@marko/run 0.9.5 → 0.9.6
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/README.md +57 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapter/index.cjs +1 -1
- package/dist/adapter/index.js +1 -1
- package/dist/cli/index.mjs +38 -10
- package/dist/runtime/index.d.ts +13 -3
- package/dist/runtime/internal.cjs +49 -3
- package/dist/runtime/internal.d.ts +2 -1
- package/dist/runtime/internal.js +47 -2
- package/dist/runtime/namespace.d.ts +1 -1
- package/dist/runtime/types.d.ts +24 -18
- package/dist/vite/index.cjs +65 -10
- package/dist/vite/index.d.ts +2 -2
- package/dist/vite/index.js +64 -10
- package/dist/vite/utils/meta-data.d.ts +3 -0
- package/package.json +1 -1
package/dist/cli/index.mjs
CHANGED
|
@@ -326,7 +326,10 @@ function renderRouteEntry(route, rootDir) {
|
|
|
326
326
|
const imports = writer.branch("imports");
|
|
327
327
|
const runtimeImports = [];
|
|
328
328
|
if (handler) {
|
|
329
|
-
runtimeImports.push("
|
|
329
|
+
runtimeImports.push("normalizeHandler");
|
|
330
|
+
}
|
|
331
|
+
if (meta) {
|
|
332
|
+
runtimeImports.push("normalizeMeta");
|
|
330
333
|
}
|
|
331
334
|
if (handler || middleware.length) {
|
|
332
335
|
runtimeImports.push("call");
|
|
@@ -358,7 +361,9 @@ function renderRouteEntry(route, rootDir) {
|
|
|
358
361
|
for (const verb of handler.verbs) {
|
|
359
362
|
const importName = verb.toUpperCase();
|
|
360
363
|
names.push(importName);
|
|
361
|
-
writer.writeLines(
|
|
364
|
+
writer.writeLines(
|
|
365
|
+
`const ${verb}Handler = normalizeHandler(${importName});`
|
|
366
|
+
);
|
|
362
367
|
}
|
|
363
368
|
imports.writeLines(
|
|
364
369
|
`import { ${names.join(", ")} } from "${normalizedRelativePath(rootDir, handler.filePath)}";`
|
|
@@ -370,8 +375,18 @@ function renderRouteEntry(route, rootDir) {
|
|
|
370
375
|
);
|
|
371
376
|
}
|
|
372
377
|
if (meta) {
|
|
378
|
+
const metaName = `meta${index}`;
|
|
379
|
+
const metaVerbsExports = verbs.map((verb) => {
|
|
380
|
+
var _a2;
|
|
381
|
+
const name = verb === "head" && !((_a2 = handler == null ? void 0 : handler.verbs) == null ? void 0 : _a2.includes(verb)) ? "GET" : verb.toUpperCase();
|
|
382
|
+
return `${name}: ${verb}${index}_meta`;
|
|
383
|
+
}).join(", ");
|
|
384
|
+
writer.writeLines("");
|
|
373
385
|
imports.writeLines(
|
|
374
|
-
`
|
|
386
|
+
`import ${metaName} from "${normalizedRelativePath(rootDir, meta.filePath)}";`
|
|
387
|
+
);
|
|
388
|
+
writer.writeLines(
|
|
389
|
+
`export const { ${metaVerbsExports} } = normalizeMeta(${metaName});`
|
|
375
390
|
);
|
|
376
391
|
}
|
|
377
392
|
for (const verb of verbs) {
|
|
@@ -490,10 +505,16 @@ function renderRouter(routes, rootDir, runtimeInclude, options = {
|
|
|
490
505
|
);
|
|
491
506
|
for (const route of routes.list) {
|
|
492
507
|
const verbs = getVerbs(route);
|
|
493
|
-
const
|
|
494
|
-
|
|
508
|
+
const routeImports = [];
|
|
509
|
+
for (const verb of verbs) {
|
|
510
|
+
const verbName = `${verb}${route.index}`;
|
|
511
|
+
routeImports.push(verbName);
|
|
512
|
+
if (route.meta) {
|
|
513
|
+
routeImports.push(`${verbName}_meta`);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
495
516
|
imports.writeLines(
|
|
496
|
-
`import { ${
|
|
517
|
+
`import { ${routeImports.join(", ")} } from "${virtualFilePrefix}/${getRouteVirtualFileName(route)}";`
|
|
497
518
|
);
|
|
498
519
|
}
|
|
499
520
|
for (const route of Object.values(routes.special)) {
|
|
@@ -785,14 +806,14 @@ function renderParams(params, pathIndex) {
|
|
|
785
806
|
function renderMatch(verb, route, path10, pathIndex) {
|
|
786
807
|
const handler = `${verb}${route.index}`;
|
|
787
808
|
const params = path10.params ? renderParams(path10.params, pathIndex) : "{}";
|
|
788
|
-
const meta = route.meta ?
|
|
809
|
+
const meta = route.meta ? `${verb}${route.index}_meta` : "{}";
|
|
789
810
|
return `{ handler: ${handler}, params: ${params}, meta: ${meta}, path: '${path10.path}' }`;
|
|
790
811
|
}
|
|
791
812
|
function renderMiddleware(middleware, rootDir) {
|
|
792
813
|
const writer = createStringWriter();
|
|
793
814
|
const imports = writer.branch("imports");
|
|
794
815
|
imports.writeLines(
|
|
795
|
-
`import {
|
|
816
|
+
`import { normalizeHandler } from "${virtualFilePrefix}/runtime/internal";`
|
|
796
817
|
);
|
|
797
818
|
writer.writeLines("");
|
|
798
819
|
for (const { id, filePath } of middleware) {
|
|
@@ -800,7 +821,9 @@ function renderMiddleware(middleware, rootDir) {
|
|
|
800
821
|
imports.writeLines(
|
|
801
822
|
`import ${importName} from "${normalizedRelativePath(rootDir, filePath)}";`
|
|
802
823
|
);
|
|
803
|
-
writer.writeLines(
|
|
824
|
+
writer.writeLines(
|
|
825
|
+
`export const mware${id} = normalizeHandler(${importName});`
|
|
826
|
+
);
|
|
804
827
|
}
|
|
805
828
|
imports.join();
|
|
806
829
|
return writer.end();
|
|
@@ -959,7 +982,12 @@ function writeModuleDeclaration(writer, name, routeType, moduleTypes) {
|
|
|
959
982
|
export { NotHandled, NotMatched, GetPaths, PostPaths, GetablePath, GetableHref, PostablePath, PostableHref, Platform };
|
|
960
983
|
export type Route = ${routeType};
|
|
961
984
|
export type Context = Run.MultiRouteContext<Route>${isMarko ? " & Marko.Global" : ""};
|
|
962
|
-
export type Handler = Run.HandlerLike<Route
|
|
985
|
+
export type Handler = Run.HandlerLike<Route>;`);
|
|
986
|
+
for (const verb of httpVerbs) {
|
|
987
|
+
writer.write(`
|
|
988
|
+
export type ${verb.toUpperCase()} = Run.HandlerLike<Route, "${verb.toUpperCase()}">;`);
|
|
989
|
+
}
|
|
990
|
+
writer.write(`
|
|
963
991
|
/** @deprecated use \`((context, next) => { ... }) satisfies MarkoRun.Handler\` instead */
|
|
964
992
|
export const route: Run.HandlerTypeFn<Route>;
|
|
965
993
|
}`);
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
import { InlineConfig } from "vite";
|
|
2
2
|
import { NotHandled, NotMatched } from "./namespace";
|
|
3
|
-
import type {
|
|
3
|
+
import type { AnyRoute, GetableHref, GetablePath, GetPaths, HandlerLike, HandlerTypeFn, MultiRouteContext, Platform, PostableHref, PostablePath, PostPaths, RuntimeModule } from "./types";
|
|
4
4
|
declare global {
|
|
5
5
|
var __marko_run__: RuntimeModule;
|
|
6
6
|
var __marko_run_vite_config__: InlineConfig | undefined;
|
|
7
7
|
namespace MarkoRun {
|
|
8
|
+
export { GetableHref, GetablePath, GetPaths, NotHandled, NotMatched, Platform, PostableHref, PostablePath, PostPaths, };
|
|
9
|
+
export type Route = AnyRoute;
|
|
10
|
+
export type Context = MultiRouteContext<AnyRoute>;
|
|
11
|
+
export type Handler = HandlerLike<AnyRoute>;
|
|
12
|
+
export type GET = HandlerLike<AnyRoute, "GET">;
|
|
13
|
+
export type HEAD = HandlerLike<AnyRoute, "HEAD">;
|
|
14
|
+
export type POST = HandlerLike<AnyRoute, "POST">;
|
|
15
|
+
export type PUT = HandlerLike<AnyRoute, "PUT">;
|
|
16
|
+
export type DELETE = HandlerLike<AnyRoute, "DELETE">;
|
|
17
|
+
export type PATCH = HandlerLike<AnyRoute, "PATCH">;
|
|
18
|
+
export type OPTIONS = HandlerLike<AnyRoute, "OPTIONS">;
|
|
8
19
|
/** @deprecated use `((context, next) => { ... }) satisfies MarkoRun.Handler` instead */
|
|
9
20
|
export const route: HandlerTypeFn;
|
|
10
|
-
export { AnyContext as Context, GetableHref, GetablePath, GetPaths, AnyHandler as Handler, NotHandled, NotMatched, Platform, PostableHref, PostablePath, PostPaths, AnyRoute as Route, };
|
|
11
21
|
}
|
|
12
22
|
}
|
|
13
|
-
export type { AppData, Context, DefineApp, Fetch, HandlerLike, HandlerTypeFn, InputObject, Invoke, LayoutInput, Match, MultiRouteContext, NextFunction, ParamsObject, Platform, Route, RouteHandler, Routes, RouteWithHandler, RuntimeModule, } from "./types";
|
|
23
|
+
export type { AppData, Context, DefineApp, Fetch, HandlerLike, HandlerTypeFn, InputObject, Invoke, LayoutInput, Match, MultiRouteContext, NextFunction, ParamsObject, Platform, Route, RouteHandler, Routes, RouteWithHandler, RuntimeModule, Verb, } from "./types";
|
|
@@ -26,7 +26,8 @@ __export(internal_exports, {
|
|
|
26
26
|
compose: () => compose,
|
|
27
27
|
createContext: () => createContext,
|
|
28
28
|
noContent: () => noContent,
|
|
29
|
-
|
|
29
|
+
normalizeHandler: () => normalizeHandler,
|
|
30
|
+
normalizeMeta: () => getMetaDataLookup,
|
|
30
31
|
notHandled: () => notHandled,
|
|
31
32
|
notMatched: () => notMatched,
|
|
32
33
|
passthrough: () => passthrough,
|
|
@@ -39,6 +40,49 @@ module.exports = __toCommonJS(internal_exports);
|
|
|
39
40
|
var import_url = require("url");
|
|
40
41
|
var __importMetaURL = (0, import_url.pathToFileURL)(__filename);
|
|
41
42
|
|
|
43
|
+
// src/vite/constants.ts
|
|
44
|
+
var httpVerbs = [
|
|
45
|
+
"get",
|
|
46
|
+
"head",
|
|
47
|
+
"post",
|
|
48
|
+
"put",
|
|
49
|
+
"delete",
|
|
50
|
+
"patch",
|
|
51
|
+
"options"
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
// src/vite/utils/meta-data.ts
|
|
55
|
+
var verbKeys = new Set(httpVerbs.map((v) => v.toUpperCase()));
|
|
56
|
+
function isObject(obj) {
|
|
57
|
+
return obj && typeof obj === "object" && !Array.isArray(obj);
|
|
58
|
+
}
|
|
59
|
+
function getMetaDataForVerb(data, verb) {
|
|
60
|
+
if (!httpVerbs.includes(verb.toLowerCase())) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Invalid argument 'verb': expected one of ${[...verbKeys].join(", ")} but received ${verb}`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
if (isObject(data)) {
|
|
66
|
+
return Object.keys(data).reduce(
|
|
67
|
+
(result, key) => {
|
|
68
|
+
if (!(key in result || verbKeys.has(key))) {
|
|
69
|
+
result[key] = data[key];
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
},
|
|
73
|
+
isObject(data[verb]) ? { ...data[verb] } : {}
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
return data;
|
|
77
|
+
}
|
|
78
|
+
function getMetaDataLookup(data) {
|
|
79
|
+
const lookup = {};
|
|
80
|
+
for (const verb of verbKeys) {
|
|
81
|
+
lookup[verb] = getMetaDataForVerb(data, verb);
|
|
82
|
+
}
|
|
83
|
+
return lookup;
|
|
84
|
+
}
|
|
85
|
+
|
|
42
86
|
// src/runtime/internal.ts
|
|
43
87
|
var NotHandled = Symbol(
|
|
44
88
|
"marko-run not handled"
|
|
@@ -101,6 +145,7 @@ function createContext(route, request, platform, url = new URL(request.url)) {
|
|
|
101
145
|
}
|
|
102
146
|
return {
|
|
103
147
|
request,
|
|
148
|
+
method: request.method,
|
|
104
149
|
url,
|
|
105
150
|
platform,
|
|
106
151
|
meta,
|
|
@@ -211,7 +256,7 @@ function compose(handlers) {
|
|
|
211
256
|
})();
|
|
212
257
|
};
|
|
213
258
|
}
|
|
214
|
-
function
|
|
259
|
+
function normalizeHandler(obj) {
|
|
215
260
|
if (typeof obj === "function") {
|
|
216
261
|
return obj;
|
|
217
262
|
} else if (Array.isArray(obj)) {
|
|
@@ -255,7 +300,8 @@ function notMatched() {
|
|
|
255
300
|
compose,
|
|
256
301
|
createContext,
|
|
257
302
|
noContent,
|
|
258
|
-
|
|
303
|
+
normalizeHandler,
|
|
304
|
+
normalizeMeta,
|
|
259
305
|
notHandled,
|
|
260
306
|
notMatched,
|
|
261
307
|
passthrough,
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { AnyRoute, Awaitable, Context, MultiRouteContext, NextFunction, Platform, RouteHandler } from "./types";
|
|
2
|
+
export { getMetaDataLookup as normalizeMeta } from "../vite/utils/meta-data";
|
|
2
3
|
export declare const NotHandled: typeof MarkoRun.NotHandled;
|
|
3
4
|
export declare const NotMatched: typeof MarkoRun.NotMatched;
|
|
4
5
|
export declare function createContext<TRoute extends AnyRoute>(route: TRoute | null, request: Request, platform: Platform, url?: URL): Context<TRoute>;
|
|
5
6
|
export declare function call<TRoute extends AnyRoute>(handler: RouteHandler<TRoute>, next: NextFunction, context: MultiRouteContext<TRoute>): Promise<Response>;
|
|
6
7
|
export declare function compose(handlers: RouteHandler[]): RouteHandler;
|
|
7
|
-
export declare function
|
|
8
|
+
export declare function normalizeHandler(obj: RouteHandler | RouteHandler[] | Promise<RouteHandler | RouteHandler[]>): RouteHandler;
|
|
8
9
|
export declare function stripResponseBodySync(response: Response): Response;
|
|
9
10
|
export declare function stripResponseBody(response: Awaitable<Response>): Awaitable<Response>;
|
|
10
11
|
export declare function passthrough(): void;
|
package/dist/runtime/internal.js
CHANGED
|
@@ -1,3 +1,46 @@
|
|
|
1
|
+
// src/vite/constants.ts
|
|
2
|
+
var httpVerbs = [
|
|
3
|
+
"get",
|
|
4
|
+
"head",
|
|
5
|
+
"post",
|
|
6
|
+
"put",
|
|
7
|
+
"delete",
|
|
8
|
+
"patch",
|
|
9
|
+
"options"
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
// src/vite/utils/meta-data.ts
|
|
13
|
+
var verbKeys = new Set(httpVerbs.map((v) => v.toUpperCase()));
|
|
14
|
+
function isObject(obj) {
|
|
15
|
+
return obj && typeof obj === "object" && !Array.isArray(obj);
|
|
16
|
+
}
|
|
17
|
+
function getMetaDataForVerb(data, verb) {
|
|
18
|
+
if (!httpVerbs.includes(verb.toLowerCase())) {
|
|
19
|
+
throw new Error(
|
|
20
|
+
`Invalid argument 'verb': expected one of ${[...verbKeys].join(", ")} but received ${verb}`
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
if (isObject(data)) {
|
|
24
|
+
return Object.keys(data).reduce(
|
|
25
|
+
(result, key) => {
|
|
26
|
+
if (!(key in result || verbKeys.has(key))) {
|
|
27
|
+
result[key] = data[key];
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
},
|
|
31
|
+
isObject(data[verb]) ? { ...data[verb] } : {}
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
return data;
|
|
35
|
+
}
|
|
36
|
+
function getMetaDataLookup(data) {
|
|
37
|
+
const lookup = {};
|
|
38
|
+
for (const verb of verbKeys) {
|
|
39
|
+
lookup[verb] = getMetaDataForVerb(data, verb);
|
|
40
|
+
}
|
|
41
|
+
return lookup;
|
|
42
|
+
}
|
|
43
|
+
|
|
1
44
|
// src/runtime/internal.ts
|
|
2
45
|
var NotHandled = Symbol(
|
|
3
46
|
"marko-run not handled"
|
|
@@ -60,6 +103,7 @@ function createContext(route, request, platform, url = new URL(request.url)) {
|
|
|
60
103
|
}
|
|
61
104
|
return {
|
|
62
105
|
request,
|
|
106
|
+
method: request.method,
|
|
63
107
|
url,
|
|
64
108
|
platform,
|
|
65
109
|
meta,
|
|
@@ -170,7 +214,7 @@ function compose(handlers) {
|
|
|
170
214
|
})();
|
|
171
215
|
};
|
|
172
216
|
}
|
|
173
|
-
function
|
|
217
|
+
function normalizeHandler(obj) {
|
|
174
218
|
if (typeof obj === "function") {
|
|
175
219
|
return obj;
|
|
176
220
|
} else if (Array.isArray(obj)) {
|
|
@@ -213,7 +257,8 @@ export {
|
|
|
213
257
|
compose,
|
|
214
258
|
createContext,
|
|
215
259
|
noContent,
|
|
216
|
-
|
|
260
|
+
normalizeHandler,
|
|
261
|
+
getMetaDataLookup as normalizeMeta,
|
|
217
262
|
notHandled,
|
|
218
263
|
notMatched,
|
|
219
264
|
passthrough,
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare const NotHandled: unique symbol;
|
|
2
2
|
export declare const NotMatched: unique symbol;
|
|
3
|
-
export type { GetableHref, GetablePath, GetPaths, Platform, PostableHref, PostablePath, PostPaths, } from "./types";
|
|
3
|
+
export type { GetableHref, GetablePath, GetPaths, Platform, PostableHref, PostablePath, PostPaths, Verb, } from "./types";
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -1,24 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
import type { HttpVerb } from "../vite";
|
|
2
2
|
type OneOrMany<T> = T | T[];
|
|
3
3
|
type NoParams = {};
|
|
4
4
|
type AllKeys<T> = T extends T ? keyof T : never;
|
|
5
5
|
type Simplify<T> = T extends unknown ? {
|
|
6
6
|
[K in keyof T]: T[K];
|
|
7
7
|
} : never;
|
|
8
|
+
type IsObject<T> = T extends object ? T extends any[] ? 0 : T extends (...args: any[]) => any ? 0 : 1 : 0;
|
|
8
9
|
type SuperSet<T, U extends T> = T & {
|
|
9
10
|
[K in AllKeys<U> as K extends keyof T ? never : K]?: never;
|
|
10
11
|
};
|
|
11
12
|
type SuperSets<T, U extends T, K extends keyof T> = Omit<T, K> & {
|
|
12
13
|
[P in K]: Simplify<SuperSet<T[P], U[P]>>;
|
|
13
14
|
};
|
|
15
|
+
export type Awaitable<T> = Promise<T> | T;
|
|
16
|
+
export type Verb = Uppercase<HttpVerb>;
|
|
14
17
|
export interface Platform {
|
|
15
18
|
}
|
|
16
|
-
export interface Context<TRoute extends Route = AnyRoute> {
|
|
19
|
+
export interface Context<TRoute extends Route = AnyRoute, TVerb extends Verb = Verb> {
|
|
17
20
|
readonly url: URL;
|
|
18
21
|
readonly request: Request;
|
|
22
|
+
readonly method: TVerb;
|
|
19
23
|
readonly route: TRoute["path"];
|
|
20
24
|
readonly params: TRoute["params"];
|
|
21
|
-
readonly meta: TRoute["meta"]
|
|
25
|
+
readonly meta: NormalizedMeta<TRoute["meta"], TVerb>;
|
|
22
26
|
readonly platform: Platform;
|
|
23
27
|
readonly serializedGlobals: Record<string, boolean>;
|
|
24
28
|
readonly parent: Context | undefined;
|
|
@@ -27,14 +31,14 @@ export interface Context<TRoute extends Route = AnyRoute> {
|
|
|
27
31
|
redirect(to: string | URL, status?: number): Response;
|
|
28
32
|
back(fallback?: string | URL, status?: number): Response;
|
|
29
33
|
}
|
|
30
|
-
export type MultiRouteContext<TRoute extends Route, _Preserved extends TRoute = TRoute> = TRoute extends any ? Context<Simplify<SuperSets<TRoute, _Preserved, "params"
|
|
34
|
+
export type MultiRouteContext<TRoute extends Route, TVerb extends Verb = Verb, _Preserved extends TRoute = TRoute> = TRoute extends any ? TVerb extends any ? Context<Simplify<SuperSets<TRoute, _Preserved, "params">>, TVerb> : never : never;
|
|
31
35
|
export type ParamsObject = Record<string, string>;
|
|
32
36
|
export type InputObject = Record<PropertyKey, any>;
|
|
33
37
|
export type NextFunction = () => Awaitable<Response>;
|
|
34
|
-
export type HandlerLike<TRoute extends Route = AnyRoute> = Awaitable<OneOrMany<RouteHandler<TRoute>>>;
|
|
38
|
+
export type HandlerLike<TRoute extends Route = AnyRoute, TVerb extends Verb = Verb> = Awaitable<OneOrMany<RouteHandler<TRoute, TVerb>>>;
|
|
35
39
|
export type RouteHandlerResult = Response | typeof MarkoRun.NotHandled | typeof MarkoRun.NotMatched | null | void;
|
|
36
|
-
export type RouteHandler<TRoute extends Route = AnyRoute> = (context: MultiRouteContext<TRoute>, next: NextFunction) => Awaitable<RouteHandlerResult>;
|
|
37
|
-
export interface Route<Params extends ParamsObject = ParamsObject, Meta =
|
|
40
|
+
export type RouteHandler<TRoute extends Route = AnyRoute, TVerb extends Verb = Verb> = (context: MultiRouteContext<TRoute, TVerb>, next: NextFunction) => Awaitable<RouteHandlerResult>;
|
|
41
|
+
export interface Route<Params extends ParamsObject = ParamsObject, Meta = any, Path extends string = string> {
|
|
38
42
|
path: Path;
|
|
39
43
|
params: Params;
|
|
40
44
|
meta: Meta;
|
|
@@ -44,14 +48,14 @@ type DefineRoutes<T extends Record<string, {
|
|
|
44
48
|
}>> = {
|
|
45
49
|
[K in keyof T]: K extends string ? T[K] extends {
|
|
46
50
|
meta: infer Meta;
|
|
47
|
-
} ? Route<PathParams<K>, Meta, K> : Route<PathParams<K>,
|
|
51
|
+
} ? Route<PathParams<K>, Meta, K> : Route<PathParams<K>, any, K> : never;
|
|
48
52
|
};
|
|
49
53
|
type DefinePaths<T extends Record<string, {
|
|
50
54
|
verb: unknown;
|
|
51
|
-
}>,
|
|
55
|
+
}>, TVerb extends "get" | "post"> = {
|
|
52
56
|
[K in keyof T]: K extends string ? T[K] extends {
|
|
53
57
|
verb: infer V;
|
|
54
|
-
} ? V extends
|
|
58
|
+
} ? V extends TVerb ? K : never : never : never;
|
|
55
59
|
}[keyof T];
|
|
56
60
|
export type DefineApp<T extends {
|
|
57
61
|
routes: Record<string, {
|
|
@@ -86,20 +90,22 @@ type MatchSegments<A extends string, B extends string> = A extends `${infer P}/$
|
|
|
86
90
|
type PathPattern<T extends string> = T extends `${infer Left}/\${${string}}/${infer Rest}` ? PathPattern<`${Left}/${string}/${Rest}`> : T extends `${infer Left}/\${...${string}}` ? PathPattern<`${Left}/${string}*`> : T extends `${infer Left}/\${${string}}` ? PathPattern<`${Left}/${string}`> : T;
|
|
87
91
|
type ValidatePath<Paths extends string, Path extends string> = Paths | (Path extends `/${string}` ? MatchSegments<Member<PathPattern<Paths>, Path>, Path> : Path);
|
|
88
92
|
type ValidateHref<Paths extends string, Href extends string> = Href extends `${infer P}#${infer H}?${infer Q}` ? `${ValidatePath<Paths, P>}#${H}?${Q}` : Href extends `${infer P}?${infer Q}` ? `${ValidatePath<Paths, P>}?${Q}` : Href extends `${infer P}#${infer H}` ? `${ValidatePath<Paths, P>}#${H}` : ValidatePath<Paths, Href>;
|
|
93
|
+
type NormalizedMetaObject<T, TVerb extends Verb = Verb> = IsObject<T> extends 1 ? TVerb extends keyof T ? Simplify<Omit<T, Verb | keyof T[TVerb]> & T[TVerb]> : Simplify<Omit<T, Verb>> : never;
|
|
94
|
+
export type NormalizedMeta<T, TVerb extends Verb = Verb> = IsObject<T> extends 1 ? {
|
|
95
|
+
[K in TVerb]: NormalizedMetaObject<T, K>;
|
|
96
|
+
}[TVerb] : T;
|
|
97
|
+
export type NormalizedMetaLookup<T> = {
|
|
98
|
+
[K in Verb]: IsObject<T> extends 1 ? NormalizedMetaObject<T, K> : T;
|
|
99
|
+
};
|
|
89
100
|
export interface AppData {
|
|
90
101
|
}
|
|
91
|
-
type HasAppData = AppData extends {
|
|
92
|
-
routes: any;
|
|
93
|
-
} ? 1 : 0;
|
|
94
|
-
type AnyParams = 0 extends HasAppData ? ParamsObject : never;
|
|
95
|
-
type AnyMeta = 0 extends HasAppData ? unknown : never;
|
|
96
102
|
export type Routes = AppData extends {
|
|
97
103
|
routes: infer T;
|
|
98
104
|
} ? T : Record<string, Route>;
|
|
99
105
|
export type AnyRoute = Routes[keyof Routes];
|
|
100
|
-
export type
|
|
101
|
-
|
|
102
|
-
|
|
106
|
+
export type HandlerTypeFn<TRoute extends Route = AnyRoute> = AppData extends {
|
|
107
|
+
routes: any;
|
|
108
|
+
} ? <Params extends ParamsObject = ParamsObject, Meta = any, T extends HandlerLike<Route<Params, Meta>> = HandlerLike<Route<Params, Meta>>>(handler: T) => T : <T extends HandlerLike<TRoute>>(handler: T) => T;
|
|
103
109
|
type DefaultAPI = keyof Exclude<Marko.Renderable, Marko.Template<any, any> | Marko.Body<any, any> | string> extends "content" ? "tags" : "class";
|
|
104
110
|
type TemplateAPI<T> = T extends {
|
|
105
111
|
api: infer API;
|
package/dist/vite/index.cjs
CHANGED
|
@@ -43,6 +43,7 @@ __export(vite_exports, {
|
|
|
43
43
|
defaultConfigPlugin: () => defaultConfigPlugin,
|
|
44
44
|
getApi: () => getApi,
|
|
45
45
|
getAvailablePort: () => getAvailablePort,
|
|
46
|
+
getMetaDataForVerb: () => getMetaDataForVerb,
|
|
46
47
|
getPackageData: () => getPackageData,
|
|
47
48
|
isPortInUse: () => isPortInUse,
|
|
48
49
|
loadEnv: () => loadEnv,
|
|
@@ -354,7 +355,10 @@ function renderRouteEntry(route, rootDir) {
|
|
|
354
355
|
const imports = writer.branch("imports");
|
|
355
356
|
const runtimeImports = [];
|
|
356
357
|
if (handler) {
|
|
357
|
-
runtimeImports.push("
|
|
358
|
+
runtimeImports.push("normalizeHandler");
|
|
359
|
+
}
|
|
360
|
+
if (meta) {
|
|
361
|
+
runtimeImports.push("normalizeMeta");
|
|
358
362
|
}
|
|
359
363
|
if (handler || middleware.length) {
|
|
360
364
|
runtimeImports.push("call");
|
|
@@ -386,7 +390,9 @@ function renderRouteEntry(route, rootDir) {
|
|
|
386
390
|
for (const verb of handler.verbs) {
|
|
387
391
|
const importName = verb.toUpperCase();
|
|
388
392
|
names.push(importName);
|
|
389
|
-
writer.writeLines(
|
|
393
|
+
writer.writeLines(
|
|
394
|
+
`const ${verb}Handler = normalizeHandler(${importName});`
|
|
395
|
+
);
|
|
390
396
|
}
|
|
391
397
|
imports.writeLines(
|
|
392
398
|
`import { ${names.join(", ")} } from "${normalizedRelativePath(rootDir, handler.filePath)}";`
|
|
@@ -398,8 +404,18 @@ function renderRouteEntry(route, rootDir) {
|
|
|
398
404
|
);
|
|
399
405
|
}
|
|
400
406
|
if (meta) {
|
|
407
|
+
const metaName = `meta${index}`;
|
|
408
|
+
const metaVerbsExports = verbs.map((verb) => {
|
|
409
|
+
var _a2;
|
|
410
|
+
const name = verb === "head" && !((_a2 = handler == null ? void 0 : handler.verbs) == null ? void 0 : _a2.includes(verb)) ? "GET" : verb.toUpperCase();
|
|
411
|
+
return `${name}: ${verb}${index}_meta`;
|
|
412
|
+
}).join(", ");
|
|
413
|
+
writer.writeLines("");
|
|
401
414
|
imports.writeLines(
|
|
402
|
-
`
|
|
415
|
+
`import ${metaName} from "${normalizedRelativePath(rootDir, meta.filePath)}";`
|
|
416
|
+
);
|
|
417
|
+
writer.writeLines(
|
|
418
|
+
`export const { ${metaVerbsExports} } = normalizeMeta(${metaName});`
|
|
403
419
|
);
|
|
404
420
|
}
|
|
405
421
|
for (const verb of verbs) {
|
|
@@ -518,10 +534,16 @@ function renderRouter(routes, rootDir, runtimeInclude, options = {
|
|
|
518
534
|
);
|
|
519
535
|
for (const route of routes.list) {
|
|
520
536
|
const verbs = getVerbs(route);
|
|
521
|
-
const
|
|
522
|
-
|
|
537
|
+
const routeImports = [];
|
|
538
|
+
for (const verb of verbs) {
|
|
539
|
+
const verbName = `${verb}${route.index}`;
|
|
540
|
+
routeImports.push(verbName);
|
|
541
|
+
if (route.meta) {
|
|
542
|
+
routeImports.push(`${verbName}_meta`);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
523
545
|
imports.writeLines(
|
|
524
|
-
`import { ${
|
|
546
|
+
`import { ${routeImports.join(", ")} } from "${virtualFilePrefix}/${getRouteVirtualFileName(route)}";`
|
|
525
547
|
);
|
|
526
548
|
}
|
|
527
549
|
for (const route of Object.values(routes.special)) {
|
|
@@ -813,14 +835,14 @@ function renderParams(params, pathIndex) {
|
|
|
813
835
|
function renderMatch(verb, route, path7, pathIndex) {
|
|
814
836
|
const handler = `${verb}${route.index}`;
|
|
815
837
|
const params = path7.params ? renderParams(path7.params, pathIndex) : "{}";
|
|
816
|
-
const meta = route.meta ?
|
|
838
|
+
const meta = route.meta ? `${verb}${route.index}_meta` : "{}";
|
|
817
839
|
return `{ handler: ${handler}, params: ${params}, meta: ${meta}, path: '${path7.path}' }`;
|
|
818
840
|
}
|
|
819
841
|
function renderMiddleware(middleware, rootDir) {
|
|
820
842
|
const writer = createStringWriter();
|
|
821
843
|
const imports = writer.branch("imports");
|
|
822
844
|
imports.writeLines(
|
|
823
|
-
`import {
|
|
845
|
+
`import { normalizeHandler } from "${virtualFilePrefix}/runtime/internal";`
|
|
824
846
|
);
|
|
825
847
|
writer.writeLines("");
|
|
826
848
|
for (const { id, filePath } of middleware) {
|
|
@@ -828,7 +850,9 @@ function renderMiddleware(middleware, rootDir) {
|
|
|
828
850
|
imports.writeLines(
|
|
829
851
|
`import ${importName} from "${normalizedRelativePath(rootDir, filePath)}";`
|
|
830
852
|
);
|
|
831
|
-
writer.writeLines(
|
|
853
|
+
writer.writeLines(
|
|
854
|
+
`export const mware${id} = normalizeHandler(${importName});`
|
|
855
|
+
);
|
|
832
856
|
}
|
|
833
857
|
imports.join();
|
|
834
858
|
return writer.end();
|
|
@@ -987,7 +1011,12 @@ function writeModuleDeclaration(writer, name, routeType, moduleTypes) {
|
|
|
987
1011
|
export { NotHandled, NotMatched, GetPaths, PostPaths, GetablePath, GetableHref, PostablePath, PostableHref, Platform };
|
|
988
1012
|
export type Route = ${routeType};
|
|
989
1013
|
export type Context = Run.MultiRouteContext<Route>${isMarko ? " & Marko.Global" : ""};
|
|
990
|
-
export type Handler = Run.HandlerLike<Route
|
|
1014
|
+
export type Handler = Run.HandlerLike<Route>;`);
|
|
1015
|
+
for (const verb of httpVerbs) {
|
|
1016
|
+
writer.write(`
|
|
1017
|
+
export type ${verb.toUpperCase()} = Run.HandlerLike<Route, "${verb.toUpperCase()}">;`);
|
|
1018
|
+
}
|
|
1019
|
+
writer.write(`
|
|
991
1020
|
/** @deprecated use \`((context, next) => { ... }) satisfies MarkoRun.Handler\` instead */
|
|
992
1021
|
export const route: Run.HandlerTypeFn<Route>;
|
|
993
1022
|
}`);
|
|
@@ -2528,6 +2557,31 @@ var defaultConfigPlugin = {
|
|
|
2528
2557
|
}
|
|
2529
2558
|
};
|
|
2530
2559
|
|
|
2560
|
+
// src/vite/utils/meta-data.ts
|
|
2561
|
+
var verbKeys = new Set(httpVerbs.map((v) => v.toUpperCase()));
|
|
2562
|
+
function isObject(obj) {
|
|
2563
|
+
return obj && typeof obj === "object" && !Array.isArray(obj);
|
|
2564
|
+
}
|
|
2565
|
+
function getMetaDataForVerb(data, verb) {
|
|
2566
|
+
if (!httpVerbs.includes(verb.toLowerCase())) {
|
|
2567
|
+
throw new Error(
|
|
2568
|
+
`Invalid argument 'verb': expected one of ${[...verbKeys].join(", ")} but received ${verb}`
|
|
2569
|
+
);
|
|
2570
|
+
}
|
|
2571
|
+
if (isObject(data)) {
|
|
2572
|
+
return Object.keys(data).reduce(
|
|
2573
|
+
(result, key) => {
|
|
2574
|
+
if (!(key in result || verbKeys.has(key))) {
|
|
2575
|
+
result[key] = data[key];
|
|
2576
|
+
}
|
|
2577
|
+
return result;
|
|
2578
|
+
},
|
|
2579
|
+
isObject(data[verb]) ? { ...data[verb] } : {}
|
|
2580
|
+
);
|
|
2581
|
+
}
|
|
2582
|
+
return data;
|
|
2583
|
+
}
|
|
2584
|
+
|
|
2531
2585
|
// src/vite/utils/server.ts
|
|
2532
2586
|
var import_child_process = __toESM(require("child_process"), 1);
|
|
2533
2587
|
var import_cluster = __toESM(require("cluster"), 1);
|
|
@@ -2678,6 +2732,7 @@ function sleep(ms) {
|
|
|
2678
2732
|
defaultConfigPlugin,
|
|
2679
2733
|
getApi,
|
|
2680
2734
|
getAvailablePort,
|
|
2735
|
+
getMetaDataForVerb,
|
|
2681
2736
|
getPackageData,
|
|
2682
2737
|
isPortInUse,
|
|
2683
2738
|
loadEnv,
|
package/dist/vite/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { default, defaultConfigPlugin, getApi, getPackageData } from "./plugin";
|
|
2
2
|
export type { Adapter, AdapterConfig, BuiltRoutes, ExplorerData, ExternalRoutes, HttpVerb, Options, PackageData, PathInfo, RoutableFile, RoutableFileType, Route, RouteGenerationData, } from "./types";
|
|
3
|
-
export
|
|
4
|
-
export { getAvailablePort, isPortInUse, loadEnv, parseEnv, spawnServer, spawnServerWorker, } from "./utils/server";
|
|
3
|
+
export { getMetaDataForVerb } from "./utils/meta-data";
|
|
4
|
+
export { getAvailablePort, isPortInUse, loadEnv, parseEnv, type SpawnedServer, spawnServer, spawnServerWorker, } from "./utils/server";
|