@kosmojs/dev 0.4.0 → 0.4.2

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-Bkag325q.js";import{join as t,resolve as n}from"node:path";import{styleText as r}from"node:util";import{DEFAULT_APIBASE as i,RequestBodyTargets as a,RequestValidationTargets as o,createRouteResolver as s,createTemplateResolver as c,defaults as l}from"@kosmojs/core";import{createH3Pattern as u,createHonoPattern as d,createPathPattern as f,createWatchedApiRouteEntriesFilter as p,createWatchedPageRouteEntriesFilter as m,defineGenerator as h,defineGeneratorFactory as g,mergeConfigs as _,nestedRoutesFactory as v,pathResolver as y,pathTokensFactory as b,renderFactory as x,renderToFile as ee,sortRoutes as S,spinnerFactory as te,vitePlugins as C}from"@kosmojs/lib";import{routeRenderHelpers as w}from"@kosmojs/core/generators";import T from"crc/crc32";import ne from"@mdx-js/rollup";import{build as E,createFilter as re}from"vite";import ie from"yaml";import{parse as ae}from"path-to-regexp";import oe from"typebox";import se from"@vitejs/plugin-react";import D from"vite-plugin-solid";import{access as ce,constants as le,cp as O,mkdir as ue,rm as k,writeFile as de}from"node:fs/promises";import{svelte as fe}from"@sveltejs/vite-plugin-svelte";import pe from"@vitejs/plugin-vue";var A=`export * from "./transport";
2
+ `,j=`export const transport = undefined;
3
+ `,M=`{{#each routes}}
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,11 +628,18 @@ 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
 
602
- import { base, apiBase, apiRouteMap, apiRouteMapper } from "{{ createImport 'libCore' }}";
635
+ import {
636
+ base,
637
+ apiBase,
638
+ apiRouteMap,
639
+ apiRouteMapper,
640
+ // needed for cascadingMiddleware
641
+ type Override,
642
+ } from "{{ createImport 'libCore' }}";
603
643
 
604
644
  {{#each routes}}
605
645
  import {{id}} from "{{ createImport 'api' file }}";
@@ -640,7 +680,7 @@ export const routeSources: Array<RouteSource<never>> = [
640
680
  },
641
681
  {{/each}}
642
682
  ];
643
- `,he=`import { parseArgs, styleText } from "node:util";
683
+ `,_e=`import { parseArgs, styleText } from "node:util";
644
684
 
645
685
  import { serve as h3serve } from "h3";
646
686
 
@@ -688,7 +728,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
688
728
 
689
729
  return server as never;
690
730
  };
691
- `,ge=`import type { H3Event, H3EventContext } from "h3";
731
+ `,ve=`import type { H3Event, H3EventContext } from "h3";
692
732
 
693
733
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
694
734
  import {
@@ -835,14 +875,14 @@ export const defineRoute: <
835
875
  use: use as never,
836
876
  });
837
877
  };
838
- `,_e=`export * from "./@api/app";
878
+ `,ye=`export * from "./@api/app";
839
879
  export { appFactory as default } from "./@api/app";
840
880
  export * from "./@api/dev";
841
881
  export * from "./@api/errors";
842
882
  export * from "./@api/router";
843
883
  export * from "./@api/routes";
844
884
  export * from "./@api/server";
845
- `,ve=`import { onError } from "h3";
885
+ `,be=`import { onError } from "h3";
846
886
 
847
887
  import appFactory, { routes, type App } from "{{ createImport 'lib' 'api:factory' }}";
848
888
  import defaultErrorHandler from "./errors";
@@ -850,7 +890,7 @@ import defaultErrorHandler from "./errors";
850
890
  export default appFactory(routes, ({ app }) => {
851
891
  app.use(onError(defaultErrorHandler));
852
892
  }) as App;
853
- `,ye=`import { toNodeHandler } from "h3/node";
893
+ `,xe=`import { toNodeHandler } from "h3/node";
854
894
 
855
895
  import app from "./app";
856
896
 
@@ -870,10 +910,10 @@ process.on("unhandledRejection", (reason) => {
870
910
  console.error("Reason:", reason);
871
911
  process.exit(1);
872
912
  });
873
- `,be=`export declare module "{{ createImport 'libApi' }}" {
913
+ `,Se=`export declare module "{{ createImport 'libApi' }}" {
874
914
  interface DefaultContext {}
875
915
  }
876
- `,xe=`import { ValidationError } from "@kosmojs/core/errors";
916
+ `,Ce=`import { ValidationError } from "@kosmojs/core/errors";
877
917
  import { HTTPError } from "h3";
878
918
 
879
919
  import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
@@ -899,14 +939,14 @@ export default errorHandlerFactory(async (error, event) => {
899
939
  headers: { "Content-Type": "text/plain" },
900
940
  });
901
941
  });
902
- `,Se=`import { defineRoute } from "{{ createImport 'libApi' }}";
942
+ `,we=`import { defineRoute } from "{{ createImport 'libApi' }}";
903
943
 
904
944
  export default defineRoute<"{{route.name}}">(({ GET }) => [
905
945
  GET(async (event) => {
906
946
  return "Automatically generated route";
907
947
  }),
908
948
  ]);
909
- `,Ce=`import { use } from "{{ createImport 'libApi' }}";
949
+ `,Te=`import { use } from "{{ createImport 'libApi' }}";
910
950
 
911
951
  export type UseT = {};
912
952
 
@@ -915,11 +955,11 @@ export default [
915
955
  return next();
916
956
  }),
917
957
  ];
918
- `,we=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
958
+ `,Ee=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
919
959
  import app from "./app";
920
960
 
921
961
  await serve(app);
922
- `,Te=`import { use } from "{{ createImport 'libApi' }}";
962
+ `,De=`import { use } from "{{ createImport 'libApi' }}";
923
963
 
