@reckona/mreact-router 0.0.153 → 0.0.154

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/src/render.ts CHANGED
@@ -185,6 +185,9 @@ export interface RenderAppRequestOptions {
185
185
  routes?: readonly AppRoute[] | undefined;
186
186
  serverModules?: ReadonlyMap<string, BuiltServerModuleArtifact> | undefined;
187
187
  serverModuleCacheVersion?: string | undefined;
188
+ // True when serving through a dev server: request-time server transforms
189
+ // are expected there and must not trigger the production prebuild warning.
190
+ dev?: boolean | undefined;
188
191
  serverSourceFiles?: ReadonlyMap<string, string> | undefined;
189
192
  serverActions?: AppRouterServerActionOptions | undefined;
190
193
  serverActionReferencesByFile?:
@@ -479,7 +482,7 @@ type StreamModuleExports = Record<string, unknown> & {
479
482
 
480
483
  const serverTransformCache = new Map<string, TransformOutput>();
481
484
  const serverTransformCacheCounters = createRouterRuntimeCacheCounters();
482
- let productionDynamicServerTransformWarned = false;
485
+ const productionDynamicServerTransformWarned = new Set<string>();
483
486
  const serverSourceFileCache = new Map<string, Promise<string>>();
484
487
  const serverSourceFileCacheCounters = createRouterRuntimeCacheCounters();
485
488
  const routeSourceAnalysisCache = new Map<string, Promise<RouteSourceAnalysis>>();
@@ -766,6 +769,7 @@ export async function resolveAppRouterMiddleware(options: {
766
769
  }
767
770
 
768
771
  async function renderAppRequestInternal(options: RenderAppRequestOptions): Promise<Response> {
772
+ warnProductionRenderWithoutPrebuiltModules(options);
769
773
  const timing = createRenderTiming(options.logger);
770
774
  const clientRouteInferenceCache =
771
775
  options.clientRouteInferenceCache ?? createClientRouteInferenceCache();
@@ -2643,7 +2647,22 @@ function transformServerModule(options: {
2643
2647
  return cached;
2644
2648
  }
2645
2649
 
2646
- warnProductionDynamicServerTransform();
2650
+ // Only renders that were handed a prebuild map can have a prebuild gap;
2651
+ // dev servers pass no serverModules and transform at request time by design.
2652
+ if (options.serverModules !== undefined) {
2653
+ warnProductionDynamicServerTransform(
2654
+ options.filename,
2655
+ options.serverOutput,
2656
+ artifact === undefined
2657
+ ? "no prebuilt server module for this output mode"
2658
+ : !prebuiltServerModuleOutputOptionsMatch(
2659
+ artifact,
2660
+ options.serverAwaitHydration === true ? { serverAwaitHydration: true } : {},
2661
+ )
2662
+ ? `serverAwaitHydration mismatch (artifact=${artifact.metadata?.serverAwaitHydration === true}, requested=${options.serverAwaitHydration === true})`
2663
+ : "stale prebuilt server module (source hash changed)",
2664
+ );
2665
+ }
2647
2666
 
2648
2667
  const output = transform({
2649
2668
  code: options.code,
@@ -2674,14 +2693,60 @@ function transformServerModule(options: {
2674
2693
 
2675
2694
  export const __transformServerModuleForTesting = transformServerModule;
2676
2695
 
2677
- function warnProductionDynamicServerTransform(): void {
2678
- if (process.env.NODE_ENV !== "production" || productionDynamicServerTransformWarned) {
2696
+ let productionRenderWithoutPrebuiltModulesWarned = false;
2697
+
2698
+ export function __resetProductionRenderWarningsForTesting(): void {
2699
+ productionRenderWithoutPrebuiltModulesWarned = false;
2700
+ productionDynamicServerTransformWarned.clear();
2701
+ }
2702
+
2703
+ // Covers the deployment that forgot prebuilt modules entirely; per-module
2704
+ // gaps inside a provided prebuild map are reported by
2705
+ // warnProductionDynamicServerTransform with the affected file instead.
2706
+ export function __warnProductionRenderWithoutPrebuiltModulesForTesting(options: {
2707
+ dev?: boolean | undefined;
2708
+ serverModules?: ReadonlyMap<string, BuiltServerModuleArtifact> | undefined;
2709
+ }): void {
2710
+ warnProductionRenderWithoutPrebuiltModules(options);
2711
+ }
2712
+
2713
+ function warnProductionRenderWithoutPrebuiltModules(options: {
2714
+ dev?: boolean | undefined;
2715
+ serverModules?: ReadonlyMap<string, BuiltServerModuleArtifact> | undefined;
2716
+ }): void {
2717
+ if (
2718
+ process.env.NODE_ENV !== "production" ||
2719
+ options.dev === true ||
2720
+ options.serverModules !== undefined ||
2721
+ productionRenderWithoutPrebuiltModulesWarned
2722
+ ) {
2723
+ return;
2724
+ }
2725
+
2726
+ productionRenderWithoutPrebuiltModulesWarned = true;
2727
+ console.warn(
2728
+ "mreact router: production render without prebuilt serverModules. Request-time transforms use development compiler settings; pass the build output's serverModules (or set dev: true for dev servers).",
2729
+ );
2730
+ }
2731
+
2732
+ function warnProductionDynamicServerTransform(
2733
+ filename: string,
2734
+ serverOutput: ServerOutputMode,
2735
+ reason: string,
2736
+ ): void {
2737
+ if (process.env.NODE_ENV !== "production") {
2738
+ return;
2739
+ }
2740
+
2741
+ const warnedKey = `${filename}\0${serverOutput}`;
2742
+
2743
+ if (productionDynamicServerTransformWarned.has(warnedKey)) {
2679
2744
  return;
2680
2745
  }
2681
2746
 
2682
- productionDynamicServerTransformWarned = true;
2747
+ productionDynamicServerTransformWarned.add(warnedKey);
2683
2748
  console.warn(
2684
- "mreact router: dynamic server transform path ran in production. Production deployments should provide prebuilt serverModules; otherwise request-time transforms use development compiler settings.",
2749
+ `mreact router: dynamic server transform path ran in production for ${filename} (serverOutput=${serverOutput}): ${reason}. Production deployments should provide prebuilt serverModules; otherwise request-time transforms use development compiler settings.`,
2685
2750
  );
2686
2751
  }
2687
2752
 
package/src/vite.ts CHANGED
@@ -549,6 +549,7 @@ async function handleAppRouterViteRequest(
549
549
  await renderAppRequest({
550
550
  appDir: project.routesDir,
551
551
  define: options.define,
552
+ dev: true,
552
553
  importPolicy: {
553
554
  ...options.importPolicy,
554
555
  allowedSourceDirs: project.allowedSourceDirs,