@reckona/mreact-router 0.0.1

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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -0
  3. package/dist/actions.d.ts +43 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +577 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/adapters/aws-lambda.d.ts +45 -0
  8. package/dist/adapters/aws-lambda.d.ts.map +1 -0
  9. package/dist/adapters/aws-lambda.js +168 -0
  10. package/dist/adapters/aws-lambda.js.map +1 -0
  11. package/dist/adapters/cloudflare.d.ts +94 -0
  12. package/dist/adapters/cloudflare.d.ts.map +1 -0
  13. package/dist/adapters/cloudflare.js +390 -0
  14. package/dist/adapters/cloudflare.js.map +1 -0
  15. package/dist/adapters/devtools.d.ts +4 -0
  16. package/dist/adapters/devtools.d.ts.map +1 -0
  17. package/dist/adapters/devtools.js +5 -0
  18. package/dist/adapters/devtools.js.map +1 -0
  19. package/dist/adapters/edge.d.ts +9 -0
  20. package/dist/adapters/edge.d.ts.map +1 -0
  21. package/dist/adapters/edge.js +53 -0
  22. package/dist/adapters/edge.js.map +1 -0
  23. package/dist/adapters/node.d.ts +26 -0
  24. package/dist/adapters/node.d.ts.map +1 -0
  25. package/dist/adapters/node.js +64 -0
  26. package/dist/adapters/node.js.map +1 -0
  27. package/dist/adapters/static.d.ts +10 -0
  28. package/dist/adapters/static.d.ts.map +1 -0
  29. package/dist/adapters/static.js +34 -0
  30. package/dist/adapters/static.js.map +1 -0
  31. package/dist/assets.d.ts +18 -0
  32. package/dist/assets.d.ts.map +1 -0
  33. package/dist/assets.js +67 -0
  34. package/dist/assets.js.map +1 -0
  35. package/dist/build.d.ts +36 -0
  36. package/dist/build.d.ts.map +1 -0
  37. package/dist/build.js +322 -0
  38. package/dist/build.js.map +1 -0
  39. package/dist/cache.d.ts +54 -0
  40. package/dist/cache.d.ts.map +1 -0
  41. package/dist/cache.js +221 -0
  42. package/dist/cache.js.map +1 -0
  43. package/dist/cli.d.ts +3 -0
  44. package/dist/cli.d.ts.map +1 -0
  45. package/dist/cli.js +37 -0
  46. package/dist/cli.js.map +1 -0
  47. package/dist/client.d.ts +105 -0
  48. package/dist/client.d.ts.map +1 -0
  49. package/dist/client.js +1268 -0
  50. package/dist/client.js.map +1 -0
  51. package/dist/config.d.ts +27 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +44 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/cookies.d.ts +14 -0
  56. package/dist/cookies.d.ts.map +1 -0
  57. package/dist/cookies.js +69 -0
  58. package/dist/cookies.js.map +1 -0
  59. package/dist/csp.d.ts +6 -0
  60. package/dist/csp.d.ts.map +1 -0
  61. package/dist/csp.js +70 -0
  62. package/dist/csp.js.map +1 -0
  63. package/dist/dev-server.d.ts +16 -0
  64. package/dist/dev-server.d.ts.map +1 -0
  65. package/dist/dev-server.js +103 -0
  66. package/dist/dev-server.js.map +1 -0
  67. package/dist/http.d.ts +23 -0
  68. package/dist/http.d.ts.map +1 -0
  69. package/dist/http.js +106 -0
  70. package/dist/http.js.map +1 -0
  71. package/dist/i18n.d.ts +15 -0
  72. package/dist/i18n.d.ts.map +1 -0
  73. package/dist/i18n.js +61 -0
  74. package/dist/i18n.js.map +1 -0
  75. package/dist/import-policy.d.ts +30 -0
  76. package/dist/import-policy.d.ts.map +1 -0
  77. package/dist/import-policy.js +105 -0
  78. package/dist/import-policy.js.map +1 -0
  79. package/dist/index.d.ts +60 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +34 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/logger.d.ts +47 -0
  84. package/dist/logger.d.ts.map +1 -0
  85. package/dist/logger.js +60 -0
  86. package/dist/logger.js.map +1 -0
  87. package/dist/module-runner.d.ts +9 -0
  88. package/dist/module-runner.d.ts.map +1 -0
  89. package/dist/module-runner.js +112 -0
  90. package/dist/module-runner.js.map +1 -0
  91. package/dist/native-escape.d.ts +2 -0
  92. package/dist/native-escape.d.ts.map +1 -0
  93. package/dist/native-escape.js +43 -0
  94. package/dist/native-escape.js.map +1 -0
  95. package/dist/native-route-matcher.d.ts +5 -0
  96. package/dist/native-route-matcher.d.ts.map +1 -0
  97. package/dist/native-route-matcher.js +91 -0
  98. package/dist/native-route-matcher.js.map +1 -0
  99. package/dist/navigation.d.ts +25 -0
  100. package/dist/navigation.d.ts.map +1 -0
  101. package/dist/navigation.js +125 -0
  102. package/dist/navigation.js.map +1 -0
  103. package/dist/prerender-store.d.ts +37 -0
  104. package/dist/prerender-store.d.ts.map +1 -0
  105. package/dist/prerender-store.js +158 -0
  106. package/dist/prerender-store.js.map +1 -0
  107. package/dist/render.d.ts +26 -0
  108. package/dist/render.d.ts.map +1 -0
  109. package/dist/render.js +1688 -0
  110. package/dist/render.js.map +1 -0
  111. package/dist/route-path.d.ts +2 -0
  112. package/dist/route-path.d.ts.map +1 -0
  113. package/dist/route-path.js +5 -0
  114. package/dist/route-path.js.map +1 -0
  115. package/dist/route-source.d.ts +9 -0
  116. package/dist/route-source.d.ts.map +1 -0
  117. package/dist/route-source.js +44 -0
  118. package/dist/route-source.js.map +1 -0
  119. package/dist/routes.d.ts +38 -0
  120. package/dist/routes.d.ts.map +1 -0
  121. package/dist/routes.js +168 -0
  122. package/dist/routes.js.map +1 -0
  123. package/dist/serve.d.ts +63 -0
  124. package/dist/serve.d.ts.map +1 -0
  125. package/dist/serve.js +445 -0
  126. package/dist/serve.js.map +1 -0
  127. package/dist/session.d.ts +25 -0
  128. package/dist/session.d.ts.map +1 -0
  129. package/dist/session.js +104 -0
  130. package/dist/session.js.map +1 -0
  131. package/dist/vite-config.d.ts +8 -0
  132. package/dist/vite-config.d.ts.map +1 -0
  133. package/dist/vite-config.js +17 -0
  134. package/dist/vite-config.js.map +1 -0
  135. package/dist/vite.d.ts +25 -0
  136. package/dist/vite.d.ts.map +1 -0
  137. package/dist/vite.js +150 -0
  138. package/dist/vite.js.map +1 -0
  139. package/package.json +91 -0