924
964
  /**
925
965
  * Define global middleware applied to all routes.
@@ -930,7 +970,7 @@ export default [
930
970
  return next();
931
971
  }),
932
972
  ];
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";
973
+ `,Oe=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`["${e}", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,d=c(n?.templates,we),f=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),d(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),Te,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,path:r.h3Pattern,basename:r.name,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:u(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,ge]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,ve],[`api:factory.ts`,ye],[`@api/app.ts`,R],[`@api/parsers.ts`,me],[`@api/dev.ts`,z],[`@api/errors.ts`,B],[`@api/router.ts`,he],[`@api/server.ts`,_e]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,be],[`dev.ts`,xe],[`errors.ts`,Ce],[`server.ts`,Ee],[`use.ts`,De],[`env.d.ts`,Se]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await f(e.filter(p(t,[`create`]))),await m(e)},async build(e){await f(e),await m(e)}}}),ke=h({meta:{name:`H3`,slot:`backend`},dependencies:{h3:L.devDependencies.h3},factory:Oe}),V={type:`module`,private:!0,name:`@kosmojs/hono-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/hono-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,crc:`^4.3.2`},devDependencies:{"@hono/node-server":`^2.1.1`,hono:`^4.13.3`,vite:`^8.2.2`}},Ae=`import { Hono, type MiddlewareHandler } from "hono";
934
974
  import type { Router } from "hono/router";
935
975
  import { RegExpRouter } from "hono/router/reg-exp-router";
936
976
  import { SmartRouter } from "hono/router/smart-router";
@@ -1002,10 +1042,10 @@ export function appFactory(
1002
1042
 
1003
1043
  return app as never;
1004
1044
  }
1005
- `,ke=`import type { DevSetup } from "@kosmojs/core/api";
1045
+ `,je=`import type { DevSetup } from "@kosmojs/core/api";
1006
1046
 
1007
1047
  export const devSetup = (setup: DevSetup) => setup;
1008
- `,Ae=`import type { Context } from "hono";
1048
+ `,Me=`import type { Context } from "hono";
1009
1049
 
1010
1050
  import type { AppEnv } from "./app";
1011
1051
 
@@ -1019,7 +1059,7 @@ export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
1019
1059
  export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
1020
1060
  return handler;
1021
1061
  };
1022
- `,je=`import type { Context } from "hono";
1062
+ `,Ne=`import type { Context } from "hono";
1023
1063
 
1024
1064
  import {
1025
1065
  parseCookies,
@@ -1068,7 +1108,7 @@ export const bodyparsers: {
1068
1108
  return ctx.req[as]();
1069
1109
  },
1070
1110
  };
1071
- `,Me=`import type { MiddlewareHandler } from "hono";
1111
+ `,Pe=`import type { MiddlewareHandler } from "hono";
1072
1112
 
1073
1113
  import type {
1074
1114
  RequestBodyTarget,
@@ -1435,11 +1475,18 @@ export const routes = createRoutes<ParameterizedMiddleware, MiddlewareHandler>(
1435
1475
  createRouteMiddleware,
1436
1476
  },
1437
1477
  );
1438
- `,Ne=`import { join } from "node:path";
1478
+ `,Fe=`import { join } from "node:path";
1439
1479
 
1440
1480
  import type { RouteSource } from "@kosmojs/core/api";
1441
1481
 
1442
- import { base, apiBase, apiRouteMap, apiRouteMapper } from "{{ createImport 'libCore' }}";
1482
+ import {
1483
+ base,
1484
+ apiBase,
1485
+ apiRouteMap,
1486
+ apiRouteMapper,
1487
+ // needed for cascadingMiddleware
1488
+ type Override,
1489
+ } from "{{ createImport 'libCore' }}";
1443
1490
 
1444
1491
  {{#each routes}}
1445
1492
  import {{id}} from "{{ createImport 'api' file }}";
@@ -1480,7 +1527,7 @@ export const routeSources: Array<RouteSource<never>> = [
1480
1527
  },
1481
1528
  {{/each}}
1482
1529
  ];
1483
- `,Pe=`import { chmod, unlink } from "node:fs/promises";
1530
+ `,Ie=`import { chmod, unlink } from "node:fs/promises";
1484
1531
  import { parseArgs, styleText } from "node:util";
1485
1532
 
1486
1533
  import { createAdaptorServer } from "@hono/node-server";
@@ -1565,7 +1612,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
1565
1612
 
1566
1613
  return server as never;
1567
1614
  };
1568
- `,Fe=`import type { Context, Next } from "hono";
1615
+ `,Le=`import type { Context, Next } from "hono";
1569
1616
 
1570
1617
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
1571
1618
  import {
@@ -1748,20 +1795,20 @@ export const defineRoute: <
1748
1795
  use: use as never,
1749
1796
  });
1750
1797
  };
1751
- `,Ie=`export * from "./@api/app";
1798
+ `,Re=`export * from "./@api/app";
1752
1799
  export { appFactory as default } from "./@api/app";
1753
1800
  export * from "./@api/dev";
1754
1801
  export * from "./@api/errors";
1755
1802
  export * from "./@api/router";
1756
1803
  export * from "./@api/routes";
1757
1804
  export * from "./@api/server";
1758
- `,Le=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
1805
+ `,ze=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
1759
1806
  import defaultErrorHandler from "./errors";
1760
1807
 
1761
1808
  export default appFactory(routes, ({ app }) => {
1762
1809
  app.onError(defaultErrorHandler);
1763
1810
  })
1764
- `,Re=`import { getRequestListener } from "@hono/node-server";
1811
+ `,Be=`import { getRequestListener } from "@hono/node-server";
1765
1812
 
1766
1813
  import app from "./app";
1767
1814
 
@@ -1782,11 +1829,11 @@ process.on("unhandledRejection", (reason) => {
1782
1829
  process.exit(1);
1783
1830
  });
1784
1831
 
1785
- `,ze=`export declare module "{{ createImport 'libApi' }}" {
1832
+ `,Ve=`export declare module "{{ createImport 'libApi' }}" {
1786
1833
  interface DefaultVariables {}
1787
1834
  interface DefaultBindings {}
1788
1835
  }
1789
- `,Be=`import { accepts } from "hono/accepts";
1836
+ `,He=`import { accepts } from "hono/accepts";
1790
1837
  import { HTTPException } from "hono/http-exception";
1791
1838
 
1792
1839
  import { ValidationError, HTTPError } from "@kosmojs/core/errors";
@@ -1818,7 +1865,7 @@ export default errorHandlerFactory(async (error, ctx) => {
1818
1865
  ? ctx.json({ error: message }, status)
1819
1866
  : ctx.text(message, status);
1820
1867
  });
1821
- `,Ve=`import { defineRoute } from "{{ createImport 'libApi' }}";
1868
+ `,Ue=`import { defineRoute } from "{{ createImport 'libApi' }}";
1822
1869
 
1823
1870
  export default defineRoute<"{{route.name}}">(({ GET }) => [
1824
1871
  GET(async (ctx) => {
@@ -1827,7 +1874,7 @@ export default defineRoute<"{{route.name}}">(({ GET }) => [
1827
1874
  return ctx.text("Automatically generated route");
1828
1875
  }),
1829
1876
  ]);
1830
- `,He=`import { use } from "{{ createImport 'libApi' }}";
1877
+ `,We=`import { use } from "{{ createImport 'libApi' }}";
1831
1878
 
1832
1879
  export type UseT = {};
1833
1880
 
@@ -1838,11 +1885,11 @@ export default [
1838
1885
  return next();
1839
1886
  }),
1840
1887
  ];
1841
- `,Ue=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1888
+ `,Ge=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
1842
1889
  import app from "./app";
1843
1890
 
1844
1891
  await serve(app);
1845
- `,We=`import { use } from "{{ createImport 'libApi' }}";
1892
+ `,Ke=`import { use } from "{{ createImport 'libApi' }}";
1846
1893
 
1847
1894
  /**
1848
1895
  * Define global middleware applied to all routes.
@@ -1853,7 +1900,7 @@ export default [
1853
1900
  return next();
1854
1901
  }),
1855
1902
  ];
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";
1903
+ `,qe=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`["${e}", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,Ue),f=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),u(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),We,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,path:r.honoPattern,basename:r.name,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:d(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,Fe]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,Le],[`api:factory.ts`,Re],[`@api/app.ts`,Ae],[`@api/parsers.ts`,Ne],[`@api/dev.ts`,je],[`@api/errors.ts`,Me],[`@api/router.ts`,Pe],[`@api/server.ts`,Ie]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,ze],[`dev.ts`,Be],[`errors.ts`,He],[`server.ts`,Ge],[`use.ts`,Ke],[`env.d.ts`,Ve]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await f(e.filter(p(t,[`create`]))),await m(e)},async build(e){await f(e),await m(e)}}}),Je=h({meta:{name:`Hono`,slot:`backend`},dependencies:{hono:V.devDependencies.hono,"@hono/node-server":V.devDependencies[`@hono/node-server`]},factory:qe}),H={type:`module`,private:!0,name:`@kosmojs/koa-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`},"./lib":{types:`./pkg/lib.d.ts`,default:`./pkg/lib.js`}},scripts:{build:`wsbuild src/index.ts src/lib.ts`,test:`vitest --root ../.. --project generators/koa-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,crc:`^4.3.2`},devDependencies:{"@koa/router":`^15.7.0`,"@types/formidable":`^3.5.1`,"@types/koa":`^3.0.3`,"@types/koa-compose":`^3.2.9`,formidable:`^3.5.4`,koa:`^3.2.1`,"koa-compose":`^4.1.0`,"light-my-request":`^6.6.0`,"raw-body":`^4.0.0`,vite:`^8.2.2`}},Ye=`import Router, { type RouterMiddleware } from "@koa/router";
1857
1904
  import Koa from "koa";
1858
1905
 
1859
1906
  import type { Route, RouteDebugOption } from "@kosmojs/core/api";
@@ -1913,10 +1960,10 @@ export function appFactory(
1913
1960
 
1914
1961
  return app;
1915
1962
  }
1916
- `,Je=`import type { DevSetup } from "@kosmojs/core/api";
1963
+ `,Xe=`import type { DevSetup } from "@kosmojs/core/api";
1917
1964
 
1918
1965
  export const devSetup = (setup: DevSetup) => setup;
1919
- `,Ye=`import type {
1966
+ `,Ze=`import type {
1920
1967
  DefaultContext,
1921
1968
  DefaultState,
1922
1969
  ParameterizedContext,
@@ -1932,7 +1979,7 @@ export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
1932
1979
  export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
1933
1980
  return handler;
1934
1981
  };
1935
- `,Xe=`import zlib from "node:zlib";
1982
+ `,Qe=`import zlib from "node:zlib";
1936
1983
 
1937
1984
  import type { RouterContext } from "@koa/router";
1938
1985
  import Formidable, { type Options as FormidableOptions } from "formidable";
@@ -2145,7 +2192,7 @@ export const bodyparsers: {
2145
2192
  return rawParser(stream, rawParserOptions);
2146
2193
  },
2147
2194
  };
2148
- `,Ze=`import type { RouterMiddleware } from "@koa/router";
2195
+ `,$e=`import type { RouterMiddleware } from "@koa/router";
2149
2196
 
2150
2197
  import type {
2151
2198
  RequestBodyTarget,
@@ -2510,11 +2557,18 @@ export const routes = createRoutes<ParameterizedMiddleware, RouterMiddleware>(
2510
2557
  createRouteMiddleware,
2511
2558
  },
2512
2559
  );
2513
- `,Qe=`import { join } from "node:path";
2560
+ `,et=`import { join } from "node:path";
2514
2561
 
2515
2562
  import type { RouteSource } from "@kosmojs/core/api";
2516
2563
 
2517
- import { base, apiBase, apiRouteMap, apiRouteMapper } from "{{ createImport 'libCore' }}";
2564
+ import {
2565
+ base,
2566
+ apiBase,
2567
+ apiRouteMap,
2568
+ apiRouteMapper,
2569
+ // needed for cascadingMiddleware
2570
+ type Override,
2571
+ } from "{{ createImport 'libCore' }}";
2518
2572
 
2519
2573
  {{#each routes}}
2520
2574
  import {{id}} from "{{ createImport 'api' file }}";
@@ -2555,7 +2609,7 @@ export const routeSources: Array<RouteSource<never>> = [
2555
2609
  },
2556
2610
  {{/each}}
2557
2611
  ];
2558
- `,$e=`import { chmod, unlink } from "node:fs/promises";
2612
+ `,tt=`import { chmod, unlink } from "node:fs/promises";
2559
2613
  import { parseArgs, styleText } from "node:util";
2560
2614
 
2561
2615
  import type { App } from "./app";
@@ -2618,7 +2672,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
2618
2672
  const server = app.listen(port || sock, onListen);
2619
2673
  return server as never;
2620
2674
  };
2621
- `,et=`import type { RouterContext } from "@koa/router";
2675
+ `,nt=`import type { RouterContext } from "@koa/router";
2622
2676
  import type { Next } from "koa";
2623
2677
 
2624
2678
  import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
@@ -2780,14 +2834,14 @@ export const defineRoute: <
2780
2834
  use: use as never,
2781
2835
  });
2782
2836
  };
2783
- `,tt=`export * from "./@api/app";
2837
+ `,rt=`export * from "./@api/app";
2784
2838
  export { appFactory as default } from "./@api/app";
2785
2839
  export * from "./@api/dev";
2786
2840
  export * from "./@api/errors";
2787
2841
  export * from "./@api/router";
2788
2842
  export * from "./@api/routes";
2789
2843
  export * from "./@api/server";
2790
- `,nt=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
2844
+ `,it=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
2791
2845
  import defaultErrorHandler from "./errors";
2792
2846
 
2793
2847
  export default appFactory(routes, ({ app, router }) => {
@@ -2798,7 +2852,7 @@ export default appFactory(routes, ({ app, router }) => {
2798
2852
  app.use(router.routes());
2799
2853
 
2800
2854
  });
2801
- `,rt=`import app from "./app";
2855
+ `,at=`import app from "./app";
2802
2856
 
2803
2857
  import { devSetup } from "{{ createImport 'lib' 'api:factory' }}";
2804
2858
 
@@ -2816,11 +2870,11 @@ process.on("unhandledRejection", (reason) => {
2816
2870
  console.error("Reason:", reason);
2817
2871
  process.exit(1);
2818
2872
  });
2819
- `,it=`export declare module "{{ createImport 'libApi' }}" {
2873
+ `,ot=`export declare module "{{ createImport 'libApi' }}" {
2820
2874
  interface DefaultState {}
2821
2875
  interface DefaultContext {}
2822
2876
  }
2823
- `,at=`import { HTTPError, ValidationError } from "@kosmojs/core/errors";
2877
+ `,st=`import { HTTPError, ValidationError } from "@kosmojs/core/errors";
2824
2878
 
2825
2879
  import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
2826
2880
 
@@ -2841,14 +2895,14 @@ export default errorHandlerFactory(async (error, ctx) => {
2841
2895
  ctx.body = message;
2842
2896
  }
2843
2897
  });
2844
- `,ot=`import { defineRoute } from "{{ createImport 'libApi' }}";
2898
+ `,ct=`import { defineRoute } from "{{ createImport 'libApi' }}";
2845
2899
 
2846
2900
  export default defineRoute<"{{route.name}}">(({ GET }) => [
2847
2901
  GET(async (ctx) => {
2848
2902
  ctx.body = "Automatically generated route";
2849
2903
  }),
2850
2904
  ]);
2851
- `,st=`import { use } from "{{ createImport 'libApi' }}";
2905
+ `,lt=`import { use } from "{{ createImport 'libApi' }}";
2852
2906
 
2853
2907
  export type UseT = {};
2854
2908
 
@@ -2859,11 +2913,11 @@ export default [
2859
2913
  return next();
2860
2914
  }),
2861
2915
  ];
2862
- `,ct=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
2916
+ `,ut=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
2863
2917
  import app from "./app";
2864
2918
 
2865
2919
  await serve(app);
2866
- `,lt=`import { use } from "{{ createImport 'libApi' }}";
2920
+ `,dt=`import { use } from "{{ createImport 'libApi' }}";
2867
2921
 
2868
2922
  /**
2869
2923
  * Define global middleware applied to all routes.
@@ -2874,17 +2928,17 @@ export default [
2874
2928
  return next();
2875
2929
  }),
2876
2930
  ];
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,`
2931
+ `,ft=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`["${e}", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,ct),d=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),u(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),lt,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,basename:r.name,path:r.pathPattern,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:f(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,et]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,nt],[`api:factory.ts`,rt],[`@api/app.ts`,Ye],[`@api/dev.ts`,Xe],[`@api/errors.ts`,Ze],[`@api/parsers.ts`,Qe],[`@api/router.ts`,$e],[`@api/server.ts`,tt]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,it],[`dev.ts`,at],[`errors.ts`,st],[`server.ts`,ut],[`use.ts`,dt],[`env.d.ts`,ot]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await d(e.filter(p(t,[`create`]))),await m(e)},async build(e){await d(e),await m(e)}}}),pt=h({meta:{name:`Koa`,slot:`backend`,types:[`@types/koa`]},dependencies:{koa:H.devDependencies.koa,"@koa/router":H.devDependencies[`@koa/router`],formidable:H.devDependencies.formidable,"raw-body":H.devDependencies[`raw-body`]},devDependencies:{"@types/koa":H.devDependencies[`@types/koa`],"@types/formidable":H.devDependencies[`@types/formidable`]},factory:ft}),U={type:`module`,private:!0,name:`@kosmojs/mdx-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"@mdx-js/rollup":`^3.1.1`,vite:`^8.2.2`},devDependencies:{"@mdx-js/mdx":`^3.1.1`,"@mdx-js/preact":`^3.1.1`,"path-to-regexp":`^8.4.2`,preact:`^10.29.8`,"preact-render-to-string":`^6.7.0`,"remark-frontmatter":`^5.0.0`,"remark-mdx-frontmatter":`^5.2.0`}},mt=()=>{let e=[`🎉 Well done! You just created a new MDX page.`,`🚀 Success! A fresh MDX page is ready to roll.`,`🌟 Nice work! Another MDX page added to your site.`,`🧩 All set! A new MDX page has been scaffolded.`,`🔧 Scaffold complete! Your new MDX page is in place.`,`✅ Built! Your MDX page is scaffolded and ready.`,`✨ Fantastic! Your new MDX page is good to go.`,`🎯 Nailed it! A brand new MDX page just landed.`,`💫 Awesome! Another MDX page joins the party.`,`⚡ Lightning fast! A new MDX page created successfully.`];return e[Math.floor(Math.random()*e.length)]},ht=(e,t,n)=>{let{remarkPlugins:r=[],rehypePlugins:i=[]}={...n},a=()=>{let t=[`${l.srcDir}/${e.name}/${l.entryDir}/client.ts`].map(e=>re(e)),n=e=>t.some(t=>t(e));return{name:`kosmo:mdx[hmr]`,enforce:`post`,transform(e,t){if(!(!n(t)||e.includes(`import.meta.hot.accept`)))return{code:[e,`
2878
2932
  if (import.meta.hot) {
2879
2933
  import.meta.hot.accept(() => {});
2880
2934
  }
2881
2935
  `].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";
2936
+ `)}}}},o=[ne({jsxImportSource:`preact`,providerImportSource:`@mdx-js/preact`,remarkPlugins:r,rehypePlugins:i})];return t===`serve`&&o.push(a()),o},gt=`import type { FunctionComponent } from "preact";
2883
2937
 
2884
2938
  export const AppProvider: FunctionComponent = (props) => {
2885
2939
  return props.children;
2886
2940
  };
2887
- `,ht=`import { render, hydrate as hydrateOrig } from "preact";
2941
+ `,_t=`import { render, hydrate as hydrateOrig } from "preact";
2888
2942
  import type { RouterFactoryReturn } from "@kosmojs/core";
2889
2943
  import { clientRenderFactory } from "@kosmojs/core/generators";
2890
2944
 
@@ -2925,7 +2979,7 @@ export const mount = async (
2925
2979
  }
2926
2980
 
2927
2981
  export default clientRenderFactory();
2928
- `,gt=`import { renderToString as renderToStringOrig } from "preact-render-to-string";
2982
+ `,vt=`import { renderToString as renderToStringOrig } from "preact-render-to-string";
2929
2983
 
2930
2984
  import type {
2931
2985
  RenderToStringWrapper,
@@ -2999,7 +3053,7 @@ export const renderToString: RenderToStringWrapper<
2999
3053
  }
3000
3054
 
3001
3055
  export default serverRenderFactory<false>();
3002
- `,_t=`declare module "*.mdx" {
3056
+ `,yt=`declare module "*.mdx" {
3003
3057
  import type { ComponentType } from "preact";
3004
3058
  export const frontmatter: Record<string, unknown>;
3005
3059
  const component: ComponentType;
@@ -3012,7 +3066,7 @@ declare module "*.md" {
3012
3066
  const component: ComponentType;
3013
3067
  export default component;
3014
3068
  }
3015
- `,vt=`import { MDXProvider } from "@mdx-js/preact";
3069
+ `,bt=`import { MDXProvider } from "@mdx-js/preact";
3016
3070
  import { match, pathToRegexp } from "path-to-regexp";
3017
3071
  import { type ComponentType, createContext, h, type VNode } from "preact";
3018
3072
 
@@ -3189,7 +3243,11 @@ export const createRoute = (
3189
3243
  loader: RawRoute["loader"],
3190
3244
  layouts: RawRoute["layouts"],
3191
3245
  ): RawRoute => {
3192
- const path = \`\${base}/\${pathPattern}\`.replace(/\\/+/g, "/");
3246
+ // strip trailing slash (keeping a sole "/") so the base-joined index route
3247
+ // matches both with and without it - "/docs/" as a pattern rejects "/docs"
3248
+ const path = \`\${base}/\${pathPattern}\`
3249
+ .replace(/\\/+/g, "/")
3250
+ .replace(/(.+)\\/$/, "$1");
3193
3251
 
3194
3252
  const { regexp } = pathToRegexp(path, { sensitive: true });
3195
3253
  const matcher = match<Route["params"]>(path);
@@ -3197,9 +3255,11 @@ export const createRoute = (
3197
3255
  return {
3198
3256
  name,
3199
3257
  regexp,
3258
+ // count segments of the same base-joined path the regexp matches against;
3259
+ // resolve() compares this against the full url pathname's segment count
3200
3260
  pathSegments: name.includes("...")
3201
3261
  ? undefined
3202
- : name.replace(/^index(\\/?|$)/, "").split("/").length,
3262
+ : path.split("/").filter(Boolean).length,
3203
3263
  extractParams: (path) => {
3204
3264
  const match = matcher(path);
3205
3265
  return match ? match.params : {};
@@ -3208,7 +3268,7 @@ export const createRoute = (
3208
3268
  layouts,
3209
3269
  };
3210
3270
  };
3211
- `,yt=`/* @jsxImportSource preact */
3271
+ `,xt=`/* @jsxImportSource preact */
3212
3272
 
3213
3273
  import styles from "./styles.module.css";
3214
3274
 
@@ -3249,7 +3309,7 @@ export default function PageSample(props: {
3249
3309
  </div>
3250
3310
  );
3251
3311
  }
3252
- `,bt=`/* @jsxImportSource preact */
3312
+ `,St=`/* @jsxImportSource preact */
3253
3313
 
3254
3314
  import styles from "./styles.module.css";
3255
3315
 
@@ -3301,7 +3361,7 @@ export default function PageSample(props: {
3301
3361
  </div>
3302
3362
  );
3303
3363
  }
