@reckona/mreact-router 0.0.146 → 0.0.148

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -43,6 +43,8 @@ export default defineConfig({
43
43
 
44
44
  `mreact-router build` reads this config. Pass `--target=node` for plain Node/container output, `--target=aws-lambda` for Lambda artifacts with a generated handler and import policy, or `--target=cloudflare` for Workers artifacts with a generated Worker module. Configure `buildTargets: ["aws-lambda"]`, `["cloudflare"]`, or another explicit target list in `mreactRouter()` when one deployment target should be the project default. Without an explicit target, build output includes only the Node-compatible server/client artifacts; Cloudflare and Lambda artifacts are opt-in. The legacy `appDir` shortcut remains available for tests and older direct programmatic usage, but it is deprecated. Use `projectRoot` + `routesDir` for new code. The shortcut is planned for removal after `0.1.0`.
45
45
 
46
+ Production builds print compact progress by default, including route discovery, server output, client output, artifact writing, and the final route count with total duration. Programmatic builds can pass `onBuildProgress` to receive the same coarse phase events without parsing CLI output.
47
+
46
48
  Production client source maps are disabled by default. Set `clientSourceMaps: "linked"` to emit public `.js.map` files beside route scripts and include `sourceMappingURL` comments, or set `clientSourceMaps: "hidden"` to emit upload-only maps under `.mreact/source-maps/client/` without exposing them in the client manifest. The CLI accepts the same modes with `mreact-router build --client-source-maps=hidden`, `linked`, or `none`.
47
49
 
48
50
  Production client route bundles can drop selected browser logging calls with `production.dropClientConsole`. Set it to `true` to remove `console.debug`, `console.info`, and `console.log` while preserving `console.warn` and `console.error`, or pass an array such as `["log"]` to choose specific methods.
@@ -302,6 +304,8 @@ Built Node output binds to `127.0.0.1` by default. Use `mreact-router start .mre
302
304
 
303
305
  Use `mreact-router --help`, `mreact-router help build`, or command-level help such as `mreact-router build --help` to inspect supported commands, build targets, and generated artifacts.
304
306
 
307
+ Build progress output is always limited to coarse phases and does not include request data. Use `--log=requests` only when you want request summaries from `dev` or `start`.
308
+
305
309
  Server-only pages get the lightweight navigation runtime automatically — without becoming hydrated client routes — whenever they render a `Link` (from `@reckona/mreact-router/link`) anywhere in their server-rendered tree, including through nested components and layouts:
306
310
 
307
311
  ```tsx
package/dist/build.d.ts CHANGED
@@ -5,6 +5,7 @@ import type { RouteCachePolicy } from "./cache.js";
5
5
  import { type AppRouterImportPolicy } from "./import-policy.js";
6
6
  import type { PluginOption, UserConfig } from "vite";
7
7
  export interface BuildAppOptions extends AppRouterProjectOptions {
8
+ onBuildProgress?: ((event: BuildAppProgressEvent) => void) | undefined;
8
9
  onBuildPhaseTiming?: ((timing: BuildAppPhaseTiming) => void) | undefined;
9
10
  outDir: string;
10
11
  targets?: readonly AppRouterBuildTarget[] | undefined;
@@ -15,6 +16,17 @@ export interface BuildAppPhaseTiming {
15
16
  ms: number;
16
17
  phase: BuildAppPhase;
17
18
  }
19
+ export type BuildAppProgressEvent = {
20
+ kind: "phase-start";
21
+ phase: BuildAppPhase;
22
+ } | {
23
+ kind: "phase-end";
24
+ ms: number;
25
+ phase: BuildAppPhase;
26
+ } | {
27
+ count: number;
28
+ kind: "routes-discovered";
29
+ };
18
30
  export interface BuildAppResult {
19
31
  routes: AppRoute[];
20
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
package/dist/build.js CHANGED
@@ -62,25 +62,28 @@ async function collectBuildMiddlewareIds(appDir) {
62
62
  }
63
63
  export async function buildApp(options) {
64
64
  const timingSink = options.onBuildPhaseTiming;
65
+ const progressSink = options.onBuildProgress;
66
+ const shouldTrackBuildPhases = timingSink !== undefined || progressSink !== undefined;
65
67
  const project = resolveAppRouterProjectOptions(options);
66
68
  const buildTargets = resolveBuildTargets(options.targets ?? project.buildTargets);
67
69
  const shouldBuildCloudflare = buildTargets.includes("cloudflare");
68
70
  const shouldBuildAwsLambda = buildTargets.includes("aws-lambda");
69
- const routes = timingSink === undefined
71
+ const routes = shouldTrackBuildPhases === false
70
72
  ? await scanAppRoutes({ appDir: project.routesDir })
71
- : await timeBuildPhase(timingSink, "scan", () => scanAppRoutes({ appDir: project.routesDir }));
73
+ : await timeBuildPhase(timingSink, progressSink, "scan", () => scanAppRoutes({ appDir: project.routesDir }));
74
+ progressSink?.({ count: routes.length, kind: "routes-discovered" });
72
75
  await validateBuildMiddlewareControls(project.routesDir, routes);
73
76
  const viteDefine = options.viteConfig?.define;
74
77
  const vitePlugins = options.viteConfig?.plugins;
75
- const files = timingSink === undefined
78
+ const files = shouldTrackBuildPhases === false
76
79
  ? await collectBuildFiles(project.projectRoot, project.allowedSourceDirs, project.routesDir)
77
- : await timeBuildPhase(timingSink, "collectFiles", () => collectBuildFiles(project.projectRoot, project.allowedSourceDirs, project.routesDir));
80
+ : await timeBuildPhase(timingSink, progressSink, "collectFiles", () => collectBuildFiles(project.projectRoot, project.allowedSourceDirs, project.routesDir));
78
81
  const serverClientRouteInferenceCache = createClientRouteInferenceCache();
79
82
  const serverTransformCache = new Map();
80
83
  const serverDir = join(options.outDir, "server");
81
84
  const clientDir = join(options.outDir, "client");
82
85
  const cloudflareDir = join(options.outDir, "cloudflare");
83
- const sourceAnalysis = timingSink === undefined
86
+ const sourceAnalysis = shouldTrackBuildPhases === false
84
87
  ? await analyzeBuildRouteSources({
85
88
  clientRouteInferenceCache: serverClientRouteInferenceCache,
86
89
  files,
@@ -89,7 +92,7 @@ export async function buildApp(options) {
89
92
  routes,
90
93
  vitePlugins,
91
94
  })
92
- : await timeBuildPhase(timingSink, "analyzeSources", () => analyzeBuildRouteSources({
95
+ : await timeBuildPhase(timingSink, progressSink, "analyzeSources", () => analyzeBuildRouteSources({
93
96
  clientRouteInferenceCache: serverClientRouteInferenceCache,
94
97
  files,
95
98
  project,
@@ -97,7 +100,7 @@ export async function buildApp(options) {
97
100
  routes,
98
101
  vitePlugins,
99
102
  }));
100
- if (timingSink === undefined) {
103
+ if (shouldTrackBuildPhases === false) {
101
104
  await validateProductionRoutes({
102
105
  clientRouteInferenceCache: serverClientRouteInferenceCache,
103
106
  files,
@@ -110,7 +113,7 @@ export async function buildApp(options) {
110
113
  });
111
114
  }
112
115
  else {
113
- await timeBuildPhase(timingSink, "validate", () => validateProductionRoutes({
116
+ await timeBuildPhase(timingSink, progressSink, "validate", () => validateProductionRoutes({
114
117
  clientRouteInferenceCache: serverClientRouteInferenceCache,
115
118
  files,
116
119
  project,
@@ -121,7 +124,7 @@ export async function buildApp(options) {
121
124
  vitePlugins,
122
125
  }));
123
126
  }
124
- if (timingSink === undefined) {
127
+ if (shouldTrackBuildPhases === false) {
125
128
  await rm(options.outDir, { force: true, recursive: true });
126
129
  await Promise.all([
127
130
  mkdir(serverDir, { recursive: true }),
@@ -132,7 +135,7 @@ export async function buildApp(options) {
132
135
  ]);
133
136
  }
134
137
  else {
135
- await timeBuildPhase(timingSink, "prepareOutput", async () => {
138
+ await timeBuildPhase(timingSink, progressSink, "prepareOutput", async () => {
136
139
  await rm(options.outDir, { force: true, recursive: true });
137
140
  await Promise.all([
138
141
  mkdir(serverDir, { recursive: true }),
@@ -143,25 +146,25 @@ export async function buildApp(options) {
143
146
  ]);
144
147
  });
145
148
  }
146
- const publicAssets = timingSink === undefined
149
+ const publicAssets = shouldTrackBuildPhases === false
147
150
  ? await buildPublicAssetManifest(project, clientDir)
148
- : await timeBuildPhase(timingSink, "publicAssets", () => buildPublicAssetManifest(project, clientDir));
151
+ : await timeBuildPhase(timingSink, progressSink, "publicAssets", () => buildPublicAssetManifest(project, clientDir));
149
152
  const clientRouteInferenceCache = createClientRouteInferenceCache();
150
153
  const [serverActionManifest, serverModules, generatedImportPolicy] = await Promise.all([
151
- timingSink === undefined
154
+ shouldTrackBuildPhases === false
152
155
  ? collectBuildServerActionManifest({
153
156
  files,
154
157
  projectRoot: project.projectRoot,
155
158
  routes,
156
159
  routesDir: project.routesDir,
157
160
  })
158
- : timeBuildPhase(timingSink, "serverActionManifest", () => collectBuildServerActionManifest({
161
+ : timeBuildPhase(timingSink, progressSink, "serverActionManifest", () => collectBuildServerActionManifest({
159
162
  files,
160
163
  projectRoot: project.projectRoot,
161
164
  routes,
162
165
  routesDir: project.routesDir,
163
166
  })),
164
- timingSink === undefined
167
+ shouldTrackBuildPhases === false
165
168
  ? buildServerModuleArtifacts({
166
169
  bundleCache: new Map(),
167
170
  clientRouteInferenceCache: serverClientRouteInferenceCache,
@@ -175,7 +178,7 @@ export async function buildApp(options) {
175
178
  serverTransformCache,
176
179
  vitePlugins,
177
180
  })
178
- : timeBuildPhase(timingSink, "serverModules", () => buildServerModuleArtifacts({
181
+ : timeBuildPhase(timingSink, progressSink, "serverModules", () => buildServerModuleArtifacts({
179
182
  bundleCache: new Map(),
180
183
  clientRouteInferenceCache: serverClientRouteInferenceCache,
181
184
  define: viteDefine,
@@ -188,14 +191,14 @@ export async function buildApp(options) {
188
191
  serverTransformCache,
189
192
  vitePlugins,
190
193
  })),
191
- timingSink === undefined
194
+ shouldTrackBuildPhases === false
192
195
  ? buildGeneratedImportPolicy({
193
196
  files,
194
197
  projectRoot: project.projectRoot,
195
198
  routes,
196
199
  routesDir: project.routesDir,
197
200
  })
198
- : timeBuildPhase(timingSink, "importPolicy", () => buildGeneratedImportPolicy({
201
+ : timeBuildPhase(timingSink, progressSink, "importPolicy", () => buildGeneratedImportPolicy({
199
202
  files,
200
203
  projectRoot: project.projectRoot,
201
204
  routes,
@@ -207,10 +210,10 @@ export async function buildApp(options) {
207
210
  file: relative(project.projectRoot, route.file),
208
211
  }));
209
212
  const [serverModuleArtifacts, clientBundle] = await Promise.all([
210
- timingSink === undefined
213
+ shouldTrackBuildPhases === false
211
214
  ? writeServerModuleArtifactFiles(serverDir, serverModules, generatedImportPolicy.runtimePackages)
212
- : timeBuildPhase(timingSink, "serverModuleArtifacts", () => writeServerModuleArtifactFiles(serverDir, serverModules, generatedImportPolicy.runtimePackages)),
213
- timingSink === undefined
215
+ : timeBuildPhase(timingSink, progressSink, "serverModuleArtifacts", () => writeServerModuleArtifactFiles(serverDir, serverModules, generatedImportPolicy.runtimePackages)),
216
+ shouldTrackBuildPhases === false
214
217
  ? writeClientRouteBundles({
215
218
  appDir: project.routesDir,
216
219
  assetBaseUrl: project.assetBaseUrl,
@@ -224,7 +227,7 @@ export async function buildApp(options) {
224
227
  sourceMaps: project.clientSourceMaps,
225
228
  vitePlugins,
226
229
  })
227
- : timeBuildPhase(timingSink, "clientBundles", () => writeClientRouteBundles({
230
+ : timeBuildPhase(timingSink, progressSink, "clientBundles", () => writeClientRouteBundles({
228
231
  appDir: project.routesDir,
229
232
  assetBaseUrl: project.assetBaseUrl,
230
233
  clientDir,
@@ -240,9 +243,9 @@ export async function buildApp(options) {
240
243
  ]);
241
244
  const clientRoutes = clientBundle.routes;
242
245
  const navigationRuntimeScript = clientRoutes.some((route) => route.navigation === true && !route.client)
243
- ? timingSink === undefined
246
+ ? shouldTrackBuildPhases === false
244
247
  ? await writeNavigationRuntimeBundle(clientDir, project.clientConsolePureFunctions)
245
- : await timeBuildPhase(timingSink, "navigationRuntime", () => writeNavigationRuntimeBundle(clientDir, project.clientConsolePureFunctions))
248
+ : await timeBuildPhase(timingSink, progressSink, "navigationRuntime", () => writeNavigationRuntimeBundle(clientDir, project.clientConsolePureFunctions))
246
249
  : undefined;
247
250
  const clientManifestRoutes = navigationRuntimeScript === undefined
248
251
  ? clientRoutes
@@ -254,7 +257,7 @@ export async function buildApp(options) {
254
257
  ...clientBundle.styles.flatMap((style) => style.css),
255
258
  ...(navigationRuntimeScript === undefined ? [] : [navigationRuntimeScript]),
256
259
  ])).sort();
257
- const prerenderedRoutes = timingSink === undefined
260
+ const prerenderedRoutes = shouldTrackBuildPhases === false
258
261
  ? await prerenderStaticRoutes({
259
262
  appDir: project.routesDir,
260
263
  assetBaseUrl: project.assetBaseUrl,
@@ -266,7 +269,7 @@ export async function buildApp(options) {
266
269
  sourceAnalysis,
267
270
  vitePlugins,
268
271
  })
269
- : await timeBuildPhase(timingSink, "prerender", () => prerenderStaticRoutes({
272
+ : await timeBuildPhase(timingSink, progressSink, "prerender", () => prerenderStaticRoutes({
270
273
  appDir: project.routesDir,
271
274
  assetBaseUrl: project.assetBaseUrl,
272
275
  clientRoutes: clientManifestRoutes,
@@ -280,7 +283,7 @@ export async function buildApp(options) {
280
283
  let cloudflareRouteModules;
281
284
  if (shouldBuildCloudflare) {
282
285
  cloudflareRouteModules =
283
- timingSink === undefined
286
+ shouldTrackBuildPhases === false
284
287
  ? await writeCloudflareRouteModules({
285
288
  cloudflareDir,
286
289
  define: viteDefine,
@@ -293,7 +296,7 @@ export async function buildApp(options) {
293
296
  sourceAnalysis,
294
297
  vitePlugins,
295
298
  })
296
- : await timeBuildPhase(timingSink, "cloudflare", () => writeCloudflareRouteModules({
299
+ : await timeBuildPhase(timingSink, progressSink, "cloudflare", () => writeCloudflareRouteModules({
297
300
  cloudflareDir,
298
301
  define: viteDefine,
299
302
  files,
@@ -349,13 +352,13 @@ export async function buildApp(options) {
349
352
  writeFile(join(clientDir, ".vite", "manifest.json"), JSON.stringify(viteManifestFromClientRoutes(clientManifestRoutes), null, 2)),
350
353
  ]);
351
354
  };
352
- if (timingSink === undefined) {
355
+ if (shouldTrackBuildPhases === false) {
353
356
  await writeManifestFiles();
354
357
  }
355
358
  else {
356
- await timeBuildPhase(timingSink, "writeManifests", writeManifestFiles);
359
+ await timeBuildPhase(timingSink, progressSink, "writeManifests", writeManifestFiles);
357
360
  }
358
- if (timingSink === undefined) {
361
+ if (shouldTrackBuildPhases === false) {
359
362
  await Promise.all([
360
363
  ...(shouldBuildAwsLambda ? [writeAwsLambdaHandlerArtifact(options.outDir)] : []),
361
364
  ...(shouldBuildCloudflare
@@ -371,7 +374,7 @@ export async function buildApp(options) {
371
374
  ]);
372
375
  }
373
376
  else {
374
- await timeBuildPhase(timingSink, "adapterArtifacts", async () => {
377
+ await timeBuildPhase(timingSink, progressSink, "adapterArtifacts", async () => {
375
378
  await Promise.all([
376
379
  ...(shouldBuildAwsLambda ? [writeAwsLambdaHandlerArtifact(options.outDir)] : []),
377
380
  ...(shouldBuildCloudflare
@@ -415,14 +418,21 @@ function typedRoutesDeclaration(routes) {
415
418
  ``,
416
419
  ].join("\n");
417
420
  }
418
- async function timeBuildPhase(sink, phase, run) {
421
+ async function timeBuildPhase(timingSink, progressSink, phase, run) {
422
+ progressSink?.({ kind: "phase-start", phase });
419
423
  const startedAt = performance.now();
420
424
  try {
421
425
  return await run();
422
426
  }
423
427
  finally {
424
- sink({
425
- ms: roundBuildPhaseMs(performance.now() - startedAt),
428
+ const ms = roundBuildPhaseMs(performance.now() - startedAt);
429
+ timingSink?.({
430
+ ms,
431
+ phase,
432
+ });
433
+ progressSink?.({
434
+ kind: "phase-end",
435
+ ms,
426
436
  phase,
427
437
  });
428
438
  }