@reckona/mreact-router 0.0.153 → 0.0.155

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
@@ -64,6 +64,7 @@ import {
64
64
  importAppRouterFileModule,
65
65
  importAppRouterSourceModule,
66
66
  fileImportMetaUrlPlugin,
67
+ rewriteCompatVendorPlaceholderImportsForRunner,
67
68
  } from "./module-runner.js";
68
69
  import { bytesResponse, htmlResponse } from "./http.js";
69
70
  import { isNotFoundError, isRedirectError, rewriteLocation } from "./navigation.js";
@@ -185,6 +186,9 @@ export interface RenderAppRequestOptions {
185
186
  routes?: readonly AppRoute[] | undefined;
186
187
  serverModules?: ReadonlyMap<string, BuiltServerModuleArtifact> | undefined;
187
188
  serverModuleCacheVersion?: string | undefined;
189
+ // True when serving through a dev server: request-time server transforms
190
+ // are expected there and must not trigger the production prebuild warning.
191
+ dev?: boolean | undefined;
188
192
  serverSourceFiles?: ReadonlyMap<string, string> | undefined;
189
193
  serverActions?: AppRouterServerActionOptions | undefined;
190
194
  serverActionReferencesByFile?:
@@ -479,7 +483,7 @@ type StreamModuleExports = Record<string, unknown> & {
479
483
 
480
484
  const serverTransformCache = new Map<string, TransformOutput>();
481
485
  const serverTransformCacheCounters = createRouterRuntimeCacheCounters();
482
- let productionDynamicServerTransformWarned = false;
486
+ const productionDynamicServerTransformWarned = new Set<string>();
483
487
  const serverSourceFileCache = new Map<string, Promise<string>>();
484
488
  const serverSourceFileCacheCounters = createRouterRuntimeCacheCounters();
485
489
  const routeSourceAnalysisCache = new Map<string, Promise<RouteSourceAnalysis>>();
@@ -766,6 +770,7 @@ export async function resolveAppRouterMiddleware(options: {
766
770
  }
767
771
 
768
772
  async function renderAppRequestInternal(options: RenderAppRequestOptions): Promise<Response> {
773
+ warnProductionRenderWithoutPrebuiltModules(options);
769
774
  const timing = createRenderTiming(options.logger);
770
775
  const clientRouteInferenceCache =
771
776
  options.clientRouteInferenceCache ?? createClientRouteInferenceCache();
@@ -2643,7 +2648,22 @@ function transformServerModule(options: {
2643
2648
  return cached;
2644
2649
  }
2645
2650
 
2646
- warnProductionDynamicServerTransform();
2651
+ // Only renders that were handed a prebuild map can have a prebuild gap;
2652
+ // dev servers pass no serverModules and transform at request time by design.
2653
+ if (options.serverModules !== undefined) {
2654
+ warnProductionDynamicServerTransform(
2655
+ options.filename,
2656
+ options.serverOutput,
2657
+ artifact === undefined
2658
+ ? "no prebuilt server module for this output mode"
2659
+ : !prebuiltServerModuleOutputOptionsMatch(
2660
+ artifact,
2661
+ options.serverAwaitHydration === true ? { serverAwaitHydration: true } : {},
2662
+ )
2663
+ ? `serverAwaitHydration mismatch (artifact=${artifact.metadata?.serverAwaitHydration === true}, requested=${options.serverAwaitHydration === true})`
2664
+ : "stale prebuilt server module (source hash changed)",
2665
+ );
2666
+ }
2647
2667
 
2648
2668
  const output = transform({
2649
2669
  code: options.code,
@@ -2674,14 +2694,60 @@ function transformServerModule(options: {
2674
2694
 
2675
2695
  export const __transformServerModuleForTesting = transformServerModule;
2676
2696
 
2677
- function warnProductionDynamicServerTransform(): void {
2678
- if (process.env.NODE_ENV !== "production" || productionDynamicServerTransformWarned) {
2697
+ let productionRenderWithoutPrebuiltModulesWarned = false;
2698
+
2699
+ export function __resetProductionRenderWarningsForTesting(): void {
2700
+ productionRenderWithoutPrebuiltModulesWarned = false;
2701
+ productionDynamicServerTransformWarned.clear();
2702
+ }
2703
+
2704
+ // Covers the deployment that forgot prebuilt modules entirely; per-module
2705
+ // gaps inside a provided prebuild map are reported by
2706
+ // warnProductionDynamicServerTransform with the affected file instead.
2707
+ export function __warnProductionRenderWithoutPrebuiltModulesForTesting(options: {
2708
+ dev?: boolean | undefined;
2709
+ serverModules?: ReadonlyMap<string, BuiltServerModuleArtifact> | undefined;
2710
+ }): void {
2711
+ warnProductionRenderWithoutPrebuiltModules(options);
2712
+ }
2713
+
2714
+ function warnProductionRenderWithoutPrebuiltModules(options: {
2715
+ dev?: boolean | undefined;
2716
+ serverModules?: ReadonlyMap<string, BuiltServerModuleArtifact> | undefined;
2717
+ }): void {
2718
+ if (
2719
+ process.env.NODE_ENV !== "production" ||
2720
+ options.dev === true ||
2721
+ options.serverModules !== undefined ||
2722
+ productionRenderWithoutPrebuiltModulesWarned
2723
+ ) {
2679
2724
  return;
2680
2725
  }
2681
2726
 
2682
- productionDynamicServerTransformWarned = true;
2727
+ productionRenderWithoutPrebuiltModulesWarned = true;
2683
2728
  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.",
2729
+ "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).",
2730
+ );
2731
+ }
2732
+
2733
+ function warnProductionDynamicServerTransform(
2734
+ filename: string,
2735
+ serverOutput: ServerOutputMode,
2736
+ reason: string,
2737
+ ): void {
2738
+ if (process.env.NODE_ENV !== "production") {
2739
+ return;
2740
+ }
2741
+
2742
+ const warnedKey = `${filename}\0${serverOutput}`;
2743
+
2744
+ if (productionDynamicServerTransformWarned.has(warnedKey)) {
2745
+ return;
2746
+ }
2747
+
2748
+ productionDynamicServerTransformWarned.add(warnedKey);
2749
+ console.warn(
2750
+ `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
2751
  );
2686
2752
  }
2687
2753
 
@@ -2887,7 +2953,8 @@ async function loadServerModule(
2887
2953
  serverModuleCacheVersion,
2888
2954
  });
2889
2955
  }
2890
- const moduleCode = prebuiltCode ?? code;
2956
+ const moduleCode =
2957
+ prebuiltCode === undefined ? code : rewriteCompatVendorPlaceholderImportsForRunner(prebuiltCode);
2891
2958
  const cacheKey =
2892
2959
  serverModuleCacheVersion === undefined
2893
2960
  ? undefined
@@ -3539,7 +3606,8 @@ async function loadServerStreamModule(
3539
3606
  serverModuleCacheVersion,
3540
3607
  });
3541
3608
  }
3542
- const moduleCode = prebuiltCode ?? code;
3609
+ const moduleCode =
3610
+ prebuiltCode === undefined ? code : rewriteCompatVendorPlaceholderImportsForRunner(prebuiltCode);
3543
3611
  const cacheKey =
3544
3612
  serverModuleCacheVersion === undefined
3545
3613
  ? undefined
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,