@reckona/mreact-router 0.0.189 → 0.0.191

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.
Files changed (76) hide show
  1. package/README.md +17 -4
  2. package/bin/mreact-router.js +23 -0
  3. package/dist/adapters/aws-lambda.d.ts +33 -13
  4. package/dist/adapters/aws-lambda.d.ts.map +1 -1
  5. package/dist/adapters/aws-lambda.js +128 -20
  6. package/dist/adapters/aws-lambda.js.map +1 -1
  7. package/dist/adapters/cloudflare.d.ts +18 -0
  8. package/dist/adapters/cloudflare.d.ts.map +1 -1
  9. package/dist/adapters/cloudflare.js.map +1 -1
  10. package/dist/adapters/edge.d.ts +2 -0
  11. package/dist/adapters/edge.d.ts.map +1 -1
  12. package/dist/adapters/edge.js.map +1 -1
  13. package/dist/adapters/node.d.ts +16 -2
  14. package/dist/adapters/node.d.ts.map +1 -1
  15. package/dist/adapters/node.js.map +1 -1
  16. package/dist/build.d.ts +6 -0
  17. package/dist/build.d.ts.map +1 -1
  18. package/dist/build.js +57 -12
  19. package/dist/build.js.map +1 -1
  20. package/dist/cache.d.ts +8 -0
  21. package/dist/cache.d.ts.map +1 -1
  22. package/dist/cache.js +34 -13
  23. package/dist/cache.js.map +1 -1
  24. package/dist/cli-options.d.ts +4 -1
  25. package/dist/cli-options.d.ts.map +1 -1
  26. package/dist/cli-options.js +63 -3
  27. package/dist/cli-options.js.map +1 -1
  28. package/dist/cli.js +12 -0
  29. package/dist/cli.js.map +1 -1
  30. package/dist/client.d.ts +1 -1
  31. package/dist/client.d.ts.map +1 -1
  32. package/dist/client.js +1 -0
  33. package/dist/client.js.map +1 -1
  34. package/dist/config.d.ts +4 -0
  35. package/dist/config.d.ts.map +1 -1
  36. package/dist/config.js +6 -2
  37. package/dist/config.js.map +1 -1
  38. package/dist/index.d.ts +19 -16
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +15 -5
  41. package/dist/index.js.map +1 -1
  42. package/dist/link.d.ts +22 -1
  43. package/dist/link.d.ts.map +1 -1
  44. package/dist/link.js +130 -5
  45. package/dist/link.js.map +1 -1
  46. package/dist/render.d.ts.map +1 -1
  47. package/dist/render.js +514 -517
  48. package/dist/render.js.map +1 -1
  49. package/dist/request.d.ts +10 -0
  50. package/dist/request.d.ts.map +1 -0
  51. package/dist/request.js +6 -0
  52. package/dist/request.js.map +1 -0
  53. package/dist/typed-routes.d.ts +4 -5
  54. package/dist/typed-routes.d.ts.map +1 -1
  55. package/dist/typed-routes.js.map +1 -1
  56. package/dist/vite.d.ts +6 -0
  57. package/dist/vite.d.ts.map +1 -1
  58. package/dist/vite.js +4 -1
  59. package/dist/vite.js.map +1 -1
  60. package/package.json +19 -13
  61. package/src/adapters/aws-lambda.ts +227 -56
  62. package/src/adapters/cloudflare.ts +59 -0
  63. package/src/adapters/edge.ts +14 -0
  64. package/src/adapters/node.ts +44 -2
  65. package/src/build.ts +113 -16
  66. package/src/cache.ts +39 -17
  67. package/src/cli-options.ts +92 -6
  68. package/src/cli.ts +12 -0
  69. package/src/client.ts +2 -1
  70. package/src/config.ts +10 -2
  71. package/src/index.ts +57 -10
  72. package/src/link.ts +205 -10
  73. package/src/render.ts +5 -7
  74. package/src/request.ts +35 -0
  75. package/src/typed-routes.ts +4 -4
  76. package/src/vite.ts +30 -1
package/dist/cache.d.ts CHANGED
@@ -38,6 +38,12 @@ export interface MemoryRouteCacheOptions {
38
38
  maxEntries?: number;
39
39
  sweepIntervalMs?: number;
40
40
  }