3304
- `,xt=`* {
3364
+ `,Ct=`* {
3305
3365
  margin: 0;
3306
3366
  padding: 0;
3307
3367
  box-sizing: border-box;
@@ -3436,7 +3496,7 @@ export default function PageSample(props: {
3436
3496
  align-items: center;
3437
3497
  gap: 0.25rem;
3438
3498
  }
3439
- `,St=`/* @jsxImportSource preact */
3499
+ `,wt=`/* @jsxImportSource preact */
3440
3500
 
3441
3501
  import styles from "./styles.module.css";
3442
3502
 
@@ -3502,7 +3562,7 @@ export default function WelcomePage() {
3502
3562
  </div>
3503
3563
  );
3504
3564
  }
3505
- `,Ct=`export type ParamsMap = {
3565
+ `,Tt=`export type ParamsMap = {
3506
3566
  {{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
3507
3567
  {{/each}}
3508
3568
  };
@@ -3511,7 +3571,7 @@ export const paramNames = {
3511
3571
  {{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
3512
3572
  {{/each}}
3513
3573
  } as const;
3514
- `,wt=`import type { ComponentType } from "preact";
3574
+ `,Et=`import type { ComponentType } from "preact";
3515
3575
 
3516
3576
  import type { RouterFactoryReturn } from "@kosmojs/core";
3517
3577
  import { createRouterFactory } from "@kosmojs/core/generators";
@@ -3555,7 +3615,7 @@ export default createRouterFactory<
3555
3615
  Promise<RouteComponent>,
3556
3616
  { server: { route: Route } }
3557
3617
  >();
3558
- `,Tt=`import { join } from "node:path";
3618
+ `,Dt=`import { join } from "node:path";
3559
3619
 
3560
3620
  import { compile } from "path-to-regexp";
3561
3621
 
@@ -3601,7 +3661,7 @@ export default Object.entries(routes)
3601
3661
  return [];
3602
3662
  })
3603
3663
  .map((path) => join(base, path));
3604
- `,Et=`import type { PageRoute } from "@kosmojs/core";
3664
+ `,Ot=`import type { PageRoute } from "@kosmojs/core";
3605
3665
 
3606
3666
  {{#each pageRoutes}}
3607
3667
  import * as {{id}} from "{{ createImport 'pages' file }}";
@@ -3625,7 +3685,7 @@ const routeMap: Record<
3625
3685
  }
3626
3686
 
3627
3687
  export default routeMap;
3628
- `,Dt=`import { useContext } from "preact/hooks";
3688
+ `,kt=`import { useContext } from "preact/hooks";
3629
3689
 
3630
3690
  import { RouterContext } from "./mdx";
3631
3691
 
@@ -3671,10 +3731,10 @@ export const useFrontmatter = <
3671
3731
  >(): T => {
3672
3732
  return useRoute().frontmatter as T;
3673
3733
  };
3674
- `,Ot=`import { AppProvider } from "{{ createImport 'lib' 'app' }}";
3734
+ `,At=`import { AppProvider } from "{{ createImport 'lib' 'app' }}";
3675
3735
 
3676
3736
  <AppProvider>{props.children}</AppProvider>
3677
- `,kt=`import { h, type JSX } from "preact";
3737
+ `,jt=`import { h, type JSX } from "preact";
3678
3738
 
3679
3739
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
3680
3740
 
@@ -3687,11 +3747,11 @@ export default function Link(
3687
3747
  const { to, query, children, ...restProps } = props;
3688
3748
 
3689
3749
  const [key, ...params] = to;
3690
- const href = pageRouteMap[key]?.base(params as never, query);
3750
+ const href = pageRouteMap[key]?.path(params as never, query);
3691
3751
 
3692
3752
  return h("a", { ...restProps, href }, children);
3693
3753
  }
3694
- `,At=`/**
3754
+ `,Mt=`/**
3695
3755
  * MDX component overrides.
3696
3756
  *
3697
3757
  * Every standard markdown element (headings, links, code blocks, etc.)
@@ -3714,7 +3774,7 @@ export const components = {
3714
3774
  declare global {
3715
3775
  type MDXProvidedComponents = typeof components;
3716
3776
  }
3717
- `,jt=`import renderFactory, {
3777
+ `,Nt=`import renderFactory, {
3718
3778
  createRoutes,
3719
3779
  hydrate,
3720
3780
  mount,
@@ -3741,7 +3801,7 @@ if (root) {
3741
3801
  } else {
3742
3802
  console.error("❌ Root element not found!");
3743
3803
  }
3744
- `,Mt=`import renderFactory, {
3804
+ `,Pt=`import renderFactory, {
3745
3805
  createRoutes,
3746
3806
  renderToString,
3747
3807
  // no renderToStream on MDX folders
@@ -3762,7 +3822,7 @@ export default renderFactory(() => {
3762
3822
  },
3763
3823
  };
3764
3824
  });
3765
- `,Nt=`<!doctype html>
3825
+ `,Ft=`<!doctype html>
3766
3826
  <html lang="en">
3767
3827
  <head>
3768
3828
  <meta charset="UTF-8" />
@@ -3774,13 +3834,13 @@ export default renderFactory(() => {
3774
3834
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
3775
3835
  </body>
3776
3836
  </html>
3777
- `,Pt=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
3837
+ `,It=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
3778
3838
 
3779
3839
  export default function Page() {
3780
3840
  return <PageSample />;
3781
3841
  }
3782
- `,Ft=`{props.children}
3783
- `,It=`---
3842
+ `,Lt=`{props.children}
3843
+ `,Rt=`---
3784
3844
  title: "{{title}}"
3785
3845
  ---
3786
3846
 
@@ -3797,7 +3857,7 @@ export const pathMap = {
3797
3857
  routeName="{{route.name}}"
3798
3858
  pathMap={pathMap}
3799
3859
  />
3800
- `,Lt=`---
3860
+ `,zt=`---
3801
3861
  title: Welcome to KosmoJS
3802
3862
  description: Content-first development with MDX and Vite
3803
3863
  ---
@@ -3805,7 +3865,7 @@ description: Content-first development with MDX and Vite
3805
3865
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}"
3806
3866
 
3807
3867
  <WelcomePage />
3808
- `,Rt=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
3868
+ `,Bt=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
3809
3869
 
3810
3870
  import app from "./app.mdx";
3811
3871
  import { components } from "./components/mdx"
@@ -3821,12 +3881,12 @@ export default routerFactory((routes) => {
3821
3881
  },
3822
3882
  };
3823
3883
  });
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";
3884
+ `,Vt=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w(),serializeParams(e){return JSON.stringify(e.params)}}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,Rt),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?zt:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:mt()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),Lt,{route:r},{overwrite:o})},d=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),r=e.flatMap(({kind:e,entry:n})=>{if(e===`pageRoute`){let{name:e,file:r}=n;return[{...n,layouts:t.flatMap(t=>t.name===e||r.startsWith(`${t.name}/`)?[t]:[]).sort(S)}]}return[]}).sort(S);for(let[e,a]of[[`client.ts`,_t],[`server.ts`,vt]])await i(n.libEntry(e),a,{pageRoutes:r,layouts:t});for(let[e,t]of[[`params.ts`,Tt],[`router.ts`,Et],[`ssg:routes.ts`,Ot]])await i(n.lib(e),t,{pageRoutes:r})};return{config({command:n}){return{oxc:{jsx:{runtime:`automatic`,importSource:`preact`}},plugins:ht(e,n,t)}},async start(){for(let[e,t]of[[`env.d.ts`,yt],[`app.ts`,gt],[`mdx.ts`,bt],[`use.ts`,kt],[`ssg.ts`,Dt],[`pageSamples/styles.module.css`,Ct],[`pageSamples/welcome.tsx`,wt],[`pageSamples/page.tsx`,St],[`pageSamples/404.tsx`,xt]])await i(n.lib(e),t,{});for(let[e,t]of[[`pages/404.mdx`,It],[`components/Link.tsx`,jt],[`components/mdx.ts`,Mt],[`app.mdx`,At],[`router.ts`,Bt]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});await a(n.src(`index.html`),Ft,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,Nt],[`server.ts`,Pt]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){await u(e.filter(m(t,[`create`]))),await d(e)},async build(e){await u(e),await d(e)}}}),Ht=h({meta:{name:`MDX`,jsx:`react-jsx`,jsxImportSource:`preact`},dependencies:{"path-to-regexp":U.devDependencies[`path-to-regexp`]},devDependencies:{preact:U.devDependencies.preact,"preact-render-to-string":U.devDependencies[`preact-render-to-string`],"@mdx-js/preact":U.devDependencies[`@mdx-js/preact`],"remark-frontmatter":U.devDependencies[`remark-frontmatter`],"remark-mdx-frontmatter":U.devDependencies[`remark-mdx-frontmatter`]},factory:Vt}),Ut={json:`application/json`,form:[`application/x-www-form-urlencoded`,`multipart/form-data`],raw:void 0},Wt=()=>{let e=e=>[`Buffer`,`ArrayBuffer`,`Blob`].includes(e)?{type:`string`,format:`binary`}:oe.Script(e),n=(e,t,n)=>{let r=n?`${t}_${n.replace(/[^\w.-]/g,`_`)}${T(n)}`:t;return`${e.id}_${r}`},r=(e,t,r,i)=>[`#`,`components`,e,n(t,r,i)].join(`/`),i=e=>e.split(`/`).reduce((e,t)=>e+ +!t.includes(`{`),0),o=e=>{if(e.name===`index`)return[`/`];let{tokens:n}=ae(e.pathPattern),r=e=>e.flatMap(e=>{switch(e.type){case`param`:return[e.name];case`wildcard`:return[e.name];case`group`:return r(e.tokens);default:return[]}}),a=(e,t)=>{if(!e.length)return[t];let[n,...i]=e;switch(n.type){case`text`:return a(i,{path:`${t.path}${n.value}`,params:t.params});case`param`:return a(i,{path:`${t.path}{${n.name}}`,params:[...t.params,n.name]});case`wildcard`:return a(i,{path:`${t.path}{${n.name}*}`,params:[...t.params,n.name]});case`group`:{let e=a(i,t),o=a([...n.tokens,...i],t),s=r(n.tokens),c=o.filter(e=>s.some(t=>e.params.includes(t)));return[...e,...c]}}},o=a(n,{path:``,params:[]}),s=e.params.schema.reduce((e,{name:t},n)=>(e[n]=t,e),{});return o.reduce((e,n)=>{let r=t(`/`,n.path);return e.includes(r)||n.params.every((e,t)=>e===s[t])&&e.push(r),e},[]).sort((e,t)=>i(t)-i(e))},s=(e,t)=>{let n=e.params.resolvedType?.properties?.flatMap(n=>RegExp(`\\{${n.name}\\*?\\}`).test(t)?[{$ref:r(`parameters`,e,e.params.id,n.name)}]:[]);return n?.length?n:void 0},c=(e,t)=>{let n=e.validationDefinitions.find(e=>e.method===t&&e.target===`response`);return Array.isArray(n?.variants)?n.variants.reduce((t,{id:n,status:i,contentType:a,body:o})=>(t[i]=Gt(i,a)||{description:`Success`,content:{[a||`application/json`]:{schema:o?{$ref:r(`schemas`,e,n)}:{type:`object`}}}},t),{}):{200:{description:`Success - TODO: Add response schema`,content:{"text/plain":{schema:{type:`string`}}}}}},l=t=>{let{parameters:r,schemas:i}={parameters:{},schemas:{}};for(let r of t.validationDefinitions)if(r.target===`response`)for(let{id:a,resolvedType:o}of r.variants)o?.typeboxSchema&&(i[n(t,a)]=e(o.typeboxSchema));else if(r.target===`query`){let{id:a,resolvedType:o}=r.schema;for(let r of o?.properties||[])if(r?.typeboxSchema){let o=n(t,a,r.name);i[o]=e(r.typeboxSchema)}}else{let{id:a,resolvedType:o}=r.schema;o?.typeboxSchema&&(i[n(t,a)]=e(o.typeboxSchema))}if(t.params.resolvedType)for(let i of t.params.resolvedType.properties||[])i?.typeboxSchema&&(r[n(t,t.params.id,i.name)]={name:i.name,in:`path`,required:!0,schema:e(i.typeboxSchema)});return{parameters:r,schemas:i}},u=e=>{let t={},n=e.validationDefinitions.flatMap(e=>e.target===`response`?[]:e.schema.resolvedType?[e]:[]);for(let i of o(e))for(let o of e.methods){let l={responses:c(e,o)},u=s(e,i);u&&(l.parameters=u);let d=n.find(e=>e.method===o&&e.target===`query`);if(d?.schema)for(let t of d.schema.resolvedType?.properties||[])l.parameters||=[],l.parameters.push({name:t.name,in:`query`,required:!t.optional,schema:{$ref:r(`schemas`,e,d.schema.id,t.name)}});let f=n.filter(e=>e.method===o&&Object.keys(a).includes(e.target));f.length&&(l.requestBody={required:!0,content:f.reduce((t,n)=>{let{contentType:i=Ut[n.target]}=n;if(i){let a={$ref:r(`schemas`,e,n.schema.id)};for(let e of[i].flat())t[e]={schema:a}}return t},{})}),t[i]||(t[i]={}),t[i][o.toLowerCase()]=l}return t};return{generateComponentId:n,generateComponentPath:r,generatePathVariations:o,generateOpenAPISchema:e=>{let t=new Map;for(let n of e)t.set(n.name,o(n));let{components:n,paths:r}=e.sort(S).flatMap(n=>{let r=t.get(n.name)??[];return r.length>0&&e.some(e=>{if(e.name===n.name)return!1;let i=t.get(e.name)??[],a=new Set(i);return r.every(e=>a.has(e))})?[]:[n]}).reduce((e,t)=>{let n=u(t),{parameters:r,schemas:i}=l(t);return{paths:{...e.paths,...n},components:{parameters:{...e.components.parameters,...r},schemas:{...e.components.schemas,...i}}}},{paths:{},components:{parameters:{},schemas:{}}});return{paths:r,components:n}}}},Gt=(e,t)=>{let n={type:`string`,format:`uri`,...t?{enum:[t]}:{}};return{301:{description:`Moved Permanently`,headers:{Location:{description:`New permanent location`,schema:n}}},302:{description:`Found`,headers:{Location:{description:`Temporary location`,schema:n}}},303:{description:`See Other`,headers:{Location:{description:`Location to GET after POST/PUT/DELETE`,schema:n}}},307:{description:`Temporary Redirect`,headers:{Location:{description:`Temporary location (preserves request method)`,schema:n}}},308:{description:`Permanent Redirect`,headers:{Location:{description:`New permanent location (preserves request method)`,schema:n}}}}[e]},Kt=g((e,t)=>{let{outfile:n=``,...r}={...t},{createPath:i}=y(e),{generateOpenAPISchema:a}=Wt(),o=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]),{paths:o,components:s}=a(t),c={...JSON.parse(JSON.stringify(r)),paths:o,components:s},l=/ya?ml/.test(n)?ie.stringify(c):JSON.stringify(c,null,2);await ee(i.src(n),l,{})};return{async watch(e){await o(e)},async build(e){await o(e)}}}),qt=h({meta:{name:`OpenAPI`,resolveTypes:!0},factory:Kt}),W={type:`module`,private:!0,name:`@kosmojs/react-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/react-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"@vitejs/plugin-react":`^6.1.0`},devDependencies:{"@tanstack/react-query":`^5.102.2`,"@types/react":`^19.2.18`,"@types/react-dom":`^19.2.5`,"path-to-regexp":`^8.4.2`,react:`^19.2.8`,"react-dom":`^19.2.8`,"react-router":`^8.3.0`}},Jt=e=>{let t=e.map(e=>e.orig).join(`/`),n=e=>e.kind===`splat`?`*`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[n(e.parts[0])]:(/\.\w+$/.test(e.orig)||(console.warn(`❗${r([`red`,`bold`],`WARN`)}: React Router v7 only supports dot-suffix mixed segments (e.g. :param.html).`),console.warn(` ${r([`magenta`],e.orig)} in ${r([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},Yt=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=n=>n.flatMap(({index:n,layout:r,children:i})=>{let{name:a,pathTokens:o}={...n,...r};if(!o)return[];let s=`${a}:layout`,c=Jt(o),l=o.at(-1);return e(l)?n&&r?[{name:s,path:c,component:r.id,children:[{name:a,path:`*`,component:n.id}]}]:n?[{path:c,children:[{name:a,path:`*`,component:n.id},...t(i)]}]:r?[{name:s,path:c,component:r.id,children:t(i)}]:[]:n&&r?[{name:s,path:c,component:r.id,children:[{name:a,index:!0,component:n.id},...t(i)]}]:n?[{path:c,children:[{name:a,index:!0,component:n.id},...t(i)]}]:r?[{name:s,path:c,component:r.id,children:t(i)}]:[]});return t},Xt=()=>{let e=[`🎉 Well done! You just created a new React route.`,`🚀 Success! A fresh React route is ready to roll.`,`🌟 Nice work! Another React route added to your app.`,`⚡ Quick and easy! Your new React route is good to go.`,`🥳 Congrats! Your app just leveled up with a new React route.`,`🧩 All set! A new React route has been scaffolded.`,`🔧 Scaffold complete! Your new React route is in place.`,`✨ Fantastic! Your new React route is ready.`,`🎯 Nailed it! A brand new React route just landed.`,`💫 Awesome! Another React route joins the lineup.`];return e[Math.floor(Math.random()*e.length)]},Zt=`import type { ReactNode } from "react";
3825
3885
 
3826
3886
  export const AppProvider = ({ children }: { children: ReactNode }) => {
3827
3887
  return children;
3828
3888
  }
3829
- `,Xt=`import { type QueryClient, QueryClientProvider } from "@tanstack/react-query";
3889
+ `,Qt=`import { type QueryClient, QueryClientProvider } from "@tanstack/react-query";
3830
3890
  import type { ReactNode } from "react";
3831
3891
 
3832
3892
  import { getQueryClient } from "./query";
@@ -3845,7 +3905,7 @@ export const AppProvider = ({
3845
3905
  </QueryClientProvider>
3846
3906
  );
3847
3907
  }
3848
- `,Zt=`import { lazy, type JSX } from "react";
3908
+ `,$t=`import { lazy, type JSX } from "react";
3849
3909
 
3850
3910
  import {
3851
3911
  createRoot,
@@ -3899,7 +3959,7 @@ export const mount = async (
3899
3959
  }
3900
3960
 
3901
3961
  export default clientRenderFactory();
3902
- `,Qt=`{
3962
+ `,en=`{
3903
3963
  {{#if name}}
3904
3964
  id: "{{name}}",
3905
3965
  {{/if}}
@@ -3917,7 +3977,7 @@ export default clientRenderFactory();
3917
3977
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
3918
3978
  {{/if}}
3919
3979
  }
3920
- `,$t=`import type { JSX } from "react";
3980
+ `,tn=`import type { JSX } from "react";
3921
3981
 
3922
3982
  import {
3923
3983
  renderToString as renderToStringOrig,
@@ -3983,7 +4043,7 @@ export const renderToStream: RenderToStreamWrapper<
3983
4043
  };
3984
4044
 
3985
4045
  export default serverRenderFactory();
3986
- `,en=`/* @jsxImportSource react */
4046
+ `,nn=`/* @jsxImportSource react */
3987
4047
 
3988
4048
  import styles from "./styles.module.css";
3989
4049
 
@@ -4024,7 +4084,7 @@ export default function PageSample(props: {
4024
4084
  </div>
4025
4085
  );
4026
4086
  }
4027
- `,tn=`/* @jsxImportSource react */
4087
+ `,rn=`/* @jsxImportSource react */
4028
4088
 
4029
4089
  import styles from "./styles.module.css";
4030
4090
 
@@ -4076,7 +4136,7 @@ export default function PageSample(props: {
4076
4136
  </div>
4077
4137
  );
4078
4138
  }
4079
- `,nn=`* {
4139
+ `,an=`* {
4080
4140
  margin: 0;
4081
4141
  padding: 0;
4082
4142
  box-sizing: border-box;
@@ -4211,7 +4271,7 @@ export default function PageSample(props: {
4211
4271
  align-items: center;
4212
4272
  gap: 0.25rem;
4213
4273
  }
4214
- `,rn=`/* @jsxImportSource react */
4274
+ `,on=`/* @jsxImportSource react */
4215
4275
 
4216
4276
  import styles from "./styles.module.css";
4217
4277
 
@@ -4277,7 +4337,7 @@ export default function WelcomePage() {
4277
4337
  </div>
4278
4338
  );
4279
4339
  }
4280
- `,an=`import { QueryClient, type QueryClientConfig } from "@tanstack/react-query";
4340
+ `,sn=`import { QueryClient, type QueryClientConfig } from "@tanstack/react-query";
4281
4341
 
4282
4342
  let client: QueryClient | undefined;
4283
4343
 
@@ -4292,7 +4352,7 @@ export const getQueryClient = (): QueryClient => {
4292
4352
  }
4293
4353
  return client;
4294
4354
  };
4295
- `,on=`import { QueryClient, type QueryClientConfig } from "@tanstack/react-query";
4355
+ `,cn=`import { QueryClient, type QueryClientConfig } from "@tanstack/react-query";
4296
4356
 
4297
4357
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
4298
4358
 
@@ -4315,7 +4375,7 @@ export const getQueryClient = (): QueryClient => {
4315
4375
  }
4316
4376
  return ctx.tsqClient as QueryClient;
4317
4377
  };
4318
- `,sn=`export type ComponentLoader = () => Promise<{
4378
+ `,ln=`export type ComponentLoader = () => Promise<{
4319
4379
  loader?: (arg: unknown) => Promise<unknown>;
4320
4380
  }>;
4321
4381
 
@@ -4335,7 +4395,7 @@ export const loaderFactory = (opt?: { withPreload?: boolean }) => {
4335
4395
  return opt?.withPreload ? { loader } : {};
4336
4396
  };
4337
4397
  };
4338
- `,cn=`import type { JSX, ComponentType } from "react";
4398
+ `,un=`import type { JSX, ComponentType } from "react";
4339
4399
 
4340
4400
  import {
4341
4401
  type RouteObject,
@@ -4393,7 +4453,7 @@ export const createRouters = (
4393
4453
  }
4394
4454
 
4395
4455
  export default createRouterFactory<RouteObject, Promise<JSX.Element>>();
4396
- `,ln=`import { Outlet } from "react-router";
4456
+ `,dn=`import { Outlet } from "react-router";
4397
4457
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
4398
4458
 
4399
4459
  export default function App() {
@@ -4403,7 +4463,7 @@ export default function App() {
4403
4463
  </AppProvider>
4404
4464
  );
4405
4465
  }
4406
- `,un=`import {
4466
+ `,fn=`import {
4407
4467
  type LinkProps as RouterLinkProps,
4408
4468
  Link as RouterLink,
4409
4469
  } from "react-router";
@@ -4422,7 +4482,7 @@ export default function Link(
4422
4482
 
4423
4483
  const href = () => {
4424
4484
  const [key, ...params] = to;
4425
- return pageRouteMap[key]?.base(params as never, query);
4485
+ return pageRouteMap[key]?.path(params as never, query, { prefix: false });
4426
4486
  };
4427
4487
 
4428
4488
  return (
@@ -4431,7 +4491,7 @@ export default function Link(
4431
4491
  </RouterLink>
4432
4492
  );
4433
4493
  }
4434
- `,dn=`import renderFactory, {
4494
+ `,pn=`import renderFactory, {
4435
4495
  createRoutes,
4436
4496
  hydrate,
4437
4497
  mount,
@@ -4458,7 +4518,7 @@ if (root) {
4458
4518
  } else {
4459
4519
  console.error("❌ Root element not found!");
4460
4520
  }
4461
- `,fn=`import renderFactory, {
4521
+ `,mn=`import renderFactory, {
4462
4522
  createRoutes,
4463
4523
  renderToStream,
4464
4524
  renderToString,
@@ -4485,7 +4545,7 @@ export default renderFactory(() => {
4485
4545
  },
4486
4546
  };
4487
4547
  });
4488
- `,pn=`<!doctype html>
4548
+ `,hn=`<!doctype html>
4489
4549
  <html lang="en">
4490
4550
  <head>
4491
4551
  <meta charset="UTF-8" />
@@ -4497,17 +4557,17 @@ export default renderFactory(() => {
4497
4557
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
4498
4558
  </body>
4499
4559
  </html>
4500
- `,mn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
4560
+ `,gn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
4501
4561
 
4502
4562
  export default function Page() {
4503
4563
  return <PageSample />;
4504
4564
  }
4505
- `,hn=`import { Outlet } from "react-router";
4565
+ `,_n=`import { Outlet } from "react-router";
4506
4566
 
4507
4567
  export default function Layout() {
4508
4568
  return <Outlet />;
4509
4569
  }
4510
- `,gn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
4570
+ `,vn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
4511
4571
 
4512
4572
  export default function Page() {
4513
4573
  return PageSample({
@@ -4520,8 +4580,8 @@ export default function Page() {
4520
4580
  },
4521
4581
  });
4522
4582
  }
4523
- `,_n=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
4524
- `,vn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
4583
+ `,yn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
4584
+ `,bn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
4525
4585
 
4526
4586
  import app from "./app";
4527
4587
 
@@ -4536,12 +4596,12 @@ export default routerFactory((routes) => {
4536
4596
  },
4537
4597
  };
4538
4598
  });
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";
4599
+ `,xn=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()},partials:{routePartial:en}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=Yt(),s=e=>!e?.trim().length,u=c(t?.templates,vn),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?yn:u(r.name,r),{route:r,message:Xt()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),_n,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(v(r));for(let[e,t]of[[`client.ts`,$t],[`server.ts`,tn]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a});await i(n.lib(`router.tsx`),un,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[se(n)]}},async start(){for(let[e,r]of[[`env.d.ts`,``],[`react.ts`,ln],[`pageSamples/styles.module.css`,an],[`pageSamples/welcome.tsx`,on],[`pageSamples/page.tsx`,rn],[`pageSamples/404.tsx`,nn],...t?.tanstack?.query?[[`app.tsx`,Qt],[`query.ts`,sn]]:[[`app.tsx`,Zt],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.tsx`,gn],[`components/Link.tsx`,fn],[`app.tsx`,dn],[`router.ts`,bn]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});await a(n.src(`index.html`),hn,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,pn],[`server.ts`,mn]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){await d(e.filter(m(t,[`create`]))),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?cn:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Sn=h({meta:{name:`React`,jsx:`preserve`,jsxImportSource:`react`},dependencies(e){return{react:W.devDependencies.react,"react-router":W.devDependencies[`react-router`],"path-to-regexp":W.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/react-query":W.devDependencies[`@tanstack/react-query`]}:{}}},devDependencies:{"@types/react":W.devDependencies[`@types/react`],"@types/react-dom":W.devDependencies[`@types/react-dom`],"react-dom":W.devDependencies[`react-dom`]},factory:xn}),G={type:`module`,private:!0,name:`@kosmojs/solid-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/solid-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"vite-plugin-solid":`^2.11.14`},devDependencies:{"@solidjs/router":`^1.0.0`,"@tanstack/solid-query":`^5.102.2`,"path-to-regexp":`^8.4.2`,"solid-js":`^1.9.15`}},Cn=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=t=>t?.kind===`param`?t.parts[0]?.kind===`optional`||e(t):!1,n=r=>r.flatMap(({index:r,layout:i,children:a})=>{let{pathTokens:o}={...r,...i},s=K(o.map((e,n)=>e.kind===`param`&&(t(o[n+1])||a.some(e=>e.index?.pathTokens.some(t)))?{...e,parts:[{...e.parts[0],kind:`required`}]}:e)),c=o.at(-1);if(e(c)){let e=K([c]);return r&&i?[{path:s,component:i.id,children:[{path:e,component:r.id}]}]:r?[{path:s,children:[{path:e,component:r.id},...n(a)]}]:i?[{path:s,component:i.id,children:n(a)}]:[]}return r&&i?[{path:s,component:i.id,children:[{path:`/`,component:r.id},...n(a)]}]:r?[{path:s,children:[{path:`/`,component:r.id},...n(a)]}]:i?[{path:s,component:i.id,children:n(a)}]:[]});return n},K=e=>{let t=e.map(e=>e.orig).join(`/`),n=e=>e.kind===`splat`?`*${e.name}`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[n(e.parts[0])]:(e.parts.length&&(console.warn(`❗${r([`red`,`bold`],`WARN`)}: At the moment Solid Router does not support mixed path segments.`),console.warn(` ${r([`magenta`],e.orig)} segment in ${r([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},wn=()=>{let e=[`🎉 Well done! You just created a new Solid route.`,`🚀 Success! A fresh Solid route is ready to roll.`,`🌟 Nice work! Another Solid route added to your app.`,`🧩 All set! A new Solid route has been scaffolded.`,`🔧 Scaffold complete! Your new Solid route is in place.`,`✅ Built! Your Solid route is scaffolded and ready.`,`✨ Fantastic! Your new Solid route is good to go.`,`🎯 Nailed it! A brand new Solid route just landed.`,`💫 Awesome! Another Solid route joins the party.`,`⚡ Lightning fast! A new Solid route created successfully.`];return e[Math.floor(Math.random()*e.length)]},Tn=`import type { ParentComponent } from "solid-js";
4540
4600
 
4541
4601
  export const AppProvider: ParentComponent = (props) => {
4542
4602
  return props.children;
4543
4603
  };
4544
- `,wn=`import type { ParentComponent } from "solid-js";
4604
+ `,En=`import type { ParentComponent } from "solid-js";
4545
4605
  import { type QueryClient, QueryClientProvider } from "@tanstack/solid-query";
4546
4606
 
4547
4607
  import { getQueryClient } from "./query";
@@ -4553,7 +4613,7 @@ export const AppProvider: ParentComponent<{ client?: QueryClient }> = (props) =>
4553
4613
  </QueryClientProvider>
4554
4614
  );
4555
4615
  };
4556
- `,Tn=`import { lazy, type JSX } from "solid-js";
4616
+ `,Dn=`import { lazy, type JSX } from "solid-js";
4557
4617
  import { hydrate as hydrateOrig, render } from "solid-js/web";
4558
4618
  import type { RouterFactoryReturn } from "@kosmojs/core";
4559
4619
  import { clientRenderFactory } from "@kosmojs/core/generators";
@@ -4598,7 +4658,7 @@ export const mount = async (
4598
4658
  }
4599
4659
 
4600
4660
  export default clientRenderFactory();
4601
- `,En=`{
4661
+ `,On=`{
4602
4662
  path: "{{path}}",
4603
4663
  {{#if component}}
4604
4664
  component: {{component}}_component,
@@ -4608,7 +4668,7 @@ export default clientRenderFactory();
4608
4668
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
4609
4669
  {{/if}}
4610
4670
  }
4611
- `,Dn=`import type { JSX } from "solid-js";
4671
+ `,kn=`import type { JSX } from "solid-js";
4612
4672
 
4613
4673
  import {
4614
4674
  generateHydrationScript,
@@ -4681,7 +4741,7 @@ export const renderToStream: RenderToStreamWrapper<
4681
4741
  * and surfaces the error to the stream consumer; catching here only keeps
4682
4742
  * the rejection from escaping as an unhandled one.
4683
4743
  * */
4684
- stream.pipeTo(writable).catch(() => {});
4744
+ void Promise.resolve(stream.pipeTo(writable)).catch(() => {});
4685
4745
  return {
4686
4746
  head: [...headerTags, generateHydrationScript()].join("\\n"),
4687
4747
  html: readable,
@@ -4689,7 +4749,7 @@ export const renderToStream: RenderToStreamWrapper<
4689
4749
  };
4690
4750
 
4691
4751
  export default serverRenderFactory<true>();
4692
- `,On=`/* @jsxImportSource solid-js */
4752
+ `,An=`/* @jsxImportSource solid-js */
4693
4753
 
4694
4754
  import styles from "./styles.module.css";
4695
4755
 
@@ -4730,7 +4790,7 @@ export default function PageSample(props: {
4730
4790
  </div>
4731
4791
  );
4732
4792
  }
4733
- `,kn=`/* @jsxImportSource solid-js */
4793
+ `,jn=`/* @jsxImportSource solid-js */
4734
4794
 
4735
4795
  import styles from "./styles.module.css";
4736
4796
 
@@ -4782,7 +4842,7 @@ export default function PageSample(props: {
4782
4842
  </div>
4783
4843
  );
4784
4844
  }
4785
- `,An=`* {
4845
+ `,Mn=`* {
4786
4846
  margin: 0;
4787
4847
  padding: 0;
4788
4848
  box-sizing: border-box;
@@ -4917,7 +4977,7 @@ export default function PageSample(props: {
4917
4977
  align-items: center;
4918
4978
  gap: 0.25rem;
4919
4979
  }
4920
- `,jn=`/* @jsxImportSource solid-js */
4980
+ `,Nn=`/* @jsxImportSource solid-js */
4921
4981
 
4922
4982
  import styles from "./styles.module.css";
4923
4983
 
@@ -4983,7 +5043,7 @@ export default function WelcomePage() {
4983
5043
  </div>
4984
5044
  );
4985
5045
  }
4986
- `,Mn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5046
+ `,Pn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
4987
5047
 
4988
5048
  let client: QueryClient | undefined;
4989
5049
 
@@ -4998,7 +5058,7 @@ export const getQueryClient = (): QueryClient => {
4998
5058
  }
4999
5059
  return client;
5000
5060
  };
5001
- `,Nn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5061
+ `,Fn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
5002
5062
 
5003
5063
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
5004
5064
 
@@ -5021,7 +5081,7 @@ export const getQueryClient = (): QueryClient => {
5021
5081
  }
5022
5082
  return ctx.tsqClient as QueryClient;
5023
5083
  };
5024
- `,Pn=`import type { JSX, ParentComponent } from "solid-js";
5084
+ `,In=`import type { JSX, ParentComponent } from "solid-js";
5025
5085
  import { Router, type RouteDefinition } from "@solidjs/router";
5026
5086
  import type { RouterFactoryReturn } from "@kosmojs/core";
5027
5087
  import { createRouterFactory } from "@kosmojs/core/generators";
@@ -5057,7 +5117,7 @@ export const createRouters = (
5057
5117
  }
5058
5118
 
5059
5119
  export default createRouterFactory<RouteDefinition, JSX.Element>();
5060
- `,Fn=`export type ComponentLoader = () => Promise<{
5120
+ `,Ln=`export type ComponentLoader = () => Promise<{
5061
5121
  preload?: () => Promise<unknown>;
5062
5122
  }>;
5063
5123
 
@@ -5072,10 +5132,10 @@ export const loaderFactory = (opt?: { withPreload?: boolean }) => {
5072
5132
  return opt?.withPreload ? { preload } : {};
5073
5133
  };
5074
5134
  };
5075
- `,In=`export type MaybeWrapped<T> = import("solid-js/store").Store<T> | T;
5135
+ `,Rn=`export type MaybeWrapped<T> = import("solid-js/store").Store<T> | T;
5076
5136
 
5077
5137
  export { unwrap } from "solid-js/store";
5078
- `,Ln=`import type { ParentComponent } from "solid-js";
5138
+ `,zn=`import type { ParentComponent } from "solid-js";
5079
5139
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
5080
5140
 
5081
5141
  const App: ParentComponent = (props) => {
@@ -5083,7 +5143,7 @@ const App: ParentComponent = (props) => {
5083
5143
  };
5084
5144
 
5085
5145
  export default App;
5086
- `,Rn=`import { A, type AnchorProps } from "@solidjs/router";
5146
+ `,Bn=`import { A, type AnchorProps } from "@solidjs/router";
5087
5147
  import { type JSXElement, splitProps } from "solid-js";
5088
5148
 
5089
5149
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
@@ -5103,12 +5163,12 @@ export default function Link(
5103
5163
 
5104
5164
  const href = () => {
5105
5165
  const [key, ...params] = knownProps.to;
5106
- return pageRouteMap[key]?.base(params as never, knownProps.query);
5166
+ return pageRouteMap[key]?.path(params as never, knownProps.query, { prefix: false });
5107
5167
  };
5108
5168
 
5109
5169
  return <A {...{ ...restProps, href: href() }}>{knownProps.children}</A>;
5110
5170
  }
5111
- `,zn=`import renderFactory, {
5171
+ `,Vn=`import renderFactory, {
5112
5172
  createRoutes,
5113
5173
  hydrate,
5114
5174
  mount,
@@ -5135,7 +5195,7 @@ if (root) {
5135
5195
  } else {
5136
5196
  console.error("❌ Root element not found!");
5137
5197
  }
5138
- `,Bn=`import renderFactory, {
5198
+ `,Hn=`import renderFactory, {
5139
5199
  createRoutes,
5140
5200
  renderToStream,
5141
5201
  renderToString,
@@ -5162,7 +5222,7 @@ export default renderFactory(() => {
5162
5222
  },
5163
5223
  };
5164
5224
  });
5165
- `,Vn=`<!doctype html>
5225
+ `,Un=`<!doctype html>
5166
5226
  <html lang="en">
5167
5227
  <head>
5168
5228
  <meta charset="UTF-8" />
@@ -5174,19 +5234,19 @@ export default renderFactory(() => {
5174
5234
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
5175
5235
  </body>
5176
5236
  </html>
5177
- `,Hn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
5237
+ `,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
5178
5238
 
5179
5239
  export default function Page() {
5180
5240
  return <PageSample />;
5181
5241
  }
5182
- `,Un=`import type { ParentComponent } from "solid-js";
5242
+ `,Gn=`import type { ParentComponent } from "solid-js";
5183
5243
 
5184
5244
  const Layout: ParentComponent = (props) => {
5185
5245
  return props.children;
5186
5246
  };
5187
5247
 
5188
5248
  export default Layout;
5189
- `,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
5249
+ `,Kn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
5190
5250
 
5191
5251
  export default function Page() {
5192
5252
  return PageSample({
@@ -5199,8 +5259,8 @@ export default function Page() {
5199
5259
  },
5200
5260
  });
5201
5261
  }
5202
- `,Gn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
5203
- `,Kn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
5262
+ `,qn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
5263
+ `,Jn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
5204
5264
 
5205
5265
  import app from "./app";
5206
5266
 
@@ -5215,12 +5275,12 @@ export default routerFactory((routes) => {
5215
5275
  },
5216
5276
  };
5217
5277
  });
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}}
5278
+ `,Yn=g((e,t)=>{let{generators:n=[]}=e.config,{createPath:r,createImportHelpers:i}=y(e),{renderToFile:a}=x({helpers:{...i({origin:`lib`}),...w()},partials:{routePartial:On}}),{renderToFile:o}=x({helpers:i({origin:`src`})}),s=Cn(),u=e=>!e?.trim().length,d=c(t?.templates,Kn),f=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await o(r.pages(n.file),n.name===`index`?qn:d(n.name,n),{route:n,message:wn()},{overwrite:u}):t===`pageLayout`&&await o(r.pages(n.file),Gn,{route:n},{overwrite:u})},p=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),n=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=s(v(n));for(let[e,t]of[[`client.ts`,Dn],[`server.ts`,kn]])await a(r.libEntry(e),t,{pageEntries:n,nestedRoutes:i});await a(r.lib(`router.tsx`),In,{entries:e,indexRoutes:t})};return{config({command:e}){let{templates:r,...i}={...t};return{oxc:{jsx:{importSource:`solid-js`}},plugins:e===`build`?[D({...i,...n.some(e=>e.meta.slot===`ssr`)?{ssr:!0,solid:{...i?.solid,hydratable:!0}}:{}})]:[D({...i,dev:!0,hot:!0})]}},async start(){for(let[e,n]of[[`env.d.ts`,``],[`solid.ts`,Ln],[`unwrap.ts`,Rn],[`pageSamples/styles.module.css`,Mn],[`pageSamples/welcome.tsx`,Nn],[`pageSamples/page.tsx`,jn],[`pageSamples/404.tsx`,An],...t?.tanstack?.query?[[`app.tsx`,En],[`query.ts`,Pn]]:[[`app.tsx`,Tn],[`query.ts`,`/** tanstack query disabled */`]]])await a(r.lib(e),n,{});for(let[e,t]of[[`pages/404.tsx`,Wn],[`components/Link.tsx`,Bn],[`app.tsx`,zn],[`router.ts`,Jn]])await o(r.src(e),t,{entryDir:l.entryDir},{overwrite:u});await o(r.src(`index.html`),Un,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,Vn],[`server.ts`,Hn]])await o(r.entry(e),t,{},{overwrite:u})},async watch(e,t){await f(e.filter(m(t,[`create`]))),await p(e)},async build(e){await f(e),await p(e)},async ssrBuild(){await a(r.lib(`query.ts`),t?.tanstack?.query?Fn:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Xn=h({meta:{name:`SolidJS`,jsx:`preserve`,jsxImportSource:`solid-js`},dependencies(e){return{"solid-js":G.devDependencies[`solid-js`],"@solidjs/router":G.devDependencies[`@solidjs/router`],"path-to-regexp":G.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/solid-query":G.devDependencies[`@tanstack/solid-query`]}:{}}},factory:Yn}),Zn=g(e=>{let{generators:i=[],refineTypeName:a,...o}={...e.config},{createPath:s}=y(e);return{async postBuild(){let a=s.distDir(`ssg`),c=n(a,`../ssr/server.js`);if(!await ce(c,le.F_OK).then(()=>!0,()=>!1)){console.error(),console.error(r(`red`,`❗Please enable ssrGenerator in ${e.name}/kosmo.config.ts`)),console.error(` SSG generator can not run without SSR server`),console.error();return}let l=te(`${e.name}: SSG`);l.append(`preparing...`);let{createDisposableServer:u}=await import(c);await O(n(a,`../client/assets`),t(a,`assets`),{recursive:!0}),l.append(`bundling routes...`),await E(_(o,...i.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:s.lib(),appType:`custom`,plugins:[C.tsconfigPaths(e),C.nodePrefix()],resolve:{conditions:[`node`]},build:{ssr:s.lib(`ssg.ts`),target:`esnext`,sourcemap:!1,emptyOutDir:!0,rolldownOptions:{output:{dir:a,entryFileNames:`routes.js`,format:`esm`}}}}));try{let e=await import(t(a,`routes.js`)).then(e=>e.default);u(async n=>{for(let[r,i]of e.entries()){l.append(`[ ${r+1} of ${e.length} ] ${i}`);let o=await Qn(n,i);o!==void 0&&(await ue(t(a,i),{recursive:!0}),await de(t(a,t(i,`index.html`)),o,`utf8`))}l.succeed(`done ✨`)})}finally{await k(`${a}/routes.js`)}}}}),Qn=async(e,t)=>{try{let n=`http://localhost:${e}${t}`;return await(await fetch(n)).text()}catch(e){console.error(r(`red`,`✗ SSG: Failed generating ${t} route: ${e.message}`));return}},$n=h({meta:{name:`SSG`,slot:`ssg`},factory:Zn}),q={type:`module`,private:!0,name:`@kosmojs/ssr-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,vite:`^8.2.2`},devDependencies:{"@hono/node-server":`^2.1.1`,hono:`^4.13.3`,"light-my-request":`^6.6.0`,tinyglobby:`^0.2.17`}},er=`{{#if apiGenerator}}
5219
5279
  export { default as apiApp } from "{{ createImport 'api' 'app' }}";
5220
5280
  {{else}}
5221
5281
  export const apiApp = undefined;
5222
5282
  {{/if}}
5223
- `,$n=`import { AsyncLocalStorage } from "node:async_hooks";
5283
+ `,tr=`import { AsyncLocalStorage } from "node:async_hooks";
5224
5284
 
5225
5285
  import type { FetchApp, NodeApp } from "@kosmojs/core";
5226
5286
 
@@ -5264,7 +5324,7 @@ export const store = new AsyncLocalStorage<RequestContext>();
5264
5324
  export const isFetchApp = (app: FetchApp | NodeApp): app is FetchApp => {
5265
5325
  return typeof (app as FetchApp).fetch === "function";
5266
5326
  };
5267
- `,er=`import { type RequestContext, store } from "./base";
5327
+ `,nr=`import { type RequestContext, store } from "./base";
5268
5328
 
5269
5329
  import { renderWrapper } from "{{ createImport 'libEntry' 'server' }}";
5270
5330
 
@@ -5286,7 +5346,7 @@ export const withSsrContext = <T>(
5286
5346
  export const errorProvider = () => {
5287
5347
  return store.getStore()?.error;
5288
5348
  };
5289
- `,tr=`import type { FetchApp, NodeApp } from "@kosmojs/core";
5349
+ `,rr=`import type { FetchApp, NodeApp } from "@kosmojs/core";
5290
5350
  import type { Transport } from "@kosmojs/core/fetch";
5291
5351
 
5292
5352
  import {
@@ -5489,12 +5549,12 @@ const pathnameOf = (input: RequestInfo | URL): string => {
5489
5549
  } catch {}
5490
5550
  return String(input);
5491
5551
  };
5492
- `,nr=`export const routeMap = [
5552
+ `,ir=`export const routeMap = [
5493
5553
  {{#each pageRoutes}}
5494
5554
  { pathPattern: "{{honoPattern}}", renderMode: "{{renderMode}}" },
5495
5555
  {{/each}}
5496
5556
  ];
5497
- `,rr=`import { access, chmod, constants, readFile, unlink } from "node:fs/promises";
5557
+ `,ar=`import { access, chmod, constants, readFile, unlink } from "node:fs/promises";
5498
5558
  import {
5499
5559
  createServer,
5500
5560
  type IncomingMessage,
@@ -5910,14 +5970,14 @@ if (isMain) {
5910
5970
  process.exit(1);
5911
5971
  }
5912
5972
  }
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">
5973
+ `,or=`string`,sr=g((e,r)=>{let{generators:i=[],refineTypeName:a,...o}=e.config,{createPath:c,createImportHelpers:l}=y(e),{renderToFile:u}=x({helpers:{...l({origin:`lib`})}});return{async build(e){let t=r?.renderMode?typeof r.renderMode==`string`?()=>r.renderMode:s(r?.renderMode,`string`):()=>or,n={renderMode:JSON.stringify(r?.renderMode||null),pageRoutes:e.flatMap(e=>e.kind===`pageRoute`?[{...e.entry,renderMode:t(e.entry.name)}]:[]).sort(S),apiGenerator:i.some(e=>e.meta.slot===`backend`)};for(let[e,t]of[[`ssr.ts`,ar],[`@ssr/api.ts`,er],[`@ssr/__kosmo_ssr_bundle.ts`,nr],[`@ssr/base.ts`,tr],[`@ssr/fetch.ts`,rr],[`@ssr/routes.ts`,ir]])await u(c.lib(e),t,n)},async postBuild(){let r=c.distDir(`ssr`),a=[C.tsconfigPaths(e),C.nodePrefix()];for(let t of i)await t.factory(e).ssrBuild?.();await E(_(o,...i.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:c.src(),plugins:a,define:{KOSMO_PRODUCTION_BUILD:`true`},build:{ssr:c.lib(`@ssr/__kosmo_ssr_bundle`),ssrEmitAssets:!0,sourcemap:!0,emptyOutDir:!0,minify:!1,rolldownOptions:{output:{dir:r,entryFileNames:`app.js`,format:`esm`}}}})),await E({root:c.lib(),configFile:!1,appType:`custom`,plugins:a,resolve:{conditions:[`node`]},build:{ssr:c.lib(`ssr.ts`),target:`esnext`,sourcemap:!0,emptyOutDir:!0,rolldownOptions:{output:{dir:t(r,`server`),entryFileNames:`server.js`,format:`esm`}}}}),await O(n(r,`../client`),r,{recursive:!0});for(let e of[`server.js`,`server.js.map`])await O(`${r}/server/${e}`,`${r}/${e}`);await k(`${r}/server`,{recursive:!0,force:!0})}}}),cr=h({meta:{name:`SSR`,slot:`ssr`},dependencies:{tinyglobby:q.devDependencies.tinyglobby,hono:q.devDependencies.hono,"@hono/node-server":q.devDependencies[`@hono/node-server`],"light-my-request":q.devDependencies[`light-my-request`]},factory:sr}),J={type:`module`,private:!0,name:`@kosmojs/svelte-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"@sveltejs/vite-plugin-svelte":`^7.3.0`,vite:`^8.2.2`},devDependencies:{"@tanstack/svelte-query":`^6.1.41`,"path-to-regexp":`^8.4.2`,svelte:`^5.56.10`}},lr=()=>{let e=[`🎉 Well done! You just created a new Svelte page.`,`🚀 Success! A fresh Svelte page is ready to roll.`,`🌟 Nice work! Another Svelte page added to your app.`,`🧩 All set! A new Svelte page has been scaffolded.`,`🔧 Scaffold complete! Your new Svelte page is in place.`,`✅ Built! Your Svelte page is scaffolded and ready.`,`✨ Fantastic! Your new Svelte page is good to go.`,`🎯 Nailed it! A brand new Svelte page just landed.`,`💫 Awesome! Another Svelte page joins the party.`,`⚡ Lightning fast! A new Svelte page created successfully.`];return e[Math.floor(Math.random()*e.length)]},Y=`<script lang="ts">
5914
5974
  import type { Snippet } from "svelte";
5915
5975
 
5916
5976
  let { children }: { children: Snippet } = $props();
5917
5977
  <\/script>
5918
5978
 
5919
5979
  {@render children()}
5920
- `,cr=`<script lang="ts">
5980
+ `,ur=`<script lang="ts">
5921
5981
  import { type QueryClient, QueryClientProvider } from "@tanstack/svelte-query";
5922
5982
  import type { Snippet } from "svelte";
5923
5983
 
@@ -5934,7 +5994,7 @@ if (isMain) {
5934
5994
  <QueryClientProvider client={queryClient}>
5935
5995
  {@render children()}
5936
5996
  </QueryClientProvider>
5937
- `,lr=`import { hydrate as hydrateOrig, mount as mountOrig } from "svelte";
5997
+ `,dr=`import { hydrate as hydrateOrig, mount as mountOrig } from "svelte";
5938
5998
  import type { RouterFactoryReturn } from "@kosmojs/core";
5939
5999
  import { clientRenderFactory } from "@kosmojs/core/generators";
5940
6000
 
@@ -5975,7 +6035,7 @@ export const mount = async (
5975
6035
  }
5976
6036
 
5977
6037
  export default clientRenderFactory();
5978
- `,ur=`import { render as renderOrig } from "svelte/server";
6038
+ `,fr=`import { render as renderOrig } from "svelte/server";
5979
6039
 
5980
6040
  import type {
5981
6041
  RenderToStringWrapper,
@@ -6041,12 +6101,12 @@ export const renderToString: RenderToStringWrapper<
6041
6101
  // svelte/server exposes only render() - no web-stream renderer -
6042
6102
  // so this folder is string-only SSR.
6043
6103
  export default serverRenderFactory<false>();
6044
- `,dr=`declare module "*.svelte" {
6104
+ `,pr=`declare module "*.svelte" {
6045
6105
  import type { Component } from "svelte";
6046
6106
  const component: Component;
6047
6107
  export default component;
6048
6108
  }
6049
- `,fr=`<script lang="ts">
6109
+ `,mr=`<script lang="ts">
6050
6110
  /**
6051
6111
  * Folds [app, ...layouts] around the page component.
6052
6112
  *
@@ -6080,7 +6140,7 @@ export default serverRenderFactory<false>();
6080
6140
  {/snippet}
6081
6141
 
6082
6142
  {@render layer(0)}
6083
- `,pr=`<script lang="ts">
6143
+ `,hr=`<script lang="ts">
6084
6144
  import styles from "./styles.module.css";
6085
6145
 
6086
6146
  let { headline }: { headline?: string } = $props();
@@ -6112,7 +6172,7 @@ export default serverRenderFactory<false>();
6112
6172
  </div>
6113
6173
  </div>
6114
6174
  </div>
6115
- `,mr=`<script lang="ts">
6175
+ `,gr=`<script lang="ts">
6116
6176
  import styles from "./styles.module.css";
6117
6177
 
6118
6178
  let {
@@ -6157,7 +6217,7 @@ export default serverRenderFactory<false>();
6157
6217
  </div>
6158
6218
  </div>
6159
6219
  </div>
6160
- `,hr=`* {
6220
+ `,_r=`* {
6161
6221
  margin: 0;
6162
6222
  padding: 0;
6163
6223
  box-sizing: border-box;
@@ -6292,7 +6352,7 @@ export default serverRenderFactory<false>();
6292
6352
  align-items: center;
6293
6353
  gap: 0.25rem;
6294
6354
  }
6295
- `,gr=`<script lang="ts">
6355
+ `,vr=`<script lang="ts">
6296
6356
  import styles from "./styles.module.css";
6297
6357
  <\/script>
6298
6358
 
@@ -6350,7 +6410,7 @@ export default serverRenderFactory<false>();
6350
6410
  </div>
6351
6411
  </div>
6352
6412
  </div>
6353
- `,_r=`export type ParamsMap = {
6413
+ `,yr=`export type ParamsMap = {
6354
6414
  {{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
6355
6415
  {{/each}}
6356
6416
  };
@@ -6359,7 +6419,7 @@ export const paramNames = {
6359
6419
  {{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
6360
6420
  {{/each}}
6361
6421
  } as const;
6362
- `,vr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6422
+ `,br=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6363
6423
 
6364
6424
  let client: QueryClient | undefined;
6365
6425
 
@@ -6374,7 +6434,7 @@ export const getQueryClient = (): QueryClient => {
6374
6434
  }
6375
6435
  return client;
6376
6436
  };
6377
- `,yr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6437
+ `,xr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
6378
6438
 
6379
6439
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
6380
6440
 
@@ -6397,7 +6457,7 @@ export const getQueryClient = (): QueryClient => {
6397
6457
  }
6398
6458
  return ctx.tsqClient as QueryClient;
6399
6459
  };
6400
- `,br=`import type { RouterFactoryReturn } from "@kosmojs/core";
6460
+ `,Sr=`import type { RouterFactoryReturn } from "@kosmojs/core";
6401
6461
  import { createRouterFactory } from "@kosmojs/core/generators";
6402
6462
 
6403
6463
  import Layouts from "./Layouts.svelte";
@@ -6437,7 +6497,7 @@ export default createRouterFactory<
6437
6497
  Promise<RouteComponent>,
6438
6498
  { server: { route: Route } }
6439
6499
  >();
6440
- `,xr=`import { match, pathToRegexp } from "path-to-regexp";
6500
+ `,Cr=`import { match, pathToRegexp } from "path-to-regexp";
6441
6501
  import { type Component, createContext } from "svelte";
6442
6502
 
6443
6503
  import { parseSearchParams } from "@kosmojs/core";
@@ -6639,7 +6699,11 @@ export const createRoute = (
6639
6699
  loader: RawRoute["loader"],
6640
6700
  layouts: RawRoute["layouts"],
6641
6701
  ): RawRoute => {
6642
- const path = \`\${base}/\${pathPattern}\`.replace(/\\/+/g, "/");
6702
+ // strip trailing slash (keeping a sole "/") so the base-joined index route
6703
+ // matches both with and without it - "/docs/" as a pattern rejects "/docs"
6704
+ const path = \`\${base}/\${pathPattern}\`
6705
+ .replace(/\\/+/g, "/")
6706
+ .replace(/(.+)\\/$/, "$1");
6643
6707
 
6644
6708
  const { regexp } = pathToRegexp(path, { sensitive: true });
6645
6709
  const matcher = match<Route["params"]>(path);
@@ -6647,9 +6711,11 @@ export const createRoute = (
6647
6711
  return {
6648
6712
  name,
6649
6713
  regexp,
6714
+ // count segments of the same base-joined path the regexp matches against;
6715
+ // resolve() compares this against the full url pathname's segment count
6650
6716
  pathSegments: name.includes("...")
6651
6717
  ? undefined
6652
- : name.replace(/^index(\\/?|$)/, "").split("/").length,
6718
+ : path.split("/").filter(Boolean).length,
6653
6719
  extractParams: (path) => {
6654
6720
  const match = matcher(path);
6655
6721
  return match ? match.params : {};
@@ -6658,7 +6724,7 @@ export const createRoute = (
6658
6724
  layouts,
6659
6725
  };
6660
6726
  };
6661
- `,Sr=`import { getRouteContext } from "./svelte";
6727
+ `,wr=`import { getRouteContext } from "./svelte";
6662
6728
 
6663
6729
  import type { ParamsMap, paramNames } from "{{ createImport 'lib' 'params' }}";
6664
6730
 
@@ -6698,7 +6764,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6698
6764
  const route = useRoute();
6699
6765
  return route.loaderData?.[key || route.name] as T;
6700
6766
  };
6701
- `,Cr=`<script lang="ts">
6767
+ `,Tr=`<script lang="ts">
6702
6768
  import { AppProvider } from "{{ createImport 'lib' 'app' }}";
6703
6769
  import type { Snippet } from "svelte";
6704
6770
 
@@ -6708,7 +6774,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6708
6774
  <AppProvider>
6709
6775
  {@render children()}
6710
6776
  </AppProvider>
6711
- `,wr=`<script lang="ts">
6777
+ `,Er=`<script lang="ts">
6712
6778
  import type { Snippet } from "svelte";
6713
6779
  import type { HTMLAnchorAttributes } from "svelte/elements";
6714
6780
 
@@ -6727,12 +6793,12 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
6727
6793
 
6728
6794
  const href = $derived.by(() => {
6729
6795
  const [key, ...params] = to;
6730
- return pageRouteMap[key]?.base(params as never, query);
6796
+ return pageRouteMap[key]?.path(params as never, query);
6731
6797
  });
6732
6798
  <\/script>
6733
6799
 
6734
6800
  <a {href} {...rest}>{@render children?.()}</a>
6735
- `,Tr=`import renderFactory, {
6801
+ `,Dr=`import renderFactory, {
6736
6802
  createRoutes,
6737
6803
  hydrate,
6738
6804
  mount,
@@ -6759,7 +6825,7 @@ if (root) {
6759
6825
  } else {
6760
6826
  console.error("❌ Root element not found!");
6761
6827
  }
6762
- `,Er=`import renderFactory, {
6828
+ `,Or=`import renderFactory, {
6763
6829
  createRoutes,
6764
6830
  renderToString,
6765
6831
  // no renderToStream on Svelte folders
@@ -6780,7 +6846,7 @@ export default renderFactory(() => {
6780
6846
  },
6781
6847
  };
6782
6848
  });
6783
- `,Dr=`<!doctype html>
6849
+ `,kr=`<!doctype html>
6784
6850
  <html lang="en">
6785
6851
  <head>
6786
6852
  <meta charset="UTF-8" />
@@ -6792,19 +6858,19 @@ export default renderFactory(() => {
6792
6858
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
6793
6859
  </body>
6794
6860
  </html>
6795
- `,Or=`<script lang="ts">
6861
+ `,Ar=`<script lang="ts">
6796
6862
  import PageSample from "{{ createImport 'lib' 'pageSamples/404.svelte' }}";
6797
6863
  <\/script>
6798
6864
 
6799
6865
  <PageSample />
6800
- `,kr=`<script lang="ts">
6866
+ `,jr=`<script lang="ts">
6801
6867
  import type { Snippet } from "svelte";
6802
6868
 
6803
6869
  let { children }: { children: Snippet } = $props();
6804
6870
  <\/script>
6805
6871
 
6806
6872
  {@render children()}
6807
- `,Ar=`<script lang="ts">
6873
+ `,Mr=`<script lang="ts">
6808
6874
  import PageSample from "{{ createImport 'lib' 'pageSamples/page.svelte' }}";
6809
6875
 
6810
6876
  const pathMap = {
@@ -6823,7 +6889,7 @@ export default renderFactory(() => {
6823
6889
  routeName={"{{route.name}}"}
6824
6890
  {pathMap}
6825
6891
  />
6826
- `,jr=`<script lang="ts">
6892
+ `,Nr=`<script lang="ts">
6827
6893
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.svelte' }}";
6828
6894
  <\/script>
6829
6895
 
@@ -6836,7 +6902,7 @@ export default renderFactory(() => {
6836
6902
  </svelte:head>
6837
6903
 
6838
6904
  <WelcomePage />
6839
- `,Mr=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
6905
+ `,Pr=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
6840
6906
 
6841
6907
  import app from "./app.svelte";
6842
6908
 
@@ -6851,7 +6917,7 @@ export default routerFactory((routes) => {
6851
6917
  },
6852
6918
  };
6853
6919
  });
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";
6920
+ `,Fr=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,Mr),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?Nr:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:lr()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),jr,{route:r},{overwrite:o})},d=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),r=e.flatMap(({kind:e,entry:n})=>{if(e===`pageRoute`){let{name:e,file:r}=n;return[{...n,layouts:t.flatMap(t=>t.name===e||r.startsWith(`${t.name}/`)?[t]:[]).sort(S)}]}return[]}).sort(S);for(let[e,a]of[[`client.ts`,dr],[`server.ts`,fr]])await i(n.libEntry(e),a,{pageRoutes:r,layouts:t});for(let[e,t]of[[`params.ts`,yr],[`router.ts`,Sr]])await i(n.lib(e),t,{pageRoutes:r})};return{config(){let{templates:e,...n}={...t};return{plugins:fe(n)}},async start(){for(let[e,r]of[[`env.d.ts`,pr],[`svelte.ts`,Cr],[`Layouts.svelte`,mr],[`use.ts`,wr],[`pageSamples/styles.module.css`,_r],[`pageSamples/welcome.svelte`,vr],[`pageSamples/page.svelte`,gr],[`pageSamples/404.svelte`,hr],...t?.tanstack?.query?[[`app/app.svelte`,Y],[`app/app-tsq.svelte`,ur],[`app/index.ts`,`export { default as AppProvider } from "./app-tsq.svelte";`],[`query.ts`,br]]:[[`app/app.svelte`,Y],[`app/app-tsq.svelte`,`/** tanstack query disabled */`],[`app/index.ts`,`export { default as AppProvider } from "./app.svelte";`],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.svelte`,Ar],[`components/Link.svelte`,Er],[`app.svelte`,Tr],[`router.ts`,Pr]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});await a(n.src(`index.html`),kr,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,Dr],[`server.ts`,Or]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){await u(e.filter(m(t,[`create`]))),await d(e)},async build(e){await u(e),await d(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?xr:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Ir=h({meta:{name:`Svelte`},dependencies(e){return{svelte:J.devDependencies.svelte,"path-to-regexp":J.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/svelte-query":J.devDependencies[`@tanstack/svelte-query`]}:{}}},factory:Fr}),Lr={type:`module`,private:!0,name:`@kosmojs/typebox-generator`,version:`0.3.0`,cacheVersion:`1`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/typebox-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,crc:`^4.3.2`,semver:`^7.8.5`},devDependencies:{"@kosmojs/core-generator":`workspace:^`,"@kosmojs/koa-generator":`workspace:^`,typebox:`^1.3.18`}},Rr=`import Type from "typebox";
6855
6921
 
6856
6922
  /**
6857
6923
  * Custom types for JavaScript constructs that have no JSON Schema
@@ -6923,7 +6989,7 @@ export default {
6923
6989
  Buffer: TBuffer(),
6924
6990
  ArrayBuffer: TArrayBuffer(),
6925
6991
  };
6926
- `,Lr=`import type { TValidationError } from "typebox/error";
6992
+ `,zr=`import type { TValidationError } from "typebox/error";
6927
6993
 
6928
6994
  import type { ValidationErrorEntry } from "@kosmojs/core";
6929
6995
 
@@ -8107,7 +8173,7 @@ const format = (fmt: string, ...args: unknown[]): string => {
8107
8173
 
8108
8174
  return str;
8109
8175
  };
8110
- `,Rr=`import Type from "typebox";
8176
+ `,Br=`import Type from "typebox";
8111
8177
  import { Compile } from "typebox/compile";
8112
8178
  import Value from "typebox/value";
8113
8179
 
@@ -8159,14 +8225,14 @@ export const validationSchemaFactory = (
8159
8225
  },
8160
8226
  };
8161
8227
  };
8162
- `,zr=`import { Settings } from "typebox/system";
8228
+ `,Vr=`import { Settings } from "typebox/system";
8163
8229
 
8164
8230
  Settings.Set({{settings}});
8165
8231
 
8166
8232
  export { default as customTypes } from "{{customTypesImport}}";
8167
8233
 
8168
8234
  export const validationMessages = {{validationMessages}};
8169
- `,Br=`import type { ValidationSchemas } from "@kosmojs/core";
8235
+ `,Hr=`import type { ValidationSchemas } from "@kosmojs/core";
8170
8236
 
8171
8237
  import { validationSchemaFactory } from "{{ createImport 'lib' '@typebox' }}";
8172
8238
 
@@ -8227,14 +8293,14 @@ export const validationSchemas: ValidationSchemas = {
8227
8293
  {{/each}}
8228
8294
  },
8229
8295
  };
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";
8296
+ `,Ur={exactOptionalPropertyTypes:!0},Wr=g((e,t)=>{let{createPath:n,createImport:r,createImportHelpers:i}=y(e),{renderToFile:a}=x({helpers:{...i({origin:`lib`})}}),{validationMessages:s={},customTypesImport:c=r.lib([`@typebox/custom-types`],{origin:`lib`}),settings:l}={...t},u=async e=>{for(let{kind:t,entry:r}of e){if(t!==`apiRoute`)continue;let e=[r.params,...r.validationDefinitions.flatMap(e=>e.target===`response`?e.variants:[e.schema])].flatMap(({resolvedType:e})=>e?[e]:[]),i=[...new Set(r.validationDefinitions.flatMap(({target:e})=>Object.keys(o).includes(e)?[e]:[]))].map(e=>({target:e,methods:r.methods.flatMap(t=>{let n=r.validationDefinitions.find(n=>n.method===t&&n.target===e);return n?[{route:r.name,method:t,target:e,schema:n.schema,...n.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(n.runtimeValidation)},...n.customErrors===void 0?{}:{customErrors:JSON.stringify(n.customErrors)}}]:[]})})),s=r.methods.flatMap(e=>{let t=r.validationDefinitions.find(t=>t.method===e&&t.target===`response`);return t?[{method:e,variants:t.variants.map(e=>({route:r.name,target:`response`,...e,...t.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(t.runtimeValidation)},...t.customErrors===void 0?{}:{customErrors:JSON.stringify(t.customErrors)}}))}]:[]});await a(n.libApi(r.name,`schemas.ts`),Hr,{route:r,resolvedTypes:e,requestSchemas:i,responseSchemas:s})}};return{async start(){for(let[e,t]of[[`custom-types.ts`,Rr],[`error-handler.ts`,zr],[`index.ts`,Br],[`setup.ts`,Vr]])await a(n.lib(`@typebox`,e),t,{validationMessages:JSON.stringify(s),customTypesImport:c,settings:JSON.stringify({...Ur,...l})})},async watch(e,t){await u(e.filter(p(t,[`create`,`update`])))},async build(e){await u(e)}}}),X={PROPERTY:`PROPERTY`,PROPERTIES:`PROPERTIES`,ALLOWED_VALUES:`ALLOWED_VALUES`,FOUND_N_DUPLICATES:`FOUND_N_DUPLICATES`,VALIDATION_PASSED:`VALIDATION_PASSED`,VALIDATION_FAILED_PREFIX:`VALIDATION_FAILED_PREFIX`,ERROR_SUMMARY:`ERROR_SUMMARY`,PLURAL_SUFFIX:`PLURAL_SUFFIX`,FIRST:`FIRST`,SECOND:`SECOND`,THIRD:`THIRD`,FOURTH:`FOURTH`,FIFTH:`FIFTH`,TYPE_INVALID:`TYPE_INVALID`,STRING_MIN_LENGTH:`STRING_MIN_LENGTH`,STRING_MAX_LENGTH:`STRING_MAX_LENGTH`,STRING_PATTERN:`STRING_PATTERN`,STRING_FORMAT:`STRING_FORMAT`,STRING_FORMAT_EMAIL:`STRING_FORMAT_EMAIL`,STRING_FORMAT_DATE:`STRING_FORMAT_DATE`,STRING_FORMAT_DATETIME:`STRING_FORMAT_DATETIME`,STRING_FORMAT_TIME:`STRING_FORMAT_TIME`,STRING_FORMAT_URI:`STRING_FORMAT_URI`,STRING_FORMAT_URL:`STRING_FORMAT_URL`,STRING_FORMAT_UUID:`STRING_FORMAT_UUID`,STRING_FORMAT_IPV4:`STRING_FORMAT_IPV4`,STRING_FORMAT_IPV6:`STRING_FORMAT_IPV6`,STRING_FORMAT_HOSTNAME:`STRING_FORMAT_HOSTNAME`,STRING_FORMAT_JSON_POINTER:`STRING_FORMAT_JSON_POINTER`,STRING_FORMAT_REGEX:`STRING_FORMAT_REGEX`,NUMBER_MINIMUM:`NUMBER_MINIMUM`,NUMBER_MAXIMUM:`NUMBER_MAXIMUM`,NUMBER_EXCLUSIVE_MINIMUM:`NUMBER_EXCLUSIVE_MINIMUM`,NUMBER_EXCLUSIVE_MAXIMUM:`NUMBER_EXCLUSIVE_MAXIMUM`,NUMBER_MULTIPLE_OF:`NUMBER_MULTIPLE_OF`,ARRAY_MIN_ITEMS:`ARRAY_MIN_ITEMS`,ARRAY_MAX_ITEMS:`ARRAY_MAX_ITEMS`,ARRAY_UNIQUE_ITEMS:`ARRAY_UNIQUE_ITEMS`,ARRAY_CONTAINS:`ARRAY_CONTAINS`,ARRAY_MIN_CONTAINS:`ARRAY_MIN_CONTAINS`,ARRAY_MAX_CONTAINS:`ARRAY_MAX_CONTAINS`,ARRAY_PREFIX_ITEMS:`ARRAY_PREFIX_ITEMS`,ARRAY_ITEMS:`ARRAY_ITEMS`,ARRAY_UNEVALUATED_ITEMS:`ARRAY_UNEVALUATED_ITEMS`,TUPLE_MIN_ITEMS:`TUPLE_MIN_ITEMS`,TUPLE_MAX_ITEMS:`TUPLE_MAX_ITEMS`,OBJECT_REQUIRED:`OBJECT_REQUIRED`,OBJECT_ADDITIONAL_PROPERTIES:`OBJECT_ADDITIONAL_PROPERTIES`,OBJECT_MIN_PROPERTIES:`OBJECT_MIN_PROPERTIES`,OBJECT_MAX_PROPERTIES:`OBJECT_MAX_PROPERTIES`,OBJECT_PROPERTY_NAMES:`OBJECT_PROPERTY_NAMES`,OBJECT_DEPENDENCIES:`OBJECT_DEPENDENCIES`,OBJECT_UNEVALUATED_PROPERTIES:`OBJECT_UNEVALUATED_PROPERTIES`,ENUM_MISMATCH:`ENUM_MISMATCH`,CONST_MISMATCH:`CONST_MISMATCH`,CONDITIONAL_IF:`CONDITIONAL_IF`,CONDITIONAL_THEN:`CONDITIONAL_THEN`,CONDITIONAL_ELSE:`CONDITIONAL_ELSE`,COMPOSITION_ONE_OF:`COMPOSITION_ONE_OF`,COMPOSITION_ANY_OF:`COMPOSITION_ANY_OF`,COMPOSITION_ALL_OF:`COMPOSITION_ALL_OF`,COMPOSITION_NOT:`COMPOSITION_NOT`,CONTENT_DISCRIMINATOR:`CONTENT_DISCRIMINATOR`,CONTENT_ENCODING:`CONTENT_ENCODING`,CONTENT_MEDIA_TYPE:`CONTENT_MEDIA_TYPE`,CUSTOM_RANGE:`CUSTOM_RANGE`,CUSTOM_EXCLUSIVE_RANGE:`CUSTOM_EXCLUSIVE_RANGE`,CUSTOM_REGEXP:`CUSTOM_REGEXP`,CUSTOM_DYNAMIC_DEFAULTS:`CUSTOM_DYNAMIC_DEFAULTS`,CUSTOM_SELECT:`CUSTOM_SELECT`,CUSTOM_TRANSFORM:`CUSTOM_TRANSFORM`,CUSTOM_UNIQUE_ITEM_PROPERTIES:`CUSTOM_UNIQUE_ITEM_PROPERTIES`,UNKNOWN:`UNKNOWN`};X.PROPERTY,X.PROPERTIES,X.ALLOWED_VALUES,X.FOUND_N_DUPLICATES,X.VALIDATION_PASSED,X.VALIDATION_FAILED_PREFIX,X.ERROR_SUMMARY,X.PLURAL_SUFFIX,X.FIRST,X.SECOND,X.THIRD,X.FOURTH,X.FIFTH,X.TYPE_INVALID,X.STRING_MIN_LENGTH,X.STRING_MAX_LENGTH,X.STRING_PATTERN,X.STRING_FORMAT,X.STRING_FORMAT_EMAIL,X.STRING_FORMAT_DATE,X.STRING_FORMAT_DATETIME,X.STRING_FORMAT_TIME,X.STRING_FORMAT_URI,X.STRING_FORMAT_URL,X.STRING_FORMAT_UUID,X.STRING_FORMAT_IPV4,X.STRING_FORMAT_IPV6,X.STRING_FORMAT_HOSTNAME,X.STRING_FORMAT_JSON_POINTER,X.STRING_FORMAT_REGEX,X.NUMBER_MINIMUM,X.NUMBER_MAXIMUM,X.NUMBER_EXCLUSIVE_MINIMUM,X.NUMBER_EXCLUSIVE_MAXIMUM,X.NUMBER_MULTIPLE_OF,X.ARRAY_MIN_ITEMS,X.ARRAY_MAX_ITEMS,X.ARRAY_UNIQUE_ITEMS,X.ARRAY_CONTAINS,X.ARRAY_MIN_CONTAINS,X.ARRAY_MAX_CONTAINS,X.ARRAY_PREFIX_ITEMS,X.ARRAY_ITEMS,X.ARRAY_UNEVALUATED_ITEMS,X.TUPLE_MIN_ITEMS,X.TUPLE_MAX_ITEMS,X.OBJECT_REQUIRED,X.OBJECT_ADDITIONAL_PROPERTIES,X.OBJECT_MIN_PROPERTIES,X.OBJECT_MAX_PROPERTIES,X.OBJECT_PROPERTY_NAMES,X.OBJECT_DEPENDENCIES,X.OBJECT_UNEVALUATED_PROPERTIES,X.ENUM_MISMATCH,X.CONST_MISMATCH,X.CONDITIONAL_IF,X.CONDITIONAL_THEN,X.CONDITIONAL_ELSE,X.COMPOSITION_ONE_OF,X.COMPOSITION_ANY_OF,X.COMPOSITION_ALL_OF,X.COMPOSITION_NOT,X.CONTENT_DISCRIMINATOR,X.CONTENT_ENCODING,X.CONTENT_MEDIA_TYPE,X.CUSTOM_RANGE,X.CUSTOM_EXCLUSIVE_RANGE,X.CUSTOM_REGEXP,X.CUSTOM_DYNAMIC_DEFAULTS,X.CUSTOM_SELECT,X.CUSTOM_TRANSFORM,X.CUSTOM_UNIQUE_ITEM_PROPERTIES,X.UNKNOWN;var Gr=h({meta:{name:`TypeBox`,resolveTypes:!0},dependencies:{typebox:Lr.devDependencies.typebox},factory:Wr}),Z={type:`module`,private:!0,name:`@kosmojs/vue-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/vue-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"@vitejs/plugin-vue":`^6.0.8`},devDependencies:{"@tanstack/vue-query":`^5.102.2`,"path-to-regexp":`^8.4.2`,vue:`^3.5.41`,"vue-router":`^5.2.0`}},Q=e=>{let t=e=>e.kind===`splat`?`:${e.name}(.*)?`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[t(e.parts[0])]:[e.parts.map(e=>e.type===`static`?e.value:t(e)).join(``)]).join(`/`)},Kr=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,n=(r,i)=>r.flatMap(({index:r,layout:a,children:o})=>{let{name:s,pathTokens:c}={...r,...a};if(!c)return[];let l=`${s}/layout`,u=i?Q(c):t(`/`,Q(c)),d=c.at(-1);return e(d)?r&&a?[{name:l,path:u,component:a.id,children:[{name:s,path:``,component:r.id}]}]:r?[{path:u,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:a?[{name:l,path:u,component:a.id,children:n(o,s)}]:[]:r&&a?[{name:l,path:u,component:a.id,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:r?[{path:u,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:a?[{name:l,path:u,component:a.id,children:n(o,s)}]:[]});return n},qr=()=>{let e=[`🎉 Well done! You just created a new Vue route.`,`🚀 Success! A fresh Vue route is ready to roll.`,`🌟 Nice work! Another Vue route added to your app.`,`🧩 All set! A new Vue route has been scaffolded.`,`🔧 Scaffold complete! Your new Vue route is in place.`,`✅ Built! Your Vue route is scaffolded and ready.`,`✨ Fantastic! Your new Vue route is good to go.`,`🎯 Nailed it! A brand new Vue route just landed.`,`💫 Awesome! Another Vue route joins the party.`,`⚡ Lightning fast! A new Vue route created successfully.`];return e[Math.floor(Math.random()*e.length)]},Jr=`import type { Plugin } from "vue";
8231
8297
 
8232
8298
  export { default as AppProvider } from "./provider.vue";
8233
8299
 
8234
8300
  export const appProvider: Plugin = {
8235
8301
  install() {},
8236
8302
  };
8237
- `,qr=`import { VueQueryPlugin } from "@tanstack/vue-query";
8303
+ `,Yr=`import { VueQueryPlugin } from "@tanstack/vue-query";
8238
8304
  import type { Plugin } from "vue";
8239
8305
 
8240
8306
  import { getQueryClient } from "../query";
@@ -8246,10 +8312,10 @@ export const appProvider: Plugin = {
8246
8312
  app.use(VueQueryPlugin, { queryClient: getQueryClient() });
8247
8313
  },
8248
8314
  };
8249
- `,Jr=`<template>
8315
+ `,Xr=`<template>
8250
8316
  <slot />
8251
8317
  </template>
8252
- `,Yr=`import type { App } from "vue";
8318
+ `,Zr=`import type { App } from "vue";
8253
8319
  import type { RouterFactoryReturn } from "@kosmojs/core";
8254
8320
  import { clientRenderFactory } from "@kosmojs/core/generators";
8255
8321
 
@@ -8289,7 +8355,7 @@ export const mount = async (
8289
8355
  }
8290
8356
 
8291
8357
  export default clientRenderFactory();
8292
- `,Xr=`{
8358
+ `,Qr=`{
8293
8359
  path: "{{path}}",
8294
8360
  {{#if name}}
8295
8361
  name: "{{name}}",
@@ -8307,7 +8373,7 @@ export default clientRenderFactory();
8307
8373
  children: [ {{#each children}}{{> routePartial}}, {{/each}}],
8308
8374
  {{/if}}
8309
8375
  }
8310
- `,Zr=`import type { App } from "vue";
8376
+ `,$r=`import type { App } from "vue";
8311
8377
 
8312
8378
  import {
8313
8379
  renderToString as renderToStringOrig,
@@ -8398,12 +8464,12 @@ export const renderToStream: RenderToStreamWrapper<
8398
8464
  }
8399
8465
 
8400
8466
  export default serverRenderFactory();
8401
- `,Qr=`declare module "*.vue" {
8467
+ `,$=`declare module "*.vue" {
8402
8468
  import type { DefineComponent } from "vue";
8403
8469
  const component: DefineComponent<{}, {}, any>;
8404
8470
  export default component;
8405
8471
  }
8406
- `,$r=`<script setup lang="ts">
8472
+ `,ei=`<script setup lang="ts">
8407
8473
  import styles from "./styles.module.css";
8408
8474
  defineProps<{
8409
8475
  headline?: string;
@@ -8442,7 +8508,7 @@ defineProps<{
8442
8508
  </div>
8443
8509
  </div>
8444
8510
  </template>
8445
- `,$=`<script setup lang="ts">
8511
+ `,ti=`<script setup lang="ts">
8446
8512
  import styles from "./styles.module.css";
8447
8513
  defineProps<{
8448
8514
  message: string;
@@ -8491,7 +8557,7 @@ defineProps<{
8491
8557
  </div>
8492
8558
  </div>
8493
8559
  </template>
8494
- `,ei=`* {
8560
+ `,ni=`* {
8495
8561
  margin: 0;
8496
8562
  padding: 0;
8497
8563
  box-sizing: border-box;
@@ -8624,7 +8690,7 @@ defineProps<{
8624
8690
  align-items: center;
8625
8691
  gap: 0.25rem;
8626
8692
  }
8627
- `,ti=`<script setup lang="ts">
8693
+ `,ri=`<script setup lang="ts">
8628
8694
  import styles from "./styles.module.css";
8629
8695
  <\/script>
8630
8696
 
@@ -8688,7 +8754,7 @@ import styles from "./styles.module.css";
8688
8754
  </div>
8689
8755
  </div>
8690
8756
  </template>
8691
- `,ni=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8757
+ `,ii=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8692
8758
 
8693
8759
  let client: QueryClient | undefined;
8694
8760
 
@@ -8703,7 +8769,7 @@ export const getQueryClient = (): QueryClient => {
8703
8769
  }
8704
8770
  return client;
8705
8771
  };
8706
- `,ri=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8772
+ `,ai=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
8707
8773
 
8708
8774
  import { store } from "{{ createImport 'lib' '@ssr/base' }}";
8709
8775
 
@@ -8726,7 +8792,7 @@ export const getQueryClient = (): QueryClient => {
8726
8792
  }
8727
8793
  return ctx.tsqClient as QueryClient;
8728
8794
  };
8729
- `,ii=`import {
8795
+ `,oi=`import {
8730
8796
  type App,
8731
8797
  type Component,
8732
8798
  createApp,
@@ -8855,7 +8921,18 @@ export const createRouters = (
8855
8921
  // would otherwise skip the guard
8856
8922
  installLoaderGuard(router);
8857
8923
 
8858
- await router.push(url.pathname + url.search);
8924
+ let { pathname } = url;
8925
+
8926
+ if (base !== "/") {
8927
+ // strip the base from pushed paths
8928
+ if (pathname === base) {
8929
+ pathname = "/";
8930
+ } else if (pathname.startsWith(\`\${base}/\`)) {
8931
+ pathname = pathname.slice(base.length);
8932
+ }
8933
+ }
8934
+
8935
+ await router.push(pathname + url.search);
8859
8936
 
8860
8937
  await router.isReady();
8861
8938
 
@@ -8877,14 +8954,14 @@ export default createRouterFactory<
8877
8954
  Promise<App>,
8878
8955
  { server: { loaderData: Record<string, unknown> } }
8879
8956
  >();
8880
- `,ai=`import { type Ref, unref } from "vue";
8957
+ `,si=`import { type Ref, unref } from "vue";
8881
8958
 
8882
8959
  export type MaybeWrapped<T> = Ref<T> | T;
8883
8960
 
8884
8961
  export function unwrap<T>(value: MaybeWrapped<T>): T {
8885
8962
  return unref(value);
8886
8963
  }
8887
- `,oi=`import { useRoute, useRouter } from "vue-router";
8964
+ `,ci=`import { useRoute, useRouter } from "vue-router";
8888
8965
 
8889
8966
  import type { RouterWithLoaderData } from "./router";
8890
8967
 
@@ -8899,7 +8976,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
8899
8976
  const route = useRoute();
8900
8977
  return router.__loaderData?.[key || (route.name as string)] as T;
8901
8978
  };
8902
- `,si=`<script setup lang="ts">
8979
+ `,li=`<script setup lang="ts">
8903
8980
  import { AppProvider } from "_/app";
8904
8981
  <\/script>
8905
8982
 
@@ -8908,39 +8985,40 @@ import { AppProvider } from "_/app";
8908
8985
  <RouterView />
8909
8986
  </AppProvider>
8910
8987
  </template>
8911
- `,ci=`<script setup lang="ts" generic="T extends LinkProps">
8988
+ `,ui=`<script setup lang="ts" generic="T extends LinkProps">
8912
8989
  import { computed } from "vue";
8913
8990
  import { RouterLink } from "vue-router";
8914
8991
 
8915
8992
  import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
8916
8993
 
8917
- interface Props {
8918
- to: T
8919
- query?: Record<string | number, unknown>
8920
- replace?: boolean
8921
- activeClass?: string
8922
- exactActiveClass?: string
8994
+ type Props = {
8995
+ to: T;
8996
+ query?: Record<string | number, unknown>;
8997
+ replace?: boolean;
8998
+ activeClass?: string;
8999
+ exactActiveClass?: string;
8923
9000
  }
8924
9001
 
8925
9002
  const props = defineProps<Props>();
8926
9003
 
8927
9004
  const href = computed(() => {
8928
- const [key, ...params] = props.to
8929
- return pageRouteMap[key]?.base(params as never, props.query)
9005
+ const [key, ...params] = props.to;
9006
+ return pageRouteMap[key]?.path(params as never, props.query, { prefix: false });
8930
9007
  })
9008
+
9009
+ const linkProps = computed(() => ({
9010
+ ...(props.replace !== undefined ? { replace: props.replace } : {}),
9011
+ ...(props.activeClass !== undefined ? { activeClass: props.activeClass } : {}),
9012
+ ...(props.exactActiveClass !== undefined ? { exactActiveClass: props.exactActiveClass } : {}),
9013
+ }))
8931
9014
  <\/script>
8932
9015
 
8933
9016
  <template>
8934
- <RouterLink
8935
- :to="href"
8936
- :replace="replace"
8937
- :active-class="activeClass"
8938
- :exact-active-class="exactActiveClass"
8939
- >
9017
+ <RouterLink :to="href" v-bind="linkProps">
8940
9018
  <slot />
8941
9019
  </RouterLink>
8942
9020
  </template>
8943
- `,li=`import renderFactory, {
9021
+ `,di=`import renderFactory, {
8944
9022
  createRoutes,
8945
9023
  hydrate,
8946
9024
  mount,
@@ -8967,7 +9045,7 @@ if (root) {
8967
9045
  } else {
8968
9046
  console.error("❌ Root element not found!");
8969
9047
  }
8970
- `,ui=`import renderFactory, {
9048
+ `,fi=`import renderFactory, {
8971
9049
  createRoutes,
8972
9050
  renderToStream,
8973
9051
  renderToString,
@@ -8994,7 +9072,7 @@ export default renderFactory(() => {
8994
9072
  },
8995
9073
  };
8996
9074
  });
8997
- `,di=`<!doctype html>
9075
+ `,pi=`<!doctype html>
8998
9076
  <html lang="en">
8999
9077
  <head>
9000
9078
  <meta charset="UTF-8" />
@@ -9006,17 +9084,17 @@ export default renderFactory(() => {
9006
9084
  <script type="module" src="/{{ entryDir }}/client.ts"><\/script>
9007
9085
  </body>
9008
9086
  </html>
9009
- `,fi=`<script setup lang="ts">
9087
+ `,mi=`<script setup lang="ts">
9010
9088
  import PageSample from "{{ createImport 'lib' 'pageSamples/404.vue' }}";
9011
9089
  <\/script>
9012
9090
 
9013
9091
  <template>
9014
9092
  <PageSample />
9015
9093
  </template>
9016
- `,pi=`<template>
9094
+ `,hi=`<template>
9017
9095
  <router-view />
9018
9096
  </template>
9019
- `,mi=`<script setup lang="ts">
9097
+ `,gi=`<script setup lang="ts">
9020
9098
  import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
9021
9099
  <\/script>
9022
9100
 
@@ -9031,14 +9109,14 @@ import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
9031
9109
  }"
9032
9110
  />
9033
9111
  </template>
9034
- `,hi=`<script setup lang="ts">
9112
+ `,_i=`<script setup lang="ts">
9035
9113
  import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.vue' }}";
9036
9114
  <\/script>
9037
9115
 
9038
9116
  <template>
9039
9117
  <WelcomePage />
9040
9118
  </template>
9041
- `,gi=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
9119
+ `,vi=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
9042
9120
  import { appProvider } from "{{ createImport 'lib' 'app' }}";
9043
9121
 
9044
9122
  import app from "./app.vue";
@@ -9057,5 +9135,5 @@ export default routerFactory((routes) => {
9057
9135
  },
9058
9136
  };
9059
9137
  });
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};
9138
+ `,yi=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()},partials:{routePartial:Qr}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=Kr(),s=e=>!e?.trim().length,u=c(t?.templates,gi),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?_i:u(r.name,r),{route:r,message:qr()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),hi,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(v(r));for(let[e,t]of[[`client.ts`,Zr],[`server.ts`,$r]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a,lazyLoad:e===`client.ts`});await i(n.lib(`router.ts`),oi,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[pe(n)]}},async start(){for(let[e,r]of[[`env.d.ts`,$],[`unwrap.ts`,si],[`use.ts`,ci],[`pageSamples/styles.module.css`,ni],[`pageSamples/welcome.vue`,ri],[`pageSamples/page.vue`,ti],[`pageSamples/404.vue`,ei],[`app/provider.vue`,Xr],...t?.tanstack?.query?[[`app/index.ts`,Yr],[`query.ts`,ii]]:[[`app/index.ts`,Jr],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.vue`,mi],[`components/Link.vue`,ui],[`app.vue`,li],[`router.ts`,vi]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});await a(n.src(`index.html`),pi,{entryDir:l.entryDir},{overwrite:e=>!e?.trim().length||!e.replace(/<!--[\s\S]*?-->/g,``).trim().length});for(let[e,t]of[[`client.ts`,di],[`server.ts`,fi]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){await d(e.filter(m(t,[`create`]))),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?ai:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),bi=h({meta:{name:`Vue`,jsxImportSource:`vue`},dependencies(e){return{vue:Z.devDependencies.vue,"vue-router":Z.devDependencies[`vue-router`],"path-to-regexp":Z.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/vue-query":Z.devDependencies[`@tanstack/vue-query`]}:{}}},factory:yi}),xi=e=>{let n=process.env.NODE_ENV||`development`,a=typeof e.base==`string`?e.base:e.base[n];if(!a?.trim())throw Error(r([`red`],`ERROR: Invalid Config - no base provided`));return{...e,base:t(`/`,a),apiBase:t(`/`,e.apiBase||i)}};export{e as coreGenerator,xi as defineConfig,I as fetchGenerator,ke as h3Generator,Je as honoGenerator,pt as koaGenerator,Ht as mdxGenerator,qt as openapiGenerator,Sn as reactGenerator,Xn as solidGenerator,$n as ssgGenerator,cr as ssrGenerator,Ir as svelteGenerator,Gr as typeboxGenerator,bi as vueGenerator};
9061
9139
  //# sourceMappingURL=index.js.map