@kosmojs/dev 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -8
- package/pkg/assets/{pkg-BhfEyKpY.js → pkg-dTglxmYm.js} +49 -16
- package/pkg/assets/pkg-dTglxmYm.js.map +1 -0
- package/pkg/chassis.js +1 -1
- package/pkg/chassis.js.map +1 -1
- package/pkg/index.js +464 -309
- package/pkg/index.js.map +1 -1
- package/pkg/assets/pkg-BhfEyKpY.js.map +0 -1
package/pkg/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{t as e}from"./assets/pkg-
|
|
2
|
-
`,
|
|
3
|
-
`,
|
|
1
|
+
import{t as e}from"./assets/pkg-dTglxmYm.js";import{join as t,resolve as n}from"node:path";import{styleText as r}from"node:util";import{DEFAULT_APIBASE as i,RequestBodyTargets as a,RequestValidationTargets as o,createRouteResolver as s,createTemplateResolver as c,defaults as l}from"@kosmojs/core";import{createH3Pattern as u,createHonoPattern as d,createPathPattern as f,createWatchedApiRouteEntriesFilter as p,createWatchedPageRouteEntriesFilter as m,defineGenerator as h,defineGeneratorFactory as g,mergeConfigs as _,nestedRoutesFactory as v,pathResolver as y,pathTokensFactory as b,renderFactory as x,renderToFile as ee,sortRoutes as S,spinnerFactory as te,vitePlugins as C}from"@kosmojs/lib";import{routeRenderHelpers as w}from"@kosmojs/core/generators";import{HTTPMethods as ne}from"@kosmojs/core/fetch";import T from"crc/crc32";import re from"@mdx-js/rollup";import{build as E,createFilter as ie}from"vite";import ae from"yaml";import{parse as oe}from"path-to-regexp";import se from"typebox";import ce from"@vitejs/plugin-react";import D from"vite-plugin-solid";import{access as le,constants as ue,cp as O,mkdir as de,rm as k,writeFile as fe}from"node:fs/promises";import{svelte as pe}from"@sveltejs/vite-plugin-svelte";import A from"@vitejs/plugin-vue";var j=`export * from "./transport";
|
|
2
|
+
`,M=`export const transport = undefined;
|
|
3
|
+
`,N=`{{#each routes}}
|
|
4
4
|
import {{id}} from "{{ createImport 'libApi' name 'fetch' }}";
|
|
5
5
|
{{/each}}
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@ export default {
|
|
|
18
18
|
{{/each}}
|
|
19
19
|
{{/each}}
|
|
20
20
|
}
|
|
21
|
-
`,
|
|
21
|
+
`,P=`import fetchFactory, { join } from "@kosmojs/core/fetch";
|
|
22
22
|
|
|
23
23
|
import { base, apiBase, apiRouteMap } from "{{ createImport 'libCore' }}";
|
|
24
24
|
import { transport } from "{{ createImport 'lib' '@fetch' }}";
|
|
@@ -118,9 +118,9 @@ export default {
|
|
|
118
118
|
href,
|
|
119
119
|
validationSchemas,
|
|
120
120
|
};
|
|
121
|
-
`,
|
|
121
|
+
`,F=`export type MaybeWrapped<T> = T;
|
|
122
122
|
export const unwrap = <T>(data: T) => data;
|
|
123
|
-
`,
|
|
123
|
+
`,I=g(e=>{let{createPath:t,createImportHelpers:n}=y(e),{renderToFile:r}=x({helpers:{...n({origin:`lib`}),...w()}}),i=async(e,n)=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]).sort(S);await r(t.lib(`fetch.ts`),N,{routes:i});for(let{kind:e,entry:i}of n)if(e===`apiRoute`){let e=[];for(let t of i.validationDefinitions)if(t.target===`response`)for(let{id:n,status:r,body:i,resolvedType:a}of t.variants)!i||Math.floor(r/100)!==2||e.push({id:n,target:t.target,method:t.method,resolvedType:a});else{let{id:n,resolvedType:r}=t.schema;e.push({id:n,target:t.target,method:t.method,resolvedType:r})}let n=Object.keys(ne),a=i.methods.flatMap(t=>n.includes(t)?[{method:t,payloadTypes:e.filter(e=>e.method===t&&![`headers`,`cookies`,`response`].includes(e.target)),responseType:e.find(e=>e.target===`response`&&e.method===t)}]:[]),o=Object.values(e.reduce((e,{id:t,target:n,method:r,resolvedType:i})=>(n===`response`&&(e[r]||(e[r]={method:r,types:[]}),e[r].types.push({id:t,target:n,method:r,resolvedType:i})),e),{}));await r(t.libApi(i.name,`fetch.ts`),P,{route:i,validationTypes:e,routeMethods:a,responseTypes:o})}};return{async start(){for(let[e,n]of[[`unwrap.ts`,F],[`@fetch/transport.ts`,M],[`@fetch/index.ts`,j]])await r(t.lib(e),n,{})},async watch(e,t){await i(e,e.filter(p(t,[`create`,`update`])))},async build(e){await i(e,e)},async ssrBuild(){for(let[e,n]of[[`@fetch/transport.ts`,`export { transport } from "${l.libPrefix}/@ssr/fetch";`]])await r(t.lib(e),n,{})}}}),L=h({meta:{name:`Fetch`,slot:`fetch`},factory:I}),R={type:`module`,private:!0,name:`@kosmojs/h3-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/h3-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,crc:`^4.3.2`},devDependencies:{h3:`2.0.1-rc.29`,vite:`^8.2.2`}},z=`import { H3, type Middleware } from "h3";
|
|
124
124
|
|
|
125
125
|
import type { Route, RouteDebugOption } from "@kosmojs/core/api";
|
|
126
126
|
|
|
@@ -168,23 +168,65 @@ export function appFactory(
|
|
|
168
168
|
} else if (debug) {
|
|
169
169
|
console.log(route.debug[typeof debug === "string" ? debug : "full"]);
|
|
170
170
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
171
|
+
|
|
172
|
+
// last middleware is the handler
|
|
173
|
+
const handler = route.middleware.at(-1);
|
|
174
|
+
|
|
175
|
+
if (handler) {
|
|
176
|
+
app.on(route.method, route.path, handler as never, {
|
|
177
|
+
middleware: route.middleware.slice(0, -1),
|
|
178
|
+
});
|
|
179
|
+
if (
|
|
180
|
+
route.method === "GET" &&
|
|
181
|
+
!routes.some((e) => e.path === route.path && e.method === "HEAD")
|
|
182
|
+
) {
|
|
183
|
+
/**
|
|
184
|
+
* Register HEAD against the sibling GET handler,
|
|
185
|
+
* matching the HEAD-via-GET dispatch hono and koa provide natively.
|
|
186
|
+
* */
|
|
187
|
+
app.on("HEAD", route.path, handler as never, {
|
|
176
188
|
middleware: route.middleware.slice(0, -1),
|
|
177
189
|
});
|
|
178
190
|
}
|
|
179
191
|
}
|
|
180
192
|
}
|
|
181
193
|
|
|
194
|
+
const routesByPath = routes.reduce<Record<string, Array<Route<Middleware>>>>(
|
|
195
|
+
(map, route) => {
|
|
196
|
+
if (!map[route.path]) {
|
|
197
|
+
map[route.path] = [];
|
|
198
|
+
}
|
|
199
|
+
map[route.path].push(route);
|
|
200
|
+
return map;
|
|
201
|
+
},
|
|
202
|
+
{},
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
for (const [path, routes] of Object.entries(routesByPath)) {
|
|
206
|
+
const methods = routes.map((e) => e.method);
|
|
207
|
+
|
|
208
|
+
app.all(path, (event) => {
|
|
209
|
+
const allowedMethods = new Set([...methods, "OPTIONS"]);
|
|
210
|
+
|
|
211
|
+
if (methods.includes("GET")) {
|
|
212
|
+
allowedMethods.add("HEAD");
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const status = event.req.method === "OPTIONS" ? 204 : 405;
|
|
216
|
+
|
|
217
|
+
return new Response(undefined, {
|
|
218
|
+
status,
|
|
219
|
+
headers: { Allow: [...allowedMethods].join(", ") },
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
182
224
|
return app;
|
|
183
225
|
}
|
|
184
|
-
`,
|
|
226
|
+
`,B=`import type { DevSetup } from "@kosmojs/core/api";
|
|
185
227
|
|
|
186
228
|
export const devSetup = (setup: DevSetup) => setup;
|
|
187
|
-
`,
|
|
229
|
+
`,me=`import { type H3Event, HTTPError } from "h3";
|
|
188
230
|
|
|
189
231
|
import { ValidationError } from "@kosmojs/core/errors";
|
|
190
232
|
|
|
@@ -208,7 +250,7 @@ export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
|
|
|
208
250
|
);
|
|
209
251
|
};
|
|
210
252
|
};
|
|
211
|
-
`,
|
|
253
|
+
`,he=`import { type H3Event, readBody } from "h3";
|
|
212
254
|
|
|
213
255
|
import {
|
|
214
256
|
parseCookies,
|
|
@@ -248,7 +290,7 @@ export const bodyparsers: {
|
|
|
248
290
|
return event.req.text();
|
|
249
291
|
},
|
|
250
292
|
};
|
|
251
|
-
`,
|
|
293
|
+
`,ge=`import type { Middleware } from "h3";
|
|
252
294
|
|
|
253
295
|
import type {
|
|
254
296
|
RequestBodyTarget,
|
|
@@ -333,7 +375,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
333
375
|
target === "query"
|
|
334
376
|
? normalizeSearchParams(
|
|
335
377
|
parser(event),
|
|
336
|
-
event.req.method
|
|
378
|
+
event.req.method === "HEAD"
|
|
379
|
+
? "GET"
|
|
380
|
+
: event.req.method,
|
|
337
381
|
)
|
|
338
382
|
: parser(event),
|
|
339
383
|
);
|
|
@@ -411,7 +455,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
411
455
|
* */
|
|
412
456
|
use(
|
|
413
457
|
async function useValidateResponse(event, next) {
|
|
414
|
-
const variants =
|
|
458
|
+
const variants =
|
|
459
|
+
validationSchemas.response?.[
|
|
460
|
+
event.req.method === "HEAD" ? "GET" : event.req.method
|
|
461
|
+
] || [];
|
|
415
462
|
|
|
416
463
|
if (!Array.isArray(variants) || !variants.length) {
|
|
417
464
|
return next();
|
|
@@ -460,6 +507,11 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
460
507
|
: "application/json"),
|
|
461
508
|
};
|
|
462
509
|
|
|
510
|
+
// validate only 2xx responses
|
|
511
|
+
if (Math.floor(response.status / 100) !== 2) {
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
|
|
463
515
|
// Validate body only for JSON variants
|
|
464
516
|
if (variants.some((e) => e.contentType?.includes("json"))) {
|
|
465
517
|
response.body = rawResponse
|
|
@@ -598,7 +650,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
598
650
|
use(
|
|
599
651
|
async (event, next) => {
|
|
600
652
|
const schema = {
|
|
601
|
-
...validationSchemas[target]?.[
|
|
653
|
+
...validationSchemas[target]?.[
|
|
654
|
+
event.req.method === "HEAD" ? "GET" : event.req.method
|
|
655
|
+
],
|
|
602
656
|
};
|
|
603
657
|
if (schema.validate && schema.runtimeValidation !== false) {
|
|
604
658
|
schema.validate(await loadData(event as never));
|
|
@@ -628,11 +682,18 @@ export const routes = createRoutes<ParameterizedMiddleware, Middleware>(
|
|
|
628
682
|
createRouteMiddleware,
|
|
629
683
|
},
|
|
630
684
|
);
|
|
631
|
-
`,
|
|
685
|
+
`,_e=`import { join } from "node:path";
|
|
632
686
|
|
|
633
687
|
import type { RouteSource } from "@kosmojs/core/api";
|
|
634
688
|
|
|
635
|
-
import {
|
|
689
|
+
import {
|
|
690
|
+
base,
|
|
691
|
+
apiBase,
|
|
692
|
+
apiRouteMap,
|
|
693
|
+
apiRouteMapper,
|
|
694
|
+
// needed for cascadingMiddleware
|
|
695
|
+
type Override,
|
|
696
|
+
} from "{{ createImport 'libCore' }}";
|
|
636
697
|
|
|
637
698
|
{{#each routes}}
|
|
638
699
|
import {{id}} from "{{ createImport 'api' file }}";
|
|
@@ -673,7 +734,7 @@ export const routeSources: Array<RouteSource<never>> = [
|
|
|
673
734
|
},
|
|
674
735
|
{{/each}}
|
|
675
736
|
];
|
|
676
|
-
`,
|
|
737
|
+
`,ve=`import { parseArgs, styleText } from "node:util";
|
|
677
738
|
|
|
678
739
|
import { serve as h3serve } from "h3";
|
|
679
740
|
|
|
@@ -721,7 +782,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
|
|
|
721
782
|
|
|
722
783
|
return server as never;
|
|
723
784
|
};
|
|
724
|
-
`,
|
|
785
|
+
`,ye=`import type { H3Event, H3EventContext } from "h3";
|
|
725
786
|
|
|
726
787
|
import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
|
|
727
788
|
import {
|
|
@@ -868,14 +929,14 @@ export const defineRoute: <
|
|
|
868
929
|
use: use as never,
|
|
869
930
|
});
|
|
870
931
|
};
|
|
871
|
-
`,
|
|
932
|
+
`,be=`export * from "./@api/app";
|
|
872
933
|
export { appFactory as default } from "./@api/app";
|
|
873
934
|
export * from "./@api/dev";
|
|
874
935
|
export * from "./@api/errors";
|
|
875
936
|
export * from "./@api/router";
|
|
876
937
|
export * from "./@api/routes";
|
|
877
938
|
export * from "./@api/server";
|
|
878
|
-
`,
|
|
939
|
+
`,xe=`import { onError } from "h3";
|
|
879
940
|
|
|
880
941
|
import appFactory, { routes, type App } from "{{ createImport 'lib' 'api:factory' }}";
|
|
881
942
|
import defaultErrorHandler from "./errors";
|
|
@@ -883,7 +944,7 @@ import defaultErrorHandler from "./errors";
|
|
|
883
944
|
export default appFactory(routes, ({ app }) => {
|
|
884
945
|
app.use(onError(defaultErrorHandler));
|
|
885
946
|
}) as App;
|
|
886
|
-
`,
|
|
947
|
+
`,Se=`import { toNodeHandler } from "h3/node";
|
|
887
948
|
|
|
888
949
|
import app from "./app";
|
|
889
950
|
|
|
@@ -903,10 +964,10 @@ process.on("unhandledRejection", (reason) => {
|
|
|
903
964
|
console.error("Reason:", reason);
|
|
904
965
|
process.exit(1);
|
|
905
966
|
});
|
|
906
|
-
`,
|
|
967
|
+
`,Ce=`export declare module "{{ createImport 'libApi' }}" {
|
|
907
968
|
interface DefaultContext {}
|
|
908
969
|
}
|
|
909
|
-
`,
|
|
970
|
+
`,we=`import { ValidationError } from "@kosmojs/core/errors";
|
|
910
971
|
import { HTTPError } from "h3";
|
|
911
972
|
|
|
912
973
|
import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
|
|
@@ -932,14 +993,14 @@ export default errorHandlerFactory(async (error, event) => {
|
|
|
932
993
|
headers: { "Content-Type": "text/plain" },
|
|
933
994
|
});
|
|
934
995
|
});
|
|
935
|
-
`,
|
|
996
|
+
`,Te=`import { defineRoute } from "{{ createImport 'libApi' }}";
|
|
936
997
|
|
|
937
998
|
export default defineRoute<"{{route.name}}">(({ GET }) => [
|
|
938
999
|
GET(async (event) => {
|
|
939
1000
|
return "Automatically generated route";
|
|
940
1001
|
}),
|
|
941
1002
|
]);
|
|
942
|
-
`,
|
|
1003
|
+
`,Ee=`import { use } from "{{ createImport 'libApi' }}";
|
|
943
1004
|
|
|
944
1005
|
export type UseT = {};
|
|
945
1006
|
|
|
@@ -948,11 +1009,11 @@ export default [
|
|
|
948
1009
|
return next();
|
|
949
1010
|
}),
|
|
950
1011
|
];
|
|
951
|
-
`,
|
|
1012
|
+
`,De=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
|
|
952
1013
|
import app from "./app";
|
|
953
1014
|
|
|
954
1015
|
await serve(app);
|
|
955
|
-
`,
|
|
1016
|
+
`,Oe=`import { use } from "{{ createImport 'libApi' }}";
|
|
956
1017
|
|
|
957
1018
|
/**
|
|
958
1019
|
* Define global middleware applied to all routes.
|
|
@@ -963,7 +1024,7 @@ export default [
|
|
|
963
1024
|
return next();
|
|
964
1025
|
}),
|
|
965
1026
|
];
|
|
966
|
-
`,
|
|
1027
|
+
`,ke=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`["${e}", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,d=c(n?.templates,Te),f=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),d(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),Ee,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,path:r.h3Pattern,basename:r.name,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:u(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,_e]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,ye],[`api:factory.ts`,be],[`@api/app.ts`,z],[`@api/parsers.ts`,he],[`@api/dev.ts`,B],[`@api/errors.ts`,me],[`@api/router.ts`,ge],[`@api/server.ts`,ve]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,xe],[`dev.ts`,Se],[`errors.ts`,we],[`server.ts`,De],[`use.ts`,Oe],[`env.d.ts`,Ce]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await f(e.filter(p(t,[`create`]))),await m(e)},async build(e){await f(e),await m(e)}}}),Ae=h({meta:{name:`H3`,slot:`backend`},dependencies:{h3:R.devDependencies.h3},factory:ke}),V={type:`module`,private:!0,name:`@kosmojs/hono-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/hono-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,crc:`^4.3.2`},devDependencies:{"@hono/node-server":`^2.1.1`,hono:`^4.13.3`,vite:`^8.2.2`}},je=`import { Hono, type MiddlewareHandler } from "hono";
|
|
967
1028
|
import type { Router } from "hono/router";
|
|
968
1029
|
import { RegExpRouter } from "hono/router/reg-exp-router";
|
|
969
1030
|
import { SmartRouter } from "hono/router/smart-router";
|
|
@@ -1030,15 +1091,45 @@ export function appFactory(
|
|
|
1030
1091
|
} else if (debug) {
|
|
1031
1092
|
console.log(route.debug[typeof debug === "string" ? debug : "full"]);
|
|
1032
1093
|
}
|
|
1033
|
-
|
|
1094
|
+
|
|
1095
|
+
app.on(route.method, [route.path], ...route.middleware);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
const routesByPath = routes.reduce<
|
|
1099
|
+
Record<string, Array<Route<MiddlewareHandler>>>
|
|
1100
|
+
>((map, route) => {
|
|
1101
|
+
if (!map[route.path]) {
|
|
1102
|
+
map[route.path] = [];
|
|
1103
|
+
}
|
|
1104
|
+
map[route.path].push(route);
|
|
1105
|
+
return map;
|
|
1106
|
+
}, {});
|
|
1107
|
+
|
|
1108
|
+
for (const [path, routes] of Object.entries(routesByPath)) {
|
|
1109
|
+
const methods = routes.map((e) => e.method);
|
|
1110
|
+
|
|
1111
|
+
app.all(path, (ctx) => {
|
|
1112
|
+
const allowedMethods = new Set([...methods, "OPTIONS"]);
|
|
1113
|
+
|
|
1114
|
+
if (methods.includes("GET")) {
|
|
1115
|
+
allowedMethods.add("HEAD");
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
const status = ctx.req.method === "OPTIONS" ? 204 : 405;
|
|
1119
|
+
|
|
1120
|
+
return new Response(undefined, {
|
|
1121
|
+
status,
|
|
1122
|
+
headers: { Allow: [...allowedMethods].join(", ") },
|
|
1123
|
+
});
|
|
1124
|
+
});
|
|
1034
1125
|
}
|
|
1035
1126
|
|
|
1036
1127
|
return app as never;
|
|
1037
1128
|
}
|
|
1038
|
-
`,
|
|
1129
|
+
`,Me=`import type { DevSetup } from "@kosmojs/core/api";
|
|
1039
1130
|
|
|
1040
1131
|
export const devSetup = (setup: DevSetup) => setup;
|
|
1041
|
-
`,
|
|
1132
|
+
`,Ne=`import type { Context } from "hono";
|
|
1042
1133
|
|
|
1043
1134
|
import type { AppEnv } from "./app";
|
|
1044
1135
|
|
|
@@ -1052,7 +1143,7 @@ export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
|
|
|
1052
1143
|
export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
|
|
1053
1144
|
return handler;
|
|
1054
1145
|
};
|
|
1055
|
-
`,
|
|
1146
|
+
`,Pe=`import type { Context } from "hono";
|
|
1056
1147
|
|
|
1057
1148
|
import {
|
|
1058
1149
|
parseCookies,
|
|
@@ -1101,7 +1192,7 @@ export const bodyparsers: {
|
|
|
1101
1192
|
return ctx.req[as]();
|
|
1102
1193
|
},
|
|
1103
1194
|
};
|
|
1104
|
-
`,
|
|
1195
|
+
`,Fe=`import type { MiddlewareHandler } from "hono";
|
|
1105
1196
|
|
|
1106
1197
|
import type {
|
|
1107
1198
|
RequestBodyTarget,
|
|
@@ -1187,7 +1278,7 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
1187
1278
|
target === "query"
|
|
1188
1279
|
? normalizeSearchParams(
|
|
1189
1280
|
parser(ctx),
|
|
1190
|
-
ctx.req.method
|
|
1281
|
+
ctx.req.method === "HEAD" ? "GET" : ctx.req.method,
|
|
1191
1282
|
)
|
|
1192
1283
|
: parser(ctx),
|
|
1193
1284
|
);
|
|
@@ -1267,7 +1358,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
1267
1358
|
* */
|
|
1268
1359
|
use(
|
|
1269
1360
|
async function useValidateResponse(ctx, next) {
|
|
1270
|
-
const variants =
|
|
1361
|
+
const variants =
|
|
1362
|
+
validationSchemas.response?.[
|
|
1363
|
+
ctx.req.method === "HEAD" ? "GET" : ctx.req.method
|
|
1364
|
+
] || [];
|
|
1271
1365
|
|
|
1272
1366
|
if (!Array.isArray(variants) || !variants.length) {
|
|
1273
1367
|
return next();
|
|
@@ -1300,10 +1394,17 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
1300
1394
|
contentType: ctx.res.headers.get("Content-Type"),
|
|
1301
1395
|
};
|
|
1302
1396
|
|
|
1397
|
+
// validate only 2xx responses
|
|
1398
|
+
if (Math.floor(response.status / 100) !== 2) {
|
|
1399
|
+
return;
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1303
1402
|
// Validate body only for JSON variants
|
|
1304
1403
|
if (variants.some((e) => e.contentType?.includes("json"))) {
|
|
1305
|
-
|
|
1306
|
-
|
|
1404
|
+
response.body = await ctx.res
|
|
1405
|
+
.clone()
|
|
1406
|
+
.json()
|
|
1407
|
+
.catch(() => undefined);
|
|
1307
1408
|
}
|
|
1308
1409
|
|
|
1309
1410
|
/**
|
|
@@ -1438,7 +1539,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
1438
1539
|
use(
|
|
1439
1540
|
async (ctx, next) => {
|
|
1440
1541
|
const schema = {
|
|
1441
|
-
...validationSchemas[target]?.[
|
|
1542
|
+
...validationSchemas[target]?.[
|
|
1543
|
+
ctx.req.method === "HEAD" ? "GET" : ctx.req.method
|
|
1544
|
+
],
|
|
1442
1545
|
};
|
|
1443
1546
|
if (schema.validate && schema.runtimeValidation !== false) {
|
|
1444
1547
|
schema.validate(await loadData(ctx as never));
|
|
@@ -1468,11 +1571,18 @@ export const routes = createRoutes<ParameterizedMiddleware, MiddlewareHandler>(
|
|
|
1468
1571
|
createRouteMiddleware,
|
|
1469
1572
|
},
|
|
1470
1573
|
);
|
|
1471
|
-
`,
|
|
1574
|
+
`,Ie=`import { join } from "node:path";
|
|
1472
1575
|
|
|
1473
1576
|
import type { RouteSource } from "@kosmojs/core/api";
|
|
1474
1577
|
|
|
1475
|
-
import {
|
|
1578
|
+
import {
|
|
1579
|
+
base,
|
|
1580
|
+
apiBase,
|
|
1581
|
+
apiRouteMap,
|
|
1582
|
+
apiRouteMapper,
|
|
1583
|
+
// needed for cascadingMiddleware
|
|
1584
|
+
type Override,
|
|
1585
|
+
} from "{{ createImport 'libCore' }}";
|
|
1476
1586
|
|
|
1477
1587
|
{{#each routes}}
|
|
1478
1588
|
import {{id}} from "{{ createImport 'api' file }}";
|
|
@@ -1513,7 +1623,7 @@ export const routeSources: Array<RouteSource<never>> = [
|
|
|
1513
1623
|
},
|
|
1514
1624
|
{{/each}}
|
|
1515
1625
|
];
|
|
1516
|
-
`,
|
|
1626
|
+
`,Le=`import { chmod, unlink } from "node:fs/promises";
|
|
1517
1627
|
import { parseArgs, styleText } from "node:util";
|
|
1518
1628
|
|
|
1519
1629
|
import { createAdaptorServer } from "@hono/node-server";
|
|
@@ -1598,7 +1708,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
|
|
|
1598
1708
|
|
|
1599
1709
|
return server as never;
|
|
1600
1710
|
};
|
|
1601
|
-
`,
|
|
1711
|
+
`,Re=`import type { Context, Next } from "hono";
|
|
1602
1712
|
|
|
1603
1713
|
import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
|
|
1604
1714
|
import {
|
|
@@ -1781,20 +1891,20 @@ export const defineRoute: <
|
|
|
1781
1891
|
use: use as never,
|
|
1782
1892
|
});
|
|
1783
1893
|
};
|
|
1784
|
-
`,
|
|
1894
|
+
`,ze=`export * from "./@api/app";
|
|
1785
1895
|
export { appFactory as default } from "./@api/app";
|
|
1786
1896
|
export * from "./@api/dev";
|
|
1787
1897
|
export * from "./@api/errors";
|
|
1788
1898
|
export * from "./@api/router";
|
|
1789
1899
|
export * from "./@api/routes";
|
|
1790
1900
|
export * from "./@api/server";
|
|
1791
|
-
`,
|
|
1901
|
+
`,Be=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
|
|
1792
1902
|
import defaultErrorHandler from "./errors";
|
|
1793
1903
|
|
|
1794
1904
|
export default appFactory(routes, ({ app }) => {
|
|
1795
1905
|
app.onError(defaultErrorHandler);
|
|
1796
1906
|
})
|
|
1797
|
-
`,
|
|
1907
|
+
`,Ve=`import { getRequestListener } from "@hono/node-server";
|
|
1798
1908
|
|
|
1799
1909
|
import app from "./app";
|
|
1800
1910
|
|
|
@@ -1815,11 +1925,11 @@ process.on("unhandledRejection", (reason) => {
|
|
|
1815
1925
|
process.exit(1);
|
|
1816
1926
|
});
|
|
1817
1927
|
|
|
1818
|
-
`,
|
|
1928
|
+
`,He=`export declare module "{{ createImport 'libApi' }}" {
|
|
1819
1929
|
interface DefaultVariables {}
|
|
1820
1930
|
interface DefaultBindings {}
|
|
1821
1931
|
}
|
|
1822
|
-
`,
|
|
1932
|
+
`,Ue=`import { accepts } from "hono/accepts";
|
|
1823
1933
|
import { HTTPException } from "hono/http-exception";
|
|
1824
1934
|
|
|
1825
1935
|
import { ValidationError, HTTPError } from "@kosmojs/core/errors";
|
|
@@ -1851,7 +1961,7 @@ export default errorHandlerFactory(async (error, ctx) => {
|
|
|
1851
1961
|
? ctx.json({ error: message }, status)
|
|
1852
1962
|
: ctx.text(message, status);
|
|
1853
1963
|
});
|
|
1854
|
-
`,
|
|
1964
|
+
`,We=`import { defineRoute } from "{{ createImport 'libApi' }}";
|
|
1855
1965
|
|
|
1856
1966
|
export default defineRoute<"{{route.name}}">(({ GET }) => [
|
|
1857
1967
|
GET(async (ctx) => {
|
|
@@ -1860,7 +1970,7 @@ export default defineRoute<"{{route.name}}">(({ GET }) => [
|
|
|
1860
1970
|
return ctx.text("Automatically generated route");
|
|
1861
1971
|
}),
|
|
1862
1972
|
]);
|
|
1863
|
-
`,
|
|
1973
|
+
`,Ge=`import { use } from "{{ createImport 'libApi' }}";
|
|
1864
1974
|
|
|
1865
1975
|
export type UseT = {};
|
|
1866
1976
|
|
|
@@ -1871,11 +1981,11 @@ export default [
|
|
|
1871
1981
|
return next();
|
|
1872
1982
|
}),
|
|
1873
1983
|
];
|
|
1874
|
-
`,
|
|
1984
|
+
`,Ke=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
|
|
1875
1985
|
import app from "./app";
|
|
1876
1986
|
|
|
1877
1987
|
await serve(app);
|
|
1878
|
-
`,
|
|
1988
|
+
`,qe=`import { use } from "{{ createImport 'libApi' }}";
|
|
1879
1989
|
|
|
1880
1990
|
/**
|
|
1881
1991
|
* Define global middleware applied to all routes.
|
|
@@ -1886,7 +1996,9 @@ export default [
|
|
|
1886
1996
|
return next();
|
|
1887
1997
|
}),
|
|
1888
1998
|
];
|
|
1889
|
-
`,
|
|
1999
|
+
`,Je=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`["${e}", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,We),f=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),u(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),Ge,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,path:r.honoPattern,basename:r.name,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:d(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,Ie]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,Re],[`api:factory.ts`,ze],[`@api/app.ts`,je],[`@api/parsers.ts`,Pe],[`@api/dev.ts`,Me],[`@api/errors.ts`,Ne],[`@api/router.ts`,Fe],[`@api/server.ts`,Le]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,Be],[`dev.ts`,Ve],[`errors.ts`,Ue],[`server.ts`,Ke],[`use.ts`,qe],[`env.d.ts`,He]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await f(e.filter(p(t,[`create`]))),await m(e)},async build(e){await f(e),await m(e)}}}),Ye=h({meta:{name:`Hono`,slot:`backend`},dependencies:{hono:V.devDependencies.hono,"@hono/node-server":V.devDependencies[`@hono/node-server`]},factory:Je}),H={type:`module`,private:!0,name:`@kosmojs/koa-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`},"./lib":{types:`./pkg/lib.d.ts`,default:`./pkg/lib.js`}},scripts:{build:`wsbuild src/index.ts src/lib.ts`,test:`vitest --root ../.. --project generators/koa-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,crc:`^4.3.2`},devDependencies:{"@koa/router":`^15.7.0`,"@types/formidable":`^3.5.1`,"@types/koa":`^3.0.3`,"@types/koa-compose":`^3.2.9`,formidable:`^3.5.4`,koa:`^3.2.1`,"koa-compose":`^4.1.0`,"light-my-request":`^6.6.0`,"raw-body":`^4.0.0`,vite:`^8.2.2`}},Xe=`import { styleText } from "node:util";
|
|
2000
|
+
|
|
2001
|
+
import Router, { type RouterMiddleware } from "@koa/router";
|
|
1890
2002
|
import Koa from "koa";
|
|
1891
2003
|
|
|
1892
2004
|
import type { Route, RouteDebugOption } from "@kosmojs/core/api";
|
|
@@ -1897,7 +2009,7 @@ export type App = Koa<DefaultState, DefaultContext>;
|
|
|
1897
2009
|
|
|
1898
2010
|
export type AppOptions = ConstructorParameters<
|
|
1899
2011
|
typeof Koa<DefaultState, DefaultContext>
|
|
1900
|
-
>[0] & {
|
|
2012
|
+
>[0] & { debug?: RouteDebugOption };
|
|
1901
2013
|
|
|
1902
2014
|
export function appFactory(
|
|
1903
2015
|
routes: Array<Route<RouterMiddleware>>,
|
|
@@ -1921,51 +2033,88 @@ export function appFactory(
|
|
|
1921
2033
|
): App {
|
|
1922
2034
|
const [options, fn] = typeof rest[0] === "function" ? [{}, rest[0]] : rest;
|
|
1923
2035
|
|
|
1924
|
-
const {
|
|
1925
|
-
router = new Router(),
|
|
1926
|
-
debug = undefined,
|
|
1927
|
-
...appOptions
|
|
1928
|
-
} = {
|
|
2036
|
+
const { debug = undefined, ...appOptions } = {
|
|
1929
2037
|
...(options ? { ...options } : {}),
|
|
1930
2038
|
};
|
|
1931
2039
|
|
|
2040
|
+
const app = new Koa(appOptions);
|
|
2041
|
+
const router = new Router();
|
|
2042
|
+
|
|
1932
2043
|
for (const route of routes) {
|
|
1933
2044
|
if (typeof debug === "function") {
|
|
1934
2045
|
(debug as Function)(route.debug, route);
|
|
1935
2046
|
} else if (debug) {
|
|
1936
2047
|
console.log(route.debug[typeof debug === "string" ? debug : "full"]);
|
|
1937
2048
|
}
|
|
1938
|
-
router.register(route.path, route.
|
|
2049
|
+
router.register(route.path, [route.method], route.middleware, route);
|
|
1939
2050
|
}
|
|
1940
2051
|
|
|
1941
|
-
const
|
|
2052
|
+
const routesByPath = routes.reduce<
|
|
2053
|
+
Record<string, Array<Route<RouterMiddleware>>>
|
|
2054
|
+
>((map, route) => {
|
|
2055
|
+
if (!map[route.path]) {
|
|
2056
|
+
map[route.path] = [];
|
|
2057
|
+
}
|
|
2058
|
+
map[route.path].push(route);
|
|
2059
|
+
return map;
|
|
2060
|
+
}, {});
|
|
2061
|
+
|
|
2062
|
+
for (const [path, routes] of Object.entries(routesByPath)) {
|
|
2063
|
+
const methods = routes.map((e) => e.method);
|
|
2064
|
+
|
|
2065
|
+
if (
|
|
2066
|
+
methods.includes("GET") &&
|
|
2067
|
+
methods.indexOf("HEAD") > methods.indexOf("GET")
|
|
2068
|
+
) {
|
|
2069
|
+
console.warn("----");
|
|
2070
|
+
console.warn(
|
|
2071
|
+
\`\${styleText("yellow", "WARN")}: HEAD handler for \${styleText("blue", routes[0].name)} route is unreachable - \${styleText("magenta", "define HEAD before GET")}\`,
|
|
2072
|
+
);
|
|
2073
|
+
console.warn("----");
|
|
2074
|
+
}
|
|
2075
|
+
|
|
2076
|
+
router.all(path, (ctx) => {
|
|
2077
|
+
const allowedMethods = new Set([...methods, "OPTIONS"]);
|
|
2078
|
+
|
|
2079
|
+
if (methods.includes("GET")) {
|
|
2080
|
+
allowedMethods.add("HEAD");
|
|
2081
|
+
}
|
|
2082
|
+
|
|
2083
|
+
ctx.status = ctx.method === "OPTIONS" ? 204 : 405;
|
|
2084
|
+
|
|
2085
|
+
ctx.set("Allow", [...allowedMethods].join(", "));
|
|
2086
|
+
});
|
|
2087
|
+
}
|
|
1942
2088
|
|
|
1943
2089
|
if (typeof fn === "function") {
|
|
1944
2090
|
fn({ app, router });
|
|
1945
2091
|
}
|
|
1946
2092
|
|
|
2093
|
+
// NOTE: Routes should be added last, after any middleware
|
|
2094
|
+
app.use(router.routes());
|
|
2095
|
+
|
|
1947
2096
|
return app;
|
|
1948
2097
|
}
|
|
1949
|
-
`,
|
|
2098
|
+
`,Ze=`import type { DevSetup } from "@kosmojs/core/api";
|
|
1950
2099
|
|
|
1951
2100
|
export const devSetup = (setup: DevSetup) => setup;
|
|
1952
|
-
`,
|
|
2101
|
+
`,Qe=`import type {
|
|
1953
2102
|
DefaultContext,
|
|
1954
2103
|
DefaultState,
|
|
1955
2104
|
ParameterizedContext,
|
|
1956
2105
|
} from "../api";
|
|
1957
2106
|
|
|
1958
2107
|
type ErrorHandler = (
|
|
1959
|
-
error: any,
|
|
1960
2108
|
ctx: ParameterizedContext<unknown, DefaultState, DefaultContext>,
|
|
1961
|
-
|
|
2109
|
+
next: Function,
|
|
2110
|
+
) => Promise<void>;
|
|
1962
2111
|
|
|
1963
2112
|
export type ErrorHandlerFactory = (handler: ErrorHandler) => ErrorHandler;
|
|
1964
2113
|
|
|
1965
2114
|
export const errorHandlerFactory: ErrorHandlerFactory = (handler) => {
|
|
1966
2115
|
return handler;
|
|
1967
2116
|
};
|
|
1968
|
-
|
|
2117
|
+
`,$e=`import zlib from "node:zlib";
|
|
1969
2118
|
|
|
1970
2119
|
import type { RouterContext } from "@koa/router";
|
|
1971
2120
|
import Formidable, { type Options as FormidableOptions } from "formidable";
|
|
@@ -2178,7 +2327,7 @@ export const bodyparsers: {
|
|
|
2178
2327
|
return rawParser(stream, rawParserOptions);
|
|
2179
2328
|
},
|
|
2180
2329
|
};
|
|
2181
|
-
|
|
2330
|
+
`,et=`import type { RouterMiddleware } from "@koa/router";
|
|
2182
2331
|
|
|
2183
2332
|
import type {
|
|
2184
2333
|
RequestBodyTarget,
|
|
@@ -2262,7 +2411,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
2262
2411
|
ctx[StateKey].set(
|
|
2263
2412
|
target,
|
|
2264
2413
|
target === "query"
|
|
2265
|
-
? normalizeSearchParams(
|
|
2414
|
+
? normalizeSearchParams(
|
|
2415
|
+
parser(ctx),
|
|
2416
|
+
ctx.method === "HEAD" ? "GET" : ctx.method,
|
|
2417
|
+
)
|
|
2266
2418
|
: parser(ctx),
|
|
2267
2419
|
);
|
|
2268
2420
|
}
|
|
@@ -2341,7 +2493,10 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
2341
2493
|
* */
|
|
2342
2494
|
use(
|
|
2343
2495
|
async function useValidateResponse(ctx, next) {
|
|
2344
|
-
const variants =
|
|
2496
|
+
const variants =
|
|
2497
|
+
validationSchemas.response?.[
|
|
2498
|
+
ctx.method === "HEAD" ? "GET" : ctx.method
|
|
2499
|
+
] || [];
|
|
2345
2500
|
|
|
2346
2501
|
if (!Array.isArray(variants) || !variants.length) {
|
|
2347
2502
|
return next();
|
|
@@ -2375,6 +2530,11 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
2375
2530
|
contentType: ctx.type,
|
|
2376
2531
|
};
|
|
2377
2532
|
|
|
2533
|
+
// validate only 2xx responses
|
|
2534
|
+
if (Math.floor(response.status / 100) !== 2) {
|
|
2535
|
+
return;
|
|
2536
|
+
}
|
|
2537
|
+
|
|
2378
2538
|
// Validate body only for JSON variants
|
|
2379
2539
|
if (variants.some((e) => e.contentType?.includes("json"))) {
|
|
2380
2540
|
response.body = ctx.body;
|
|
@@ -2513,7 +2673,9 @@ export const createRouteMiddleware: CreateRouteMiddleware<
|
|
|
2513
2673
|
use(
|
|
2514
2674
|
async (ctx, next) => {
|
|
2515
2675
|
const schema = {
|
|
2516
|
-
...validationSchemas[target]?.[
|
|
2676
|
+
...validationSchemas[target]?.[
|
|
2677
|
+
ctx.method === "HEAD" ? "GET" : ctx.method
|
|
2678
|
+
],
|
|
2517
2679
|
};
|
|
2518
2680
|
if (schema.validate && schema.runtimeValidation !== false) {
|
|
2519
2681
|
schema.validate(await loadData(ctx as never));
|
|
@@ -2543,11 +2705,18 @@ export const routes = createRoutes<ParameterizedMiddleware, RouterMiddleware>(
|
|
|
2543
2705
|
createRouteMiddleware,
|
|
2544
2706
|
},
|
|
2545
2707
|
);
|
|
2546
|
-
`,
|
|
2708
|
+
`,tt=`import { join } from "node:path";
|
|
2547
2709
|
|
|
2548
2710
|
import type { RouteSource } from "@kosmojs/core/api";
|
|
2549
2711
|
|
|
2550
|
-
import {
|
|
2712
|
+
import {
|
|
2713
|
+
base,
|
|
2714
|
+
apiBase,
|
|
2715
|
+
apiRouteMap,
|
|
2716
|
+
apiRouteMapper,
|
|
2717
|
+
// needed for cascadingMiddleware
|
|
2718
|
+
type Override,
|
|
2719
|
+
} from "{{ createImport 'libCore' }}";
|
|
2551
2720
|
|
|
2552
2721
|
{{#each routes}}
|
|
2553
2722
|
import {{id}} from "{{ createImport 'api' file }}";
|
|
@@ -2588,7 +2757,7 @@ export const routeSources: Array<RouteSource<never>> = [
|
|
|
2588
2757
|
},
|
|
2589
2758
|
{{/each}}
|
|
2590
2759
|
];
|
|
2591
|
-
`,
|
|
2760
|
+
`,nt=`import { chmod, unlink } from "node:fs/promises";
|
|
2592
2761
|
import { parseArgs, styleText } from "node:util";
|
|
2593
2762
|
|
|
2594
2763
|
import type { App } from "./app";
|
|
@@ -2651,7 +2820,7 @@ export const serve = async <T extends App>(app: T, opt?: Handles) => {
|
|
|
2651
2820
|
const server = app.listen(port || sock, onListen);
|
|
2652
2821
|
return server as never;
|
|
2653
2822
|
};
|
|
2654
|
-
`,
|
|
2823
|
+
`,rt=`import type { RouterContext } from "@koa/router";
|
|
2655
2824
|
import type { Next } from "koa";
|
|
2656
2825
|
|
|
2657
2826
|
import type { ValidationDefmap, ValidationOptmap } from "@kosmojs/core";
|
|
@@ -2813,25 +2982,20 @@ export const defineRoute: <
|
|
|
2813
2982
|
use: use as never,
|
|
2814
2983
|
});
|
|
2815
2984
|
};
|
|
2816
|
-
`,
|
|
2985
|
+
`,it=`export * from "./@api/app";
|
|
2817
2986
|
export { appFactory as default } from "./@api/app";
|
|
2818
2987
|
export * from "./@api/dev";
|
|
2819
2988
|
export * from "./@api/errors";
|
|
2820
2989
|
export * from "./@api/router";
|
|
2821
2990
|
export * from "./@api/routes";
|
|
2822
2991
|
export * from "./@api/server";
|
|
2823
|
-
`,
|
|
2992
|
+
`,at=`import appFactory, { routes } from "{{ createImport 'lib' 'api:factory' }}";
|
|
2824
2993
|
import defaultErrorHandler from "./errors";
|
|
2825
2994
|
|
|
2826
|
-
export default appFactory(routes, ({ app
|
|
2827
|
-
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
// NOTE: Routes should be added last, after any middleware
|
|
2831
|
-
app.use(router.routes());
|
|
2832
|
-
|
|
2833
|
-
});
|
|
2834
|
-
`,at=`import app from "./app";
|
|
2995
|
+
export default appFactory(routes, ({ app }) => {
|
|
2996
|
+
app.use(defaultErrorHandler);
|
|
2997
|
+
})
|
|
2998
|
+
`,ot=`import app from "./app";
|
|
2835
2999
|
|
|
2836
3000
|
import { devSetup } from "{{ createImport 'lib' 'api:factory' }}";
|
|
2837
3001
|
|
|
@@ -2849,39 +3013,43 @@ process.on("unhandledRejection", (reason) => {
|
|
|
2849
3013
|
console.error("Reason:", reason);
|
|
2850
3014
|
process.exit(1);
|
|
2851
3015
|
});
|
|
2852
|
-
`,
|
|
3016
|
+
`,st=`export declare module "{{ createImport 'libApi' }}" {
|
|
2853
3017
|
interface DefaultState {}
|
|
2854
3018
|
interface DefaultContext {}
|
|
2855
3019
|
}
|
|
2856
|
-
`,
|
|
3020
|
+
`,ct=`import { HTTPError, ValidationError } from "@kosmojs/core/errors";
|
|
2857
3021
|
|
|
2858
3022
|
import { errorHandlerFactory } from "{{ createImport 'lib' 'api:factory' }}";
|
|
2859
3023
|
|
|
2860
|
-
export default errorHandlerFactory(async (
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
ctx.
|
|
2873
|
-
|
|
2874
|
-
ctx.
|
|
3024
|
+
export default errorHandlerFactory(async (ctx, next) => {
|
|
3025
|
+
try {
|
|
3026
|
+
await next();
|
|
3027
|
+
} catch (error: any) {
|
|
3028
|
+
const [status, message] = Array.isArray(error)
|
|
3029
|
+
? error
|
|
3030
|
+
: error instanceof HTTPError
|
|
3031
|
+
? [error.status, error.message]
|
|
3032
|
+
: error instanceof ValidationError
|
|
3033
|
+
? [400, \`\${error.target}: \${error.errorMessage}\`]
|
|
3034
|
+
: [error.statusCode || 500, error.message];
|
|
3035
|
+
|
|
3036
|
+
ctx.status = status;
|
|
3037
|
+
|
|
3038
|
+
if (ctx.accepts("json")) {
|
|
3039
|
+
ctx.body = { error: message };
|
|
3040
|
+
} else {
|
|
3041
|
+
ctx.body = message;
|
|
3042
|
+
}
|
|
2875
3043
|
}
|
|
2876
3044
|
});
|
|
2877
|
-
`,
|
|
3045
|
+
`,lt=`import { defineRoute } from "{{ createImport 'libApi' }}";
|
|
2878
3046
|
|
|
2879
3047
|
export default defineRoute<"{{route.name}}">(({ GET }) => [
|
|
2880
3048
|
GET(async (ctx) => {
|
|
2881
3049
|
ctx.body = "Automatically generated route";
|
|
2882
3050
|
}),
|
|
2883
3051
|
]);
|
|
2884
|
-
`,
|
|
3052
|
+
`,ut=`import { use } from "{{ createImport 'libApi' }}";
|
|
2885
3053
|
|
|
2886
3054
|
export type UseT = {};
|
|
2887
3055
|
|
|
@@ -2892,11 +3060,11 @@ export default [
|
|
|
2892
3060
|
return next();
|
|
2893
3061
|
}),
|
|
2894
3062
|
];
|
|
2895
|
-
`,
|
|
3063
|
+
`,dt=`import { serve } from "{{ createImport 'lib' 'api:factory' }}";
|
|
2896
3064
|
import app from "./app";
|
|
2897
3065
|
|
|
2898
3066
|
await serve(app);
|
|
2899
|
-
`,
|
|
3067
|
+
`,ft=`import { use } from "{{ createImport 'libApi' }}";
|
|
2900
3068
|
|
|
2901
3069
|
/**
|
|
2902
3070
|
* Define global middleware applied to all routes.
|
|
@@ -2907,17 +3075,17 @@ export default [
|
|
|
2907
3075
|
return next();
|
|
2908
3076
|
}),
|
|
2909
3077
|
];
|
|
2910
|
-
`,
|
|
3078
|
+
`,pt=g((e,n)=>{let{createPath:r,createImportHelpers:i}=y(e),a=e=>e.length===0?`{}`:e.length===1?e[0]:`Override<${e[0]}, ${a(e.slice(1))}>`,{renderToFile:o}=x({helpers:{...i({origin:`lib`}),...w(),paramsDefaults({params:e}){return`[${e.schema.map(()=>`unknown?`).join(`, `)}]`},paramsMappings({params:e}){return`[${e.schema.map(({name:e,kind:t})=>`["${e}", unknown, ${t===`required`?`true`:`false`}]`).join(`, `)}]`},cascadingState({cascadingMiddleware:e}){return a(e.map(({id:e})=>`UseT${e}`))}}}),{renderToFile:s}=x({helpers:i({origin:`src`})}),l=e=>e?.trim().length===0,u=c(n?.templates,lt),d=async e=>{for(let{kind:t,entry:n}of e)t===`apiRoute`?await s(r.api(n.file),u(n.name,n),{route:n},{overwrite:l}):t===`apiUse`&&await s(r.api(n.file),ut,{},{overwrite:l})},m=async e=>{let i=e.flatMap(({kind:e,entry:t})=>e===`apiUse`?[t]:[]),a=e.flatMap(({kind:e,entry:r})=>{if(e!==`apiRoute`)return[];let a=r.name.split(`/`).reduce((e,n)=>{let r=e[e.length-1];return e.push(r?t(r,n):n),e},[]),o={...r,basename:r.name,path:r.pathPattern,cascadingMiddleware:i.flatMap(e=>a.some(t=>e.name===t)?[e]:[])};return[o,...Object.entries({...n?.alias}).flatMap(([e,t])=>{let n=b(e);return t===r.name?[{...o,name:e,basename:r.name,id:`${o.id}_${T(e)}`,alias:f(n),pathTokens:n}]:[]})]}).sort(S);for(let[e,t]of[[`@api/routes.ts`,tt]])await o(r.lib(e),t,{routes:a,cascadingMiddleware:i})};return{config({command:e}){return{define:{KOSMO_PRODUCTION_BUILD:e===`build`?`true`:`false`}}},async start(){for(let[e,t]of[[`api.ts`,rt],[`api:factory.ts`,it],[`@api/app.ts`,Xe],[`@api/dev.ts`,Ze],[`@api/errors.ts`,Qe],[`@api/parsers.ts`,$e],[`@api/router.ts`,et],[`@api/server.ts`,nt]])await o(r.lib(e),t,{});for(let[e,t]of[[`app.ts`,at],[`dev.ts`,ot],[`errors.ts`,ct],[`server.ts`,dt],[`use.ts`,ft],[`env.d.ts`,st]])await s(r.api(e),t,{},{overwrite:l})},async watch(e,t){await d(e.filter(p(t,[`create`]))),await m(e)},async build(e){await d(e),await m(e)}}}),mt=h({meta:{name:`Koa`,slot:`backend`,types:[`@types/koa`]},dependencies:{koa:H.devDependencies.koa,"@koa/router":H.devDependencies[`@koa/router`],formidable:H.devDependencies.formidable,"raw-body":H.devDependencies[`raw-body`]},devDependencies:{"@types/koa":H.devDependencies[`@types/koa`],"@types/formidable":H.devDependencies[`@types/formidable`]},factory:pt}),U={type:`module`,private:!0,name:`@kosmojs/mdx-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"@mdx-js/rollup":`^3.1.1`,vite:`^8.2.2`},devDependencies:{"@mdx-js/mdx":`^3.1.1`,"@mdx-js/preact":`^3.1.1`,"path-to-regexp":`^8.4.2`,preact:`^10.29.8`,"preact-render-to-string":`^6.7.0`,"remark-frontmatter":`^5.0.0`,"remark-mdx-frontmatter":`^5.2.0`}},ht=()=>{let e=[`🎉 Well done! You just created a new MDX page.`,`🚀 Success! A fresh MDX page is ready to roll.`,`🌟 Nice work! Another MDX page added to your site.`,`🧩 All set! A new MDX page has been scaffolded.`,`🔧 Scaffold complete! Your new MDX page is in place.`,`✅ Built! Your MDX page is scaffolded and ready.`,`✨ Fantastic! Your new MDX page is good to go.`,`🎯 Nailed it! A brand new MDX page just landed.`,`💫 Awesome! Another MDX page joins the party.`,`⚡ Lightning fast! A new MDX page created successfully.`];return e[Math.floor(Math.random()*e.length)]},gt=(e,t,n)=>{let{remarkPlugins:r=[],rehypePlugins:i=[]}={...n},a=()=>{let t=[`${l.srcDir}/${e.name}/${l.entryDir}/client.ts`].map(e=>ie(e)),n=e=>t.some(t=>t(e));return{name:`kosmo:mdx[hmr]`,enforce:`post`,transform(e,t){if(!(!n(t)||e.includes(`import.meta.hot.accept`)))return{code:[e,`
|
|
2911
3079
|
if (import.meta.hot) {
|
|
2912
3080
|
import.meta.hot.accept(() => {});
|
|
2913
3081
|
}
|
|
2914
3082
|
`].join(`
|
|
2915
|
-
`)}}}},o=[
|
|
3083
|
+
`)}}}},o=[re({jsxImportSource:`preact`,providerImportSource:`@mdx-js/preact`,remarkPlugins:r,rehypePlugins:i})];return t===`serve`&&o.push(a()),o},_t=`import type { FunctionComponent } from "preact";
|
|
2916
3084
|
|
|
2917
3085
|
export const AppProvider: FunctionComponent = (props) => {
|
|
2918
3086
|
return props.children;
|
|
2919
3087
|
};
|
|
2920
|
-
`,
|
|
3088
|
+
`,vt=`import { render, hydrate as hydrateOrig } from "preact";
|
|
2921
3089
|
import type { RouterFactoryReturn } from "@kosmojs/core";
|
|
2922
3090
|
import { clientRenderFactory } from "@kosmojs/core/generators";
|
|
2923
3091
|
|
|
@@ -2958,7 +3126,7 @@ export const mount = async (
|
|
|
2958
3126
|
}
|
|
2959
3127
|
|
|
2960
3128
|
export default clientRenderFactory();
|
|
2961
|
-
`,
|
|
3129
|
+
`,yt=`import { renderToString as renderToStringOrig } from "preact-render-to-string";
|
|
2962
3130
|
|
|
2963
3131
|
import type {
|
|
2964
3132
|
RenderToStringWrapper,
|
|
@@ -3032,7 +3200,7 @@ export const renderToString: RenderToStringWrapper<
|
|
|
3032
3200
|
}
|
|
3033
3201
|
|
|
3034
3202
|
export default serverRenderFactory<false>();
|
|
3035
|
-
`,
|
|
3203
|
+
`,bt=`declare module "*.mdx" {
|
|
3036
3204
|
import type { ComponentType } from "preact";
|
|
3037
3205
|
export const frontmatter: Record<string, unknown>;
|
|
3038
3206
|
const component: ComponentType;
|
|
@@ -3045,7 +3213,7 @@ declare module "*.md" {
|
|
|
3045
3213
|
const component: ComponentType;
|
|
3046
3214
|
export default component;
|
|
3047
3215
|
}
|
|
3048
|
-
`,
|
|
3216
|
+
`,xt=`import { MDXProvider } from "@mdx-js/preact";
|
|
3049
3217
|
import { match, pathToRegexp } from "path-to-regexp";
|
|
3050
3218
|
import { type ComponentType, createContext, h, type VNode } from "preact";
|
|
3051
3219
|
|
|
@@ -3247,7 +3415,7 @@ export const createRoute = (
|
|
|
3247
3415
|
layouts,
|
|
3248
3416
|
};
|
|
3249
3417
|
};
|
|
3250
|
-
`,
|
|
3418
|
+
`,St=`/* @jsxImportSource preact */
|
|
3251
3419
|
|
|
3252
3420
|
import styles from "./styles.module.css";
|
|
3253
3421
|
|
|
@@ -3288,7 +3456,7 @@ export default function PageSample(props: {
|
|
|
3288
3456
|
</div>
|
|
3289
3457
|
);
|
|
3290
3458
|
}
|
|
3291
|
-
`,
|
|
3459
|
+
`,Ct=`/* @jsxImportSource preact */
|
|
3292
3460
|
|
|
3293
3461
|
import styles from "./styles.module.css";
|
|
3294
3462
|
|
|
@@ -3340,7 +3508,7 @@ export default function PageSample(props: {
|
|
|
3340
3508
|
</div>
|
|
3341
3509
|
);
|
|
3342
3510
|
}
|
|
3343
|
-
`,
|
|
3511
|
+
`,wt=`* {
|
|
3344
3512
|
margin: 0;
|
|
3345
3513
|
padding: 0;
|
|
3346
3514
|
box-sizing: border-box;
|
|
@@ -3475,7 +3643,7 @@ export default function PageSample(props: {
|
|
|
3475
3643
|
align-items: center;
|
|
3476
3644
|
gap: 0.25rem;
|
|
3477
3645
|
}
|
|
3478
|
-
`,
|
|
3646
|
+
`,Tt=`/* @jsxImportSource preact */
|
|
3479
3647
|
|
|
3480
3648
|
import styles from "./styles.module.css";
|
|
3481
3649
|
|
|
@@ -3541,7 +3709,7 @@ export default function WelcomePage() {
|
|
|
3541
3709
|
</div>
|
|
3542
3710
|
);
|
|
3543
3711
|
}
|
|
3544
|
-
`,
|
|
3712
|
+
`,Et=`export type ParamsMap = {
|
|
3545
3713
|
{{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
|
|
3546
3714
|
{{/each}}
|
|
3547
3715
|
};
|
|
@@ -3550,7 +3718,7 @@ export const paramNames = {
|
|
|
3550
3718
|
{{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
|
|
3551
3719
|
{{/each}}
|
|
3552
3720
|
} as const;
|
|
3553
|
-
`,
|
|
3721
|
+
`,Dt=`import type { ComponentType } from "preact";
|
|
3554
3722
|
|
|
3555
3723
|
import type { RouterFactoryReturn } from "@kosmojs/core";
|
|
3556
3724
|
import { createRouterFactory } from "@kosmojs/core/generators";
|
|
@@ -3594,7 +3762,7 @@ export default createRouterFactory<
|
|
|
3594
3762
|
Promise<RouteComponent>,
|
|
3595
3763
|
{ server: { route: Route } }
|
|
3596
3764
|
>();
|
|
3597
|
-
`,
|
|
3765
|
+
`,Ot=`import { join } from "node:path";
|
|
3598
3766
|
|
|
3599
3767
|
import { compile } from "path-to-regexp";
|
|
3600
3768
|
|
|
@@ -3640,7 +3808,7 @@ export default Object.entries(routes)
|
|
|
3640
3808
|
return [];
|
|
3641
3809
|
})
|
|
3642
3810
|
.map((path) => join(base, path));
|
|
3643
|
-
`,
|
|
3811
|
+
`,kt=`import type { PageRoute } from "@kosmojs/core";
|
|
3644
3812
|
|
|
3645
3813
|
{{#each pageRoutes}}
|
|
3646
3814
|
import * as {{id}} from "{{ createImport 'pages' file }}";
|
|
@@ -3664,7 +3832,7 @@ const routeMap: Record<
|
|
|
3664
3832
|
}
|
|
3665
3833
|
|
|
3666
3834
|
export default routeMap;
|
|
3667
|
-
`,
|
|
3835
|
+
`,At=`import { useContext } from "preact/hooks";
|
|
3668
3836
|
|
|
3669
3837
|
import { RouterContext } from "./mdx";
|
|
3670
3838
|
|
|
@@ -3710,10 +3878,10 @@ export const useFrontmatter = <
|
|
|
3710
3878
|
>(): T => {
|
|
3711
3879
|
return useRoute().frontmatter as T;
|
|
3712
3880
|
};
|
|
3713
|
-
`,
|
|
3881
|
+
`,jt=`import { AppProvider } from "{{ createImport 'lib' 'app' }}";
|
|
3714
3882
|
|
|
3715
3883
|
<AppProvider>{props.children}</AppProvider>
|
|
3716
|
-
`,
|
|
3884
|
+
`,Mt=`import { h, type JSX } from "preact";
|
|
3717
3885
|
|
|
3718
3886
|
import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
|
|
3719
3887
|
|
|
@@ -3730,7 +3898,7 @@ export default function Link(
|
|
|
3730
3898
|
|
|
3731
3899
|
return h("a", { ...restProps, href }, children);
|
|
3732
3900
|
}
|
|
3733
|
-
`,
|
|
3901
|
+
`,Nt=`/**
|
|
3734
3902
|
* MDX component overrides.
|
|
3735
3903
|
*
|
|
3736
3904
|
* Every standard markdown element (headings, links, code blocks, etc.)
|
|
@@ -3753,7 +3921,7 @@ export const components = {
|
|
|
3753
3921
|
declare global {
|
|
3754
3922
|
type MDXProvidedComponents = typeof components;
|
|
3755
3923
|
}
|
|
3756
|
-
`,
|
|
3924
|
+
`,Pt=`import renderFactory, {
|
|
3757
3925
|
createRoutes,
|
|
3758
3926
|
hydrate,
|
|
3759
3927
|
mount,
|
|
@@ -3780,7 +3948,7 @@ if (root) {
|
|
|
3780
3948
|
} else {
|
|
3781
3949
|
console.error("❌ Root element not found!");
|
|
3782
3950
|
}
|
|
3783
|
-
`,
|
|
3951
|
+
`,Ft=`import renderFactory, {
|
|
3784
3952
|
createRoutes,
|
|
3785
3953
|
renderToString,
|
|
3786
3954
|
// no renderToStream on MDX folders
|
|
@@ -3801,18 +3969,6 @@ export default renderFactory(() => {
|
|
|
3801
3969
|
},
|
|
3802
3970
|
};
|
|
3803
3971
|
});
|
|
3804
|
-
`,Ft=`<!doctype html>
|
|
3805
|
-
<html lang="en">
|
|
3806
|
-
<head>
|
|
3807
|
-
<meta charset="UTF-8" />
|
|
3808
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
3809
|
-
<!--app-head-->
|
|
3810
|
-
</head>
|
|
3811
|
-
<body>
|
|
3812
|
-
<div id="app"><!--app-html--></div>
|
|
3813
|
-
<script type="module" src="/{{ entryDir }}/client.ts"><\/script>
|
|
3814
|
-
</body>
|
|
3815
|
-
</html>
|
|
3816
3972
|
`,It=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
|
|
3817
3973
|
|
|
3818
3974
|
export default function Page() {
|
|
@@ -3860,7 +4016,7 @@ export default routerFactory((routes) => {
|
|
|
3860
4016
|
},
|
|
3861
4017
|
};
|
|
3862
4018
|
});
|
|
3863
|
-
`,Vt=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w(),serializeParams(e){return JSON.stringify(e.params)}}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,Rt),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?zt:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:
|
|
4019
|
+
`,Vt=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w(),serializeParams(e){return JSON.stringify(e.params)}}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,Rt),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?zt:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:ht()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),Lt,{route:r},{overwrite:o})},d=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),r=e.flatMap(({kind:e,entry:n})=>{if(e===`pageRoute`){let{name:e,file:r}=n;return[{...n,layouts:t.flatMap(t=>t.name===e||r.startsWith(`${t.name}/`)?[t]:[]).sort(S)}]}return[]}).sort(S);for(let[e,a]of[[`client.ts`,vt],[`server.ts`,yt]])await i(n.libEntry(e),a,{pageRoutes:r,layouts:t});for(let[e,t]of[[`params.ts`,Et],[`router.ts`,Dt],[`ssg:routes.ts`,kt]])await i(n.lib(e),t,{pageRoutes:r})};return{config({command:n}){return{oxc:{jsx:{runtime:`automatic`,importSource:`preact`}},plugins:gt(e,n,t)}},async start(){for(let[e,t]of[[`env.d.ts`,bt],[`app.ts`,_t],[`mdx.ts`,xt],[`use.ts`,At],[`ssg.ts`,Ot],[`pageSamples/styles.module.css`,wt],[`pageSamples/welcome.tsx`,Tt],[`pageSamples/page.tsx`,Ct],[`pageSamples/404.tsx`,St]])await i(n.lib(e),t,{});for(let[e,t]of[[`pages/404.mdx`,It],[`components/Link.tsx`,Mt],[`components/mdx.ts`,Nt],[`app.mdx`,jt],[`router.ts`,Bt]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});for(let[e,t]of[[`client.ts`,Pt],[`server.ts`,Ft]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){await u(e.filter(m(t,[`create`]))),await d(e)},async build(e){await u(e),await d(e)}}}),Ht=h({meta:{name:`MDX`,slot:`frontend`,jsx:`react-jsx`,jsxImportSource:`preact`},dependencies:{"path-to-regexp":U.devDependencies[`path-to-regexp`]},devDependencies:{preact:U.devDependencies.preact,"preact-render-to-string":U.devDependencies[`preact-render-to-string`],"@mdx-js/preact":U.devDependencies[`@mdx-js/preact`],"remark-frontmatter":U.devDependencies[`remark-frontmatter`],"remark-mdx-frontmatter":U.devDependencies[`remark-mdx-frontmatter`]},factory:Vt}),Ut={json:`application/json`,form:[`application/x-www-form-urlencoded`,`multipart/form-data`],raw:void 0},Wt=()=>{let e=e=>[`Buffer`,`ArrayBuffer`,`Blob`].includes(e)?{type:`string`,format:`binary`}:se.Script(e),n=(e,t,n)=>{let r=n?`${t}_${n.replace(/[^\w.-]/g,`_`)}${T(n)}`:t;return`${e.id}_${r}`},r=(e,t,r,i)=>[`#`,`components`,e,n(t,r,i)].join(`/`),i=e=>e.split(`/`).reduce((e,t)=>e+ +!t.includes(`{`),0),o=e=>{if(e.name===`index`)return[`/`];let{tokens:n}=oe(e.pathPattern),r=e=>e.flatMap(e=>{switch(e.type){case`param`:return[e.name];case`wildcard`:return[e.name];case`group`:return r(e.tokens);default:return[]}}),a=(e,t)=>{if(!e.length)return[t];let[n,...i]=e;switch(n.type){case`text`:return a(i,{path:`${t.path}${n.value}`,params:t.params});case`param`:return a(i,{path:`${t.path}{${n.name}}`,params:[...t.params,n.name]});case`wildcard`:return a(i,{path:`${t.path}{${n.name}*}`,params:[...t.params,n.name]});case`group`:{let e=a(i,t),o=a([...n.tokens,...i],t),s=r(n.tokens),c=o.filter(e=>s.some(t=>e.params.includes(t)));return[...e,...c]}}},o=a(n,{path:``,params:[]}),s=e.params.schema.reduce((e,{name:t},n)=>(e[n]=t,e),{});return o.reduce((e,n)=>{let r=t(`/`,n.path);return e.includes(r)||n.params.every((e,t)=>e===s[t])&&e.push(r),e},[]).sort((e,t)=>i(t)-i(e))},s=(e,t)=>{let n=e.params.resolvedType?.properties?.flatMap(n=>RegExp(`\\{${n.name}\\*?\\}`).test(t)?[{$ref:r(`parameters`,e,e.params.id,n.name)}]:[]);return n?.length?n:void 0},c=(e,t)=>{let n=e.validationDefinitions.find(e=>e.method===t&&e.target===`response`);return Array.isArray(n?.variants)?n.variants.reduce((t,{id:n,status:i,contentType:a,body:o})=>(t[i]=Gt(i,a)||{description:`Success`,content:{[a||`application/json`]:{schema:o?{$ref:r(`schemas`,e,n)}:{type:`object`}}}},t),{}):{200:{description:`Success - TODO: Add response schema`,content:{"text/plain":{schema:{type:`string`}}}}}},l=t=>{let{parameters:r,schemas:i}={parameters:{},schemas:{}};for(let r of t.validationDefinitions)if(r.target===`response`)for(let{id:a,resolvedType:o}of r.variants)o?.typeboxSchema&&(i[n(t,a)]=e(o.typeboxSchema));else if(r.target===`query`){let{id:a,resolvedType:o}=r.schema;for(let r of o?.properties||[])if(r?.typeboxSchema){let o=n(t,a,r.name);i[o]=e(r.typeboxSchema)}}else{let{id:a,resolvedType:o}=r.schema;o?.typeboxSchema&&(i[n(t,a)]=e(o.typeboxSchema))}if(t.params.resolvedType)for(let i of t.params.resolvedType.properties||[])i?.typeboxSchema&&(r[n(t,t.params.id,i.name)]={name:i.name,in:`path`,required:!0,schema:e(i.typeboxSchema)});return{parameters:r,schemas:i}},u=e=>{let t={},n=e.validationDefinitions.flatMap(e=>e.target===`response`?[]:e.schema.resolvedType?[e]:[]);for(let i of o(e))for(let o of e.methods){let l={responses:c(e,o)},u=s(e,i);u&&(l.parameters=u);let d=n.find(e=>e.method===o&&e.target===`query`);if(d?.schema)for(let t of d.schema.resolvedType?.properties||[])l.parameters||=[],l.parameters.push({name:t.name,in:`query`,required:!t.optional,schema:{$ref:r(`schemas`,e,d.schema.id,t.name)}});let f=n.filter(e=>e.method===o&&Object.keys(a).includes(e.target));f.length&&(l.requestBody={required:!0,content:f.reduce((t,n)=>{let{contentType:i=Ut[n.target]}=n;if(i){let a={$ref:r(`schemas`,e,n.schema.id)};for(let e of[i].flat())t[e]={schema:a}}return t},{})}),t[i]||(t[i]={}),t[i][o.toLowerCase()]=l}return t};return{generateComponentId:n,generateComponentPath:r,generatePathVariations:o,generateOpenAPISchema:e=>{let t=new Map;for(let n of e)t.set(n.name,o(n));let{components:n,paths:r}=e.sort(S).flatMap(n=>{let r=t.get(n.name)??[];return r.length>0&&e.some(e=>{if(e.name===n.name)return!1;let i=t.get(e.name)??[],a=new Set(i);return r.every(e=>a.has(e))})?[]:[n]}).reduce((e,t)=>{let n=u(t),{parameters:r,schemas:i}=l(t);return{paths:{...e.paths,...n},components:{parameters:{...e.components.parameters,...r},schemas:{...e.components.schemas,...i}}}},{paths:{},components:{parameters:{},schemas:{}}});return{paths:r,components:n}}}},Gt=(e,t)=>{let n={type:`string`,format:`uri`,...t?{enum:[t]}:{}};return{301:{description:`Moved Permanently`,headers:{Location:{description:`New permanent location`,schema:n}}},302:{description:`Found`,headers:{Location:{description:`Temporary location`,schema:n}}},303:{description:`See Other`,headers:{Location:{description:`Location to GET after POST/PUT/DELETE`,schema:n}}},307:{description:`Temporary Redirect`,headers:{Location:{description:`Temporary location (preserves request method)`,schema:n}}},308:{description:`Permanent Redirect`,headers:{Location:{description:`New permanent location (preserves request method)`,schema:n}}}}[e]},Kt=g((e,t)=>{let{outfile:n=``,...r}={...t},{createPath:i}=y(e),{generateOpenAPISchema:a}=Wt(),o=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`apiRoute`?[t]:[]),{paths:o,components:s}=a(t),c={...JSON.parse(JSON.stringify(r)),paths:o,components:s},l=/ya?ml/.test(n)?ae.stringify(c):JSON.stringify(c,null,2);await ee(i.src(n),l,{})};return{async watch(e){await o(e)},async build(e){await o(e)}}}),qt=h({meta:{name:`OpenAPI`,resolveTypes:!0},factory:Kt}),W={type:`module`,private:!0,name:`@kosmojs/react-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/react-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"@vitejs/plugin-react":`^6.1.0`},devDependencies:{"@tanstack/react-query":`^5.102.2`,"@types/react":`^19.2.18`,"@types/react-dom":`^19.2.5`,"path-to-regexp":`^8.4.2`,react:`^19.2.8`,"react-dom":`^19.2.8`,"react-router":`^8.3.0`}},Jt=e=>{let t=e.map(e=>e.orig).join(`/`),n=e=>e.kind===`splat`?`*`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[n(e.parts[0])]:(/\.\w+$/.test(e.orig)||(console.warn(`❗${r([`red`,`bold`],`WARN`)}: React Router v7 only supports dot-suffix mixed segments (e.g. :param.html).`),console.warn(` ${r([`magenta`],e.orig)} in ${r([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},Yt=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=n=>n.flatMap(({index:n,layout:r,children:i})=>{let{name:a,pathTokens:o}={...n,...r};if(!o)return[];let s=`${a}:layout`,c=Jt(o),l=o.at(-1);return e(l)?n&&r?[{name:s,path:c,component:r.id,children:[{name:a,path:`*`,component:n.id}]}]:n?[{path:c,children:[{name:a,path:`*`,component:n.id},...t(i)]}]:r?[{name:s,path:c,component:r.id,children:t(i)}]:[]:n&&r?[{name:s,path:c,component:r.id,children:[{name:a,index:!0,component:n.id},...t(i)]}]:n?[{path:c,children:[{name:a,index:!0,component:n.id},...t(i)]}]:r?[{name:s,path:c,component:r.id,children:t(i)}]:[]});return t},Xt=()=>{let e=[`🎉 Well done! You just created a new React route.`,`🚀 Success! A fresh React route is ready to roll.`,`🌟 Nice work! Another React route added to your app.`,`⚡ Quick and easy! Your new React route is good to go.`,`🥳 Congrats! Your app just leveled up with a new React route.`,`🧩 All set! A new React route has been scaffolded.`,`🔧 Scaffold complete! Your new React route is in place.`,`✨ Fantastic! Your new React route is ready.`,`🎯 Nailed it! A brand new React route just landed.`,`💫 Awesome! Another React route joins the lineup.`];return e[Math.floor(Math.random()*e.length)]},Zt=`import type { ReactNode } from "react";
|
|
3864
4020
|
|
|
3865
4021
|
export const AppProvider = ({ children }: { children: ReactNode }) => {
|
|
3866
4022
|
return children;
|
|
@@ -4524,29 +4680,17 @@ export default renderFactory(() => {
|
|
|
4524
4680
|
},
|
|
4525
4681
|
};
|
|
4526
4682
|
});
|
|
4527
|
-
`,hn
|
|
4528
|
-
<html lang="en">
|
|
4529
|
-
<head>
|
|
4530
|
-
<meta charset="UTF-8" />
|
|
4531
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
4532
|
-
<!--app-head-->
|
|
4533
|
-
</head>
|
|
4534
|
-
<body>
|
|
4535
|
-
<div id="app"><!--app-html--></div>
|
|
4536
|
-
<script type="module" src="/{{ entryDir }}/client.ts"><\/script>
|
|
4537
|
-
</body>
|
|
4538
|
-
</html>
|
|
4539
|
-
`,gn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
|
|
4683
|
+
`,hn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
|
|
4540
4684
|
|
|
4541
4685
|
export default function Page() {
|
|
4542
4686
|
return <PageSample />;
|
|
4543
4687
|
}
|
|
4544
|
-
`,
|
|
4688
|
+
`,gn=`import { Outlet } from "react-router";
|
|
4545
4689
|
|
|
4546
4690
|
export default function Layout() {
|
|
4547
4691
|
return <Outlet />;
|
|
4548
4692
|
}
|
|
4549
|
-
`,
|
|
4693
|
+
`,_n=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
|
|
4550
4694
|
|
|
4551
4695
|
export default function Page() {
|
|
4552
4696
|
return PageSample({
|
|
@@ -4559,8 +4703,8 @@ export default function Page() {
|
|
|
4559
4703
|
},
|
|
4560
4704
|
});
|
|
4561
4705
|
}
|
|
4562
|
-
`,
|
|
4563
|
-
`,
|
|
4706
|
+
`,vn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
|
|
4707
|
+
`,yn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
|
|
4564
4708
|
|
|
4565
4709
|
import app from "./app";
|
|
4566
4710
|
|
|
@@ -4575,12 +4719,12 @@ export default routerFactory((routes) => {
|
|
|
4575
4719
|
},
|
|
4576
4720
|
};
|
|
4577
4721
|
});
|
|
4578
|
-
`,
|
|
4722
|
+
`,bn=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()},partials:{routePartial:en}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=Yt(),s=e=>!e?.trim().length,u=c(t?.templates,_n),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?vn:u(r.name,r),{route:r,message:Xt()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),gn,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(v(r));for(let[e,t]of[[`client.ts`,$t],[`server.ts`,tn]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a});await i(n.lib(`router.tsx`),un,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[ce(n)]}},async start(){for(let[e,r]of[[`env.d.ts`,``],[`react.ts`,ln],[`pageSamples/styles.module.css`,an],[`pageSamples/welcome.tsx`,on],[`pageSamples/page.tsx`,rn],[`pageSamples/404.tsx`,nn],...t?.tanstack?.query?[[`app.tsx`,Qt],[`query.ts`,sn]]:[[`app.tsx`,Zt],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.tsx`,hn],[`components/Link.tsx`,fn],[`app.tsx`,dn],[`router.ts`,yn]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});for(let[e,t]of[[`client.ts`,pn],[`server.ts`,mn]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){await d(e.filter(m(t,[`create`]))),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?cn:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),xn=h({meta:{name:`React`,slot:`frontend`,jsx:`preserve`,jsxImportSource:`react`},dependencies(e){return{react:W.devDependencies.react,"react-router":W.devDependencies[`react-router`],"path-to-regexp":W.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/react-query":W.devDependencies[`@tanstack/react-query`]}:{}}},devDependencies:{"@types/react":W.devDependencies[`@types/react`],"@types/react-dom":W.devDependencies[`@types/react-dom`],"react-dom":W.devDependencies[`react-dom`]},factory:bn}),G={type:`module`,private:!0,name:`@kosmojs/solid-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/solid-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"vite-plugin-solid":`^2.11.14`},devDependencies:{"@solidjs/router":`^1.0.0`,"@tanstack/solid-query":`^5.102.2`,"path-to-regexp":`^8.4.2`,"solid-js":`^1.9.15`}},Sn=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,t=t=>t?.kind===`param`?t.parts[0]?.kind===`optional`||e(t):!1,n=r=>r.flatMap(({index:r,layout:i,children:a})=>{let{pathTokens:o}={...r,...i},s=K(o.map((e,n)=>e.kind===`param`&&(t(o[n+1])||a.some(e=>e.index?.pathTokens.some(t)))?{...e,parts:[{...e.parts[0],kind:`required`}]}:e)),c=o.at(-1);if(e(c)){let e=K([c]);return r&&i?[{path:s,component:i.id,children:[{path:e,component:r.id}]}]:r?[{path:s,children:[{path:e,component:r.id},...n(a)]}]:i?[{path:s,component:i.id,children:n(a)}]:[]}return r&&i?[{path:s,component:i.id,children:[{path:`/`,component:r.id},...n(a)]}]:r?[{path:s,children:[{path:`/`,component:r.id},...n(a)]}]:i?[{path:s,component:i.id,children:n(a)}]:[]});return n},K=e=>{let t=e.map(e=>e.orig).join(`/`),n=e=>e.kind===`splat`?`*${e.name}`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[n(e.parts[0])]:(e.parts.length&&(console.warn(`❗${r([`red`,`bold`],`WARN`)}: At the moment Solid Router does not support mixed path segments.`),console.warn(` ${r([`magenta`],e.orig)} segment in ${r([`blue`],t)} route won't match as expected.`),console.warn()),[e.parts.map(e=>e.type===`static`?e.value:n(e)).join(``)])).join(`/`)},Cn=()=>{let e=[`🎉 Well done! You just created a new Solid route.`,`🚀 Success! A fresh Solid route is ready to roll.`,`🌟 Nice work! Another Solid route added to your app.`,`🧩 All set! A new Solid route has been scaffolded.`,`🔧 Scaffold complete! Your new Solid route is in place.`,`✅ Built! Your Solid route is scaffolded and ready.`,`✨ Fantastic! Your new Solid route is good to go.`,`🎯 Nailed it! A brand new Solid route just landed.`,`💫 Awesome! Another Solid route joins the party.`,`⚡ Lightning fast! A new Solid route created successfully.`];return e[Math.floor(Math.random()*e.length)]},wn=`import type { ParentComponent } from "solid-js";
|
|
4579
4723
|
|
|
4580
4724
|
export const AppProvider: ParentComponent = (props) => {
|
|
4581
4725
|
return props.children;
|
|
4582
4726
|
};
|
|
4583
|
-
`,
|
|
4727
|
+
`,Tn=`import type { ParentComponent } from "solid-js";
|
|
4584
4728
|
import { type QueryClient, QueryClientProvider } from "@tanstack/solid-query";
|
|
4585
4729
|
|
|
4586
4730
|
import { getQueryClient } from "./query";
|
|
@@ -4592,7 +4736,7 @@ export const AppProvider: ParentComponent<{ client?: QueryClient }> = (props) =>
|
|
|
4592
4736
|
</QueryClientProvider>
|
|
4593
4737
|
);
|
|
4594
4738
|
};
|
|
4595
|
-
`,
|
|
4739
|
+
`,En=`import { lazy, type JSX } from "solid-js";
|
|
4596
4740
|
import { hydrate as hydrateOrig, render } from "solid-js/web";
|
|
4597
4741
|
import type { RouterFactoryReturn } from "@kosmojs/core";
|
|
4598
4742
|
import { clientRenderFactory } from "@kosmojs/core/generators";
|
|
@@ -4637,7 +4781,7 @@ export const mount = async (
|
|
|
4637
4781
|
}
|
|
4638
4782
|
|
|
4639
4783
|
export default clientRenderFactory();
|
|
4640
|
-
`,
|
|
4784
|
+
`,Dn=`{
|
|
4641
4785
|
path: "{{path}}",
|
|
4642
4786
|
{{#if component}}
|
|
4643
4787
|
component: {{component}}_component,
|
|
@@ -4647,7 +4791,7 @@ export default clientRenderFactory();
|
|
|
4647
4791
|
children: [ {{#each children}}{{> routePartial}}, {{/each}}],
|
|
4648
4792
|
{{/if}}
|
|
4649
4793
|
}
|
|
4650
|
-
`,
|
|
4794
|
+
`,On=`import type { JSX } from "solid-js";
|
|
4651
4795
|
|
|
4652
4796
|
import {
|
|
4653
4797
|
generateHydrationScript,
|
|
@@ -4720,7 +4864,7 @@ export const renderToStream: RenderToStreamWrapper<
|
|
|
4720
4864
|
* and surfaces the error to the stream consumer; catching here only keeps
|
|
4721
4865
|
* the rejection from escaping as an unhandled one.
|
|
4722
4866
|
* */
|
|
4723
|
-
stream.pipeTo(writable).catch(() => {});
|
|
4867
|
+
void Promise.resolve(stream.pipeTo(writable)).catch(() => {});
|
|
4724
4868
|
return {
|
|
4725
4869
|
head: [...headerTags, generateHydrationScript()].join("\\n"),
|
|
4726
4870
|
html: readable,
|
|
@@ -4728,7 +4872,7 @@ export const renderToStream: RenderToStreamWrapper<
|
|
|
4728
4872
|
};
|
|
4729
4873
|
|
|
4730
4874
|
export default serverRenderFactory<true>();
|
|
4731
|
-
`,
|
|
4875
|
+
`,kn=`/* @jsxImportSource solid-js */
|
|
4732
4876
|
|
|
4733
4877
|
import styles from "./styles.module.css";
|
|
4734
4878
|
|
|
@@ -4769,7 +4913,7 @@ export default function PageSample(props: {
|
|
|
4769
4913
|
</div>
|
|
4770
4914
|
);
|
|
4771
4915
|
}
|
|
4772
|
-
`,
|
|
4916
|
+
`,An=`/* @jsxImportSource solid-js */
|
|
4773
4917
|
|
|
4774
4918
|
import styles from "./styles.module.css";
|
|
4775
4919
|
|
|
@@ -4821,7 +4965,7 @@ export default function PageSample(props: {
|
|
|
4821
4965
|
</div>
|
|
4822
4966
|
);
|
|
4823
4967
|
}
|
|
4824
|
-
`,
|
|
4968
|
+
`,jn=`* {
|
|
4825
4969
|
margin: 0;
|
|
4826
4970
|
padding: 0;
|
|
4827
4971
|
box-sizing: border-box;
|
|
@@ -4956,7 +5100,7 @@ export default function PageSample(props: {
|
|
|
4956
5100
|
align-items: center;
|
|
4957
5101
|
gap: 0.25rem;
|
|
4958
5102
|
}
|
|
4959
|
-
`,
|
|
5103
|
+
`,Mn=`/* @jsxImportSource solid-js */
|
|
4960
5104
|
|
|
4961
5105
|
import styles from "./styles.module.css";
|
|
4962
5106
|
|
|
@@ -5022,7 +5166,7 @@ export default function WelcomePage() {
|
|
|
5022
5166
|
</div>
|
|
5023
5167
|
);
|
|
5024
5168
|
}
|
|
5025
|
-
`,
|
|
5169
|
+
`,Nn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
|
|
5026
5170
|
|
|
5027
5171
|
let client: QueryClient | undefined;
|
|
5028
5172
|
|
|
@@ -5037,7 +5181,7 @@ export const getQueryClient = (): QueryClient => {
|
|
|
5037
5181
|
}
|
|
5038
5182
|
return client;
|
|
5039
5183
|
};
|
|
5040
|
-
`,
|
|
5184
|
+
`,Pn=`import { QueryClient, type QueryClientConfig } from "@tanstack/solid-query";
|
|
5041
5185
|
|
|
5042
5186
|
import { store } from "{{ createImport 'lib' '@ssr/base' }}";
|
|
5043
5187
|
|
|
@@ -5060,7 +5204,7 @@ export const getQueryClient = (): QueryClient => {
|
|
|
5060
5204
|
}
|
|
5061
5205
|
return ctx.tsqClient as QueryClient;
|
|
5062
5206
|
};
|
|
5063
|
-
`,
|
|
5207
|
+
`,Fn=`import type { JSX, ParentComponent } from "solid-js";
|
|
5064
5208
|
import { Router, type RouteDefinition } from "@solidjs/router";
|
|
5065
5209
|
import type { RouterFactoryReturn } from "@kosmojs/core";
|
|
5066
5210
|
import { createRouterFactory } from "@kosmojs/core/generators";
|
|
@@ -5096,7 +5240,7 @@ export const createRouters = (
|
|
|
5096
5240
|
}
|
|
5097
5241
|
|
|
5098
5242
|
export default createRouterFactory<RouteDefinition, JSX.Element>();
|
|
5099
|
-
`,
|
|
5243
|
+
`,In=`export type ComponentLoader = () => Promise<{
|
|
5100
5244
|
preload?: () => Promise<unknown>;
|
|
5101
5245
|
}>;
|
|
5102
5246
|
|
|
@@ -5111,10 +5255,10 @@ export const loaderFactory = (opt?: { withPreload?: boolean }) => {
|
|
|
5111
5255
|
return opt?.withPreload ? { preload } : {};
|
|
5112
5256
|
};
|
|
5113
5257
|
};
|
|
5114
|
-
`,
|
|
5258
|
+
`,Ln=`export type MaybeWrapped<T> = import("solid-js/store").Store<T> | T;
|
|
5115
5259
|
|
|
5116
5260
|
export { unwrap } from "solid-js/store";
|
|
5117
|
-
`,
|
|
5261
|
+
`,Rn=`import type { ParentComponent } from "solid-js";
|
|
5118
5262
|
import { AppProvider } from "{{ createImport 'lib' 'app' }}";
|
|
5119
5263
|
|
|
5120
5264
|
const App: ParentComponent = (props) => {
|
|
@@ -5122,7 +5266,7 @@ const App: ParentComponent = (props) => {
|
|
|
5122
5266
|
};
|
|
5123
5267
|
|
|
5124
5268
|
export default App;
|
|
5125
|
-
`,
|
|
5269
|
+
`,zn=`import { A, type AnchorProps } from "@solidjs/router";
|
|
5126
5270
|
import { type JSXElement, splitProps } from "solid-js";
|
|
5127
5271
|
|
|
5128
5272
|
import { pageRouteMap, type LinkProps } from "{{ createImport 'libCore' }}";
|
|
@@ -5147,7 +5291,7 @@ export default function Link(
|
|
|
5147
5291
|
|
|
5148
5292
|
return <A {...{ ...restProps, href: href() }}>{knownProps.children}</A>;
|
|
5149
5293
|
}
|
|
5150
|
-
`,
|
|
5294
|
+
`,Bn=`import renderFactory, {
|
|
5151
5295
|
createRoutes,
|
|
5152
5296
|
hydrate,
|
|
5153
5297
|
mount,
|
|
@@ -5174,7 +5318,7 @@ if (root) {
|
|
|
5174
5318
|
} else {
|
|
5175
5319
|
console.error("❌ Root element not found!");
|
|
5176
5320
|
}
|
|
5177
|
-
`,
|
|
5321
|
+
`,Vn=`import renderFactory, {
|
|
5178
5322
|
createRoutes,
|
|
5179
5323
|
renderToStream,
|
|
5180
5324
|
renderToString,
|
|
@@ -5201,31 +5345,19 @@ export default renderFactory(() => {
|
|
|
5201
5345
|
},
|
|
5202
5346
|
};
|
|
5203
5347
|
});
|
|
5204
|
-
`,
|
|
5205
|
-
<html lang="en">
|
|
5206
|
-
<head>
|
|
5207
|
-
<meta charset="UTF-8" />
|
|
5208
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
5209
|
-
<!--app-head-->
|
|
5210
|
-
</head>
|
|
5211
|
-
<body>
|
|
5212
|
-
<div id="app"><!--app-html--></div>
|
|
5213
|
-
<script type="module" src="/{{ entryDir }}/client.ts"><\/script>
|
|
5214
|
-
</body>
|
|
5215
|
-
</html>
|
|
5216
|
-
`,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
|
|
5348
|
+
`,Hn=`import PageSample from "{{ createImport 'lib' 'pageSamples/404.tsx' }}";
|
|
5217
5349
|
|
|
5218
5350
|
export default function Page() {
|
|
5219
5351
|
return <PageSample />;
|
|
5220
5352
|
}
|
|
5221
|
-
`,
|
|
5353
|
+
`,Un=`import type { ParentComponent } from "solid-js";
|
|
5222
5354
|
|
|
5223
5355
|
const Layout: ParentComponent = (props) => {
|
|
5224
5356
|
return props.children;
|
|
5225
5357
|
};
|
|
5226
5358
|
|
|
5227
5359
|
export default Layout;
|
|
5228
|
-
`,
|
|
5360
|
+
`,Wn=`import PageSample from "{{ createImport 'lib' 'pageSamples/page.tsx' }}";
|
|
5229
5361
|
|
|
5230
5362
|
export default function Page() {
|
|
5231
5363
|
return PageSample({
|
|
@@ -5238,8 +5370,8 @@ export default function Page() {
|
|
|
5238
5370
|
},
|
|
5239
5371
|
});
|
|
5240
5372
|
}
|
|
5241
|
-
`,
|
|
5242
|
-
`,
|
|
5373
|
+
`,Gn=`export { default } from "{{ createImport 'lib' 'pageSamples/welcome.tsx' }}";
|
|
5374
|
+
`,Kn=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
|
|
5243
5375
|
|
|
5244
5376
|
import app from "./app";
|
|
5245
5377
|
|
|
@@ -5254,12 +5386,12 @@ export default routerFactory((routes) => {
|
|
|
5254
5386
|
},
|
|
5255
5387
|
};
|
|
5256
5388
|
});
|
|
5257
|
-
`,
|
|
5389
|
+
`,qn=g((e,t)=>{let{generators:n=[]}=e.config,{createPath:r,createImportHelpers:i}=y(e),{renderToFile:a}=x({helpers:{...i({origin:`lib`}),...w()},partials:{routePartial:Dn}}),{renderToFile:o}=x({helpers:i({origin:`src`})}),s=Sn(),u=e=>!e?.trim().length,d=c(t?.templates,Wn),f=async e=>{for(let{kind:t,entry:n}of e)t===`pageRoute`?await o(r.pages(n.file),n.name===`index`?Gn:d(n.name,n),{route:n,message:Cn()},{overwrite:u}):t===`pageLayout`&&await o(r.pages(n.file),Un,{route:n},{overwrite:u})},p=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),n=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),i=s(v(n));for(let[e,t]of[[`client.ts`,En],[`server.ts`,On]])await a(r.libEntry(e),t,{pageEntries:n,nestedRoutes:i});await a(r.lib(`router.tsx`),Fn,{entries:e,indexRoutes:t})};return{config({command:e}){let{templates:r,...i}={...t};return{oxc:{jsx:{importSource:`solid-js`}},plugins:e===`build`?[D({...i,...n.some(e=>e.meta.slot===`ssr`)?{ssr:!0,solid:{...i?.solid,hydratable:!0}}:{}})]:[D({...i,dev:!0,hot:!0})]}},async start(){for(let[e,n]of[[`env.d.ts`,``],[`solid.ts`,In],[`unwrap.ts`,Ln],[`pageSamples/styles.module.css`,jn],[`pageSamples/welcome.tsx`,Mn],[`pageSamples/page.tsx`,An],[`pageSamples/404.tsx`,kn],...t?.tanstack?.query?[[`app.tsx`,Tn],[`query.ts`,Nn]]:[[`app.tsx`,wn],[`query.ts`,`/** tanstack query disabled */`]]])await a(r.lib(e),n,{});for(let[e,t]of[[`pages/404.tsx`,Hn],[`components/Link.tsx`,zn],[`app.tsx`,Rn],[`router.ts`,Kn]])await o(r.src(e),t,{entryDir:l.entryDir},{overwrite:u});for(let[e,t]of[[`client.ts`,Bn],[`server.ts`,Vn]])await o(r.entry(e),t,{},{overwrite:u})},async watch(e,t){await f(e.filter(m(t,[`create`]))),await p(e)},async build(e){await f(e),await p(e)},async ssrBuild(){await a(r.lib(`query.ts`),t?.tanstack?.query?Pn:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Jn=h({meta:{name:`SolidJS`,slot:`frontend`,jsx:`preserve`,jsxImportSource:`solid-js`},dependencies(e){return{"solid-js":G.devDependencies[`solid-js`],"@solidjs/router":G.devDependencies[`@solidjs/router`],"path-to-regexp":G.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/solid-query":G.devDependencies[`@tanstack/solid-query`]}:{}}},factory:qn}),Yn=g(e=>{let{generators:i=[],refineTypeName:a,...o}={...e.config},{createPath:s}=y(e);return{async postBuild(){let a=s.distDir(`ssg`),c=n(a,`../ssr/server.js`);if(!await le(c,ue.F_OK).then(()=>!0,()=>!1)){console.error(),console.error(r(`red`,`❗Please enable ssrGenerator in ${e.name}/kosmo.config.ts`)),console.error(` SSG generator can not run without SSR server`),console.error();return}let l=te(`${e.name}: SSG`);l.append(`preparing...`);let{createDisposableServer:u}=await import(c);await O(n(a,`../client/assets`),t(a,`assets`),{recursive:!0}),l.append(`bundling routes...`),await E(_(o,...i.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:s.lib(),appType:`custom`,plugins:[C.tsconfigPaths(e),C.nodePrefix()],resolve:{conditions:[`node`]},build:{ssr:s.lib(`ssg.ts`),target:`esnext`,sourcemap:!1,emptyOutDir:!0,rolldownOptions:{output:{dir:a,entryFileNames:`routes.js`,format:`esm`}}}}));try{let e=await import(t(a,`routes.js`)).then(e=>e.default);u(async n=>{for(let[r,i]of e.entries()){l.append(`[ ${r+1} of ${e.length} ] ${i}`);let o=await Xn(n,i);o!==void 0&&(await de(t(a,i),{recursive:!0}),await fe(t(a,t(i,`index.html`)),o,`utf8`))}l.succeed(`done ✨`)})}finally{await k(`${a}/routes.js`)}}}}),Xn=async(e,t)=>{try{let n=`http://localhost:${e}${t}`;return await(await fetch(n)).text()}catch(e){console.error(r(`red`,`✗ SSG: Failed generating ${t} route: ${e.message}`));return}},Zn=h({meta:{name:`SSG`,slot:`ssg`},factory:Yn}),q={type:`module`,private:!0,name:`@kosmojs/ssr-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,vite:`^8.2.2`},devDependencies:{"@hono/node-server":`^2.1.1`,hono:`^4.13.3`,"light-my-request":`^6.6.0`,tinyglobby:`^0.2.17`}},Qn=`{{#if apiGenerator}}
|
|
5258
5390
|
export { default as apiApp } from "{{ createImport 'api' 'app' }}";
|
|
5259
5391
|
{{else}}
|
|
5260
5392
|
export const apiApp = undefined;
|
|
5261
5393
|
{{/if}}
|
|
5262
|
-
|
|
5394
|
+
`,$n=`import { AsyncLocalStorage } from "node:async_hooks";
|
|
5263
5395
|
|
|
5264
5396
|
import type { FetchApp, NodeApp } from "@kosmojs/core";
|
|
5265
5397
|
|
|
@@ -5303,7 +5435,7 @@ export const store = new AsyncLocalStorage<RequestContext>();
|
|
|
5303
5435
|
export const isFetchApp = (app: FetchApp | NodeApp): app is FetchApp => {
|
|
5304
5436
|
return typeof (app as FetchApp).fetch === "function";
|
|
5305
5437
|
};
|
|
5306
|
-
`,
|
|
5438
|
+
`,er=`import { type RequestContext, store } from "./base";
|
|
5307
5439
|
|
|
5308
5440
|
import { renderWrapper } from "{{ createImport 'libEntry' 'server' }}";
|
|
5309
5441
|
|
|
@@ -5325,7 +5457,7 @@ export const withSsrContext = <T>(
|
|
|
5325
5457
|
export const errorProvider = () => {
|
|
5326
5458
|
return store.getStore()?.error;
|
|
5327
5459
|
};
|
|
5328
|
-
`,
|
|
5460
|
+
`,tr=`import type { FetchApp, NodeApp } from "@kosmojs/core";
|
|
5329
5461
|
import type { Transport } from "@kosmojs/core/fetch";
|
|
5330
5462
|
|
|
5331
5463
|
import {
|
|
@@ -5528,12 +5660,12 @@ const pathnameOf = (input: RequestInfo | URL): string => {
|
|
|
5528
5660
|
} catch {}
|
|
5529
5661
|
return String(input);
|
|
5530
5662
|
};
|
|
5531
|
-
`,
|
|
5663
|
+
`,nr=`export const routeMap = [
|
|
5532
5664
|
{{#each pageRoutes}}
|
|
5533
5665
|
{ pathPattern: "{{honoPattern}}", renderMode: "{{renderMode}}" },
|
|
5534
5666
|
{{/each}}
|
|
5535
5667
|
];
|
|
5536
|
-
`,
|
|
5668
|
+
`,rr=`import { access, chmod, constants, readFile, unlink } from "node:fs/promises";
|
|
5537
5669
|
import {
|
|
5538
5670
|
createServer,
|
|
5539
5671
|
type IncomingMessage,
|
|
@@ -5557,6 +5689,7 @@ import { routeMap } from "{{ createImport 'lib' '@ssr/routes' }}";
|
|
|
5557
5689
|
import { apiBase, base } from "{{ createImport 'libCore' }}";
|
|
5558
5690
|
|
|
5559
5691
|
const ROOT = import.meta.dirname;
|
|
5692
|
+
const HEAD_CLOSE_PATTERN = /<\\/head\\s*>/i;
|
|
5560
5693
|
|
|
5561
5694
|
type AssetInfo = {
|
|
5562
5695
|
file: string;
|
|
@@ -5583,8 +5716,7 @@ export const createApp = async () => {
|
|
|
5583
5716
|
errorProvider: () => Error | undefined;
|
|
5584
5717
|
} = await import(\`\${ROOT}/app.js\`);
|
|
5585
5718
|
|
|
5586
|
-
// Read the client index.html that includes <!--app-
|
|
5587
|
-
// placeholders used for SSR injection.
|
|
5719
|
+
// Read the client index.html that includes <!--app-html--> placeholder
|
|
5588
5720
|
const template = await readFile(\`\${ROOT}/index.html\`, "utf8");
|
|
5589
5721
|
|
|
5590
5722
|
// Load the Vite manifest
|
|
@@ -5593,7 +5725,8 @@ export const createApp = async () => {
|
|
|
5593
5725
|
}).then((e) => e.default);
|
|
5594
5726
|
|
|
5595
5727
|
const { renderToString, renderToStream } = ssrApp;
|
|
5596
|
-
|
|
5728
|
+
|
|
5729
|
+
const [htmlStart, htmlEnd = ""] = template.split(/<!--\\s*app-html\\s*-->/);
|
|
5597
5730
|
|
|
5598
5731
|
const assets = await loadAssets(ROOT);
|
|
5599
5732
|
|
|
@@ -5639,6 +5772,17 @@ export const createApp = async () => {
|
|
|
5639
5772
|
};
|
|
5640
5773
|
};
|
|
5641
5774
|
|
|
5775
|
+
const injectHead = (html: string, head: string) => {
|
|
5776
|
+
const error = "WARN: missing </head> - required for SSR head injection";
|
|
5777
|
+
if (HEAD_CLOSE_PATTERN.test(html)) {
|
|
5778
|
+
return html.replace(HEAD_CLOSE_PATTERN, (headEnd) => {
|
|
5779
|
+
return [head, headEnd].join("\\n");
|
|
5780
|
+
});
|
|
5781
|
+
}
|
|
5782
|
+
console.error(error);
|
|
5783
|
+
return \`\${html}\\n<script>console.error("\${error}")<\/script>\`;
|
|
5784
|
+
};
|
|
5785
|
+
|
|
5642
5786
|
const renderPage = async (url: URL, ctx: Context) => {
|
|
5643
5787
|
const {
|
|
5644
5788
|
head = "",
|
|
@@ -5669,23 +5813,20 @@ export const createApp = async () => {
|
|
|
5669
5813
|
);
|
|
5670
5814
|
|
|
5671
5815
|
if (error) {
|
|
5672
|
-
|
|
5816
|
+
const errorMessage = "WARN: SSR failed, fallback to CSR";
|
|
5817
|
+
console.error(errorMessage);
|
|
5673
5818
|
console.error(error);
|
|
5674
5819
|
console.error();
|
|
5675
5820
|
return [
|
|
5676
|
-
|
|
5677
|
-
|
|
5678
|
-
\`<script>console.error("
|
|
5821
|
+
injectHead(
|
|
5822
|
+
htmlStart,
|
|
5823
|
+
\`<script>console.error("\${errorMessage}")<\/script>\`,
|
|
5679
5824
|
),
|
|
5680
5825
|
htmlEnd,
|
|
5681
5826
|
].join("");
|
|
5682
5827
|
}
|
|
5683
5828
|
|
|
5684
|
-
return [
|
|
5685
|
-
htmlStart.replace("<!--app-head-->", head),
|
|
5686
|
-
html ?? "",
|
|
5687
|
-
htmlEnd,
|
|
5688
|
-
].join("");
|
|
5829
|
+
return [injectHead(htmlStart, head), html ?? "", htmlEnd].join("");
|
|
5689
5830
|
};
|
|
5690
5831
|
|
|
5691
5832
|
const app = new Hono({ strict: false });
|
|
@@ -5710,7 +5851,7 @@ export const createApp = async () => {
|
|
|
5710
5851
|
},
|
|
5711
5852
|
() => renderToStream(url, ssrOptions(), stream as never),
|
|
5712
5853
|
);
|
|
5713
|
-
await stream.write(htmlStart
|
|
5854
|
+
await stream.write(injectHead(htmlStart, head));
|
|
5714
5855
|
await stream.pipe(html);
|
|
5715
5856
|
await stream.write(htmlEnd);
|
|
5716
5857
|
});
|
|
@@ -5949,14 +6090,14 @@ if (isMain) {
|
|
|
5949
6090
|
process.exit(1);
|
|
5950
6091
|
}
|
|
5951
6092
|
}
|
|
5952
|
-
`,
|
|
6093
|
+
`,ir=`string`,ar=g((e,r)=>{let{generators:i=[],refineTypeName:a,...o}=e.config,{createPath:c,createImportHelpers:l}=y(e),{renderToFile:u}=x({helpers:{...l({origin:`lib`})}});return{async build(e){let t=r?.renderMode?typeof r.renderMode==`string`?()=>r.renderMode:s(r?.renderMode,`string`):()=>ir,n={renderMode:JSON.stringify(r?.renderMode||null),pageRoutes:e.flatMap(e=>e.kind===`pageRoute`?[{...e.entry,renderMode:t(e.entry.name)}]:[]).sort(S),apiGenerator:i.some(e=>e.meta.slot===`backend`)};for(let[e,t]of[[`ssr.ts`,rr],[`@ssr/api.ts`,Qn],[`@ssr/__kosmo_ssr_bundle.ts`,er],[`@ssr/base.ts`,$n],[`@ssr/fetch.ts`,tr],[`@ssr/routes.ts`,nr]])await u(c.lib(e),t,n)},async postBuild(){if(!i.some(e=>e.meta.slot===`frontend`))return;let r=c.distDir(`ssr`),a=[C.tsconfigPaths(e),C.nodePrefix()];for(let t of i)await t.factory(e).ssrBuild?.();await E(_(o,...i.map(({factory:t})=>t(e).config?.({kind:`client`,command:`build`})),{root:c.src(),plugins:a,define:{KOSMO_PRODUCTION_BUILD:`true`},build:{ssr:c.lib(`@ssr/__kosmo_ssr_bundle`),ssrEmitAssets:!0,sourcemap:!0,emptyOutDir:!0,minify:!1,rolldownOptions:{output:{dir:r,entryFileNames:`app.js`,format:`esm`}}}})),await E({root:c.lib(),configFile:!1,appType:`custom`,plugins:a,resolve:{conditions:[`node`]},build:{ssr:c.lib(`ssr.ts`),target:`esnext`,sourcemap:!0,emptyOutDir:!0,rolldownOptions:{output:{dir:t(r,`server`),entryFileNames:`server.js`,format:`esm`}}}}),await O(n(r,`../client`),r,{recursive:!0});for(let e of[`server.js`,`server.js.map`])await O(`${r}/server/${e}`,`${r}/${e}`);await k(`${r}/server`,{recursive:!0,force:!0})}}}),or=h({meta:{name:`SSR`,slot:`ssr`},dependencies:{tinyglobby:q.devDependencies.tinyglobby,hono:q.devDependencies.hono,"@hono/node-server":q.devDependencies[`@hono/node-server`],"light-my-request":q.devDependencies[`light-my-request`]},factory:ar}),J={type:`module`,private:!0,name:`@kosmojs/svelte-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"@sveltejs/vite-plugin-svelte":`^7.3.0`,vite:`^8.2.2`},devDependencies:{"@tanstack/svelte-query":`^6.1.41`,"path-to-regexp":`^8.4.2`,svelte:`^5.56.10`}},sr=()=>{let e=[`🎉 Well done! You just created a new Svelte page.`,`🚀 Success! A fresh Svelte page is ready to roll.`,`🌟 Nice work! Another Svelte page added to your app.`,`🧩 All set! A new Svelte page has been scaffolded.`,`🔧 Scaffold complete! Your new Svelte page is in place.`,`✅ Built! Your Svelte page is scaffolded and ready.`,`✨ Fantastic! Your new Svelte page is good to go.`,`🎯 Nailed it! A brand new Svelte page just landed.`,`💫 Awesome! Another Svelte page joins the party.`,`⚡ Lightning fast! A new Svelte page created successfully.`];return e[Math.floor(Math.random()*e.length)]},Y=`<script lang="ts">
|
|
5953
6094
|
import type { Snippet } from "svelte";
|
|
5954
6095
|
|
|
5955
6096
|
let { children }: { children: Snippet } = $props();
|
|
5956
6097
|
<\/script>
|
|
5957
6098
|
|
|
5958
6099
|
{@render children()}
|
|
5959
|
-
`,
|
|
6100
|
+
`,cr=`<script lang="ts">
|
|
5960
6101
|
import { type QueryClient, QueryClientProvider } from "@tanstack/svelte-query";
|
|
5961
6102
|
import type { Snippet } from "svelte";
|
|
5962
6103
|
|
|
@@ -5973,7 +6114,7 @@ if (isMain) {
|
|
|
5973
6114
|
<QueryClientProvider client={queryClient}>
|
|
5974
6115
|
{@render children()}
|
|
5975
6116
|
</QueryClientProvider>
|
|
5976
|
-
`,
|
|
6117
|
+
`,lr=`import { hydrate as hydrateOrig, mount as mountOrig } from "svelte";
|
|
5977
6118
|
import type { RouterFactoryReturn } from "@kosmojs/core";
|
|
5978
6119
|
import { clientRenderFactory } from "@kosmojs/core/generators";
|
|
5979
6120
|
|
|
@@ -6014,7 +6155,7 @@ export const mount = async (
|
|
|
6014
6155
|
}
|
|
6015
6156
|
|
|
6016
6157
|
export default clientRenderFactory();
|
|
6017
|
-
`,
|
|
6158
|
+
`,ur=`import { render as renderOrig } from "svelte/server";
|
|
6018
6159
|
|
|
6019
6160
|
import type {
|
|
6020
6161
|
RenderToStringWrapper,
|
|
@@ -6080,12 +6221,12 @@ export const renderToString: RenderToStringWrapper<
|
|
|
6080
6221
|
// svelte/server exposes only render() - no web-stream renderer -
|
|
6081
6222
|
// so this folder is string-only SSR.
|
|
6082
6223
|
export default serverRenderFactory<false>();
|
|
6083
|
-
`,
|
|
6224
|
+
`,dr=`declare module "*.svelte" {
|
|
6084
6225
|
import type { Component } from "svelte";
|
|
6085
6226
|
const component: Component;
|
|
6086
6227
|
export default component;
|
|
6087
6228
|
}
|
|
6088
|
-
`,
|
|
6229
|
+
`,fr=`<script lang="ts">
|
|
6089
6230
|
/**
|
|
6090
6231
|
* Folds [app, ...layouts] around the page component.
|
|
6091
6232
|
*
|
|
@@ -6119,7 +6260,7 @@ export default serverRenderFactory<false>();
|
|
|
6119
6260
|
{/snippet}
|
|
6120
6261
|
|
|
6121
6262
|
{@render layer(0)}
|
|
6122
|
-
`,
|
|
6263
|
+
`,pr=`<script lang="ts">
|
|
6123
6264
|
import styles from "./styles.module.css";
|
|
6124
6265
|
|
|
6125
6266
|
let { headline }: { headline?: string } = $props();
|
|
@@ -6151,7 +6292,7 @@ export default serverRenderFactory<false>();
|
|
|
6151
6292
|
</div>
|
|
6152
6293
|
</div>
|
|
6153
6294
|
</div>
|
|
6154
|
-
`,
|
|
6295
|
+
`,mr=`<script lang="ts">
|
|
6155
6296
|
import styles from "./styles.module.css";
|
|
6156
6297
|
|
|
6157
6298
|
let {
|
|
@@ -6196,7 +6337,7 @@ export default serverRenderFactory<false>();
|
|
|
6196
6337
|
</div>
|
|
6197
6338
|
</div>
|
|
6198
6339
|
</div>
|
|
6199
|
-
`,
|
|
6340
|
+
`,hr=`* {
|
|
6200
6341
|
margin: 0;
|
|
6201
6342
|
padding: 0;
|
|
6202
6343
|
box-sizing: border-box;
|
|
@@ -6331,7 +6472,7 @@ export default serverRenderFactory<false>();
|
|
|
6331
6472
|
align-items: center;
|
|
6332
6473
|
gap: 0.25rem;
|
|
6333
6474
|
}
|
|
6334
|
-
`,
|
|
6475
|
+
`,gr=`<script lang="ts">
|
|
6335
6476
|
import styles from "./styles.module.css";
|
|
6336
6477
|
<\/script>
|
|
6337
6478
|
|
|
@@ -6389,7 +6530,7 @@ export default serverRenderFactory<false>();
|
|
|
6389
6530
|
</div>
|
|
6390
6531
|
</div>
|
|
6391
6532
|
</div>
|
|
6392
|
-
`,
|
|
6533
|
+
`,_r=`export type ParamsMap = {
|
|
6393
6534
|
{{#each pageRoutes}}"{{name}}": {{serializeParamsLiteral .}};
|
|
6394
6535
|
{{/each}}
|
|
6395
6536
|
};
|
|
@@ -6398,7 +6539,7 @@ export const paramNames = {
|
|
|
6398
6539
|
{{#each pageRoutes}}"{{name}}": [ {{#each params.schema}}"{{name}}", {{/each}}],
|
|
6399
6540
|
{{/each}}
|
|
6400
6541
|
} as const;
|
|
6401
|
-
`,
|
|
6542
|
+
`,vr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
|
|
6402
6543
|
|
|
6403
6544
|
let client: QueryClient | undefined;
|
|
6404
6545
|
|
|
@@ -6413,7 +6554,7 @@ export const getQueryClient = (): QueryClient => {
|
|
|
6413
6554
|
}
|
|
6414
6555
|
return client;
|
|
6415
6556
|
};
|
|
6416
|
-
`,
|
|
6557
|
+
`,yr=`import { QueryClient, type QueryClientConfig } from "@tanstack/svelte-query";
|
|
6417
6558
|
|
|
6418
6559
|
import { store } from "{{ createImport 'lib' '@ssr/base' }}";
|
|
6419
6560
|
|
|
@@ -6436,7 +6577,7 @@ export const getQueryClient = (): QueryClient => {
|
|
|
6436
6577
|
}
|
|
6437
6578
|
return ctx.tsqClient as QueryClient;
|
|
6438
6579
|
};
|
|
6439
|
-
`,
|
|
6580
|
+
`,br=`import type { RouterFactoryReturn } from "@kosmojs/core";
|
|
6440
6581
|
import { createRouterFactory } from "@kosmojs/core/generators";
|
|
6441
6582
|
|
|
6442
6583
|
import Layouts from "./Layouts.svelte";
|
|
@@ -6476,7 +6617,7 @@ export default createRouterFactory<
|
|
|
6476
6617
|
Promise<RouteComponent>,
|
|
6477
6618
|
{ server: { route: Route } }
|
|
6478
6619
|
>();
|
|
6479
|
-
`,
|
|
6620
|
+
`,xr=`import { match, pathToRegexp } from "path-to-regexp";
|
|
6480
6621
|
import { type Component, createContext } from "svelte";
|
|
6481
6622
|
|
|
6482
6623
|
import { parseSearchParams } from "@kosmojs/core";
|
|
@@ -6703,7 +6844,7 @@ export const createRoute = (
|
|
|
6703
6844
|
layouts,
|
|
6704
6845
|
};
|
|
6705
6846
|
};
|
|
6706
|
-
`,
|
|
6847
|
+
`,Sr=`import { getRouteContext } from "./svelte";
|
|
6707
6848
|
|
|
6708
6849
|
import type { ParamsMap, paramNames } from "{{ createImport 'lib' 'params' }}";
|
|
6709
6850
|
|
|
@@ -6743,7 +6884,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
|
|
|
6743
6884
|
const route = useRoute();
|
|
6744
6885
|
return route.loaderData?.[key || route.name] as T;
|
|
6745
6886
|
};
|
|
6746
|
-
`,
|
|
6887
|
+
`,Cr=`<script lang="ts">
|
|
6747
6888
|
import { AppProvider } from "{{ createImport 'lib' 'app' }}";
|
|
6748
6889
|
import type { Snippet } from "svelte";
|
|
6749
6890
|
|
|
@@ -6753,7 +6894,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
|
|
|
6753
6894
|
<AppProvider>
|
|
6754
6895
|
{@render children()}
|
|
6755
6896
|
</AppProvider>
|
|
6756
|
-
`,
|
|
6897
|
+
`,wr=`<script lang="ts">
|
|
6757
6898
|
import type { Snippet } from "svelte";
|
|
6758
6899
|
import type { HTMLAnchorAttributes } from "svelte/elements";
|
|
6759
6900
|
|
|
@@ -6777,7 +6918,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
|
|
|
6777
6918
|
<\/script>
|
|
6778
6919
|
|
|
6779
6920
|
<a {href} {...rest}>{@render children?.()}</a>
|
|
6780
|
-
`,
|
|
6921
|
+
`,Tr=`import renderFactory, {
|
|
6781
6922
|
createRoutes,
|
|
6782
6923
|
hydrate,
|
|
6783
6924
|
mount,
|
|
@@ -6804,7 +6945,7 @@ if (root) {
|
|
|
6804
6945
|
} else {
|
|
6805
6946
|
console.error("❌ Root element not found!");
|
|
6806
6947
|
}
|
|
6807
|
-
`,
|
|
6948
|
+
`,Er=`import renderFactory, {
|
|
6808
6949
|
createRoutes,
|
|
6809
6950
|
renderToString,
|
|
6810
6951
|
// no renderToStream on Svelte folders
|
|
@@ -6825,31 +6966,19 @@ export default renderFactory(() => {
|
|
|
6825
6966
|
},
|
|
6826
6967
|
};
|
|
6827
6968
|
});
|
|
6828
|
-
`,
|
|
6829
|
-
<html lang="en">
|
|
6830
|
-
<head>
|
|
6831
|
-
<meta charset="UTF-8" />
|
|
6832
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6833
|
-
<!--app-head-->
|
|
6834
|
-
</head>
|
|
6835
|
-
<body>
|
|
6836
|
-
<div id="app"><!--app-html--></div>
|
|
6837
|
-
<script type="module" src="/{{ entryDir }}/client.ts"><\/script>
|
|
6838
|
-
</body>
|
|
6839
|
-
</html>
|
|
6840
|
-
`,Ar=`<script lang="ts">
|
|
6969
|
+
`,Dr=`<script lang="ts">
|
|
6841
6970
|
import PageSample from "{{ createImport 'lib' 'pageSamples/404.svelte' }}";
|
|
6842
6971
|
<\/script>
|
|
6843
6972
|
|
|
6844
6973
|
<PageSample />
|
|
6845
|
-
`,
|
|
6974
|
+
`,Or=`<script lang="ts">
|
|
6846
6975
|
import type { Snippet } from "svelte";
|
|
6847
6976
|
|
|
6848
6977
|
let { children }: { children: Snippet } = $props();
|
|
6849
6978
|
<\/script>
|
|
6850
6979
|
|
|
6851
6980
|
{@render children()}
|
|
6852
|
-
`,
|
|
6981
|
+
`,kr=`<script lang="ts">
|
|
6853
6982
|
import PageSample from "{{ createImport 'lib' 'pageSamples/page.svelte' }}";
|
|
6854
6983
|
|
|
6855
6984
|
const pathMap = {
|
|
@@ -6868,7 +6997,7 @@ export default renderFactory(() => {
|
|
|
6868
6997
|
routeName={"{{route.name}}"}
|
|
6869
6998
|
{pathMap}
|
|
6870
6999
|
/>
|
|
6871
|
-
`,
|
|
7000
|
+
`,Ar=`<script lang="ts">
|
|
6872
7001
|
import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.svelte' }}";
|
|
6873
7002
|
<\/script>
|
|
6874
7003
|
|
|
@@ -6881,7 +7010,7 @@ export default renderFactory(() => {
|
|
|
6881
7010
|
</svelte:head>
|
|
6882
7011
|
|
|
6883
7012
|
<WelcomePage />
|
|
6884
|
-
`,
|
|
7013
|
+
`,jr=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
|
|
6885
7014
|
|
|
6886
7015
|
import app from "./app.svelte";
|
|
6887
7016
|
|
|
@@ -6896,7 +7025,7 @@ export default routerFactory((routes) => {
|
|
|
6896
7025
|
},
|
|
6897
7026
|
};
|
|
6898
7027
|
});
|
|
6899
|
-
`,
|
|
7028
|
+
`,Mr=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=e=>!e?.trim().length,s=c(t?.templates,kr),u=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?Ar:s(r.name,r),{route:r,title:r.name.replace(/\{([^}]+)\}/g,`$1`),message:sr()},{overwrite:o}):t===`pageLayout`&&await a(n.pages(r.file),Or,{route:r},{overwrite:o})},d=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageLayout`?[t]:[]),r=e.flatMap(({kind:e,entry:n})=>{if(e===`pageRoute`){let{name:e,file:r}=n;return[{...n,layouts:t.flatMap(t=>t.name===e||r.startsWith(`${t.name}/`)?[t]:[]).sort(S)}]}return[]}).sort(S);for(let[e,a]of[[`client.ts`,lr],[`server.ts`,ur]])await i(n.libEntry(e),a,{pageRoutes:r,layouts:t});for(let[e,t]of[[`params.ts`,_r],[`router.ts`,br]])await i(n.lib(e),t,{pageRoutes:r})};return{config(){let{templates:e,...n}={...t};return{plugins:pe(n)}},async start(){for(let[e,r]of[[`env.d.ts`,dr],[`svelte.ts`,xr],[`Layouts.svelte`,fr],[`use.ts`,Sr],[`pageSamples/styles.module.css`,hr],[`pageSamples/welcome.svelte`,gr],[`pageSamples/page.svelte`,mr],[`pageSamples/404.svelte`,pr],...t?.tanstack?.query?[[`app/app.svelte`,Y],[`app/app-tsq.svelte`,cr],[`app/index.ts`,`export { default as AppProvider } from "./app-tsq.svelte";`],[`query.ts`,vr]]:[[`app/app.svelte`,Y],[`app/app-tsq.svelte`,`/** tanstack query disabled */`],[`app/index.ts`,`export { default as AppProvider } from "./app.svelte";`],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.svelte`,Dr],[`components/Link.svelte`,wr],[`app.svelte`,Cr],[`router.ts`,jr]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:o});for(let[e,t]of[[`client.ts`,Tr],[`server.ts`,Er]])await a(n.entry(e),t,{},{overwrite:o})},async watch(e,t){await u(e.filter(m(t,[`create`]))),await d(e)},async build(e){await u(e),await d(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?yr:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),Nr=h({meta:{name:`Svelte`,slot:`frontend`},dependencies(e){return{svelte:J.devDependencies.svelte,"path-to-regexp":J.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/svelte-query":J.devDependencies[`@tanstack/svelte-query`]}:{}}},factory:Mr}),Pr={type:`module`,private:!0,name:`@kosmojs/typebox-generator`,version:`0.3.0`,cacheVersion:`1`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/typebox-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,crc:`^4.3.2`,semver:`^7.8.5`},devDependencies:{"@kosmojs/core-generator":`workspace:^`,"@kosmojs/koa-generator":`workspace:^`,typebox:`^1.3.18`}},Fr=`import Type from "typebox";
|
|
6900
7029
|
|
|
6901
7030
|
/**
|
|
6902
7031
|
* Custom types for JavaScript constructs that have no JSON Schema
|
|
@@ -6968,13 +7097,13 @@ export default {
|
|
|
6968
7097
|
Buffer: TBuffer(),
|
|
6969
7098
|
ArrayBuffer: TArrayBuffer(),
|
|
6970
7099
|
};
|
|
6971
|
-
`,
|
|
7100
|
+
`,Ir=`import type { TValidationError } from "typebox/error";
|
|
6972
7101
|
|
|
6973
7102
|
import type { ValidationErrorEntry } from "@kosmojs/core";
|
|
6974
7103
|
|
|
6975
7104
|
/**
|
|
6976
7105
|
* Message codes for i18n/l10n support
|
|
6977
|
-
*/
|
|
7106
|
+
* */
|
|
6978
7107
|
export const MESSAGE_CODES = {
|
|
6979
7108
|
// Generic messages
|
|
6980
7109
|
|
|
@@ -7164,7 +7293,7 @@ export type ValidationMessages = typeof MESSAGE_CODES;
|
|
|
7164
7293
|
*
|
|
7165
7294
|
* Usage: format(ERROR_MESSAGES[ErrorCode.STRING_MIN_LENGTH], 5)
|
|
7166
7295
|
* Result: "must be at least 5 characters long"
|
|
7167
|
-
*/
|
|
7296
|
+
* */
|
|
7168
7297
|
const MESSAGE_MAP: Record<keyof ValidationMessages, string> = {
|
|
7169
7298
|
// Generic messages
|
|
7170
7299
|
|
|
@@ -7284,7 +7413,7 @@ const MESSAGE_MAP: Record<keyof ValidationMessages, string> = {
|
|
|
7284
7413
|
* Comprehensive error handler for TypeBox validation errors.
|
|
7285
7414
|
* Supports most JSON Schema validation keywords and produces human-friendly messages
|
|
7286
7415
|
* with i18n/l10n support through message code mapping.
|
|
7287
|
-
*/
|
|
7416
|
+
* */
|
|
7288
7417
|
export const errorHandlerFactory = (
|
|
7289
7418
|
customMessages?: Partial<Record<keyof ValidationMessages, string>>,
|
|
7290
7419
|
) => {
|
|
@@ -7292,7 +7421,7 @@ export const errorHandlerFactory = (
|
|
|
7292
7421
|
|
|
7293
7422
|
/**
|
|
7294
7423
|
* Formats the instancePath into a human-readable field name
|
|
7295
|
-
*/
|
|
7424
|
+
* */
|
|
7296
7425
|
function formatFieldPath(instancePath: string, schemaPath?: string): string {
|
|
7297
7426
|
if (!instancePath?.trim?.()) {
|
|
7298
7427
|
return "root";
|
|
@@ -7330,7 +7459,7 @@ export const errorHandlerFactory = (
|
|
|
7330
7459
|
|
|
7331
7460
|
/**
|
|
7332
7461
|
* Pluralizes a word based on count
|
|
7333
|
-
*/
|
|
7462
|
+
* */
|
|
7334
7463
|
function pluralize(
|
|
7335
7464
|
count: number,
|
|
7336
7465
|
plural: string = messageMap[MESSAGE_CODES.PLURAL_SUFFIX],
|
|
@@ -7340,7 +7469,7 @@ export const errorHandlerFactory = (
|
|
|
7340
7469
|
|
|
7341
7470
|
/**
|
|
7342
7471
|
* Maps validation error to error code and formats message
|
|
7343
|
-
*/
|
|
7472
|
+
* */
|
|
7344
7473
|
function getErrorCodeAndMessage(error: TValidationError): {
|
|
7345
7474
|
code: keyof ValidationMessages;
|
|
7346
7475
|
message: string;
|
|
@@ -7760,7 +7889,7 @@ export const errorHandlerFactory = (
|
|
|
7760
7889
|
* TODO: Periodically check the TypeBox repository for implementation updates.
|
|
7761
7890
|
* Some validation cases (minContains, prefixItems, etc.) are not yet
|
|
7762
7891
|
* implemented by TypeBox, so they are commented out below.
|
|
7763
|
-
*/
|
|
7892
|
+
* */
|
|
7764
7893
|
|
|
7765
7894
|
/**
|
|
7766
7895
|
case "minContains": {
|
|
@@ -7914,7 +8043,7 @@ export const errorHandlerFactory = (
|
|
|
7914
8043
|
),
|
|
7915
8044
|
};
|
|
7916
8045
|
}
|
|
7917
|
-
|
|
8046
|
+
* */
|
|
7918
8047
|
|
|
7919
8048
|
// Default fallback
|
|
7920
8049
|
default: {
|
|
@@ -7925,7 +8054,7 @@ export const errorHandlerFactory = (
|
|
|
7925
8054
|
|
|
7926
8055
|
/**
|
|
7927
8056
|
* Groups errors by field to avoid duplicate messages
|
|
7928
|
-
*/
|
|
8057
|
+
* */
|
|
7929
8058
|
function groupErrorsByField(
|
|
7930
8059
|
errors: TValidationError[],
|
|
7931
8060
|
): Map<string, TValidationError[]> {
|
|
@@ -7944,7 +8073,7 @@ export const errorHandlerFactory = (
|
|
|
7944
8073
|
|
|
7945
8074
|
/**
|
|
7946
8075
|
* Prioritizes errors to show the most important one per field
|
|
7947
|
-
*/
|
|
8076
|
+
* */
|
|
7948
8077
|
function prioritizeErrors(errors: TValidationError[]): TValidationError {
|
|
7949
8078
|
// Priority order: required > type > format > const/enum > other constraints
|
|
7950
8079
|
const priority: Record<string, number> = {
|
|
@@ -7973,13 +8102,51 @@ export const errorHandlerFactory = (
|
|
|
7973
8102
|
})[0];
|
|
7974
8103
|
}
|
|
7975
8104
|
|
|
8105
|
+
/**
|
|
8106
|
+
* A failed union of literals arrives as one \`anyOf\` error plus one \`const\` error per branch,
|
|
8107
|
+
* all at the same instancePath.
|
|
8108
|
+
* Collapse them into a single synthetic \`enum\` error so the message reflects the whole union.
|
|
8109
|
+
* */
|
|
8110
|
+
function collapseLiteralUnion(
|
|
8111
|
+
fieldErrors: TValidationError[],
|
|
8112
|
+
): TValidationError[] {
|
|
8113
|
+
const anyOfError = fieldErrors.find((e) => e.keyword === "anyOf");
|
|
8114
|
+
if (!anyOfError) {
|
|
8115
|
+
return fieldErrors;
|
|
8116
|
+
}
|
|
8117
|
+
const branchConsts = fieldErrors.filter((e) => {
|
|
8118
|
+
return e.keyword === "const"
|
|
8119
|
+
? e.schemaPath.startsWith(\`\${anyOfError.schemaPath}/anyOf/\`)
|
|
8120
|
+
: false;
|
|
8121
|
+
});
|
|
8122
|
+
// bail unless EVERY sibling is a const branch of this anyOf -
|
|
8123
|
+
// mixed unions (literal | object) keep their current behavior
|
|
8124
|
+
if (
|
|
8125
|
+
!branchConsts.length ||
|
|
8126
|
+
fieldErrors.length !== branchConsts.length + 1
|
|
8127
|
+
) {
|
|
8128
|
+
return fieldErrors;
|
|
8129
|
+
}
|
|
8130
|
+
return [
|
|
8131
|
+
{
|
|
8132
|
+
...anyOfError,
|
|
8133
|
+
keyword: "enum",
|
|
8134
|
+
params: {
|
|
8135
|
+
allowedValues: branchConsts.map(
|
|
8136
|
+
(e) => (e.params as never)["allowedValue"],
|
|
8137
|
+
),
|
|
8138
|
+
},
|
|
8139
|
+
},
|
|
8140
|
+
];
|
|
8141
|
+
}
|
|
8142
|
+
|
|
7976
8143
|
// ============================================================================
|
|
7977
8144
|
// Public API
|
|
7978
8145
|
// ============================================================================
|
|
7979
8146
|
|
|
7980
8147
|
/**
|
|
7981
8148
|
* Main function to format validation errors
|
|
7982
|
-
*/
|
|
8149
|
+
* */
|
|
7983
8150
|
function formatValidationErrors(
|
|
7984
8151
|
errors: TValidationError[],
|
|
7985
8152
|
options: {
|
|
@@ -8014,7 +8181,7 @@ export const errorHandlerFactory = (
|
|
|
8014
8181
|
const formatted: ValidationErrorEntry[] = [];
|
|
8015
8182
|
|
|
8016
8183
|
for (const [_, fieldErrors] of grouped) {
|
|
8017
|
-
const prioritized = prioritizeErrors(fieldErrors);
|
|
8184
|
+
const prioritized = prioritizeErrors(collapseLiteralUnion(fieldErrors));
|
|
8018
8185
|
const { code, message } = getErrorCodeAndMessage(prioritized);
|
|
8019
8186
|
formatted.push({
|
|
8020
8187
|
keyword: prioritized.keyword,
|
|
@@ -8046,7 +8213,7 @@ export const errorHandlerFactory = (
|
|
|
8046
8213
|
|
|
8047
8214
|
/**
|
|
8048
8215
|
* Formats errors into a single human-readable message
|
|
8049
|
-
*/
|
|
8216
|
+
* */
|
|
8050
8217
|
function formatValidationErrorMessage(
|
|
8051
8218
|
errors: TValidationError[],
|
|
8052
8219
|
options: {
|
|
@@ -8075,7 +8242,7 @@ export const errorHandlerFactory = (
|
|
|
8075
8242
|
|
|
8076
8243
|
/**
|
|
8077
8244
|
* Gets a simple error summary for quick feedback
|
|
8078
|
-
*/
|
|
8245
|
+
* */
|
|
8079
8246
|
function getErrorSummary(errors: TValidationError[]): string {
|
|
8080
8247
|
if (!errors?.length) {
|
|
8081
8248
|
return messageMap[MESSAGE_CODES.VALIDATION_PASSED];
|
|
@@ -8152,7 +8319,7 @@ const format = (fmt: string, ...args: unknown[]): string => {
|
|
|
8152
8319
|
|
|
8153
8320
|
return str;
|
|
8154
8321
|
};
|
|
8155
|
-
`,
|
|
8322
|
+
`,Lr=`import Type from "typebox";
|
|
8156
8323
|
import { Compile } from "typebox/compile";
|
|
8157
8324
|
import Value from "typebox/value";
|
|
8158
8325
|
|
|
@@ -8204,14 +8371,14 @@ export const validationSchemaFactory = (
|
|
|
8204
8371
|
},
|
|
8205
8372
|
};
|
|
8206
8373
|
};
|
|
8207
|
-
`,
|
|
8374
|
+
`,Rr=`import { Settings } from "typebox/system";
|
|
8208
8375
|
|
|
8209
8376
|
Settings.Set({{settings}});
|
|
8210
8377
|
|
|
8211
8378
|
export { default as customTypes } from "{{customTypesImport}}";
|
|
8212
8379
|
|
|
8213
8380
|
export const validationMessages = {{validationMessages}};
|
|
8214
|
-
`,
|
|
8381
|
+
`,zr=`import type { ValidationSchemas } from "@kosmojs/core";
|
|
8215
8382
|
|
|
8216
8383
|
import { validationSchemaFactory } from "{{ createImport 'lib' '@typebox' }}";
|
|
8217
8384
|
|
|
@@ -8272,14 +8439,14 @@ export const validationSchemas: ValidationSchemas = {
|
|
|
8272
8439
|
{{/each}}
|
|
8273
8440
|
},
|
|
8274
8441
|
};
|
|
8275
|
-
`,
|
|
8442
|
+
`,Br={exactOptionalPropertyTypes:!0},Vr=g((e,t)=>{let{createPath:n,createImport:r,createImportHelpers:i}=y(e),{renderToFile:a}=x({helpers:{...i({origin:`lib`})}}),{validationMessages:s={},customTypesImport:c=r.lib([`@typebox/custom-types`],{origin:`lib`}),settings:l}={...t},u=async e=>{for(let{kind:t,entry:r}of e){if(t!==`apiRoute`)continue;let e=[r.params,...r.validationDefinitions.flatMap(e=>e.target===`response`?e.variants:[e.schema])].flatMap(({resolvedType:e})=>e?[e]:[]),i=[...new Set(r.validationDefinitions.flatMap(({target:e})=>Object.keys(o).includes(e)?[e]:[]))].map(e=>({target:e,methods:r.methods.flatMap(t=>{let n=r.validationDefinitions.find(n=>n.method===t&&n.target===e);return n?[{route:r.name,method:t,target:e,schema:n.schema,...n.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(n.runtimeValidation)},...n.customErrors===void 0?{}:{customErrors:JSON.stringify(n.customErrors)}}]:[]})})),s=r.methods.flatMap(e=>{let t=r.validationDefinitions.find(t=>t.method===e&&t.target===`response`);return t?[{method:e,variants:t.variants.map(e=>({route:r.name,target:`response`,...e,...t.runtimeValidation===void 0?{}:{runtimeValidation:JSON.stringify(t.runtimeValidation)},...t.customErrors===void 0?{}:{customErrors:JSON.stringify(t.customErrors)}}))}]:[]});await a(n.libApi(r.name,`schemas.ts`),zr,{route:r,resolvedTypes:e,requestSchemas:i,responseSchemas:s})}};return{async start(){for(let[e,t]of[[`custom-types.ts`,Fr],[`error-handler.ts`,Ir],[`index.ts`,Lr],[`setup.ts`,Rr]])await a(n.lib(`@typebox`,e),t,{validationMessages:JSON.stringify(s),customTypesImport:c,settings:JSON.stringify({...Br,...l})})},async watch(e,t){await u(e.filter(p(t,[`create`,`update`])))},async build(e){await u(e)}}}),X={PROPERTY:`PROPERTY`,PROPERTIES:`PROPERTIES`,ALLOWED_VALUES:`ALLOWED_VALUES`,FOUND_N_DUPLICATES:`FOUND_N_DUPLICATES`,VALIDATION_PASSED:`VALIDATION_PASSED`,VALIDATION_FAILED_PREFIX:`VALIDATION_FAILED_PREFIX`,ERROR_SUMMARY:`ERROR_SUMMARY`,PLURAL_SUFFIX:`PLURAL_SUFFIX`,FIRST:`FIRST`,SECOND:`SECOND`,THIRD:`THIRD`,FOURTH:`FOURTH`,FIFTH:`FIFTH`,TYPE_INVALID:`TYPE_INVALID`,STRING_MIN_LENGTH:`STRING_MIN_LENGTH`,STRING_MAX_LENGTH:`STRING_MAX_LENGTH`,STRING_PATTERN:`STRING_PATTERN`,STRING_FORMAT:`STRING_FORMAT`,STRING_FORMAT_EMAIL:`STRING_FORMAT_EMAIL`,STRING_FORMAT_DATE:`STRING_FORMAT_DATE`,STRING_FORMAT_DATETIME:`STRING_FORMAT_DATETIME`,STRING_FORMAT_TIME:`STRING_FORMAT_TIME`,STRING_FORMAT_URI:`STRING_FORMAT_URI`,STRING_FORMAT_URL:`STRING_FORMAT_URL`,STRING_FORMAT_UUID:`STRING_FORMAT_UUID`,STRING_FORMAT_IPV4:`STRING_FORMAT_IPV4`,STRING_FORMAT_IPV6:`STRING_FORMAT_IPV6`,STRING_FORMAT_HOSTNAME:`STRING_FORMAT_HOSTNAME`,STRING_FORMAT_JSON_POINTER:`STRING_FORMAT_JSON_POINTER`,STRING_FORMAT_REGEX:`STRING_FORMAT_REGEX`,NUMBER_MINIMUM:`NUMBER_MINIMUM`,NUMBER_MAXIMUM:`NUMBER_MAXIMUM`,NUMBER_EXCLUSIVE_MINIMUM:`NUMBER_EXCLUSIVE_MINIMUM`,NUMBER_EXCLUSIVE_MAXIMUM:`NUMBER_EXCLUSIVE_MAXIMUM`,NUMBER_MULTIPLE_OF:`NUMBER_MULTIPLE_OF`,ARRAY_MIN_ITEMS:`ARRAY_MIN_ITEMS`,ARRAY_MAX_ITEMS:`ARRAY_MAX_ITEMS`,ARRAY_UNIQUE_ITEMS:`ARRAY_UNIQUE_ITEMS`,ARRAY_CONTAINS:`ARRAY_CONTAINS`,ARRAY_MIN_CONTAINS:`ARRAY_MIN_CONTAINS`,ARRAY_MAX_CONTAINS:`ARRAY_MAX_CONTAINS`,ARRAY_PREFIX_ITEMS:`ARRAY_PREFIX_ITEMS`,ARRAY_ITEMS:`ARRAY_ITEMS`,ARRAY_UNEVALUATED_ITEMS:`ARRAY_UNEVALUATED_ITEMS`,TUPLE_MIN_ITEMS:`TUPLE_MIN_ITEMS`,TUPLE_MAX_ITEMS:`TUPLE_MAX_ITEMS`,OBJECT_REQUIRED:`OBJECT_REQUIRED`,OBJECT_ADDITIONAL_PROPERTIES:`OBJECT_ADDITIONAL_PROPERTIES`,OBJECT_MIN_PROPERTIES:`OBJECT_MIN_PROPERTIES`,OBJECT_MAX_PROPERTIES:`OBJECT_MAX_PROPERTIES`,OBJECT_PROPERTY_NAMES:`OBJECT_PROPERTY_NAMES`,OBJECT_DEPENDENCIES:`OBJECT_DEPENDENCIES`,OBJECT_UNEVALUATED_PROPERTIES:`OBJECT_UNEVALUATED_PROPERTIES`,ENUM_MISMATCH:`ENUM_MISMATCH`,CONST_MISMATCH:`CONST_MISMATCH`,CONDITIONAL_IF:`CONDITIONAL_IF`,CONDITIONAL_THEN:`CONDITIONAL_THEN`,CONDITIONAL_ELSE:`CONDITIONAL_ELSE`,COMPOSITION_ONE_OF:`COMPOSITION_ONE_OF`,COMPOSITION_ANY_OF:`COMPOSITION_ANY_OF`,COMPOSITION_ALL_OF:`COMPOSITION_ALL_OF`,COMPOSITION_NOT:`COMPOSITION_NOT`,CONTENT_DISCRIMINATOR:`CONTENT_DISCRIMINATOR`,CONTENT_ENCODING:`CONTENT_ENCODING`,CONTENT_MEDIA_TYPE:`CONTENT_MEDIA_TYPE`,CUSTOM_RANGE:`CUSTOM_RANGE`,CUSTOM_EXCLUSIVE_RANGE:`CUSTOM_EXCLUSIVE_RANGE`,CUSTOM_REGEXP:`CUSTOM_REGEXP`,CUSTOM_DYNAMIC_DEFAULTS:`CUSTOM_DYNAMIC_DEFAULTS`,CUSTOM_SELECT:`CUSTOM_SELECT`,CUSTOM_TRANSFORM:`CUSTOM_TRANSFORM`,CUSTOM_UNIQUE_ITEM_PROPERTIES:`CUSTOM_UNIQUE_ITEM_PROPERTIES`,UNKNOWN:`UNKNOWN`};X.PROPERTY,X.PROPERTIES,X.ALLOWED_VALUES,X.FOUND_N_DUPLICATES,X.VALIDATION_PASSED,X.VALIDATION_FAILED_PREFIX,X.ERROR_SUMMARY,X.PLURAL_SUFFIX,X.FIRST,X.SECOND,X.THIRD,X.FOURTH,X.FIFTH,X.TYPE_INVALID,X.STRING_MIN_LENGTH,X.STRING_MAX_LENGTH,X.STRING_PATTERN,X.STRING_FORMAT,X.STRING_FORMAT_EMAIL,X.STRING_FORMAT_DATE,X.STRING_FORMAT_DATETIME,X.STRING_FORMAT_TIME,X.STRING_FORMAT_URI,X.STRING_FORMAT_URL,X.STRING_FORMAT_UUID,X.STRING_FORMAT_IPV4,X.STRING_FORMAT_IPV6,X.STRING_FORMAT_HOSTNAME,X.STRING_FORMAT_JSON_POINTER,X.STRING_FORMAT_REGEX,X.NUMBER_MINIMUM,X.NUMBER_MAXIMUM,X.NUMBER_EXCLUSIVE_MINIMUM,X.NUMBER_EXCLUSIVE_MAXIMUM,X.NUMBER_MULTIPLE_OF,X.ARRAY_MIN_ITEMS,X.ARRAY_MAX_ITEMS,X.ARRAY_UNIQUE_ITEMS,X.ARRAY_CONTAINS,X.ARRAY_MIN_CONTAINS,X.ARRAY_MAX_CONTAINS,X.ARRAY_PREFIX_ITEMS,X.ARRAY_ITEMS,X.ARRAY_UNEVALUATED_ITEMS,X.TUPLE_MIN_ITEMS,X.TUPLE_MAX_ITEMS,X.OBJECT_REQUIRED,X.OBJECT_ADDITIONAL_PROPERTIES,X.OBJECT_MIN_PROPERTIES,X.OBJECT_MAX_PROPERTIES,X.OBJECT_PROPERTY_NAMES,X.OBJECT_DEPENDENCIES,X.OBJECT_UNEVALUATED_PROPERTIES,X.ENUM_MISMATCH,X.CONST_MISMATCH,X.CONDITIONAL_IF,X.CONDITIONAL_THEN,X.CONDITIONAL_ELSE,X.COMPOSITION_ONE_OF,X.COMPOSITION_ANY_OF,X.COMPOSITION_ALL_OF,X.COMPOSITION_NOT,X.CONTENT_DISCRIMINATOR,X.CONTENT_ENCODING,X.CONTENT_MEDIA_TYPE,X.CUSTOM_RANGE,X.CUSTOM_EXCLUSIVE_RANGE,X.CUSTOM_REGEXP,X.CUSTOM_DYNAMIC_DEFAULTS,X.CUSTOM_SELECT,X.CUSTOM_TRANSFORM,X.CUSTOM_UNIQUE_ITEM_PROPERTIES,X.UNKNOWN;var Hr=h({meta:{name:`TypeBox`,resolveTypes:!0},dependencies:{typebox:Pr.devDependencies.typebox},factory:Vr}),Z={type:`module`,private:!0,name:`@kosmojs/vue-generator`,version:`0.3.0`,author:`Slee Woo`,license:`MIT`,files:[`pkg/*`],exports:{".":{types:`./pkg/index.d.ts`,default:`./pkg/index.js`}},scripts:{build:`wsbuild src/index.ts`,test:`vitest --root ../.. --project generators/vue-generator`},dependencies:{"@kosmojs/core":`workspace:^`,"@kosmojs/lib":`workspace:^`,"@vitejs/plugin-vue":`^6.0.8`},devDependencies:{"@tanstack/vue-query":`^5.102.2`,"path-to-regexp":`^8.4.2`,vue:`^3.5.41`,"vue-router":`^5.2.0`}},Q=e=>{let t=e=>e.kind===`splat`?`:${e.name}(.*)?`:e.kind===`optional`?`:${e.name}?`:`:${e.name}`;return e.flatMap(e=>e.kind===`static`?[e.parts[0].value]:e.kind===`param`?[t(e.parts[0])]:[e.parts.map(e=>e.type===`static`?e.value:t(e)).join(``)]).join(`/`)},Ur=()=>{let e=e=>e?.kind===`param`&&e.parts[0]?.kind===`splat`,n=(r,i)=>r.flatMap(({index:r,layout:a,children:o})=>{let{name:s,pathTokens:c}={...r,...a};if(!c)return[];let l=`${s}/layout`,u=i?Q(c):t(`/`,Q(c)),d=c.at(-1);return e(d)?r&&a?[{name:l,path:u,component:a.id,children:[{name:s,path:``,component:r.id}]}]:r?[{path:u,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:a?[{name:l,path:u,component:a.id,children:n(o,s)}]:[]:r&&a?[{name:l,path:u,component:a.id,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:r?[{path:u,children:[{name:s,path:``,component:r.id},...n(o,s)]}]:a?[{name:l,path:u,component:a.id,children:n(o,s)}]:[]});return n},Wr=()=>{let e=[`🎉 Well done! You just created a new Vue route.`,`🚀 Success! A fresh Vue route is ready to roll.`,`🌟 Nice work! Another Vue route added to your app.`,`🧩 All set! A new Vue route has been scaffolded.`,`🔧 Scaffold complete! Your new Vue route is in place.`,`✅ Built! Your Vue route is scaffolded and ready.`,`✨ Fantastic! Your new Vue route is good to go.`,`🎯 Nailed it! A brand new Vue route just landed.`,`💫 Awesome! Another Vue route joins the party.`,`⚡ Lightning fast! A new Vue route created successfully.`];return e[Math.floor(Math.random()*e.length)]},Gr=`import type { Plugin } from "vue";
|
|
8276
8443
|
|
|
8277
8444
|
export { default as AppProvider } from "./provider.vue";
|
|
8278
8445
|
|
|
8279
8446
|
export const appProvider: Plugin = {
|
|
8280
8447
|
install() {},
|
|
8281
8448
|
};
|
|
8282
|
-
`,
|
|
8449
|
+
`,Kr=`import { VueQueryPlugin } from "@tanstack/vue-query";
|
|
8283
8450
|
import type { Plugin } from "vue";
|
|
8284
8451
|
|
|
8285
8452
|
import { getQueryClient } from "../query";
|
|
@@ -8291,10 +8458,10 @@ export const appProvider: Plugin = {
|
|
|
8291
8458
|
app.use(VueQueryPlugin, { queryClient: getQueryClient() });
|
|
8292
8459
|
},
|
|
8293
8460
|
};
|
|
8294
|
-
|
|
8461
|
+
`,$=`<template>
|
|
8295
8462
|
<slot />
|
|
8296
8463
|
</template>
|
|
8297
|
-
`,
|
|
8464
|
+
`,qr=`import type { App } from "vue";
|
|
8298
8465
|
import type { RouterFactoryReturn } from "@kosmojs/core";
|
|
8299
8466
|
import { clientRenderFactory } from "@kosmojs/core/generators";
|
|
8300
8467
|
|
|
@@ -8334,7 +8501,7 @@ export const mount = async (
|
|
|
8334
8501
|
}
|
|
8335
8502
|
|
|
8336
8503
|
export default clientRenderFactory();
|
|
8337
|
-
`,
|
|
8504
|
+
`,Jr=`{
|
|
8338
8505
|
path: "{{path}}",
|
|
8339
8506
|
{{#if name}}
|
|
8340
8507
|
name: "{{name}}",
|
|
@@ -8352,7 +8519,7 @@ export default clientRenderFactory();
|
|
|
8352
8519
|
children: [ {{#each children}}{{> routePartial}}, {{/each}}],
|
|
8353
8520
|
{{/if}}
|
|
8354
8521
|
}
|
|
8355
|
-
|
|
8522
|
+
`,Yr=`import type { App } from "vue";
|
|
8356
8523
|
|
|
8357
8524
|
import {
|
|
8358
8525
|
renderToString as renderToStringOrig,
|
|
@@ -8443,12 +8610,12 @@ export const renderToStream: RenderToStreamWrapper<
|
|
|
8443
8610
|
}
|
|
8444
8611
|
|
|
8445
8612
|
export default serverRenderFactory();
|
|
8446
|
-
|
|
8613
|
+
`,Xr=`declare module "*.vue" {
|
|
8447
8614
|
import type { DefineComponent } from "vue";
|
|
8448
8615
|
const component: DefineComponent<{}, {}, any>;
|
|
8449
8616
|
export default component;
|
|
8450
8617
|
}
|
|
8451
|
-
`,
|
|
8618
|
+
`,Zr=`<script setup lang="ts">
|
|
8452
8619
|
import styles from "./styles.module.css";
|
|
8453
8620
|
defineProps<{
|
|
8454
8621
|
headline?: string;
|
|
@@ -8487,7 +8654,7 @@ defineProps<{
|
|
|
8487
8654
|
</div>
|
|
8488
8655
|
</div>
|
|
8489
8656
|
</template>
|
|
8490
|
-
`,
|
|
8657
|
+
`,Qr=`<script setup lang="ts">
|
|
8491
8658
|
import styles from "./styles.module.css";
|
|
8492
8659
|
defineProps<{
|
|
8493
8660
|
message: string;
|
|
@@ -8536,7 +8703,7 @@ defineProps<{
|
|
|
8536
8703
|
</div>
|
|
8537
8704
|
</div>
|
|
8538
8705
|
</template>
|
|
8539
|
-
|
|
8706
|
+
`,$r=`* {
|
|
8540
8707
|
margin: 0;
|
|
8541
8708
|
padding: 0;
|
|
8542
8709
|
box-sizing: border-box;
|
|
@@ -8669,7 +8836,7 @@ defineProps<{
|
|
|
8669
8836
|
align-items: center;
|
|
8670
8837
|
gap: 0.25rem;
|
|
8671
8838
|
}
|
|
8672
|
-
`,
|
|
8839
|
+
`,ei=`<script setup lang="ts">
|
|
8673
8840
|
import styles from "./styles.module.css";
|
|
8674
8841
|
<\/script>
|
|
8675
8842
|
|
|
@@ -8733,7 +8900,7 @@ import styles from "./styles.module.css";
|
|
|
8733
8900
|
</div>
|
|
8734
8901
|
</div>
|
|
8735
8902
|
</template>
|
|
8736
|
-
`,
|
|
8903
|
+
`,ti=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
|
|
8737
8904
|
|
|
8738
8905
|
let client: QueryClient | undefined;
|
|
8739
8906
|
|
|
@@ -8748,7 +8915,7 @@ export const getQueryClient = (): QueryClient => {
|
|
|
8748
8915
|
}
|
|
8749
8916
|
return client;
|
|
8750
8917
|
};
|
|
8751
|
-
`,
|
|
8918
|
+
`,ni=`import { QueryClient, type QueryClientConfig } from "@tanstack/vue-query";
|
|
8752
8919
|
|
|
8753
8920
|
import { store } from "{{ createImport 'lib' '@ssr/base' }}";
|
|
8754
8921
|
|
|
@@ -8771,7 +8938,7 @@ export const getQueryClient = (): QueryClient => {
|
|
|
8771
8938
|
}
|
|
8772
8939
|
return ctx.tsqClient as QueryClient;
|
|
8773
8940
|
};
|
|
8774
|
-
`,
|
|
8941
|
+
`,ri=`import {
|
|
8775
8942
|
type App,
|
|
8776
8943
|
type Component,
|
|
8777
8944
|
createApp,
|
|
@@ -8902,7 +9069,7 @@ export const createRouters = (
|
|
|
8902
9069
|
|
|
8903
9070
|
let { pathname } = url;
|
|
8904
9071
|
|
|
8905
|
-
if (base !== "/") {
|
|
9072
|
+
if ((base as string) !== "/") {
|
|
8906
9073
|
// strip the base from pushed paths
|
|
8907
9074
|
if (pathname === base) {
|
|
8908
9075
|
pathname = "/";
|
|
@@ -8933,14 +9100,14 @@ export default createRouterFactory<
|
|
|
8933
9100
|
Promise<App>,
|
|
8934
9101
|
{ server: { loaderData: Record<string, unknown> } }
|
|
8935
9102
|
>();
|
|
8936
|
-
`,
|
|
9103
|
+
`,ii=`import { type Ref, unref } from "vue";
|
|
8937
9104
|
|
|
8938
9105
|
export type MaybeWrapped<T> = Ref<T> | T;
|
|
8939
9106
|
|
|
8940
9107
|
export function unwrap<T>(value: MaybeWrapped<T>): T {
|
|
8941
9108
|
return unref(value);
|
|
8942
9109
|
}
|
|
8943
|
-
`,
|
|
9110
|
+
`,ai=`import { useRoute, useRouter } from "vue-router";
|
|
8944
9111
|
|
|
8945
9112
|
import type { RouterWithLoaderData } from "./router";
|
|
8946
9113
|
|
|
@@ -8955,7 +9122,7 @@ export const useLoaderData = <T>(key?: string): T | undefined => {
|
|
|
8955
9122
|
const route = useRoute();
|
|
8956
9123
|
return router.__loaderData?.[key || (route.name as string)] as T;
|
|
8957
9124
|
};
|
|
8958
|
-
`,
|
|
9125
|
+
`,oi=`<script setup lang="ts">
|
|
8959
9126
|
import { AppProvider } from "_/app";
|
|
8960
9127
|
<\/script>
|
|
8961
9128
|
|
|
@@ -8964,7 +9131,7 @@ import { AppProvider } from "_/app";
|
|
|
8964
9131
|
<RouterView />
|
|
8965
9132
|
</AppProvider>
|
|
8966
9133
|
</template>
|
|
8967
|
-
`,
|
|
9134
|
+
`,si=`<script setup lang="ts" generic="T extends LinkProps">
|
|
8968
9135
|
import { computed } from "vue";
|
|
8969
9136
|
import { RouterLink } from "vue-router";
|
|
8970
9137
|
|
|
@@ -8997,7 +9164,7 @@ const linkProps = computed(() => ({
|
|
|
8997
9164
|
<slot />
|
|
8998
9165
|
</RouterLink>
|
|
8999
9166
|
</template>
|
|
9000
|
-
`,
|
|
9167
|
+
`,ci=`import renderFactory, {
|
|
9001
9168
|
createRoutes,
|
|
9002
9169
|
hydrate,
|
|
9003
9170
|
mount,
|
|
@@ -9024,7 +9191,7 @@ if (root) {
|
|
|
9024
9191
|
} else {
|
|
9025
9192
|
console.error("❌ Root element not found!");
|
|
9026
9193
|
}
|
|
9027
|
-
`,
|
|
9194
|
+
`,li=`import renderFactory, {
|
|
9028
9195
|
createRoutes,
|
|
9029
9196
|
renderToStream,
|
|
9030
9197
|
renderToString,
|
|
@@ -9051,29 +9218,17 @@ export default renderFactory(() => {
|
|
|
9051
9218
|
},
|
|
9052
9219
|
};
|
|
9053
9220
|
});
|
|
9054
|
-
`,
|
|
9055
|
-
<html lang="en">
|
|
9056
|
-
<head>
|
|
9057
|
-
<meta charset="UTF-8" />
|
|
9058
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
9059
|
-
<!--app-head-->
|
|
9060
|
-
</head>
|
|
9061
|
-
<body>
|
|
9062
|
-
<div id="app"><!--app-html--></div>
|
|
9063
|
-
<script type="module" src="/{{ entryDir }}/client.ts"><\/script>
|
|
9064
|
-
</body>
|
|
9065
|
-
</html>
|
|
9066
|
-
`,mi=`<script setup lang="ts">
|
|
9221
|
+
`,ui=`<script setup lang="ts">
|
|
9067
9222
|
import PageSample from "{{ createImport 'lib' 'pageSamples/404.vue' }}";
|
|
9068
9223
|
<\/script>
|
|
9069
9224
|
|
|
9070
9225
|
<template>
|
|
9071
9226
|
<PageSample />
|
|
9072
9227
|
</template>
|
|
9073
|
-
`,
|
|
9228
|
+
`,di=`<template>
|
|
9074
9229
|
<router-view />
|
|
9075
9230
|
</template>
|
|
9076
|
-
`,
|
|
9231
|
+
`,fi=`<script setup lang="ts">
|
|
9077
9232
|
import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
|
|
9078
9233
|
<\/script>
|
|
9079
9234
|
|
|
@@ -9088,14 +9243,14 @@ import PageSample from "{{ createImport 'lib' 'pageSamples/page.vue' }}";
|
|
|
9088
9243
|
}"
|
|
9089
9244
|
/>
|
|
9090
9245
|
</template>
|
|
9091
|
-
`,
|
|
9246
|
+
`,pi=`<script setup lang="ts">
|
|
9092
9247
|
import WelcomePage from "{{ createImport 'lib' 'pageSamples/welcome.vue' }}";
|
|
9093
9248
|
<\/script>
|
|
9094
9249
|
|
|
9095
9250
|
<template>
|
|
9096
9251
|
<WelcomePage />
|
|
9097
9252
|
</template>
|
|
9098
|
-
`,
|
|
9253
|
+
`,mi=`import routerFactory, { createRouters } from "{{ createImport 'lib' 'router' }}";
|
|
9099
9254
|
import { appProvider } from "{{ createImport 'lib' 'app' }}";
|
|
9100
9255
|
|
|
9101
9256
|
import app from "./app.vue";
|
|
@@ -9114,5 +9269,5 @@ export default routerFactory((routes) => {
|
|
|
9114
9269
|
},
|
|
9115
9270
|
};
|
|
9116
9271
|
});
|
|
9117
|
-
`,
|
|
9272
|
+
`,hi=g((e,t)=>{let{createPath:n,createImportHelpers:r}=y(e),{renderToFile:i}=x({helpers:{...r({origin:`lib`}),...w()},partials:{routePartial:Jr}}),{renderToFile:a}=x({helpers:r({origin:`src`})}),o=Ur(),s=e=>!e?.trim().length,u=c(t?.templates,fi),d=async e=>{for(let{kind:t,entry:r}of e)t===`pageRoute`?await a(n.pages(r.file),r.name===`index`?pi:u(r.name,r),{route:r,message:Wr()},{overwrite:s}):t===`pageLayout`&&await a(n.pages(r.file),di,{route:r},{overwrite:s})},f=async e=>{let t=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`?[t]:[]).sort(S),r=e.flatMap(({kind:e,entry:t})=>e===`pageRoute`||e===`pageLayout`?[t]:[]),a=o(v(r));for(let[e,t]of[[`client.ts`,qr],[`server.ts`,Yr]])await i(n.libEntry(e),t,{pageEntries:r,nestedRoutes:a,lazyLoad:e===`client.ts`});await i(n.lib(`router.ts`),ri,{entries:e,indexRoutes:t})};return{config(){let{templates:e,...n}={...t};return{plugins:[A(n)]}},async start(){for(let[e,r]of[[`env.d.ts`,Xr],[`unwrap.ts`,ii],[`use.ts`,ai],[`pageSamples/styles.module.css`,$r],[`pageSamples/welcome.vue`,ei],[`pageSamples/page.vue`,Qr],[`pageSamples/404.vue`,Zr],[`app/provider.vue`,$],...t?.tanstack?.query?[[`app/index.ts`,Kr],[`query.ts`,ti]]:[[`app/index.ts`,Gr],[`query.ts`,`/** tanstack query disabled */`]]])await i(n.lib(e),r,{});for(let[e,t]of[[`pages/404.vue`,ui],[`components/Link.vue`,si],[`app.vue`,oi],[`router.ts`,mi]])await a(n.src(e),t,{entryDir:l.entryDir},{overwrite:s});for(let[e,t]of[[`client.ts`,ci],[`server.ts`,li]])await a(n.entry(e),t,{},{overwrite:s})},async watch(e,t){await d(e.filter(m(t,[`create`]))),await f(e)},async build(e){await d(e),await f(e)},async ssrBuild(){await i(n.lib(`query.ts`),t?.tanstack?.query?ni:`/** tanstack query disabled */`,{ssrBundle:!0})}}}),gi=h({meta:{name:`Vue`,slot:`frontend`,jsxImportSource:`vue`},dependencies(e){return{vue:Z.devDependencies.vue,"vue-router":Z.devDependencies[`vue-router`],"path-to-regexp":Z.devDependencies[`path-to-regexp`],...e?.tanstack?.query?{"@tanstack/vue-query":Z.devDependencies[`@tanstack/vue-query`]}:{}}},factory:hi}),_i=e=>{let n=process.env.NODE_ENV||`development`,a=typeof e.base==`string`?e.base:e.base[n];if(!a?.trim())throw Error(r([`red`],`ERROR: Invalid Config - no base provided`));return{...e,base:t(`/`,a),apiBase:t(`/`,e.apiBase||i)}};export{e as coreGenerator,_i as defineConfig,L as fetchGenerator,Ae as h3Generator,Ye as honoGenerator,mt as koaGenerator,Ht as mdxGenerator,qt as openapiGenerator,xn as reactGenerator,Jn as solidGenerator,Zn as ssgGenerator,or as ssrGenerator,Nr as svelteGenerator,Hr as typeboxGenerator,gi as vueGenerator};
|
|
9118
9273
|
//# sourceMappingURL=index.js.map
|