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