41
+ interface RouteCacheContext {
42
+ cache: AppRouterCache;
43
+ cachePolicy?: RouteCachePolicy | undefined;
44
+ closed?: boolean | undefined;
45
+ revalidatedPaths: Set<string>;
46
+ }
41
47
  /**
42
48
  * Creates an in-memory route response cache for app-router rendering.
43
49
  *
@@ -85,6 +91,8 @@ export declare function beginRouteCacheContext(cache: AppRouterCache | undefined
85
91
  revalidatedPaths: string[];
86
92
  }>;
87
93
  };
94
+ export declare function activeRouteCacheContext(): RouteCacheContext | undefined;
88
95
  export declare function routeCacheKey(appDir: string, routePath: string, url: URL): string;
89
96
  export declare function stripRevalidateExport(code: string): string;
97
+ export {};
90
98
  //# sourceMappingURL=cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
package/dist/cache.js CHANGED
@@ -319,13 +319,19 @@ export async function withRouteCacheContext(cache, fn) {
319
319
  revalidatedPaths: new Set(),
320
320
  };
321
321
  return cacheState.storage.run(context, async () => {
322
- const value = await fn();
323
- const cachePolicy = context.cachePolicy;
324
- const revalidatedPaths = Array.from(context.revalidatedPaths);
325
- for (const path of revalidatedPaths) {
326
- await context.cache.deleteByPath(path);
322
+ try {
323
+ const value = await fn();
324
+ context.closed = true;
325
+ const cachePolicy = context.cachePolicy;
326
+ const revalidatedPaths = Array.from(context.revalidatedPaths);
327
+ for (const path of revalidatedPaths) {
328
+ await context.cache.deleteByPath(path);
329
+ }
330
+ return { cachePolicy, revalidatedPaths, value };
331
+ }
332
+ finally {
333
+ context.closed = true;
327
334
  }
328
- return { cachePolicy, revalidatedPaths, value };
329
335
  });
330
336
  }
331
337
  export function beginRouteCacheContext(cache) {
@@ -339,20 +345,35 @@ export function beginRouteCacheContext(cache) {
339
345
  return context.cachePolicy;
340
346
  },
341
347
  async dispose() {
348
+ context.closed = true;
342
349
  const revalidatedPaths = Array.from(context.revalidatedPaths);
343
- for (const path of revalidatedPaths) {
344
- await context.cache.deleteByPath(path);
350
+ try {
351
+ for (const path of revalidatedPaths) {
352
+ await context.cache.deleteByPath(path);
353
+ }
345
354
  }
346
- const index = cacheState.activeContexts.lastIndexOf(context);
347
- if (index !== -1) {
348
- cacheState.activeContexts.splice(index, 1);
355
+ finally {
356
+ const index = cacheState.activeContexts.lastIndexOf(context);
357
+ if (index !== -1) {
358
+ cacheState.activeContexts.splice(index, 1);
359
+ }
349
360
  }
350
361
  return { revalidatedPaths };
351
362
  },
352
363
  };
353
364
  }
354
- function activeRouteCacheContext() {
355
- return cacheState.storage.getStore() ?? cacheState.activeContexts.at(-1);
365
+ export function activeRouteCacheContext() {
366
+ const asyncContext = cacheState.storage.getStore();
367
+ if (asyncContext !== undefined) {
368
+ return asyncContext.closed === true ? undefined : asyncContext;
369
+ }
370
+ for (let index = cacheState.activeContexts.length - 1; index >= 0; index -= 1) {
371
+ const context = cacheState.activeContexts[index];
372
+ if (context?.closed !== true) {
373
+ return context;
374
+ }
375
+ }
376
+ return undefined;
356
377
  }
357
378
  // Host is excluded from the cache key to prevent attacker-supplied Host
358
379
  // headers from fragmenting / poisoning the cache (Issue 068). The Vary
package/dist/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\n/**\n * Describes the cache lifetime assigned to a rendered route response.\n */\nexport interface RouteCachePolicy {\n cacheControl: string;\n revalidateSeconds: number;\n}\n\n/**\n * Configures cache-control directives for route response caching.\n */\nexport interface CacheControlOptions {\n maxAge?: number | undefined;\n sMaxAge?: number | undefined;\n staleWhileRevalidate?: boolean | number | undefined;\n}\n\n/**\n * Stores a cached route response body and its expiration metadata.\n */\nexport interface AppRouterCacheEntry {\n body: string;\n cacheControl: string;\n expiresAt: number;\n path: string;\n status: number;\n}\n\n/**\n * Defines the storage interface used by app-router route response caching.\n */\nexport interface AppRouterCache {\n deleteByPath(path: string): void | Promise<void>;\n get(\n key: string,\n now?: number,\n ): AppRouterCacheEntry | undefined | Promise<AppRouterCacheEntry | undefined>;\n set(key: string, entry: AppRouterCacheEntry): void | Promise<void>;\n}\n\n/**\n * Configures the process-local in-memory route cache implementation.\n */\nexport interface MemoryRouteCacheOptions {\n maxEntries?: number;\n sweepIntervalMs?: number;\n}\n\ninterface AppRouterCacheState {\n activeContexts: RouteCacheContext[];\n invalidatedPaths: Set<string>;\n memoryCache: AppRouterCache;\n storage: AsyncLocalStorage<RouteCacheContext>;\n}\n\ninterface RouteCacheContext {\n cache: AppRouterCache;\n cachePolicy?: RouteCachePolicy | undefined;\n revalidatedPaths: Set<string>;\n}\n\nconst cacheState = ((\n globalThis as { __mreactAppRouterCache?: AppRouterCacheState }\n).__mreactAppRouterCache ??= {\n activeContexts: [],\n invalidatedPaths: new Set(),\n memoryCache: createMemoryRouteCache(),\n storage: new AsyncLocalStorage<RouteCacheContext>(),\n});\ncacheState.storage ??= new AsyncLocalStorage<RouteCacheContext>();\n\n/**\n * Creates an in-memory route response cache for app-router rendering.\n *\n * The cache is process-local, evicts expired entries during reads/writes, and is suitable for development, tests, or single-process deployments that do not need shared invalidation.\n */\nexport function createMemoryRouteCache(options: MemoryRouteCacheOptions = {}): AppRouterCache {\n const maxEntries = positiveIntegerOrDefault(options.maxEntries, 10_000);\n const sweepIntervalMs = nonNegativeIntegerOrDefault(options.sweepIntervalMs, 60_000);\n const cachedRoutes = new Map<string, AppRouterCacheEntry>();\n const keysByPath = new Map<string, Set<string>>();\n let nextSweepAt = 0;\n\n function unindexKey(key: string, path: string): void {\n const keys = keysByPath.get(path);\n keys?.delete(key);\n\n if (keys?.size === 0) {\n keysByPath.delete(path);\n }\n }\n\n function deleteEntry(key: string): void {\n const entry = cachedRoutes.get(key);\n cachedRoutes.delete(key);\n\n if (entry !== undefined) {\n unindexKey(key, entry.path);\n }\n }\n\n function indexKey(key: string, path: string): void {\n const keys = keysByPath.get(path);\n\n if (keys === undefined) {\n keysByPath.set(path, new Set([key]));\n return;\n }\n\n keys.add(key);\n }\n\n function sweepExpired(now: number): void {\n for (const [key, entry] of cachedRoutes) {\n if (entry.expiresAt <= now) {\n deleteEntry(key);\n }\n }\n\n nextSweepAt = now + sweepIntervalMs;\n }\n\n function maybeSweepExpired(now: number): void {\n if (sweepIntervalMs === 0 || now >= nextSweepAt) {\n sweepExpired(now);\n }\n }\n\n function evictOldestEntries(): void {\n while (cachedRoutes.size > maxEntries) {\n const oldestKey = cachedRoutes.keys().next().value;\n\n if (oldestKey === undefined) {\n return;\n }\n\n deleteEntry(oldestKey);\n }\n }\n\n return {\n deleteByPath(path) {\n const normalizedPath = normalizeRevalidationPath(path);\n const keys = keysByPath.get(normalizedPath);\n\n if (keys === undefined) {\n return;\n }\n\n for (const key of keys) {\n cachedRoutes.delete(key);\n }\n\n keysByPath.delete(normalizedPath);\n },\n get(key, now = Date.now()) {\n const entry = cachedRoutes.get(key);\n\n if (entry === undefined) {\n return undefined;\n }\n\n if (entry.expiresAt <= now) {\n deleteEntry(key);\n return undefined;\n }\n\n return entry;\n },\n set(key, entry) {\n const now = Date.now();\n maybeSweepExpired(now);\n const previous = cachedRoutes.get(key);\n\n if (previous !== undefined) {\n cachedRoutes.delete(key);\n unindexKey(key, previous.path);\n }\n\n cachedRoutes.set(key, entry);\n indexKey(key, entry.path);\n\n if (cachedRoutes.size > maxEntries) {\n sweepExpired(now);\n evictOldestEntries();\n }\n },\n };\n}\n\nfunction positiveIntegerOrDefault(value: number | undefined, fallback: number): number {\n return value === undefined || !Number.isInteger(value) || value < 1 ? fallback : value;\n}\n\nfunction nonNegativeIntegerOrDefault(value: number | undefined, fallback: number): number {\n return value === undefined || !Number.isInteger(value) || value < 0 ? fallback : value;\n}\n\nexport function routeCachePolicyFromSource(code: string): RouteCachePolicy | undefined {\n const match = /^\\s*export\\s+const\\s+revalidate\\s*=\\s*(?<seconds>\\d+)\\s*;?\\s*$/m.exec(code);\n const seconds = match?.groups?.seconds === undefined ? undefined : Number(match.groups.seconds);\n\n if (seconds === undefined || !Number.isFinite(seconds)) {\n if (/^\\s*export\\s+const\\s+revalidate\\s*=/m.test(code)) {\n console.warn(\n \"export const revalidate must be a plain integer literal, e.g. export const revalidate = 3600\",\n );\n }\n return undefined;\n }\n\n return {\n cacheControl: seconds === 0 ? \"no-store\" : `s-maxage=${seconds}, stale-while-revalidate`,\n revalidateSeconds: seconds,\n };\n}\n\n/**\n * Sets the cache policy for the current app-router render.\n *\n * Call this during a loader or route render to override the response `Cache-Control` policy; it throws outside an active app-router request.\n */\nexport function cacheControl(options: CacheControlOptions): void {\n const activeContext = activeRouteCacheContext();\n\n if (activeContext === undefined) {\n throw new Error(\"cacheControl() must be called during an app router request.\");\n }\n\n activeContext.cachePolicy = routeCachePolicyFromOptions(options);\n}\n\nexport function routeCachePolicyFromOptions(options: CacheControlOptions): RouteCachePolicy {\n const directives: string[] = [];\n const maxAge = cacheControlSeconds(options.maxAge, \"maxAge\");\n const sMaxAge = cacheControlSeconds(options.sMaxAge, \"sMaxAge\");\n\n if (maxAge !== undefined) {\n directives.push(`max-age=${maxAge}`);\n }\n\n if (sMaxAge !== undefined) {\n directives.push(`s-maxage=${sMaxAge}`);\n }\n\n if (options.staleWhileRevalidate !== undefined) {\n directives.push(staleWhileRevalidateDirective(options.staleWhileRevalidate));\n }\n\n if (directives.length === 0) {\n throw new Error(\"cacheControl() requires at least one cache directive.\");\n }\n\n return {\n cacheControl: directives.join(\", \"),\n revalidateSeconds: sMaxAge ?? 0,\n };\n}\n\nexport function cachedRouteResponse(options: {\n cache?: AppRouterCache | undefined;\n key: string;\n now?: number;\n request?: Request | undefined;\n}): Promise<Response | undefined> {\n return Promise.resolve().then(async () => {\n if (requestCarriesCredentials(options.request)) {\n return undefined;\n }\n\n const cache = options.cache ?? cacheState.memoryCache;\n\n await consumeInvalidations(cache);\n const now = options.now ?? Date.now();\n const cached = await cache.get(options.key, now);\n\n if (cached === undefined || cached.expiresAt <= now) {\n return undefined;\n }\n\n return new Response(cached.body, {\n headers: {\n \"cache-control\": cached.cacheControl,\n \"content-type\": \"text/html; charset=utf-8\",\n \"x-mreact-cache\": \"HIT\",\n },\n status: cached.status,\n });\n });\n}\n\nexport async function cacheRouteResponse(options: {\n cache?: AppRouterCache | undefined;\n key: string;\n now?: number;\n path: string;\n policy: RouteCachePolicy | undefined;\n request?: Request | undefined;\n response: Response;\n}): Promise<Response> {\n if (options.policy === undefined) {\n return options.response;\n }\n\n if (options.policy.revalidateSeconds === 0) {\n options.response.headers.set(\"cache-control\", options.policy.cacheControl);\n return options.response;\n }\n\n const body = await options.response.text();\n const cacheControl = options.policy.cacheControl;\n const status = options.response.status;\n const contentType = options.response.headers.get(\"content-type\") ?? \"text/html; charset=utf-8\";\n\n if (\n requestCarriesCredentials(options.request) ||\n options.response.headers.has(\"set-cookie\")\n ) {\n const headers = new Headers(options.response.headers);\n headers.set(\"cache-control\", \"private, no-store\");\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", contentType);\n }\n\n return new Response(body, {\n headers,\n status,\n });\n }\n\n await (options.cache ?? cacheState.memoryCache).set(options.key, {\n body,\n cacheControl,\n expiresAt: (options.now ?? Date.now()) + options.policy.revalidateSeconds * 1000,\n path: normalizeRevalidationPath(options.path),\n status,\n });\n\n return new Response(body, {\n headers: {\n \"cache-control\": cacheControl,\n \"content-type\": contentType,\n \"x-mreact-cache\": \"MISS\",\n },\n status,\n });\n}\n\nfunction requestCarriesCredentials(request: Request | undefined): boolean {\n if (request === undefined) {\n return false;\n }\n\n if (request.headers.has(\"authorization\") || request.headers.has(\"cookie\")) {\n return true;\n }\n\n for (const name of request.headers.keys()) {\n const lower = name.toLowerCase();\n if (PUBLIC_ROUTE_CACHE_REQUEST_HEADERS.has(lower)) {\n continue;\n }\n\n if (\n lower === \"x-api-key\" ||\n lower === \"cf-access-jwt-assertion\" ||\n lower === \"proxy-authorization\" ||\n lower === \"x-access-token\" ||\n lower === \"x-auth-token\" ||\n lower === \"x-authenticated-user\" ||\n lower === \"x-id-token\" ||\n lower === \"x-forwarded-user\" ||\n lower === \"x-session-id\" ||\n lower === \"x-user-email\" ||\n lower === \"x-user-id\" ||\n lower.endsWith(\"-api-key\") ||\n lower.endsWith(\"-auth-token\") ||\n lower.endsWith(\"-session-id\") ||\n lower.endsWith(\"-user\") ||\n lower.endsWith(\"-user-email\") ||\n lower.endsWith(\"-user-id\") ||\n lower.includes(\"-jwt-\") ||\n lower.endsWith(\"-jwt\")\n ) {\n return true;\n }\n\n continue;\n }\n\n return false;\n}\n\nconst PUBLIC_ROUTE_CACHE_REQUEST_HEADERS = new Set([\n \"accept\",\n \"accept-encoding\",\n \"accept-language\",\n \"cache-control\",\n \"cf-connecting-ip\",\n \"cf-ipcountry\",\n \"cf-ray\",\n \"connection\",\n \"dnt\",\n \"host\",\n \"if-none-match\",\n \"pragma\",\n \"priority\",\n \"purpose\",\n \"referer\",\n \"save-data\",\n \"sec-ch-prefers-color-scheme\",\n \"sec-ch-prefers-reduced-motion\",\n \"sec-ch-ua\",\n \"sec-ch-ua-mobile\",\n \"sec-ch-ua-platform\",\n \"sec-fetch-dest\",\n \"sec-fetch-mode\",\n \"sec-fetch-site\",\n \"sec-fetch-user\",\n \"upgrade-insecure-requests\",\n \"user-agent\",\n \"via\",\n \"x-mreact-navigation\",\n \"x-mreact-navigation-cache\",\n \"x-real-ip\",\n \"x-request-id\",\n \"x-forwarded-for\",\n \"x-forwarded-host\",\n \"x-forwarded-proto\",\n]);\n\n/**\n * Invalidates cached route responses for a normalized app-router path.\n *\n * During a request the invalidation is scoped to that route cache context; outside a request it is queued for the next cache access.\n */\nexport function revalidatePath(path: string): void {\n const normalizedPath = normalizeRevalidationPath(path);\n const activeContext = activeRouteCacheContext();\n\n if (activeContext !== undefined) {\n activeContext.revalidatedPaths.add(normalizedPath);\n return;\n }\n\n cacheState.invalidatedPaths.add(normalizedPath);\n}\n\nexport async function consumeInvalidations(\n cache: AppRouterCache = cacheState.memoryCache,\n): Promise<void> {\n if (cacheState.invalidatedPaths.size === 0) {\n return;\n }\n\n for (const path of cacheState.invalidatedPaths) {\n await cache.deleteByPath(path);\n }\n\n cacheState.invalidatedPaths.clear();\n}\n\nexport async function withRouteCacheContext<T>(\n cache: AppRouterCache | undefined,\n fn: () => T | Promise<T>,\n): Promise<{ cachePolicy: RouteCachePolicy | undefined; revalidatedPaths: string[]; value: T }> {\n const context: RouteCacheContext = {\n cache: cache ?? cacheState.memoryCache,\n revalidatedPaths: new Set(),\n };\n\n return cacheState.storage.run(context, async () => {\n const value = await fn();\n const cachePolicy = context.cachePolicy;\n const revalidatedPaths = Array.from(context.revalidatedPaths);\n\n for (const path of revalidatedPaths) {\n await context.cache.deleteByPath(path);\n }\n\n return { cachePolicy, revalidatedPaths, value };\n });\n}\n\nexport function beginRouteCacheContext(cache: AppRouterCache | undefined): {\n readonly cachePolicy: RouteCachePolicy | undefined;\n dispose(): Promise<{ revalidatedPaths: string[] }>;\n} {\n const context: RouteCacheContext = {\n cache: cache ?? cacheState.memoryCache,\n revalidatedPaths: new Set(),\n };\n\n cacheState.activeContexts.push(context);\n\n return {\n get cachePolicy() {\n return context.cachePolicy;\n },\n async dispose() {\n const revalidatedPaths = Array.from(context.revalidatedPaths);\n\n for (const path of revalidatedPaths) {\n await context.cache.deleteByPath(path);\n }\n\n const index = cacheState.activeContexts.lastIndexOf(context);\n if (index !== -1) {\n cacheState.activeContexts.splice(index, 1);\n }\n\n return { revalidatedPaths };\n },\n };\n}\n\nfunction activeRouteCacheContext(): RouteCacheContext | undefined {\n return cacheState.storage.getStore() ?? cacheState.activeContexts.at(-1);\n}\n\n// Host is excluded from the cache key to prevent attacker-supplied Host\n// headers from fragmenting / poisoning the cache (Issue 068). The Vary\n// dimension is the request path + query; same-origin reverse proxies are\n// expected to handle vhost separation at their layer.\nexport function routeCacheKey(appDir: string, routePath: string, url: URL): string {\n return `${appDir}\\0${normalizeRevalidationPath(routePath)}\\0${url.pathname}${url.search}`;\n}\n\nexport function stripRevalidateExport(code: string): string {\n return code.replace(/^\\s*export\\s+const\\s+revalidate\\s*=\\s*\\d+\\s*;?\\s*$/m, \"\");\n}\n\nfunction normalizeRevalidationPath(path: string): string {\n const pathname = path.startsWith(\"/\") ? path : `/${path}`;\n const withoutTrailing = pathname.length > 1 ? pathname.replace(/\\/+$/, \"\") : pathname;\n\n return withoutTrailing === \"\" ? \"/\" : withoutTrailing;\n}\n\nfunction cacheControlSeconds(value: number | undefined, name: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`cacheControl() ${name} must be a non-negative integer.`);\n }\n\n return value;\n}\n\nfunction staleWhileRevalidateDirective(value: boolean | number): string {\n if (value === true) {\n return \"stale-while-revalidate\";\n }\n\n if (value === false) {\n throw new Error(\"cacheControl() staleWhileRevalidate must be true or a non-negative integer.\");\n }\n\n const seconds = cacheControlSeconds(value, \"staleWhileRevalidate\");\n return `stale-while-revalidate=${seconds}`;\n}\n"]}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\n/**\n * Describes the cache lifetime assigned to a rendered route response.\n */\nexport interface RouteCachePolicy {\n cacheControl: string;\n revalidateSeconds: number;\n}\n\n/**\n * Configures cache-control directives for route response caching.\n */\nexport interface CacheControlOptions {\n maxAge?: number | undefined;\n sMaxAge?: number | undefined;\n staleWhileRevalidate?: boolean | number | undefined;\n}\n\n/**\n * Stores a cached route response body and its expiration metadata.\n */\nexport interface AppRouterCacheEntry {\n body: string;\n cacheControl: string;\n expiresAt: number;\n path: string;\n status: number;\n}\n\n/**\n * Defines the storage interface used by app-router route response caching.\n */\nexport interface AppRouterCache {\n deleteByPath(path: string): void | Promise<void>;\n get(\n key: string,\n now?: number,\n ): AppRouterCacheEntry | undefined | Promise<AppRouterCacheEntry | undefined>;\n set(key: string, entry: AppRouterCacheEntry): void | Promise<void>;\n}\n\n/**\n * Configures the process-local in-memory route cache implementation.\n */\nexport interface MemoryRouteCacheOptions {\n maxEntries?: number;\n sweepIntervalMs?: number;\n}\n\ninterface AppRouterCacheState {\n activeContexts: RouteCacheContext[];\n invalidatedPaths: Set<string>;\n memoryCache: AppRouterCache;\n storage: AsyncLocalStorage<RouteCacheContext>;\n}\n\ninterface RouteCacheContext {\n cache: AppRouterCache;\n cachePolicy?: RouteCachePolicy | undefined;\n closed?: boolean | undefined;\n revalidatedPaths: Set<string>;\n}\n\nconst cacheState = ((\n globalThis as { __mreactAppRouterCache?: AppRouterCacheState }\n).__mreactAppRouterCache ??= {\n activeContexts: [],\n invalidatedPaths: new Set(),\n memoryCache: createMemoryRouteCache(),\n storage: new AsyncLocalStorage<RouteCacheContext>(),\n});\ncacheState.storage ??= new AsyncLocalStorage<RouteCacheContext>();\n\n/**\n * Creates an in-memory route response cache for app-router rendering.\n *\n * The cache is process-local, evicts expired entries during reads/writes, and is suitable for development, tests, or single-process deployments that do not need shared invalidation.\n */\nexport function createMemoryRouteCache(options: MemoryRouteCacheOptions = {}): AppRouterCache {\n const maxEntries = positiveIntegerOrDefault(options.maxEntries, 10_000);\n const sweepIntervalMs = nonNegativeIntegerOrDefault(options.sweepIntervalMs, 60_000);\n const cachedRoutes = new Map<string, AppRouterCacheEntry>();\n const keysByPath = new Map<string, Set<string>>();\n let nextSweepAt = 0;\n\n function unindexKey(key: string, path: string): void {\n const keys = keysByPath.get(path);\n keys?.delete(key);\n\n if (keys?.size === 0) {\n keysByPath.delete(path);\n }\n }\n\n function deleteEntry(key: string): void {\n const entry = cachedRoutes.get(key);\n cachedRoutes.delete(key);\n\n if (entry !== undefined) {\n unindexKey(key, entry.path);\n }\n }\n\n function indexKey(key: string, path: string): void {\n const keys = keysByPath.get(path);\n\n if (keys === undefined) {\n keysByPath.set(path, new Set([key]));\n return;\n }\n\n keys.add(key);\n }\n\n function sweepExpired(now: number): void {\n for (const [key, entry] of cachedRoutes) {\n if (entry.expiresAt <= now) {\n deleteEntry(key);\n }\n }\n\n nextSweepAt = now + sweepIntervalMs;\n }\n\n function maybeSweepExpired(now: number): void {\n if (sweepIntervalMs === 0 || now >= nextSweepAt) {\n sweepExpired(now);\n }\n }\n\n function evictOldestEntries(): void {\n while (cachedRoutes.size > maxEntries) {\n const oldestKey = cachedRoutes.keys().next().value;\n\n if (oldestKey === undefined) {\n return;\n }\n\n deleteEntry(oldestKey);\n }\n }\n\n return {\n deleteByPath(path) {\n const normalizedPath = normalizeRevalidationPath(path);\n const keys = keysByPath.get(normalizedPath);\n\n if (keys === undefined) {\n return;\n }\n\n for (const key of keys) {\n cachedRoutes.delete(key);\n }\n\n keysByPath.delete(normalizedPath);\n },\n get(key, now = Date.now()) {\n const entry = cachedRoutes.get(key);\n\n if (entry === undefined) {\n return undefined;\n }\n\n if (entry.expiresAt <= now) {\n deleteEntry(key);\n return undefined;\n }\n\n return entry;\n },\n set(key, entry) {\n const now = Date.now();\n maybeSweepExpired(now);\n const previous = cachedRoutes.get(key);\n\n if (previous !== undefined) {\n cachedRoutes.delete(key);\n unindexKey(key, previous.path);\n }\n\n cachedRoutes.set(key, entry);\n indexKey(key, entry.path);\n\n if (cachedRoutes.size > maxEntries) {\n sweepExpired(now);\n evictOldestEntries();\n }\n },\n };\n}\n\nfunction positiveIntegerOrDefault(value: number | undefined, fallback: number): number {\n return value === undefined || !Number.isInteger(value) || value < 1 ? fallback : value;\n}\n\nfunction nonNegativeIntegerOrDefault(value: number | undefined, fallback: number): number {\n return value === undefined || !Number.isInteger(value) || value < 0 ? fallback : value;\n}\n\nexport function routeCachePolicyFromSource(code: string): RouteCachePolicy | undefined {\n const match = /^\\s*export\\s+const\\s+revalidate\\s*=\\s*(?<seconds>\\d+)\\s*;?\\s*$/m.exec(code);\n const seconds = match?.groups?.seconds === undefined ? undefined : Number(match.groups.seconds);\n\n if (seconds === undefined || !Number.isFinite(seconds)) {\n if (/^\\s*export\\s+const\\s+revalidate\\s*=/m.test(code)) {\n console.warn(\n \"export const revalidate must be a plain integer literal, e.g. export const revalidate = 3600\",\n );\n }\n return undefined;\n }\n\n return {\n cacheControl: seconds === 0 ? \"no-store\" : `s-maxage=${seconds}, stale-while-revalidate`,\n revalidateSeconds: seconds,\n };\n}\n\n/**\n * Sets the cache policy for the current app-router render.\n *\n * Call this during a loader or route render to override the response `Cache-Control` policy; it throws outside an active app-router request.\n */\nexport function cacheControl(options: CacheControlOptions): void {\n const activeContext = activeRouteCacheContext();\n\n if (activeContext === undefined) {\n throw new Error(\"cacheControl() must be called during an app router request.\");\n }\n\n activeContext.cachePolicy = routeCachePolicyFromOptions(options);\n}\n\nexport function routeCachePolicyFromOptions(options: CacheControlOptions): RouteCachePolicy {\n const directives: string[] = [];\n const maxAge = cacheControlSeconds(options.maxAge, \"maxAge\");\n const sMaxAge = cacheControlSeconds(options.sMaxAge, \"sMaxAge\");\n\n if (maxAge !== undefined) {\n directives.push(`max-age=${maxAge}`);\n }\n\n if (sMaxAge !== undefined) {\n directives.push(`s-maxage=${sMaxAge}`);\n }\n\n if (options.staleWhileRevalidate !== undefined) {\n directives.push(staleWhileRevalidateDirective(options.staleWhileRevalidate));\n }\n\n if (directives.length === 0) {\n throw new Error(\"cacheControl() requires at least one cache directive.\");\n }\n\n return {\n cacheControl: directives.join(\", \"),\n revalidateSeconds: sMaxAge ?? 0,\n };\n}\n\nexport function cachedRouteResponse(options: {\n cache?: AppRouterCache | undefined;\n key: string;\n now?: number;\n request?: Request | undefined;\n}): Promise<Response | undefined> {\n return Promise.resolve().then(async () => {\n if (requestCarriesCredentials(options.request)) {\n return undefined;\n }\n\n const cache = options.cache ?? cacheState.memoryCache;\n\n await consumeInvalidations(cache);\n const now = options.now ?? Date.now();\n const cached = await cache.get(options.key, now);\n\n if (cached === undefined || cached.expiresAt <= now) {\n return undefined;\n }\n\n return new Response(cached.body, {\n headers: {\n \"cache-control\": cached.cacheControl,\n \"content-type\": \"text/html; charset=utf-8\",\n \"x-mreact-cache\": \"HIT\",\n },\n status: cached.status,\n });\n });\n}\n\nexport async function cacheRouteResponse(options: {\n cache?: AppRouterCache | undefined;\n key: string;\n now?: number;\n path: string;\n policy: RouteCachePolicy | undefined;\n request?: Request | undefined;\n response: Response;\n}): Promise<Response> {\n if (options.policy === undefined) {\n return options.response;\n }\n\n if (options.policy.revalidateSeconds === 0) {\n options.response.headers.set(\"cache-control\", options.policy.cacheControl);\n return options.response;\n }\n\n const body = await options.response.text();\n const cacheControl = options.policy.cacheControl;\n const status = options.response.status;\n const contentType = options.response.headers.get(\"content-type\") ?? \"text/html; charset=utf-8\";\n\n if (\n requestCarriesCredentials(options.request) ||\n options.response.headers.has(\"set-cookie\")\n ) {\n const headers = new Headers(options.response.headers);\n headers.set(\"cache-control\", \"private, no-store\");\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", contentType);\n }\n\n return new Response(body, {\n headers,\n status,\n });\n }\n\n await (options.cache ?? cacheState.memoryCache).set(options.key, {\n body,\n cacheControl,\n expiresAt: (options.now ?? Date.now()) + options.policy.revalidateSeconds * 1000,\n path: normalizeRevalidationPath(options.path),\n status,\n });\n\n return new Response(body, {\n headers: {\n \"cache-control\": cacheControl,\n \"content-type\": contentType,\n \"x-mreact-cache\": \"MISS\",\n },\n status,\n });\n}\n\nfunction requestCarriesCredentials(request: Request | undefined): boolean {\n if (request === undefined) {\n return false;\n }\n\n if (request.headers.has(\"authorization\") || request.headers.has(\"cookie\")) {\n return true;\n }\n\n for (const name of request.headers.keys()) {\n const lower = name.toLowerCase();\n if (PUBLIC_ROUTE_CACHE_REQUEST_HEADERS.has(lower)) {\n continue;\n }\n\n if (\n lower === \"x-api-key\" ||\n lower === \"cf-access-jwt-assertion\" ||\n lower === \"proxy-authorization\" ||\n lower === \"x-access-token\" ||\n lower === \"x-auth-token\" ||\n lower === \"x-authenticated-user\" ||\n lower === \"x-id-token\" ||\n lower === \"x-forwarded-user\" ||\n lower === \"x-session-id\" ||\n lower === \"x-user-email\" ||\n lower === \"x-user-id\" ||\n lower.endsWith(\"-api-key\") ||\n lower.endsWith(\"-auth-token\") ||\n lower.endsWith(\"-session-id\") ||\n lower.endsWith(\"-user\") ||\n lower.endsWith(\"-user-email\") ||\n lower.endsWith(\"-user-id\") ||\n lower.includes(\"-jwt-\") ||\n lower.endsWith(\"-jwt\")\n ) {\n return true;\n }\n\n continue;\n }\n\n return false;\n}\n\nconst PUBLIC_ROUTE_CACHE_REQUEST_HEADERS = new Set([\n \"accept\",\n \"accept-encoding\",\n \"accept-language\",\n \"cache-control\",\n \"cf-connecting-ip\",\n \"cf-ipcountry\",\n \"cf-ray\",\n \"connection\",\n \"dnt\",\n \"host\",\n \"if-none-match\",\n \"pragma\",\n \"priority\",\n \"purpose\",\n \"referer\",\n \"save-data\",\n \"sec-ch-prefers-color-scheme\",\n \"sec-ch-prefers-reduced-motion\",\n \"sec-ch-ua\",\n \"sec-ch-ua-mobile\",\n \"sec-ch-ua-platform\",\n \"sec-fetch-dest\",\n \"sec-fetch-mode\",\n \"sec-fetch-site\",\n \"sec-fetch-user\",\n \"upgrade-insecure-requests\",\n \"user-agent\",\n \"via\",\n \"x-mreact-navigation\",\n \"x-mreact-navigation-cache\",\n \"x-real-ip\",\n \"x-request-id\",\n \"x-forwarded-for\",\n \"x-forwarded-host\",\n \"x-forwarded-proto\",\n]);\n\n/**\n * Invalidates cached route responses for a normalized app-router path.\n *\n * During a request the invalidation is scoped to that route cache context; outside a request it is queued for the next cache access.\n */\nexport function revalidatePath(path: string): void {\n const normalizedPath = normalizeRevalidationPath(path);\n const activeContext = activeRouteCacheContext();\n\n if (activeContext !== undefined) {\n activeContext.revalidatedPaths.add(normalizedPath);\n return;\n }\n\n cacheState.invalidatedPaths.add(normalizedPath);\n}\n\nexport async function consumeInvalidations(\n cache: AppRouterCache = cacheState.memoryCache,\n): Promise<void> {\n if (cacheState.invalidatedPaths.size === 0) {\n return;\n }\n\n for (const path of cacheState.invalidatedPaths) {\n await cache.deleteByPath(path);\n }\n\n cacheState.invalidatedPaths.clear();\n}\n\nexport async function withRouteCacheContext<T>(\n cache: AppRouterCache | undefined,\n fn: () => T | Promise<T>,\n): Promise<{ cachePolicy: RouteCachePolicy | undefined; revalidatedPaths: string[]; value: T }> {\n const context: RouteCacheContext = {\n cache: cache ?? cacheState.memoryCache,\n revalidatedPaths: new Set(),\n };\n\n return cacheState.storage.run(context, async () => {\n try {\n const value = await fn();\n context.closed = true;\n const cachePolicy = context.cachePolicy;\n const revalidatedPaths = Array.from(context.revalidatedPaths);\n\n for (const path of revalidatedPaths) {\n await context.cache.deleteByPath(path);\n }\n\n return { cachePolicy, revalidatedPaths, value };\n } finally {\n context.closed = true;\n }\n });\n}\n\nexport function beginRouteCacheContext(cache: AppRouterCache | undefined): {\n readonly cachePolicy: RouteCachePolicy | undefined;\n dispose(): Promise<{ revalidatedPaths: string[] }>;\n} {\n const context: RouteCacheContext = {\n cache: cache ?? cacheState.memoryCache,\n revalidatedPaths: new Set(),\n };\n\n cacheState.activeContexts.push(context);\n\n return {\n get cachePolicy() {\n return context.cachePolicy;\n },\n async dispose() {\n context.closed = true;\n const revalidatedPaths = Array.from(context.revalidatedPaths);\n try {\n for (const path of revalidatedPaths) {\n await context.cache.deleteByPath(path);\n }\n } finally {\n const index = cacheState.activeContexts.lastIndexOf(context);\n if (index !== -1) {\n cacheState.activeContexts.splice(index, 1);\n }\n }\n\n return { revalidatedPaths };\n },\n };\n}\n\nexport function activeRouteCacheContext(): RouteCacheContext | undefined {\n const asyncContext = cacheState.storage.getStore();\n\n if (asyncContext !== undefined) {\n return asyncContext.closed === true ? undefined : asyncContext;\n }\n\n for (let index = cacheState.activeContexts.length - 1; index >= 0; index -= 1) {\n const context = cacheState.activeContexts[index];\n\n if (context?.closed !== true) {\n return context;\n }\n }\n\n return undefined;\n}\n\n// Host is excluded from the cache key to prevent attacker-supplied Host\n// headers from fragmenting / poisoning the cache (Issue 068). The Vary\n// dimension is the request path + query; same-origin reverse proxies are\n// expected to handle vhost separation at their layer.\nexport function routeCacheKey(appDir: string, routePath: string, url: URL): string {\n return `${appDir}\\0${normalizeRevalidationPath(routePath)}\\0${url.pathname}${url.search}`;\n}\n\nexport function stripRevalidateExport(code: string): string {\n return code.replace(/^\\s*export\\s+const\\s+revalidate\\s*=\\s*\\d+\\s*;?\\s*$/m, \"\");\n}\n\nfunction normalizeRevalidationPath(path: string): string {\n const pathname = path.startsWith(\"/\") ? path : `/${path}`;\n const withoutTrailing = pathname.length > 1 ? pathname.replace(/\\/+$/, \"\") : pathname;\n\n return withoutTrailing === \"\" ? \"/\" : withoutTrailing;\n}\n\nfunction cacheControlSeconds(value: number | undefined, name: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`cacheControl() ${name} must be a non-negative integer.`);\n }\n\n return value;\n}\n\nfunction staleWhileRevalidateDirective(value: boolean | number): string {\n if (value === true) {\n return \"stale-while-revalidate\";\n }\n\n if (value === false) {\n throw new Error(\"cacheControl() staleWhileRevalidate must be true or a non-negative integer.\");\n }\n\n const seconds = cacheControlSeconds(value, \"staleWhileRevalidate\");\n return `stale-while-revalidate=${seconds}`;\n}\n"]}
@@ -1,9 +1,12 @@
1
1
  import type { AppRouterLogger } from "./logger.js";
2
- import type { AppRouterBuildTarget, AppRouterClientSourceMapMode } from "./config.js";
2
+ import { type AppRouterBuildTarget, type AppRouterClientSourceMapMode } from "./config.js";
3
3
  import type { RequestHostPolicy } from "./serve.js";
4
+ import type { AwsLambdaGeneratedHandlerPreloadMode } from "./build.js";
4
5
  export type CliRequestLogMode = "requests";
5
6
  export type CliBuildTarget = AppRouterBuildTarget | "all";
6
7
  export interface ParsedCliArguments {
8
+ awsLambdaPreload?: AwsLambdaGeneratedHandlerPreloadMode | undefined;
9
+ awsLambdaPreloadRoutes?: readonly string[] | undefined;
7
10
  clientSourceMaps?: AppRouterClientSourceMapMode | undefined;
8
11
  command: string;
9
12
  allowedHosts?: readonly string[] | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-options.d.ts","sourceRoot":"","sources":["../src/cli-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EACV,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAC3C,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC3C,GAAG,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACpC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,0BAA0B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,kBAAkB,CAsJ7E;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAoHlE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,GAAG,SAAS,GACjC,SAAS,oBAAoB,EAAE,GAAG,SAAS,CAM7C;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,iBAAiB,GAAG,SAAS,EACxC,GAAG,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC9C,iBAAiB,GAAG,SAAS,CAW/B;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,GAAG,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACjC,MAAM,CAOR;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,GAAG,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAClC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,iBAAiB,GAAG,SAAS,EACxC,GAAG,EAAE;IAAE,yBAAyB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACtD,iBAAiB,GAAG,SAAS,CAO/B;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACxC,GAAG,EAAE;IAAE,2BAA2B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACxD,SAAS,MAAM,EAAE,GAAG,SAAS,CAO/B;AAED,wBAAgB,sBAAsB,IAAI,eAAe,CAaxD"}
1
+ {"version":3,"file":"cli-options.d.ts","sourceRoot":"","sources":["../src/cli-options.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { appRouterBuildTargetMetadata, } from "./config.js";
1
2
  export function parseCliArguments(argv) {
2
3
  const first = argv[0];
3
4
  const rootHelp = first === "--help" || first === "-h";
@@ -103,6 +104,24 @@ export function parseCliArguments(argv) {
103
104
  index += 1;
104
105
  continue;
105
106
  }
107
+ if (value === "--aws-lambda-preload") {
108
+ parsed.awsLambdaPreload = parseCliAwsLambdaPreloadMode(readOptionValue(argv, index, "aws-lambda-preload"));
109
+ index += 1;
110
+ continue;
111
+ }
112
+ if (value.startsWith("--aws-lambda-preload=")) {
113
+ parsed.awsLambdaPreload = parseCliAwsLambdaPreloadMode(value.slice("--aws-lambda-preload=".length));
114
+ continue;
115
+ }
116
+ if (value === "--aws-lambda-preload-routes") {
117
+ parsed.awsLambdaPreloadRoutes = parseCliAwsLambdaPreloadRoutes(readOptionValue(argv, index, "aws-lambda-preload-routes"));
118
+ index += 1;
119
+ continue;
120
+ }
121
+ if (value.startsWith("--aws-lambda-preload-routes=")) {
122
+ parsed.awsLambdaPreloadRoutes = parseCliAwsLambdaPreloadRoutes(value.slice("--aws-lambda-preload-routes=".length));
123
+ continue;
124
+ }
106
125
  if (value.startsWith("--client-source-maps=")) {
107
126
  parsed.clientSourceMaps = parseCliClientSourceMapMode(value.slice("--client-source-maps=".length));
108
127
  continue;
@@ -118,6 +137,8 @@ export function parseCliArguments(argv) {
118
137
  return parsed;
119
138
  }
120
139
  export function formatCliHelp(command) {
140
+ const defaultTargetLabel = formatBuildTargetDisplayList(appRouterBuildTargetMetadata.defaultTargets);
141
+ const allTargetValues = formatBuildTargetValueList(appRouterBuildTargetMetadata.allTargets);
121
142
  if (command === "build") {
122
143
  return [
123
144
  "Usage: mreact-router build [appDir] [options]",
@@ -126,9 +147,13 @@ export function formatCliHelp(command) {
126
147
  "",
127
148
  "Options:",
128
149
  " --target=node|cloudflare|aws-lambda|all",
129
- " Select build artifacts. Defaults to node. aws-lambda writes .mreact/aws-lambda/mreact-handler.mjs and .mreact/server/import-policy.json.",
150
+ ` Select build artifacts. Defaults to ${defaultTargetLabel.toLowerCase()}. all selects ${allTargetValues}. aws-lambda writes .mreact/aws-lambda/mreact-handler.mjs and .mreact/server/import-policy.json.`,
130
151
  " --client-source-maps=none|hidden",
131
152
  " Control production client source map output.",
153
+ " --aws-lambda-preload=middleware|hot-route-requests|all|none",
154
+ " Select generated Lambda initialization preload. Defaults to middleware.",
155
+ " --aws-lambda-preload-routes=/,/login",
156
+ " Select routes for hot-route-requests initialization preload.",
132
157
  " -h, --help",
133
158
  " Show this help message.",
134
159
  "",
@@ -136,6 +161,7 @@ export function formatCliHelp(command) {
136
161
  " mreact-router build --target=node",
137
162
  " mreact-router build --target=cloudflare",
138
163
  " mreact-router build --target=aws-lambda",
164
+ " mreact-router build --target=all",
139
165
  ].join("\n");
140
166
  }
141
167
  if (command === "package") {
@@ -155,6 +181,10 @@ export function formatCliHelp(command) {
155
181
  " For aws-lambda only, skip the production node_modules check when a later deploy step installs dependencies into the package directory.",
156
182
  " --handler <entry>",
157
183
  " For aws-lambda only, bundle a custom handler entry into mreact-handler.mjs. App-local extensionless TypeScript imports are bundled; package imports stay external.",
184
+ " --aws-lambda-preload=middleware|hot-route-requests|all|none",
185
+ " Override generated Lambda initialization preload. Omission preserves the build policy; legacy output without policy metadata falls back to middleware.",
186
+ " --aws-lambda-preload-routes=/,/login",
187
+ " Select routes for hot-route-requests initialization preload.",
158
188
  " -h, --help Show this help message.",
159
189
  "",
160
190
  "Examples:",
@@ -208,7 +238,7 @@ export function formatCliHelp(command) {
208
238
  "",
209
239
  "Commands:",
210
240
  " dev [appDir] Start the development server.",
211
- " build [appDir] Build Node and Cloudflare artifacts by default.",
241
+ ` build [appDir] Build ${defaultTargetLabel} artifacts by default.`,
212
242
  " build --target=aws-lambda Build Lambda artifacts including generated handler and import policy.",
213
243
  " start [outDir] Serve built Node output.",
214
244
  " package aws-lambda --from .mreact --out .lambda",
@@ -226,6 +256,7 @@ export function formatCliHelp(command) {
226
256
  "Examples:",
227
257
  " mreact-router build --target=cloudflare",
228
258
  " mreact-router build --target=aws-lambda",
259
+ " mreact-router build --target=all",
229
260
  " mreact-router package aws-lambda --from .mreact --out .lambda",
230
261
  " mreact-router build --help",
231
262
  ].join("\n");
@@ -234,7 +265,20 @@ export function buildTargetsFromCliTarget(target) {
234
265
  if (target === undefined) {
235
266
  return undefined;
236
267
  }
237
- return target === "all" ? ["node", "cloudflare", "aws-lambda"] : [target];
268
+ return target === "all" ? appRouterBuildTargetMetadata.allTargets : [target];
269
+ }
270
+ function formatBuildTargetDisplayList(targets) {
271
+ return targets.map(formatBuildTargetDisplayName).join(", ");
272
+ }
273
+ function formatBuildTargetDisplayName(target) {
274
+ if (target === "aws-lambda")
275
+ return "AWS Lambda";
276
+ return target[0]?.toUpperCase() + target.slice(1);
277
+ }
278
+ function formatBuildTargetValueList(targets) {
279
+ if (targets.length < 2)
280
+ return targets[0] ?? "";
281
+ return `${targets.slice(0, -1).join(", ")}, and ${targets.at(-1)}`;
238
282
  }
239
283
  export function resolveCliRequestLogMode(flagValue, env) {
240
284
  if (flagValue !== undefined) {
@@ -325,6 +369,22 @@ function parseCliClientSourceMapMode(value) {
325
369
  }
326
370
  throw new Error(`Unsupported client source map mode ${JSON.stringify(value)} for --client-source-maps. Expected "none", "hidden", or "linked".`);
327
371
  }
372
+ function parseCliAwsLambdaPreloadMode(value) {
373
+ if (value === "all" ||
374
+ value === "hot-route-requests" ||
375
+ value === "middleware" ||
376
+ value === "none") {
377
+ return value;
378
+ }
379
+ throw new Error(`Unsupported aws-lambda-preload ${JSON.stringify(value)}. Expected "middleware", "hot-route-requests", "all", or "none".`);
380
+ }
381
+ function parseCliAwsLambdaPreloadRoutes(value) {
382
+ const routes = value.split(",").filter((route) => route.startsWith("/"));
383
+ if (routes.length === 0 || routes.join(",") !== value) {
384
+ throw new Error("aws-lambda-preload-routes must be a comma-separated list of absolute routes.");
385
+ }
386
+ return routes;
387
+ }
328
388
  function readOptionValue(values, index, name) {
329
389
  const value = values[index + 1];
330
390
  if (value === undefined || value.startsWith("-")) {
@@ -1 +1 @@
1
- {"version":3,"file":"cli-options.js","sourceRoot":"","sources":["../src/cli-options.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AppRouterLogger, AppRouterLogEvent } from \"./logger.js\";\nimport type {\n AppRouterBuildTarget,\n AppRouterClientSourceMapMode,\n} from \"./config.js\";\nimport type { RequestHostPolicy } from \"./serve.js\";\n\nexport type CliRequestLogMode = \"requests\";\nexport type CliBuildTarget = AppRouterBuildTarget | \"all\";\n\nexport interface ParsedCliArguments {\n clientSourceMaps?: AppRouterClientSourceMapMode | undefined;\n command: string;\n allowedHosts?: readonly string[] | undefined;\n from?: string | undefined;\n handler?: string | undefined;\n help?: boolean | undefined;\n host?: string | undefined;\n hostPolicy?: RequestHostPolicy | undefined;\n log?: CliRequestLogMode | undefined;\n out?: string | undefined;\n port?: number | undefined;\n routeArg?: string | undefined;\n skipRuntimeDependencyCheck?: boolean | undefined;\n target?: CliBuildTarget | undefined;\n}\n\nexport function parseCliArguments(argv: readonly string[]): ParsedCliArguments {\n const first = argv[0];\n const rootHelp = first === \"--help\" || first === \"-h\";\n const command = rootHelp ? \"help\" : first === undefined || first.startsWith(\"-\") ? \"dev\" : first;\n const parsed: ParsedCliArguments = rootHelp ? { command, help: true } : { command };\n const startIndex = rootHelp || command === first ? 1 : 0;\n\n for (let index = startIndex; index < argv.length; index += 1) {\n const value = argv[index];\n\n if (value === undefined) {\n continue;\n }\n\n if (value === \"--help\" || value === \"-h\") {\n parsed.help = true;\n continue;\n }\n\n if (value === \"--log\") {\n parsed.log = parseCliRequestLogMode(readOptionValue(argv, index, \"log\"));\n index += 1;\n continue;\n }\n\n if (value === \"--port\") {\n parsed.port = parseCliPort(readOptionValue(argv, index, \"port\"));\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--port=\")) {\n parsed.port = parseCliPort(value.slice(\"--port=\".length));\n continue;\n }\n\n if (value === \"--host\") {\n parsed.host = readOptionValue(argv, index, \"host\");\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--host=\")) {\n parsed.host = value.slice(\"--host=\".length);\n continue;\n }\n\n if (value === \"--host-policy\") {\n parsed.hostPolicy = parseCliHostPolicy(readOptionValue(argv, index, \"host-policy\"));\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--host-policy=\")) {\n parsed.hostPolicy = parseCliHostPolicy(value.slice(\"--host-policy=\".length));\n continue;\n }\n\n if (value === \"--allowed-hosts\") {\n parsed.allowedHosts = parseCliAllowedHosts(readOptionValue(argv, index, \"allowed-hosts\"));\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--allowed-hosts=\")) {\n parsed.allowedHosts = parseCliAllowedHosts(value.slice(\"--allowed-hosts=\".length));\n continue;\n }\n\n if (value === \"--from\") {\n parsed.from = readOptionValue(argv, index, \"from\");\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--from=\")) {\n parsed.from = value.slice(\"--from=\".length);\n continue;\n }\n\n if (value === \"--out\") {\n parsed.out = readOptionValue(argv, index, \"out\");\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--out=\")) {\n parsed.out = value.slice(\"--out=\".length);\n continue;\n }\n\n if (value === \"--skip-runtime-dependency-check\") {\n parsed.skipRuntimeDependencyCheck = true;\n continue;\n }\n\n if (value === \"--handler\") {\n parsed.handler = readOptionValue(argv, index, \"handler\");\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--handler=\")) {\n parsed.handler = value.slice(\"--handler=\".length);\n continue;\n }\n\n if (value.startsWith(\"--log=\")) {\n parsed.log = parseCliRequestLogMode(value.slice(\"--log=\".length));\n continue;\n }\n\n if (value === \"--target\") {\n parsed.target = parseCliBuildTarget(readOptionValue(argv, index, \"target\"));\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--target=\")) {\n parsed.target = parseCliBuildTarget(value.slice(\"--target=\".length));\n continue;\n }\n\n if (value === \"--client-source-maps\") {\n parsed.clientSourceMaps = parseCliClientSourceMapMode(\n readOptionValue(argv, index, \"client-source-maps\"),\n );\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--client-source-maps=\")) {\n parsed.clientSourceMaps = parseCliClientSourceMapMode(\n value.slice(\"--client-source-maps=\".length),\n );\n continue;\n }\n\n if (value.startsWith(\"-\")) {\n throw new Error(`Unknown option ${value}`);\n }\n\n if (parsed.routeArg !== undefined) {\n throw new Error(`Unexpected argument ${value}`);\n }\n\n parsed.routeArg = value;\n }\n\n return parsed;\n}\n\nexport function formatCliHelp(command?: string | undefined): string {\n if (command === \"build\") {\n return [\n \"Usage: mreact-router build [appDir] [options]\",\n \"\",\n \"Build an mreact app router project.\",\n \"\",\n \"Options:\",\n \" --target=node|cloudflare|aws-lambda|all\",\n \" Select build artifacts. Defaults to node. aws-lambda writes .mreact/aws-lambda/mreact-handler.mjs and .mreact/server/import-policy.json.\",\n \" --client-source-maps=none|hidden\",\n \" Control production client source map output.\",\n \" -h, --help\",\n \" Show this help message.\",\n \"\",\n \"Examples:\",\n \" mreact-router build --target=node\",\n \" mreact-router build --target=cloudflare\",\n \" mreact-router build --target=aws-lambda\",\n ].join(\"\\n\");\n }\n\n if (command === \"package\") {\n return [\n \"Usage: mreact-router package <target> [options]\",\n \"\",\n \"Package generated build output into a deployable artifact directory.\",\n \"\",\n \"Targets:\",\n \" aws-lambda Minimal AWS Lambda asset directory.\",\n \" cloudflare-pages Cloudflare Pages advanced mode output with _worker.js.\",\n \"\",\n \"Options:\",\n \" --from <dir> Build output directory. Default: .mreact\",\n \" --out <dir> Output directory. Defaults to .lambda for aws-lambda and .mreact/pages for cloudflare-pages.\",\n \" --skip-runtime-dependency-check\",\n \" For aws-lambda only, skip the production node_modules check when a later deploy step installs dependencies into the package directory.\",\n \" --handler <entry>\",\n \" For aws-lambda only, bundle a custom handler entry into mreact-handler.mjs. App-local extensionless TypeScript imports are bundled; package imports stay external.\",\n \" -h, --help Show this help message.\",\n \"\",\n \"Examples:\",\n \" mreact-router package aws-lambda --from .mreact --out .lambda\",\n \" mreact-router package cloudflare-pages --from .mreact --out .mreact/pages\",\n ].join(\"\\n\");\n }\n\n if (command === \"start\") {\n return [\n \"Usage: mreact-router start [outDir] [options]\",\n \"\",\n \"Serve built mreact app router output with the Node adapter.\",\n \"\",\n \"Options:\",\n \" --host <host> Bind address. Default: 127.0.0.1. Use 0.0.0.0 inside containers behind explicit port publishing or a reverse proxy.\",\n \" --host-policy=strict|trusted-proxy\",\n \" Control Host header trust for request origin reconstruction.\",\n \" --allowed-hosts <host[,host...]>\",\n \" Exact Host header allow-list for public deployments.\",\n \" --log=requests Print request summaries.\",\n \" -h, --help Show this help message.\",\n \"\",\n \"Environment:\",\n \" HOST Bind address when --host is not set.\",\n \" MREACT_ROUTER_HOST_POLICY\",\n \" Host header trust policy when --host-policy is not set.\",\n \" MREACT_ROUTER_ALLOWED_HOSTS\",\n \" Comma-separated Host header allow-list when --allowed-hosts is not set.\",\n \" PORT TCP port. Default: 3001.\",\n ].join(\"\\n\");\n }\n\n if (command === \"dev\") {\n return [\n \"Usage: mreact-router dev [appDir] [options]\",\n \"\",\n \"Start the mreact app router development server.\",\n \"\",\n \"Options:\",\n \" --host <host> Bind address. Default: 127.0.0.1. Use 0.0.0.0 for LAN or device testing.\",\n \" --port <port> TCP port. Overrides PORT and vite.config.ts server.port.\",\n \" --log=requests Print request summaries.\",\n \" -h, --help Show this help message.\",\n \"\",\n \"Environment:\",\n \" HOST Bind address when --host is not set.\",\n \" PORT TCP port when --port is not set.\",\n ].join(\"\\n\");\n }\n\n return [\n \"Usage: mreact-router <command> [options]\",\n \"\",\n \"Commands:\",\n \" dev [appDir] Start the development server.\",\n \" build [appDir] Build Node and Cloudflare artifacts by default.\",\n \" build --target=aws-lambda Build Lambda artifacts including generated handler and import policy.\",\n \" start [outDir] Serve built Node output.\",\n \" package aws-lambda --from .mreact --out .lambda\",\n \" Package a minimal AWS Lambda asset directory.\",\n \" package aws-lambda --handler lambda/mreact-handler.ts\",\n \" Bundle a custom Lambda handler with app-local server imports.\",\n \" package cloudflare-pages --from .mreact --out .mreact/pages\",\n \" Package Cloudflare Pages advanced mode output.\",\n \" help [command] Show help.\",\n \"\",\n \"Options:\",\n \" -h, --help Show this help message.\",\n \" --log=requests Print request summaries for dev/start.\",\n \"\",\n \"Examples:\",\n \" mreact-router build --target=cloudflare\",\n \" mreact-router build --target=aws-lambda\",\n \" mreact-router package aws-lambda --from .mreact --out .lambda\",\n \" mreact-router build --help\",\n ].join(\"\\n\");\n}\n\nexport function buildTargetsFromCliTarget(\n target: CliBuildTarget | undefined,\n): readonly AppRouterBuildTarget[] | undefined {\n if (target === undefined) {\n return undefined;\n }\n\n return target === \"all\" ? [\"node\", \"cloudflare\", \"aws-lambda\"] : [target];\n}\n\nexport function resolveCliRequestLogMode(\n flagValue: CliRequestLogMode | undefined,\n env: { MREACT_ROUTER_LOG?: string | undefined },\n): CliRequestLogMode | undefined {\n if (flagValue !== undefined) {\n return flagValue;\n }\n\n const envValue = env.MREACT_ROUTER_LOG;\n if (envValue === undefined || envValue === \"\") {\n return undefined;\n }\n\n return parseCliRequestLogMode(envValue);\n}\n\nexport function resolveCliHost(\n flagValue: string | undefined,\n env: { HOST?: string | undefined },\n): string {\n if (flagValue !== undefined && flagValue !== \"\") {\n return flagValue;\n }\n\n const envValue = env.HOST;\n return envValue === undefined || envValue === \"\" ? \"127.0.0.1\" : envValue;\n}\n\nexport function resolveCliDevPort(\n flagValue: number | undefined,\n env: { PORT?: string | undefined },\n viteConfigPort: number | undefined,\n): number | undefined {\n if (flagValue !== undefined) {\n return flagValue;\n }\n\n const envValue = env.PORT;\n return envValue === undefined || envValue === \"\" ? viteConfigPort : parseCliPort(envValue);\n}\n\nexport function resolveCliHostPolicy(\n flagValue: RequestHostPolicy | undefined,\n env: { MREACT_ROUTER_HOST_POLICY?: string | undefined },\n): RequestHostPolicy | undefined {\n if (flagValue !== undefined) {\n return flagValue;\n }\n\n const envValue = env.MREACT_ROUTER_HOST_POLICY;\n return envValue === undefined || envValue === \"\" ? undefined : parseCliHostPolicy(envValue);\n}\n\nexport function resolveCliAllowedHosts(\n flagValue: readonly string[] | undefined,\n env: { MREACT_ROUTER_ALLOWED_HOSTS?: string | undefined },\n): readonly string[] | undefined {\n if (flagValue !== undefined) {\n return flagValue;\n }\n\n const envValue = env.MREACT_ROUTER_ALLOWED_HOSTS;\n return envValue === undefined || envValue === \"\" ? undefined : parseCliAllowedHosts(envValue);\n}\n\nexport function createCliRequestLogger(): AppRouterLogger {\n return {\n error(event) {\n if (event.type === \"router:request:error\") {\n console.error(formatCliRequestLogEvent(event));\n }\n },\n info(event) {\n if (event.type === \"router:request:end\") {\n console.log(formatCliRequestLogEvent(event));\n }\n },\n };\n}\n\nfunction parseCliRequestLogMode(value: string): CliRequestLogMode {\n if (value === \"requests\") {\n return value;\n }\n\n throw new Error(`Unsupported log mode ${JSON.stringify(value)}. Expected \"requests\".`);\n}\n\nfunction parseCliPort(value: string): number {\n const port = Number(value);\n\n if (Number.isInteger(port) && port >= 0 && port <= 65535) {\n return port;\n }\n\n throw new Error(`Unsupported port ${JSON.stringify(value)}. Expected an integer from 0 to 65535.`);\n}\n\nfunction parseCliHostPolicy(value: string): RequestHostPolicy {\n if (value === \"strict\" || value === \"trusted-proxy\") {\n return value;\n }\n\n throw new Error(\n `Unsupported host policy ${JSON.stringify(value)}. Expected \"strict\" or \"trusted-proxy\".`,\n );\n}\n\nfunction parseCliAllowedHosts(value: string): readonly string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry !== \"\");\n}\n\nfunction parseCliBuildTarget(value: string): CliBuildTarget {\n if (value === \"node\" || value === \"cloudflare\" || value === \"aws-lambda\" || value === \"all\") {\n return value;\n }\n\n throw new Error(\n `Unsupported build target ${JSON.stringify(value)}. Expected \"node\", \"cloudflare\", \"aws-lambda\", or \"all\".`,\n );\n}\n\nfunction parseCliClientSourceMapMode(value: string): AppRouterClientSourceMapMode {\n if (value === \"none\" || value === \"hidden\" || value === \"linked\") {\n return value;\n }\n\n throw new Error(\n `Unsupported client source map mode ${JSON.stringify(value)} for --client-source-maps. Expected \"none\", \"hidden\", or \"linked\".`,\n );\n}\n\nfunction readOptionValue(values: readonly string[], index: number, name: string): string {\n const value = values[index + 1];\n\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`Missing value for --${name}`);\n }\n\n return value;\n}\n\nfunction formatCliRequestLogEvent(event: AppRouterLogEvent): string {\n if (event.type === \"router:request:error\") {\n return `[mreact] ${event.method} ${event.path} error ${event.durationMs}ms ${event.runtime} ${event.error.name}: ${event.error.message}`;\n }\n\n if (event.type === \"router:request:end\") {\n return `[mreact] ${event.method} ${event.path} ${event.status} ${event.durationMs}ms ${event.runtime}`;\n }\n\n if (event.type === \"router:request:timing\") {\n return `[mreact] ${event.method} ${event.path} ${event.status} ${event.durationMs}ms ${event.runtime}`;\n }\n\n if (event.type === \"router:render:timing\") {\n return `[mreact] ${event.method} ${event.path} ${event.status} render timing`;\n }\n\n if (event.type === \"router:csp:inline-nonce-warning\") {\n return `[mreact] ${event.path} CSP ${event.directive} will block inline <${event.tag}> without a matching nonce`;\n }\n\n return `[mreact] ${event.method} ${event.path} ${event.runtime}`;\n}\n"]}
1
+ {"version":3,"file":"cli-options.js","sourceRoot":"","sources":["../src/cli-options.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AppRouterLogger, AppRouterLogEvent } from \"./logger.js\";\nimport {\n appRouterBuildTargetMetadata,\n type AppRouterBuildTarget,\n type AppRouterClientSourceMapMode,\n} from \"./config.js\";\nimport type { RequestHostPolicy } from \"./serve.js\";\nimport type { AwsLambdaGeneratedHandlerPreloadMode } from \"./build.js\";\n\nexport type CliRequestLogMode = \"requests\";\nexport type CliBuildTarget = AppRouterBuildTarget | \"all\";\n\nexport interface ParsedCliArguments {\n awsLambdaPreload?: AwsLambdaGeneratedHandlerPreloadMode | undefined;\n awsLambdaPreloadRoutes?: readonly string[] | undefined;\n clientSourceMaps?: AppRouterClientSourceMapMode | undefined;\n command: string;\n allowedHosts?: readonly string[] | undefined;\n from?: string | undefined;\n handler?: string | undefined;\n help?: boolean | undefined;\n host?: string | undefined;\n hostPolicy?: RequestHostPolicy | undefined;\n log?: CliRequestLogMode | undefined;\n out?: string | undefined;\n port?: number | undefined;\n routeArg?: string | undefined;\n skipRuntimeDependencyCheck?: boolean | undefined;\n target?: CliBuildTarget | undefined;\n}\n\nexport function parseCliArguments(argv: readonly string[]): ParsedCliArguments {\n const first = argv[0];\n const rootHelp = first === \"--help\" || first === \"-h\";\n const command = rootHelp ? \"help\" : first === undefined || first.startsWith(\"-\") ? \"dev\" : first;\n const parsed: ParsedCliArguments = rootHelp ? { command, help: true } : { command };\n const startIndex = rootHelp || command === first ? 1 : 0;\n\n for (let index = startIndex; index < argv.length; index += 1) {\n const value = argv[index];\n\n if (value === undefined) {\n continue;\n }\n\n if (value === \"--help\" || value === \"-h\") {\n parsed.help = true;\n continue;\n }\n\n if (value === \"--log\") {\n parsed.log = parseCliRequestLogMode(readOptionValue(argv, index, \"log\"));\n index += 1;\n continue;\n }\n\n if (value === \"--port\") {\n parsed.port = parseCliPort(readOptionValue(argv, index, \"port\"));\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--port=\")) {\n parsed.port = parseCliPort(value.slice(\"--port=\".length));\n continue;\n }\n\n if (value === \"--host\") {\n parsed.host = readOptionValue(argv, index, \"host\");\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--host=\")) {\n parsed.host = value.slice(\"--host=\".length);\n continue;\n }\n\n if (value === \"--host-policy\") {\n parsed.hostPolicy = parseCliHostPolicy(readOptionValue(argv, index, \"host-policy\"));\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--host-policy=\")) {\n parsed.hostPolicy = parseCliHostPolicy(value.slice(\"--host-policy=\".length));\n continue;\n }\n\n if (value === \"--allowed-hosts\") {\n parsed.allowedHosts = parseCliAllowedHosts(readOptionValue(argv, index, \"allowed-hosts\"));\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--allowed-hosts=\")) {\n parsed.allowedHosts = parseCliAllowedHosts(value.slice(\"--allowed-hosts=\".length));\n continue;\n }\n\n if (value === \"--from\") {\n parsed.from = readOptionValue(argv, index, \"from\");\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--from=\")) {\n parsed.from = value.slice(\"--from=\".length);\n continue;\n }\n\n if (value === \"--out\") {\n parsed.out = readOptionValue(argv, index, \"out\");\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--out=\")) {\n parsed.out = value.slice(\"--out=\".length);\n continue;\n }\n\n if (value === \"--skip-runtime-dependency-check\") {\n parsed.skipRuntimeDependencyCheck = true;\n continue;\n }\n\n if (value === \"--handler\") {\n parsed.handler = readOptionValue(argv, index, \"handler\");\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--handler=\")) {\n parsed.handler = value.slice(\"--handler=\".length);\n continue;\n }\n\n if (value.startsWith(\"--log=\")) {\n parsed.log = parseCliRequestLogMode(value.slice(\"--log=\".length));\n continue;\n }\n\n if (value === \"--target\") {\n parsed.target = parseCliBuildTarget(readOptionValue(argv, index, \"target\"));\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--target=\")) {\n parsed.target = parseCliBuildTarget(value.slice(\"--target=\".length));\n continue;\n }\n\n if (value === \"--client-source-maps\") {\n parsed.clientSourceMaps = parseCliClientSourceMapMode(\n readOptionValue(argv, index, \"client-source-maps\"),\n );\n index += 1;\n continue;\n }\n\n if (value === \"--aws-lambda-preload\") {\n parsed.awsLambdaPreload = parseCliAwsLambdaPreloadMode(\n readOptionValue(argv, index, \"aws-lambda-preload\"),\n );\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--aws-lambda-preload=\")) {\n parsed.awsLambdaPreload = parseCliAwsLambdaPreloadMode(\n value.slice(\"--aws-lambda-preload=\".length),\n );\n continue;\n }\n\n if (value === \"--aws-lambda-preload-routes\") {\n parsed.awsLambdaPreloadRoutes = parseCliAwsLambdaPreloadRoutes(\n readOptionValue(argv, index, \"aws-lambda-preload-routes\"),\n );\n index += 1;\n continue;\n }\n\n if (value.startsWith(\"--aws-lambda-preload-routes=\")) {\n parsed.awsLambdaPreloadRoutes = parseCliAwsLambdaPreloadRoutes(\n value.slice(\"--aws-lambda-preload-routes=\".length),\n );\n continue;\n }\n\n if (value.startsWith(\"--client-source-maps=\")) {\n parsed.clientSourceMaps = parseCliClientSourceMapMode(\n value.slice(\"--client-source-maps=\".length),\n );\n continue;\n }\n\n if (value.startsWith(\"-\")) {\n throw new Error(`Unknown option ${value}`);\n }\n\n if (parsed.routeArg !== undefined) {\n throw new Error(`Unexpected argument ${value}`);\n }\n\n parsed.routeArg = value;\n }\n\n return parsed;\n}\n\nexport function formatCliHelp(command?: string | undefined): string {\n const defaultTargetLabel = formatBuildTargetDisplayList(\n appRouterBuildTargetMetadata.defaultTargets,\n );\n const allTargetValues = formatBuildTargetValueList(appRouterBuildTargetMetadata.allTargets);\n\n if (command === \"build\") {\n return [\n \"Usage: mreact-router build [appDir] [options]\",\n \"\",\n \"Build an mreact app router project.\",\n \"\",\n \"Options:\",\n \" --target=node|cloudflare|aws-lambda|all\",\n ` Select build artifacts. Defaults to ${defaultTargetLabel.toLowerCase()}. all selects ${allTargetValues}. aws-lambda writes .mreact/aws-lambda/mreact-handler.mjs and .mreact/server/import-policy.json.`,\n \" --client-source-maps=none|hidden\",\n \" Control production client source map output.\",\n \" --aws-lambda-preload=middleware|hot-route-requests|all|none\",\n \" Select generated Lambda initialization preload. Defaults to middleware.\",\n \" --aws-lambda-preload-routes=/,/login\",\n \" Select routes for hot-route-requests initialization preload.\",\n \" -h, --help\",\n \" Show this help message.\",\n \"\",\n \"Examples:\",\n \" mreact-router build --target=node\",\n \" mreact-router build --target=cloudflare\",\n \" mreact-router build --target=aws-lambda\",\n \" mreact-router build --target=all\",\n ].join(\"\\n\");\n }\n\n if (command === \"package\") {\n return [\n \"Usage: mreact-router package <target> [options]\",\n \"\",\n \"Package generated build output into a deployable artifact directory.\",\n \"\",\n \"Targets:\",\n \" aws-lambda Minimal AWS Lambda asset directory.\",\n \" cloudflare-pages Cloudflare Pages advanced mode output with _worker.js.\",\n \"\",\n \"Options:\",\n \" --from <dir> Build output directory. Default: .mreact\",\n \" --out <dir> Output directory. Defaults to .lambda for aws-lambda and .mreact/pages for cloudflare-pages.\",\n \" --skip-runtime-dependency-check\",\n \" For aws-lambda only, skip the production node_modules check when a later deploy step installs dependencies into the package directory.\",\n \" --handler <entry>\",\n \" For aws-lambda only, bundle a custom handler entry into mreact-handler.mjs. App-local extensionless TypeScript imports are bundled; package imports stay external.\",\n \" --aws-lambda-preload=middleware|hot-route-requests|all|none\",\n \" Override generated Lambda initialization preload. Omission preserves the build policy; legacy output without policy metadata falls back to middleware.\",\n \" --aws-lambda-preload-routes=/,/login\",\n \" Select routes for hot-route-requests initialization preload.\",\n \" -h, --help Show this help message.\",\n \"\",\n \"Examples:\",\n \" mreact-router package aws-lambda --from .mreact --out .lambda\",\n \" mreact-router package cloudflare-pages --from .mreact --out .mreact/pages\",\n ].join(\"\\n\");\n }\n\n if (command === \"start\") {\n return [\n \"Usage: mreact-router start [outDir] [options]\",\n \"\",\n \"Serve built mreact app router output with the Node adapter.\",\n \"\",\n \"Options:\",\n \" --host <host> Bind address. Default: 127.0.0.1. Use 0.0.0.0 inside containers behind explicit port publishing or a reverse proxy.\",\n \" --host-policy=strict|trusted-proxy\",\n \" Control Host header trust for request origin reconstruction.\",\n \" --allowed-hosts <host[,host...]>\",\n \" Exact Host header allow-list for public deployments.\",\n \" --log=requests Print request summaries.\",\n \" -h, --help Show this help message.\",\n \"\",\n \"Environment:\",\n \" HOST Bind address when --host is not set.\",\n \" MREACT_ROUTER_HOST_POLICY\",\n \" Host header trust policy when --host-policy is not set.\",\n \" MREACT_ROUTER_ALLOWED_HOSTS\",\n \" Comma-separated Host header allow-list when --allowed-hosts is not set.\",\n \" PORT TCP port. Default: 3001.\",\n ].join(\"\\n\");\n }\n\n if (command === \"dev\") {\n return [\n \"Usage: mreact-router dev [appDir] [options]\",\n \"\",\n \"Start the mreact app router development server.\",\n \"\",\n \"Options:\",\n \" --host <host> Bind address. Default: 127.0.0.1. Use 0.0.0.0 for LAN or device testing.\",\n \" --port <port> TCP port. Overrides PORT and vite.config.ts server.port.\",\n \" --log=requests Print request summaries.\",\n \" -h, --help Show this help message.\",\n \"\",\n \"Environment:\",\n \" HOST Bind address when --host is not set.\",\n \" PORT TCP port when --port is not set.\",\n ].join(\"\\n\");\n }\n\n return [\n \"Usage: mreact-router <command> [options]\",\n \"\",\n \"Commands:\",\n \" dev [appDir] Start the development server.\",\n ` build [appDir] Build ${defaultTargetLabel} artifacts by default.`,\n \" build --target=aws-lambda Build Lambda artifacts including generated handler and import policy.\",\n \" start [outDir] Serve built Node output.\",\n \" package aws-lambda --from .mreact --out .lambda\",\n \" Package a minimal AWS Lambda asset directory.\",\n \" package aws-lambda --handler lambda/mreact-handler.ts\",\n \" Bundle a custom Lambda handler with app-local server imports.\",\n \" package cloudflare-pages --from .mreact --out .mreact/pages\",\n \" Package Cloudflare Pages advanced mode output.\",\n \" help [command] Show help.\",\n \"\",\n \"Options:\",\n \" -h, --help Show this help message.\",\n \" --log=requests Print request summaries for dev/start.\",\n \"\",\n \"Examples:\",\n \" mreact-router build --target=cloudflare\",\n \" mreact-router build --target=aws-lambda\",\n \" mreact-router build --target=all\",\n \" mreact-router package aws-lambda --from .mreact --out .lambda\",\n \" mreact-router build --help\",\n ].join(\"\\n\");\n}\n\nexport function buildTargetsFromCliTarget(\n target: CliBuildTarget | undefined,\n): readonly AppRouterBuildTarget[] | undefined {\n if (target === undefined) {\n return undefined;\n }\n\n return target === \"all\" ? appRouterBuildTargetMetadata.allTargets : [target];\n}\n\nfunction formatBuildTargetDisplayList(targets: readonly AppRouterBuildTarget[]): string {\n return targets.map(formatBuildTargetDisplayName).join(\", \");\n}\n\nfunction formatBuildTargetDisplayName(target: AppRouterBuildTarget): string {\n if (target === \"aws-lambda\") return \"AWS Lambda\";\n return target[0]?.toUpperCase() + target.slice(1);\n}\n\nfunction formatBuildTargetValueList(targets: readonly AppRouterBuildTarget[]): string {\n if (targets.length < 2) return targets[0] ?? \"\";\n return `${targets.slice(0, -1).join(\", \")}, and ${targets.at(-1)}`;\n}\n\nexport function resolveCliRequestLogMode(\n flagValue: CliRequestLogMode | undefined,\n env: { MREACT_ROUTER_LOG?: string | undefined },\n): CliRequestLogMode | undefined {\n if (flagValue !== undefined) {\n return flagValue;\n }\n\n const envValue = env.MREACT_ROUTER_LOG;\n if (envValue === undefined || envValue === \"\") {\n return undefined;\n }\n\n return parseCliRequestLogMode(envValue);\n}\n\nexport function resolveCliHost(\n flagValue: string | undefined,\n env: { HOST?: string | undefined },\n): string {\n if (flagValue !== undefined && flagValue !== \"\") {\n return flagValue;\n }\n\n const envValue = env.HOST;\n return envValue === undefined || envValue === \"\" ? \"127.0.0.1\" : envValue;\n}\n\nexport function resolveCliDevPort(\n flagValue: number | undefined,\n env: { PORT?: string | undefined },\n viteConfigPort: number | undefined,\n): number | undefined {\n if (flagValue !== undefined) {\n return flagValue;\n }\n\n const envValue = env.PORT;\n return envValue === undefined || envValue === \"\" ? viteConfigPort : parseCliPort(envValue);\n}\n\nexport function resolveCliHostPolicy(\n flagValue: RequestHostPolicy | undefined,\n env: { MREACT_ROUTER_HOST_POLICY?: string | undefined },\n): RequestHostPolicy | undefined {\n if (flagValue !== undefined) {\n return flagValue;\n }\n\n const envValue = env.MREACT_ROUTER_HOST_POLICY;\n return envValue === undefined || envValue === \"\" ? undefined : parseCliHostPolicy(envValue);\n}\n\nexport function resolveCliAllowedHosts(\n flagValue: readonly string[] | undefined,\n env: { MREACT_ROUTER_ALLOWED_HOSTS?: string | undefined },\n): readonly string[] | undefined {\n if (flagValue !== undefined) {\n return flagValue;\n }\n\n const envValue = env.MREACT_ROUTER_ALLOWED_HOSTS;\n return envValue === undefined || envValue === \"\" ? undefined : parseCliAllowedHosts(envValue);\n}\n\nexport function createCliRequestLogger(): AppRouterLogger {\n return {\n error(event) {\n if (event.type === \"router:request:error\") {\n console.error(formatCliRequestLogEvent(event));\n }\n },\n info(event) {\n if (event.type === \"router:request:end\") {\n console.log(formatCliRequestLogEvent(event));\n }\n },\n };\n}\n\nfunction parseCliRequestLogMode(value: string): CliRequestLogMode {\n if (value === \"requests\") {\n return value;\n }\n\n throw new Error(`Unsupported log mode ${JSON.stringify(value)}. Expected \"requests\".`);\n}\n\nfunction parseCliPort(value: string): number {\n const port = Number(value);\n\n if (Number.isInteger(port) && port >= 0 && port <= 65535) {\n return port;\n }\n\n throw new Error(`Unsupported port ${JSON.stringify(value)}. Expected an integer from 0 to 65535.`);\n}\n\nfunction parseCliHostPolicy(value: string): RequestHostPolicy {\n if (value === \"strict\" || value === \"trusted-proxy\") {\n return value;\n }\n\n throw new Error(\n `Unsupported host policy ${JSON.stringify(value)}. Expected \"strict\" or \"trusted-proxy\".`,\n );\n}\n\nfunction parseCliAllowedHosts(value: string): readonly string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry !== \"\");\n}\n\nfunction parseCliBuildTarget(value: string): CliBuildTarget {\n if (value === \"node\" || value === \"cloudflare\" || value === \"aws-lambda\" || value === \"all\") {\n return value;\n }\n\n throw new Error(\n `Unsupported build target ${JSON.stringify(value)}. Expected \"node\", \"cloudflare\", \"aws-lambda\", or \"all\".`,\n );\n}\n\nfunction parseCliClientSourceMapMode(value: string): AppRouterClientSourceMapMode {\n if (value === \"none\" || value === \"hidden\" || value === \"linked\") {\n return value;\n }\n\n throw new Error(\n `Unsupported client source map mode ${JSON.stringify(value)} for --client-source-maps. Expected \"none\", \"hidden\", or \"linked\".`,\n );\n}\n\nfunction parseCliAwsLambdaPreloadMode(value: string): AwsLambdaGeneratedHandlerPreloadMode {\n if (\n value === \"all\" ||\n value === \"hot-route-requests\" ||\n value === \"middleware\" ||\n value === \"none\"\n ) {\n return value;\n }\n\n throw new Error(\n `Unsupported aws-lambda-preload ${JSON.stringify(value)}. Expected \"middleware\", \"hot-route-requests\", \"all\", or \"none\".`,\n );\n}\n\nfunction parseCliAwsLambdaPreloadRoutes(value: string): readonly string[] {\n const routes = value.split(\",\").filter((route) => route.startsWith(\"/\"));\n if (routes.length === 0 || routes.join(\",\") !== value) {\n throw new Error(\"aws-lambda-preload-routes must be a comma-separated list of absolute routes.\");\n }\n return routes;\n}\n\nfunction readOptionValue(values: readonly string[], index: number, name: string): string {\n const value = values[index + 1];\n\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`Missing value for --${name}`);\n }\n\n return value;\n}\n\nfunction formatCliRequestLogEvent(event: AppRouterLogEvent): string {\n if (event.type === \"router:request:error\") {\n return `[mreact] ${event.method} ${event.path} error ${event.durationMs}ms ${event.runtime} ${event.error.name}: ${event.error.message}`;\n }\n\n if (event.type === \"router:request:end\") {\n return `[mreact] ${event.method} ${event.path} ${event.status} ${event.durationMs}ms ${event.runtime}`;\n }\n\n if (event.type === \"router:request:timing\") {\n return `[mreact] ${event.method} ${event.path} ${event.status} ${event.durationMs}ms ${event.runtime}`;\n }\n\n if (event.type === \"router:render:timing\") {\n return `[mreact] ${event.method} ${event.path} ${event.status} render timing`;\n }\n\n if (event.type === \"router:csp:inline-nonce-warning\") {\n return `[mreact] ${event.path} CSP ${event.directive} will block inline <${event.tag}> without a matching nonce`;\n }\n\n return `[mreact] ${event.method} ${event.path} ${event.runtime}`;\n}\n"]}
package/dist/cli.js CHANGED
@@ -38,6 +38,12 @@ if (parsed !== undefined) {
38
38
  try {
39
39
  const result = await buildApp({
40
40
  ...loaded.project,
41
+ ...(parsed.awsLambdaPreload === undefined
42
+ ? {}
43
+ : { awsLambdaPreload: parsed.awsLambdaPreload }),
44
+ ...(parsed.awsLambdaPreloadRoutes === undefined
45
+ ? {}
46
+ : { awsLambdaPreloadRoutes: parsed.awsLambdaPreloadRoutes }),
41
47
  ...(parsed.clientSourceMaps === undefined
42
48
  ? {}
43
49
  : { clientSourceMaps: parsed.clientSourceMaps }),
@@ -60,6 +66,12 @@ if (parsed !== undefined) {
60
66
  else if (command === "package") {
61
67
  if (routeArg === "aws-lambda") {
62
68
  const manifest = await packageAwsLambdaArtifact({
69
+ ...(parsed.awsLambdaPreload === undefined
70
+ ? {}
71
+ : { awsLambdaPreload: parsed.awsLambdaPreload }),
72
+ ...(parsed.awsLambdaPreloadRoutes === undefined
73
+ ? {}
74
+ : { awsLambdaPreloadRoutes: parsed.awsLambdaPreloadRoutes }),
63
75
  fromDir: resolve(parsed.from ?? ".mreact"),
64
76
  ...(parsed.handler === undefined ? {} : { handlerEntry: resolve(parsed.handler) }),
65
77
  outDir: resolve(parsed.out ?? ".lambda"),