@marko/run 0.9.4 → 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.
@@ -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("normalize");
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(`const ${verb}Handler = normalize(${importName});`);
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
- `export { default as meta${index} } from "${normalizedRelativePath(rootDir, meta.filePath)}";`
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 names = verbs.map((verb) => `${verb}${route.index}`);
494
- route.meta && names.push(`meta${route.index}`);
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 { ${names.join(", ")} } from "${virtualFilePrefix}/${getRouteVirtualFileName(route)}";`
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 ? `meta${route.index}` : "{}";
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 { normalize } from "${virtualFilePrefix}/runtime/internal";`
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(`export const mware${id} = normalize(${importName});`);
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
  }`);
@@ -1560,7 +1588,7 @@ function createFSWalker(dir) {
1560
1588
  }
1561
1589
 
1562
1590
  // src/vite/utils/ast.ts
1563
- import * as t from "@babel/types";
1591
+ import { types as t } from "@marko/compiler";
1564
1592
  function getExportIdentifiers(astProgramNode) {
1565
1593
  const result = [];
1566
1594
  if (t.isProgram(astProgramNode)) {
@@ -1,13 +1,23 @@
1
1
  import { InlineConfig } from "vite";
2
2
  import { NotHandled, NotMatched } from "./namespace";
3
- import type { AnyContext, AnyHandler, AnyRoute, GetableHref, GetablePath, GetPaths, HandlerTypeFn, Platform, PostableHref, PostablePath, PostPaths, RuntimeModule } from "./types";
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
- normalize: () => normalize,
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 normalize(obj) {
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
- normalize,
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 normalize(obj: RouteHandler | RouteHandler[] | Promise<RouteHandler | RouteHandler[]>): RouteHandler;
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;
@@ -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 normalize(obj) {
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
- normalize,
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";
@@ -1,24 +1,28 @@
1
- export type Awaitable<T> = Promise<T> | T;
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">>> : never;
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 = unknown, Path extends string = string> {
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>, unknown, K> : never;
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
- }>, Verb extends "get" | "post"> = {
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 Verb ? K : never : never : never;
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 AnyContext = MultiRouteContext<AnyRoute>;
101
- export type AnyHandler<Params extends AnyParams = AnyParams, Meta extends AnyMeta = AnyMeta> = 0 extends HasAppData ? HandlerLike<Route<Params, Meta>> : HandlerLike<AnyRoute>;
102
- export type HandlerTypeFn<TRoute extends Route = AnyRoute> = 0 extends HasAppData ? <Params extends ParamsObject = ParamsObject, Meta = unknown, T extends HandlerLike<Route<Params, Meta>> = HandlerLike<Route<Params, Meta>>>(handler: T) => T : <T extends HandlerLike<TRoute>>(handler: T) => T;
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;
@@ -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("normalize");
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(`const ${verb}Handler = normalize(${importName});`);
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
- `export { default as meta${index} } from "${normalizedRelativePath(rootDir, meta.filePath)}";`
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 names = verbs.map((verb) => `${verb}${route.index}`);
522
- route.meta && names.push(`meta${route.index}`);
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 { ${names.join(", ")} } from "${virtualFilePrefix}/${getRouteVirtualFileName(route)}";`
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 ? `meta${route.index}` : "{}";
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 { normalize } from "${virtualFilePrefix}/runtime/internal";`
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(`export const mware${id} = normalize(${importName});`);
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
  }`);
@@ -1588,31 +1617,31 @@ function createFSWalker(dir) {
1588
1617
  }
1589
1618
 
1590
1619
  // src/vite/utils/ast.ts
1591
- var t = __toESM(require("@babel/types"), 1);
1620
+ var import_compiler = require("@marko/compiler");
1592
1621
  function getExportIdentifiers(astProgramNode) {
1593
1622
  const result = [];
1594
- if (t.isProgram(astProgramNode)) {
1623
+ if (import_compiler.types.isProgram(astProgramNode)) {
1595
1624
  for (const node of astProgramNode.body) {
1596
- if (t.isExportNamedDeclaration(node)) {
1625
+ if (import_compiler.types.isExportNamedDeclaration(node)) {
1597
1626
  const { declaration, specifiers } = node;
1598
1627
  if (declaration) {
1599
- if (t.isFunctionDeclaration(declaration) && declaration.id) {
1628
+ if (import_compiler.types.isFunctionDeclaration(declaration) && declaration.id) {
1600
1629
  result.push(declaration.id.name);
1601
- } else if (t.isVariableDeclaration(declaration)) {
1630
+ } else if (import_compiler.types.isVariableDeclaration(declaration)) {
1602
1631
  for (const declarator of declaration.declarations) {
1603
- if (t.isIdentifier(declarator.id)) {
1632
+ if (import_compiler.types.isIdentifier(declarator.id)) {
1604
1633
  result.push(declarator.id.name);
1605
1634
  }
1606
1635
  }
1607
1636
  }
1608
1637
  } else if (specifiers) {
1609
1638
  for (const specifier of specifiers) {
1610
- if (t.isExportSpecifier(specifier) && t.isIdentifier(specifier.exported)) {
1639
+ if (import_compiler.types.isExportSpecifier(specifier) && import_compiler.types.isIdentifier(specifier.exported)) {
1611
1640
  result.push(specifier.exported.name);
1612
1641
  }
1613
1642
  }
1614
1643
  }
1615
- } else if (t.isExportDefaultDeclaration(node)) {
1644
+ } else if (import_compiler.types.isExportDefaultDeclaration(node)) {
1616
1645
  result.push("default");
1617
1646
  }
1618
1647
  }
@@ -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,
@@ -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 type { SpawnedServer } from "./utils/server";
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";