package/dist/serve.js ADDED
@@ -0,0 +1,445 @@
1
+ import { createServer } from "node:http";
2
+ import { createHash } from "node:crypto";
3
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
4
+ import { dirname, isAbsolute, join, normalize } from "node:path";
5
+ import { createRouteMatcher } from "./routes.js";
6
+ import { renderAppRequest } from "./render.js";
7
+ import { bytesResponse, htmlResponse, nodeRequestToWebRequest, sendResponse } from "./http.js";
8
+ import { emitRouterLog, logDurationMs, logError, logNow, nodeRequestPath, requestLogFields, } from "./logger.js";
9
+ import { normalizeRoutePath } from "./route-path.js";
10
+ const builtRuntimeCache = new Map();
11
+ const builtPublicAssetCache = new Map();
12
+ export function resolveRequestHost(options) {
13
+ const raw = options.rawHost;
14
+ if (raw === undefined || raw === "")
15
+ return options.fallbackHost;
16
+ if (options.allowedHosts === undefined)
17
+ return raw;
18
+ return options.allowedHosts.includes(raw) ? raw : options.fallbackHost;
19
+ }
20
+ export async function renderBuiltAppRequest(options) {
21
+ return renderBuiltAppRequestWithRuntime({
22
+ ...options,
23
+ runtime: await readBuiltRuntime(options.outDir),
24
+ });
25
+ }
26
+ async function renderBuiltAppRequestWithRuntime(options) {
27
+ const url = new URL(options.request.url);
28
+ if (url.pathname.startsWith("/_mreact/client/")) {
29
+ return readBuiltClientAsset(options.outDir, url.pathname);
30
+ }
31
+ if (options.request.method === "GET" || options.request.method === "HEAD") {
32
+ const publicAsset = await readBuiltPublicAsset(options.outDir, url.pathname);
33
+ if (publicAsset !== undefined) {
34
+ return publicAsset;
35
+ }
36
+ }
37
+ const normalizedPath = normalizeRoutePath(url.pathname);
38
+ if (options.request.method === "GET" || options.request.method === "HEAD") {
39
+ // Sync fast path when no external prerender store is configured (the
40
+ // common case): skip the Promise wrap that `readPrerenderedRoute`
41
+ // would otherwise introduce just to satisfy the async signature.
42
+ const prerendered = options.prerenderStore === undefined
43
+ ? options.runtime.prerenderedRoutes.get(normalizedPath)
44
+ : await readPrerenderedRoute(options.runtime, normalizedPath, options.prerenderStore);
45
+ if (prerendered !== undefined) {
46
+ if (options.request.method === "HEAD") {
47
+ return new Response(null, {
48
+ headers: prerendered.headers,
49
+ status: prerendered.status,
50
+ });
51
+ }
52
+ return htmlResponse(prerendered.html, {
53
+ headers: prerendered.headers,
54
+ status: prerendered.status,
55
+ });
56
+ }
57
+ }
58
+ if (options.request.method === "GET" &&
59
+ options.runtime.prerenderableRoutes.has(normalizedPath)) {
60
+ return renderAndCachePrerenderWithLock(options, normalizedPath);
61
+ }
62
+ const response = await renderBuiltDynamicResponse(options);
63
+ await applyBuiltPrerenderInvalidations(options.runtime, response, options.prerenderStore);
64
+ return options.sinkStrategy === "buffer"
65
+ ? await materializeResponseAsBuffer(response)
66
+ : response;
67
+ }
68
+ async function materializeResponseAsBuffer(response) {
69
+ if (response.body === null) {
70
+ return response;
71
+ }
72
+ // Drains streaming responses into a single Buffer (loses TTFB streaming
73
+ // by design — opt-in via sinkStrategy === "buffer"). Avoids the
74
+ // string → UTF-8 encode the Response stream would otherwise do lazily
75
+ // during the socket write. Tagged via `bytesResponse` so `sendResponse`
76
+ // can take the raw-bytes fast path.
77
+ const bytes = new Uint8Array(await response.arrayBuffer());
78
+ return bytesResponse(bytes, {
79
+ headers: response.headers,
80
+ status: response.status,
81
+ statusText: response.statusText,
82
+ });
83
+ }
84
+ export async function startServer(options) {
85
+ const runtime = await readBuiltRuntime(options.outDir);
86
+ const server = createServer(async (incoming, outgoing) => {
87
+ const startedAt = logNow();
88
+ const fallbackRequestFields = {
89
+ method: incoming.method ?? "GET",
90
+ path: nodeRequestPath(incoming.url),
91
+ runtime: "node",
92
+ };
93
+ try {
94
+ const fallbackHost = `${options.hostname ?? "127.0.0.1"}:${options.port}`;
95
+ const host = resolveRequestHost({
96
+ allowedHosts: options.allowedHosts,
97
+ fallbackHost,
98
+ rawHost: incoming.headers.host,
99
+ });
100
+ const origin = `http://${host}`;
101
+ const request = nodeRequestToWebRequest(incoming, origin);
102
+ const logFields = requestLogFields(request, "node");
103
+ emitRouterLog(options.logger, "info", {
104
+ ...logFields,
105
+ type: "router:request:start",
106
+ });
107
+ const response = await renderBuiltAppRequestWithRuntime({
108
+ outDir: options.outDir,
109
+ importPolicy: options.importPolicy,
110
+ logger: options.logger,
111
+ prerenderStore: options.prerenderStore,
112
+ request,
113
+ routeCache: options.routeCache,
114
+ runtime,
115
+ serverActions: options.serverActions,
116
+ ...(options.sinkStrategy === undefined ? {} : { sinkStrategy: options.sinkStrategy }),
117
+ });
118
+ emitRouterLog(options.logger, "info", {
119
+ ...logFields,
120
+ durationMs: logDurationMs(startedAt),
121
+ status: response.status,
122
+ type: "router:request:end",
123
+ });
124
+ await sendResponse(outgoing, response);
125
+ }
126
+ catch (error) {
127
+ // Log the full stack to stderr for operator visibility; never
128
+ // place it in the response body where attackers can scrape it
129
+ // (Issue 071). The errorHandler hook lets embedders customize
130
+ // the public response shape while still benefiting from the
131
+ // server-side log.
132
+ emitRouterLog(options.logger, "error", {
133
+ ...fallbackRequestFields,
134
+ durationMs: logDurationMs(startedAt),
135
+ error: logError(error),
136
+ type: "router:request:error",
137
+ });
138
+ if (options.logger === undefined) {
139
+ console.error("[mreact] startServer request failed:", error);
140
+ }
141
+ const payload = options.errorHandler
142
+ ? options.errorHandler(error)
143
+ : { body: "Internal Server Error", status: 500 };
144
+ outgoing.statusCode = payload.status;
145
+ outgoing.setHeader("content-type", payload.headers?.["content-type"] ?? "text/plain; charset=utf-8");
146
+ for (const [name, value] of Object.entries(payload.headers ?? {})) {
147
+ if (name.toLowerCase() === "content-type")
148
+ continue;
149
+ outgoing.setHeader(name, value);
150
+ }
151
+ outgoing.end(payload.body);
152
+ }
153
+ });
154
+ await new Promise((resolve) => server.listen(options.port, options.hostname ?? "127.0.0.1", resolve));
155
+ const address = server.address();
156
+ const port = typeof address === "object" && address !== null ? address.port : options.port;
157
+ return {
158
+ url: `http://${options.hostname ?? "127.0.0.1"}:${port}`,
159
+ close: () => new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve()))),
160
+ };
161
+ }
162
+ async function readBuiltClientAsset(outDir, pathname) {
163
+ const clientPrefix = "/_mreact/client/";
164
+ const relativePath = pathname.slice(clientPrefix.length);
165
+ const normalized = normalize(relativePath);
166
+ if (normalized.startsWith("..")) {
167
+ return new Response("Not Found", { status: 404 });
168
+ }
169
+ try {
170
+ const code = await readFile(join(outDir, "client", normalized), "utf8");
171
+ return new Response(code, {
172
+ headers: clientAssetHeaders(normalized),
173
+ });
174
+ }
175
+ catch {
176
+ return new Response("Not Found", { status: 404 });
177
+ }
178
+ }
179
+ async function readBuiltPublicAsset(outDir, pathname) {
180
+ const relativePath = pathname.startsWith("/") ? pathname.slice(1) : pathname;
181
+ if (relativePath === "") {
182
+ return undefined;
183
+ }
184
+ const normalized = normalize(relativePath);
185
+ if (isAbsolute(normalized) || normalized === ".." || normalized.startsWith("../")) {
186
+ return undefined;
187
+ }
188
+ try {
189
+ const cacheKey = `${outDir}\0${normalized}`;
190
+ const cached = builtPublicAssetCache.get(cacheKey);
191
+ if (cached === null) {
192
+ return undefined;
193
+ }
194
+ if (cached !== undefined) {
195
+ return bytesResponse(cached.bytes, {
196
+ headers: cached.headers,
197
+ });
198
+ }
199
+ const bytes = await readFile(join(outDir, "client", "public", normalized));
200
+ const headers = publicAssetHeaders(normalized);
201
+ builtPublicAssetCache.set(cacheKey, {
202
+ bytes,
203
+ headers,
204
+ });
205
+ return bytesResponse(bytes, { headers });
206
+ }
207
+ catch {
208
+ builtPublicAssetCache.set(`${outDir}\0${normalized}`, null);
209
+ return undefined;
210
+ }
211
+ }
212
+ async function readBuiltRuntime(outDir) {
213
+ const [serverManifestText, clientManifestText] = await Promise.all([
214
+ readFile(join(outDir, "server", "manifest.json"), "utf8"),
215
+ readFile(join(outDir, "client", "manifest.json"), "utf8"),
216
+ ]);
217
+ const cached = builtRuntimeCache.get(outDir);
218
+ if (cached !== undefined &&
219
+ cached.serverManifestText === serverManifestText &&
220
+ cached.clientManifestText === clientManifestText) {
221
+ return cached.runtime;
222
+ }
223
+ const runtime = materializeBuiltRuntime({
224
+ clientManifestText,
225
+ outDir,
226
+ serverManifestText,
227
+ });
228
+ builtRuntimeCache.set(outDir, {
229
+ clientManifestText,
230
+ runtime,
231
+ serverManifestText,
232
+ });
233
+ return runtime;
234
+ }
235
+ async function materializeBuiltRuntime(options) {
236
+ const serverManifest = JSON.parse(options.serverManifestText);
237
+ const clientManifest = JSON.parse(options.clientManifestText);
238
+ const appDir = await materializeBuiltServerApp(options.outDir, serverManifest);
239
+ const projectRoot = appDir;
240
+ const routesDir = join(projectRoot, serverManifest.routesDir ?? "");
241
+ const routes = serverManifest.routes.map((route) => ({
242
+ ...route,
243
+ file: join(projectRoot, route.file),
244
+ }));
245
+ const prerenderedRoutes = new Map(Object.entries(serverManifest.prerenderedRoutes ?? {}));
246
+ const prerenderableRoutes = new Set(prerenderedRoutes.keys());
247
+ const prerenderLocks = new Map();
248
+ const serverModules = new Map(Object.entries(serverManifest.serverModules ?? {}).map(([file, artifact]) => [
249
+ join(appDir, file),
250
+ artifact,
251
+ ]));
252
+ const serverSourceFiles = new Map(Object.entries(serverManifest.files).map(([file, source]) => [join(appDir, file), source]));
253
+ const routeMatcher = createRouteMatcher(routes);
254
+ const clientScripts = new Map(clientManifest.routes.flatMap((route) => route.client && route.script !== undefined ? [[route.path, route.script]] : []));
255
+ const hasMiddleware = serverSourceFiles.has(join(appDir, "middleware.ts")) ||
256
+ serverSourceFiles.has(join(appDir, "middleware.mreact.ts"));
257
+ const serverModuleCacheVersion = createHash("sha256")
258
+ .update(options.serverManifestText)
259
+ .update("\0")
260
+ .update(options.clientManifestText)
261
+ .digest("hex")
262
+ .slice(0, 16);
263
+ const allowedSourceDirs = (serverManifest.allowedSourceDirs ?? [""]).map((directory) => join(projectRoot, directory));
264
+ return {
265
+ appDir: routesDir,
266
+ allowedSourceDirs,
267
+ ...(serverManifest.assetBaseUrl === undefined
268
+ ? {}
269
+ : { assetBaseUrl: serverManifest.assetBaseUrl }),
270
+ clientScripts,
271
+ hasMiddleware,
272
+ projectRoot,
273
+ ...(serverManifest.publicAssetBaseUrl === undefined
274
+ ? {}
275
+ : { publicAssetBaseUrl: serverManifest.publicAssetBaseUrl }),
276
+ prerenderableRoutes,
277
+ prerenderLocks,
278
+ prerenderedRoutes,
279
+ routeMatcher,
280
+ routes,
281
+ serverModules,
282
+ serverModuleCacheVersion,
283
+ serverSourceFiles,
284
+ };
285
+ }
286
+ async function readPrerenderedRoute(runtime, path, store) {
287
+ const stored = await store?.get(path);
288
+ if (stored !== undefined) {
289
+ runtime.prerenderedRoutes.set(path, stored);
290
+ return stored;
291
+ }
292
+ const manifestEntry = runtime.prerenderedRoutes.get(path);
293
+ if (manifestEntry !== undefined && store !== undefined) {
294
+ await store.set(path, manifestEntry);
295
+ }
296
+ return manifestEntry;
297
+ }
298
+ function renderBuiltDynamicResponse(options) {
299
+ return renderAppRequest({
300
+ appDir: options.runtime.appDir,
301
+ assetBaseUrl: options.runtime.assetBaseUrl,
302
+ clientScripts: options.runtime.clientScripts,
303
+ importPolicy: {
304
+ ...options.importPolicy,
305
+ allowedSourceDirs: options.runtime.allowedSourceDirs,
306
+ projectRoot: options.runtime.projectRoot,
307
+ },
308
+ request: options.request,
309
+ logger: options.logger,
310
+ routeCache: options.routeCache,
311
+ routeMatcher: options.runtime.routeMatcher,
312
+ routes: options.runtime.routes,
313
+ serverModules: options.runtime.serverModules,
314
+ serverModuleCacheVersion: options.runtime.serverModuleCacheVersion,
315
+ serverSourceFiles: options.runtime.serverSourceFiles,
316
+ serverActions: options.serverActions,
317
+ skipMiddleware: !options.runtime.hasMiddleware,
318
+ });
319
+ }
320
+ async function renderAndCachePrerenderWithLock(options, path) {
321
+ const existing = options.runtime.prerenderLocks.get(path);
322
+ if (existing !== undefined) {
323
+ return cloneResponse(await existing);
324
+ }
325
+ const task = runPrerenderRegeneration(options, path);
326
+ options.runtime.prerenderLocks.set(path, task);
327
+ try {
328
+ return cloneResponse(await task);
329
+ }
330
+ finally {
331
+ options.runtime.prerenderLocks.delete(path);
332
+ }
333
+ }
334
+ async function runPrerenderRegeneration(options, path) {
335
+ const regenerate = async () => {
336
+ const stored = await readPrerenderedRoute(options.runtime, path, options.prerenderStore);
337
+ if (stored !== undefined) {
338
+ return htmlResponse(stored.html, {
339
+ headers: stored.headers,
340
+ status: stored.status,
341
+ });
342
+ }
343
+ const response = await renderBuiltDynamicResponse(options);
344
+ return response.ok
345
+ ? await cacheRegeneratedPrerenderedRoute(options.runtime, path, response, options.prerenderStore)
346
+ : response;
347
+ };
348
+ return options.prerenderStore?.withLock === undefined
349
+ ? await regenerate()
350
+ : await options.prerenderStore.withLock(path, regenerate);
351
+ }
352
+ async function applyBuiltPrerenderInvalidations(runtime, response, store) {
353
+ const revalidated = response.headers.get("x-mreact-revalidate");
354
+ if (revalidated === null) {
355
+ return;
356
+ }
357
+ for (const path of revalidated.split(",")) {
358
+ const normalized = normalizeRoutePath(path.trim());
359
+ runtime.prerenderedRoutes.delete(normalized);
360
+ await store?.delete(normalized);
361
+ }
362
+ }
363
+ async function cacheRegeneratedPrerenderedRoute(runtime, path, response, store) {
364
+ const body = await response.text();
365
+ const headers = {};
366
+ response.headers.forEach((value, key) => {
367
+ headers[key] = value;
368
+ });
369
+ const entry = {
370
+ headers,
371
+ html: body,
372
+ status: response.status,
373
+ };
374
+ runtime.prerenderedRoutes.set(path, entry);
375
+ await store?.set(path, entry);
376
+ return htmlResponse(body, {
377
+ headers: response.headers,
378
+ status: response.status,
379
+ });
380
+ }
381
+ async function cloneResponse(response) {
382
+ return htmlResponse(await response.clone().text(), {
383
+ headers: response.headers,
384
+ status: response.status,
385
+ });
386
+ }
387
+ async function materializeBuiltServerApp(outDir, manifest) {
388
+ const appDir = join(outDir, "server", "runtime", "app");
389
+ await rm(appDir, { force: true, recursive: true });
390
+ await Promise.all(Object.entries(manifest.files).map(async ([file, code]) => {
391
+ const outputFile = join(appDir, safeManifestFilePath(file));
392
+ await mkdir(dirname(outputFile), { recursive: true });
393
+ await writeFile(outputFile, code);
394
+ }));
395
+ return appDir;
396
+ }
397
+ function safeManifestFilePath(pathname) {
398
+ const normalized = normalize(pathname);
399
+ if (isAbsolute(normalized) || normalized === ".." || normalized.startsWith("../")) {
400
+ throw new Error(`Invalid built app manifest file path: ${pathname}`);
401
+ }
402
+ return normalized;
403
+ }
404
+ function clientAssetHeaders(pathname) {
405
+ if (pathname === "manifest.json") {
406
+ return {
407
+ "cache-control": "no-cache",
408
+ "content-type": "application/json; charset=utf-8",
409
+ };
410
+ }
411
+ return {
412
+ "cache-control": "public, max-age=31536000, immutable",
413
+ "content-type": "text/javascript; charset=utf-8",
414
+ };
415
+ }
416
+ function publicAssetHeaders(pathname) {
417
+ return {
418
+ "cache-control": "public, max-age=3600",
419
+ "content-type": publicAssetContentType(pathname),
420
+ };
421
+ }
422
+ function publicAssetContentType(pathname) {
423
+ if (pathname.endsWith(".css"))
424
+ return "text/css; charset=utf-8";
425
+ if (pathname.endsWith(".html"))
426
+ return "text/html; charset=utf-8";
427
+ if (pathname.endsWith(".js"))
428
+ return "text/javascript; charset=utf-8";
429
+ if (pathname.endsWith(".json"))
430
+ return "application/json; charset=utf-8";
431
+ if (pathname.endsWith(".svg"))
432
+ return "image/svg+xml";
433
+ if (pathname.endsWith(".png"))
434
+ return "image/png";
435
+ if (pathname.endsWith(".jpg") || pathname.endsWith(".jpeg"))
436
+ return "image/jpeg";
437
+ if (pathname.endsWith(".webp"))
438
+ return "image/webp";
439
+ if (pathname.endsWith(".ico"))
440
+ return "image/x-icon";
441
+ if (pathname.endsWith(".txt"))
442
+ return "text/plain; charset=utf-8";
443
+ return "application/octet-stream";
444
+ }
445
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface SessionRecord<TData = unknown> {
2
+ createdAt: number;
3
+ data: TData;
4
+ expiresAt: number;
5
+ id: string;
6
+ rotatedAt?: number;
7
+ }
8
+ export interface SessionStore<TData = unknown> {
9
+ delete(id: string): void | Promise<void>;
10
+ get(id: string): SessionRecord<TData> | undefined | Promise<SessionRecord<TData> | undefined>;
11
+ set(record: SessionRecord<TData>): void | Promise<void>;
12
+ }
13
+ export interface SessionCookieOptions {
14
+ cookieName?: string;
15
+ maxAgeSeconds?: number;
16
+ path?: string;
17
+ sameSite?: "Strict" | "Lax" | "None";
18
+ secure?: boolean;
19
+ }
20
+ export declare function createMemorySessionStore<TData>(): SessionStore<TData>;
21
+ export declare function getSession<TData>(request: Request, store: SessionStore<TData>, options?: SessionCookieOptions): Promise<SessionRecord<TData> | undefined>;
22
+ export declare function createSession<TData>(response: Response, store: SessionStore<TData>, data: TData, options?: SessionCookieOptions): Promise<SessionRecord<TData>>;
23
+ export declare function destroySession<TData>(request: Request, response: Response, store: SessionStore<TData>, options?: SessionCookieOptions): Promise<void>;
24
+ export declare function rotateSession<TData>(request: Request, response: Response, store: SessionStore<TData>, options?: SessionCookieOptions): Promise<SessionRecord<TData> | undefined>;
25
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,OAAO;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY,CAAC,KAAK,GAAG,OAAO;IAC3C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;IAC9F,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAsCD,wBAAgB,wBAAwB,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CAAC,CA6BrE;AAED,wBAAsB,UAAU,CAAC,KAAK,EACpC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAC1B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAmB3C;AAED,wBAAsB,aAAa,CAAC,KAAK,EACvC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAC1B,IAAI,EAAE,KAAK,EACX,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAgB/B;AAED,wBAAsB,cAAc,CAAC,KAAK,EACxC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAC1B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,aAAa,CAAC,KAAK,EACvC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAC1B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAW3C"}
@@ -0,0 +1,104 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { deleteCookie, parseCookieHeader, setCookie } from "./cookies.js";
3
+ const DEFAULT_MAX_AGE_SECONDS = 7 * 24 * 60 * 60;
4
+ const SESSION_COOKIE_DEV = "mreact.session";
5
+ const SESSION_COOKIE_PROD = "__Host-mreact.session";
6
+ function isProduction() {
7
+ return process.env.NODE_ENV === "production";
8
+ }
9
+ function defaultCookieName() {
10
+ return isProduction() ? SESSION_COOKIE_PROD : SESSION_COOKIE_DEV;
11
+ }
12
+ function sessionCookieOptions(options = {}) {
13
+ const production = isProduction();
14
+ return {
15
+ httpOnly: true,
16
+ maxAge: options.maxAgeSeconds ?? DEFAULT_MAX_AGE_SECONDS,
17
+ path: production ? "/" : options.path ?? "/",
18
+ sameSite: options.sameSite ?? "Lax",
19
+ secure: options.secure ?? production,
20
+ };
21
+ }
22
+ function readSessionId(request, options = {}) {
23
+ const values = parseCookieHeader(request.headers.get("cookie"));
24
+ return values.get(options.cookieName ?? defaultCookieName());
25
+ }
26
+ function createSessionId() {
27
+ return randomBytes(32).toString("base64url");
28
+ }
29
+ export function createMemorySessionStore() {
30
+ const records = new Map();
31
+ return {
32
+ delete(id) {
33
+ records.delete(id);
34
+ },
35
+ get(id) {
36
+ const record = records.get(id);
37
+ if (record !== undefined && record.expiresAt <= Date.now()) {
38
+ records.delete(id);
39
+ return undefined;
40
+ }
41
+ return record;
42
+ },
43
+ set(record) {
44
+ const now = Date.now();
45
+ for (const [id, value] of records) {
46
+ if (value.expiresAt <= now) {
47
+ records.delete(id);
48
+ }
49
+ }
50
+ records.set(record.id, record);
51
+ },
52
+ };
53
+ }
54
+ export async function getSession(request, store, options = {}) {
55
+ const id = readSessionId(request, options);
56
+ if (id === undefined || id.length === 0) {
57
+ return undefined;
58
+ }
59
+ const record = await store.get(id);
60
+ if (record === undefined) {
61
+ return undefined;
62
+ }
63
+ if (record.expiresAt <= Date.now()) {
64
+ await store.delete(id);
65
+ return undefined;
66
+ }
67
+ return record;
68
+ }
69
+ export async function createSession(response, store, data, options = {}) {
70
+ const now = Date.now();
71
+ const maxAgeSeconds = options.maxAgeSeconds ?? DEFAULT_MAX_AGE_SECONDS;
72
+ const record = {
73
+ createdAt: now,
74
+ data,
75
+ expiresAt: now + maxAgeSeconds * 1000,
76
+ id: createSessionId(),
77
+ };
78
+ await store.set(record);
79
+ setCookie(response, options.cookieName ?? defaultCookieName(), record.id, {
80
+ ...sessionCookieOptions({ ...options, maxAgeSeconds }),
81
+ });
82
+ return record;
83
+ }
84
+ export async function destroySession(request, response, store, options = {}) {
85
+ const id = readSessionId(request, options);
86
+ if (id !== undefined) {
87
+ await store.delete(id);
88
+ }
89
+ deleteCookie(response, options.cookieName ?? defaultCookieName(), {
90
+ path: isProduction() ? "/" : options.path ?? "/",
91
+ sameSite: options.sameSite ?? "Lax",
92
+ secure: options.secure ?? isProduction(),
93
+ });
94
+ }
95
+ export async function rotateSession(request, response, store, options = {}) {
96
+ const current = await getSession(request, store, options);
97
+ if (current === undefined) {
98
+ return undefined;
99
+ }
100
+ await store.delete(current.id);
101
+ const next = await createSession(response, store, current.data, options);
102
+ return { ...next, rotatedAt: Date.now() };
103
+ }
104
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ConfigEnv } from "vite";
2
+ import type { ResolvedAppRouterProject } from "./config.js";
3
+ export declare function loadMreactRouterViteConfig(options: {
4
+ command: ConfigEnv["command"];
5
+ cwd: string;
6
+ mode?: string | undefined;
7
+ }): Promise<ResolvedAppRouterProject>;
8
+ //# sourceMappingURL=vite-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-config.d.ts","sourceRoot":"","sources":["../src/vite-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAG5D,wBAAsB,0BAA0B,CAAC,OAAO,EAAE;IACxD,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAqBpC"}
@@ -0,0 +1,17 @@
1
+ import { loadConfigFromFile } from "vite";
2
+ import { mreactRouterConfigFromPlugins } from "./vite.js";
3
+ export async function loadMreactRouterViteConfig(options) {
4
+ const loaded = await loadConfigFromFile({
5
+ command: options.command,
6
+ mode: options.mode ?? (options.command === "serve" ? "development" : "production"),
7
+ }, undefined, options.cwd);
8
+ if (loaded === null) {
9
+ throw new Error("vite.config.ts is required for mreact-router CLI commands.");
10
+ }
11
+ const config = mreactRouterConfigFromPlugins(loaded.config.plugins ?? []);
12
+ if (config === undefined) {
13
+ throw new Error("vite.config.ts must include mreactRouter() from @reckona/mreact-router/vite.");
14
+ }
15
+ return config;
16
+ }
17
+ //# sourceMappingURL=vite-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-config.js","sourceRoot":"","sources":["../src/vite-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,MAAM,CAAC;AAE1D,OAAO,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,OAIhD;IACC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC;QACE,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;KACnF,EACD,SAAS,EACT,OAAO,CAAC,GAAG,CACZ,CAAC;IAEF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAE1E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}