@react-router/dev 0.0.0-experimental-13d6d438f → 0.0.0-experimental-9aebdc522

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 (39) hide show
  1. package/dist/cli/commands.js +1 -1
  2. package/dist/cli/detectPackageManager.js +1 -1
  3. package/dist/cli/index.js +1 -1
  4. package/dist/cli/run.js +1 -1
  5. package/dist/cli/useJavascript.js +1 -1
  6. package/dist/cli.js +1 -1
  7. package/dist/colors.js +1 -1
  8. package/dist/config/defaults/entry.client.rsc.tsx +119 -0
  9. package/dist/config/defaults/entry.react-server.node.tsx +19 -0
  10. package/dist/config/defaults/entry.react-server.web.tsx +13 -0
  11. package/dist/config/defaults/entry.server.node.rsc.tsx +164 -0
  12. package/dist/config/findConfig.js +1 -1
  13. package/dist/config/flatRoutes.js +1 -1
  14. package/dist/config/format.js +1 -1
  15. package/dist/config/routes.js +1 -1
  16. package/dist/config.d.ts +3 -23
  17. package/dist/config.js +27 -10
  18. package/dist/index.js +1 -1
  19. package/dist/invariant.js +1 -1
  20. package/dist/runtime.client.d.ts +1 -0
  21. package/dist/runtime.client.js +19 -0
  22. package/dist/vite/babel.js +1 -1
  23. package/dist/vite/build.js +24 -34
  24. package/dist/vite/cloudflare-proxy-plugin.js +1 -1
  25. package/dist/vite/dev.js +1 -1
  26. package/dist/vite/import-vite-esm-sync.js +1 -1
  27. package/dist/vite/index.js +1 -1
  28. package/dist/vite/node-adapter.js +1 -1
  29. package/dist/vite/plugin.d.ts +10 -0
  30. package/dist/vite/plugin.js +232 -19
  31. package/dist/vite/profiler.js +1 -1
  32. package/dist/vite/remove-exports.d.ts +3 -1
  33. package/dist/vite/remove-exports.js +18 -2
  34. package/dist/vite/resolve-file-url.js +1 -1
  35. package/dist/vite/styles.js +1 -1
  36. package/dist/vite/vmod.js +1 -1
  37. package/package.json +13 -7
  38. package/dist/config/defaults/entry.dev.d.ts +0 -2
  39. package/dist/config/defaults/entry.dev.ts +0 -13
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -149,26 +149,13 @@ async function cleanBuildDirectory(viteConfig, ctx) {
149
149
  }
150
150
  function getViteManifestPaths(ctx, serverBuilds) {
151
151
  let buildRelative = pathname => path__default["default"].resolve(ctx.reactRouterConfig.buildDirectory, pathname);
152
- let viteManifestPaths = [{
153
- srcPath: "client/.vite/manifest.json",
154
- destPath: ".vite/client-manifest.json"
155
- }, ...serverBuilds.map(({
152
+ let viteManifestPaths = ["client/.vite/manifest.json", ...serverBuilds.map(({
156
153
  serverBundleBuildConfig
157
154
  }) => {
158
155
  let serverBundleId = serverBundleBuildConfig === null || serverBundleBuildConfig === void 0 ? void 0 : serverBundleBuildConfig.serverBundleId;
159
156
  let serverBundlePath = serverBundleId ? serverBundleId + "/" : "";
160
- let serverBundleSuffix = serverBundleId ? serverBundleId + "-" : "";
161
- return {
162
- srcPath: `server/${serverBundlePath}.vite/manifest.json`,
163
- destPath: `.vite/server-${serverBundleSuffix}manifest.json`
164
- };
165
- })].map(({
166
- srcPath,
167
- destPath
168
- }) => ({
169
- srcPath: buildRelative(srcPath),
170
- destPath: buildRelative(destPath)
171
- }));
157
+ return `server/${serverBundlePath}.vite/manifest.json`;
158
+ })].map(srcPath => buildRelative(srcPath));
172
159
  return viteManifestPaths;
173
160
  }
174
161
  async function build(root, {
@@ -227,7 +214,16 @@ async function build(root, {
227
214
  });
228
215
  }
229
216
  await cleanBuildDirectory(viteConfig, ctx);
230
- // Run the Vite client build first
217
+ // Then run React server build first
218
+ if (reactRouterConfig.future.unstable_serverComponents) {
219
+ // TODO: This will be handled by the vite env API in the future
220
+ process.env.REACT_SERVER_BUILD = "1";
221
+ await viteBuild({
222
+ ssr: true
223
+ });
224
+ }
225
+ process.env.REACT_SERVER_BUILD = "";
226
+ // Run the Vite client build second
231
227
  await viteBuild({
232
228
  ssr: false
233
229
  });
@@ -238,35 +234,29 @@ async function build(root, {
238
234
  } = await getServerBuilds(ctx);
239
235
  await Promise.all(serverBuilds.map(viteBuild));
240
236
  let viteManifestPaths = getViteManifestPaths(ctx, serverBuilds);
241
- await Promise.all(viteManifestPaths.map(async ({
242
- srcPath,
243
- destPath
244
- }) => {
245
- let manifestExists = await fse__default["default"].pathExists(srcPath);
237
+ await Promise.all(viteManifestPaths.map(async viteManifestPath => {
238
+ let manifestExists = await fse__default["default"].pathExists(viteManifestPath);
246
239
  if (!manifestExists) return;
247
- // Move/delete original Vite manifest file
248
- if (ctx.viteManifestEnabled) {
249
- await fse__default["default"].ensureDir(path__default["default"].dirname(destPath));
250
- await fse__default["default"].move(srcPath, destPath);
251
- } else {
252
- await fse__default["default"].remove(srcPath);
240
+ // Delete original Vite manifest file if consumer doesn't want it
241
+ if (!ctx.viteManifestEnabled) {
242
+ await fse__default["default"].remove(viteManifestPath);
253
243
  }
254
244
  // Remove .vite dir if it's now empty
255
- let viteDir = path__default["default"].dirname(srcPath);
245
+ let viteDir = path__default["default"].dirname(viteManifestPath);
256
246
  let viteDirFiles = await fse__default["default"].readdir(viteDir);
257
247
  if (viteDirFiles.length === 0) {
258
248
  await fse__default["default"].remove(viteDir);
259
249
  }
260
250
  }));
261
- if (ctx.reactRouterConfig.manifest) {
262
- await fse__default["default"].ensureDir(path__default["default"].join(ctx.reactRouterConfig.buildDirectory, ".react-router"));
263
- await fse__default["default"].writeFile(path__default["default"].join(ctx.reactRouterConfig.buildDirectory, ".react-router", "manifest.json"), JSON.stringify(buildManifest, null, 2), "utf-8");
264
- }
265
251
  await ((_reactRouterConfig$bu = reactRouterConfig.buildEnd) === null || _reactRouterConfig$bu === void 0 ? void 0 : _reactRouterConfig$bu.call(reactRouterConfig, {
266
252
  buildManifest,
267
253
  reactRouterConfig,
268
254
  viteConfig
269
255
  }));
256
+ const {
257
+ serverModules
258
+ } = plugin.getReactServerOptions();
259
+ invariant["default"](!serverModules.size, "`use server` is not yet supported.");
270
260
  }
271
261
 
272
262
  exports.build = build;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/vite/dev.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -59,7 +59,9 @@ type ReactRouterPluginSsrBuildContext = {
59
59
  export type ReactRouterPluginContext = ReactRouterPluginSsrBuildContext & {
60
60
  rootDirectory: string;
61
61
  entryClientFilePath: string;
62
+ entryReactServerFilePath?: string;
62
63
  entryServerFilePath: string;
64
+ publicPath: string;
63
65
  reactRouterConfig: ResolvedVitePluginConfig;
64
66
  viteManifestEnabled: boolean;
65
67
  };
@@ -68,4 +70,12 @@ type MaybePromise<T> = T | Promise<T>;
68
70
  export declare let setReactRouterDevLoadContext: (loadContext: (request: Request) => MaybePromise<Record<string, unknown>>) => void;
69
71
  export type ReactRouterVitePlugin = (config?: VitePluginConfig) => Vite.Plugin[];
70
72
  export declare const reactRouterVitePlugin: ReactRouterVitePlugin;
73
+ declare global {
74
+ var __clientModules: Set<string>;
75
+ var __serverModules: Set<string>;
76
+ }
77
+ export declare function getReactServerOptions(): {
78
+ clientModules: Set<string>;
79
+ serverModules: Set<string>;
80
+ };
71
81
  export {};
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -22,6 +22,7 @@ var reactRouter = require('react-router');
22
22
  var esModuleLexer = require('es-module-lexer');
23
23
  var jsesc = require('jsesc');
24
24
  var colors = require('picocolors');
25
+ var unpluginRsc = require('unplugin-rsc');
25
26
  var findConfig = require('../config/findConfig.js');
26
27
  var invariant = require('../invariant.js');
27
28
  var nodeAdapter = require('./node-adapter.js');
@@ -118,13 +119,16 @@ let serverManifestId = vmod.id("server-manifest");
118
119
  let browserManifestId = vmod.id("browser-manifest");
119
120
  let hmrRuntimeId = vmod.id("hmr-runtime");
120
121
  let injectHmrRuntimeId = vmod.id("inject-hmr-runtime");
122
+ let reactServerBuildId = vmod.id("react-server-build");
123
+ let clientReferencesId = vmod.id("client-references");
124
+ let serverReferencesId = vmod.id("server-references");
121
125
  const resolveRelativeRouteFilePath = (route, reactRouterConfig) => {
122
126
  let vite = importViteEsmSync.importViteEsmSync();
123
127
  let file = route.file;
124
128
  let fullPath = path__namespace.resolve(reactRouterConfig.appDirectory, file);
125
129
  return vite.normalizePath(fullPath);
126
130
  };
127
- let vmods = [serverBuildId, serverManifestId, browserManifestId];
131
+ let vmods = [serverBuildId, serverManifestId, browserManifestId, reactServerBuildId, clientReferencesId, serverReferencesId];
128
132
  const invalidateVirtualModules = viteDevServer => {
129
133
  vmods.forEach(vmod$1 => {
130
134
  let mod = viteDevServer.moduleGraph.getModuleById(vmod.resolve(vmod$1));
@@ -153,12 +157,12 @@ const getReactRouterManifestBuildAssets = (ctx, viteManifest, entryFilePath, pre
153
157
  let prependedAssetChunks = prependedAssetFilePaths.map(filePath => resolveChunk(ctx, viteManifest, filePath));
154
158
  let chunks = resolveDependantChunks(viteManifest, [...prependedAssetChunks, entryChunk]);
155
159
  return {
156
- module: `${ctx.reactRouterConfig.publicPath}${entryChunk.file}`,
160
+ module: `${ctx.publicPath}${entryChunk.file}`,
157
161
  imports: dedupe(chunks.flatMap(e => e.imports ?? [])).map(imported => {
158
- return `${ctx.reactRouterConfig.publicPath}${viteManifest[imported].file}`;
162
+ return `${ctx.publicPath}${viteManifest[imported].file}`;
159
163
  }) ?? [],
160
164
  css: dedupe(chunks.flatMap(e => e.css ?? [])).map(href => {
161
- return `${ctx.reactRouterConfig.publicPath}${href}`;
165
+ return `${ctx.publicPath}${href}`;
162
166
  }) ?? []
163
167
  };
164
168
  };
@@ -233,6 +237,7 @@ const getServerBundleBuildConfig = viteUserConfig => {
233
237
  return viteUserConfig.__reactRouterServerBundleBuildConfig;
234
238
  };
235
239
  let getServerBuildDirectory = ctx => path__namespace.join(ctx.reactRouterConfig.buildDirectory, "server", ...(ctx.serverBundleBuildConfig ? [ctx.serverBundleBuildConfig.serverBundleId] : []));
240
+ let getReactServerBuildDirectory = reactRouterConfig => path__namespace.join(reactRouterConfig.buildDirectory, "react-server");
236
241
  let getClientBuildDirectory = reactRouterConfig => path__namespace.join(reactRouterConfig.buildDirectory, "client");
237
242
  let defaultEntriesDir = path__namespace.resolve(__dirname, "..", "config", "defaults");
238
243
  let defaultEntries = fse__namespace.readdirSync(defaultEntriesDir).map(filename => path__namespace.join(defaultEntriesDir, filename));
@@ -280,11 +285,13 @@ const reactRouterVitePlugin = _config => {
280
285
  });
281
286
  let {
282
287
  entryClientFilePath,
288
+ entryReactServerFilePath,
283
289
  entryServerFilePath
284
290
  } = await config.resolveEntryFiles({
285
291
  rootDirectory,
286
292
  reactRouterConfig
287
293
  });
294
+ let publicPath = config.resolvePublicPath(viteUserConfig);
288
295
  let viteManifestEnabled = ((_viteUserConfig$build = viteUserConfig.build) === null || _viteUserConfig$build === void 0 ? void 0 : _viteUserConfig$build.manifest) === true;
289
296
  let ssrBuildCtx = viteConfigEnv.isSsrBuild && viteCommand === "build" ? {
290
297
  isSsrBuild: true,
@@ -297,7 +304,9 @@ const reactRouterVitePlugin = _config => {
297
304
  reactRouterConfig,
298
305
  rootDirectory,
299
306
  entryClientFilePath,
307
+ entryReactServerFilePath,
300
308
  entryServerFilePath,
309
+ publicPath,
301
310
  viteManifestEnabled,
302
311
  ...ssrBuildCtx
303
312
  };
@@ -314,7 +323,7 @@ const reactRouterVitePlugin = _config => {
314
323
  ctx.serverBundleBuildConfig.routes :
315
324
  // Otherwise, all routes are imported as usual
316
325
  ctx.reactRouterConfig.routes;
317
- return `
326
+ let code = `
318
327
  import * as entryServer from ${JSON.stringify(resolveFileUrl.resolveFileUrl(ctx, ctx.entryServerFilePath))};
319
328
  ${Object.keys(routes).map((key, index) => {
320
329
  let route = routes[key];
@@ -325,7 +334,7 @@ const reactRouterVitePlugin = _config => {
325
334
  export const basename = ${JSON.stringify(ctx.reactRouterConfig.basename)};
326
335
  export const future = ${JSON.stringify(ctx.reactRouterConfig.future)};
327
336
  export const isSpaMode = ${!ctx.reactRouterConfig.ssr && ctx.reactRouterConfig.prerender == null};
328
- export const publicPath = ${JSON.stringify(ctx.reactRouterConfig.publicPath)};
337
+ export const publicPath = ${JSON.stringify(ctx.publicPath)};
329
338
  export const entry = { module: entryServer };
330
339
  export const routes = {
331
340
  ${Object.keys(routes).map((key, index) => {
@@ -340,6 +349,61 @@ const reactRouterVitePlugin = _config => {
340
349
  }`;
341
350
  }).join(",\n ")}
342
351
  };`;
352
+ if (ctx.reactRouterConfig.future.unstable_serverComponents) {
353
+ code += `
354
+ export { default as clientReferences } from ${JSON.stringify(clientReferencesId)};`;
355
+ }
356
+ return code;
357
+ };
358
+ let {
359
+ clientModules,
360
+ serverModules
361
+ } = getReactServerOptions();
362
+ let getReactServerEntry = () => {
363
+ invariant["default"](viteConfig, "viteconfig required to generate the react-server entry");
364
+ invariant["default"](ctx.entryReactServerFilePath, "entryReactServerFilePath required to generate the react-server entry");
365
+ let routes = ctx.serverBundleBuildConfig ?
366
+ // For server bundle builds, the server build should only import the
367
+ // routes for this bundle rather than importing all routes
368
+ ctx.serverBundleBuildConfig.routes :
369
+ // Otherwise, all routes are imported as usual
370
+ ctx.reactRouterConfig.routes;
371
+ return `
372
+ import * as entryServer from ${JSON.stringify(resolveFileUrl.resolveFileUrl(ctx, ctx.entryReactServerFilePath))};
373
+ ${Object.keys(routes).map((key, index) => {
374
+ let route = routes[key];
375
+ return `import * as route${index} from ${JSON.stringify(resolveFileUrl.resolveFileUrl(ctx, resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)))};`;
376
+ }).join("\n")}
377
+ export const future = ${JSON.stringify(ctx.reactRouterConfig.future)};
378
+ export const basename = ${JSON.stringify(ctx.reactRouterConfig.basename)};
379
+ export const entry = { module: entryServer };
380
+ export const routes = {
381
+ ${Object.keys(routes).map((key, index) => {
382
+ let route = routes[key];
383
+ return `${JSON.stringify(key)}: {
384
+ id: ${JSON.stringify(route.id)},
385
+ parentId: ${JSON.stringify(route.parentId)},
386
+ path: ${JSON.stringify(route.path)},
387
+ index: ${JSON.stringify(route.index)},
388
+ caseSensitive: ${JSON.stringify(route.caseSensitive)},
389
+ module: route${index}
390
+ }`;
391
+ }).join(",\n ")}
392
+ };`;
393
+ };
394
+ let getClientReferencesEntry = () => {
395
+ let result = "export default {";
396
+ for (let clientModule of clientModules) {
397
+ result += `${JSON.stringify(prodHash(clientModule))}: () => import(${JSON.stringify(clientModule)}),`;
398
+ }
399
+ return `${result}};`;
400
+ };
401
+ let getServerReferencesEntry = () => {
402
+ let result = "export default {";
403
+ for (let serverModule of serverModules) {
404
+ result += `${JSON.stringify(prodHash(serverModule))}: () => import(${JSON.stringify(serverModule)}),`;
405
+ }
406
+ return `${result}\};`;
343
407
  };
344
408
  let loadViteManifest = async directory => {
345
409
  let manifestContents = await fse__namespace.readFile(path__namespace.resolve(directory, ".vite", "manifest.json"), "utf-8");
@@ -397,7 +461,7 @@ const reactRouterVitePlugin = _config => {
397
461
  };
398
462
  let version = getHash(JSON.stringify(fingerprintedValues), 8);
399
463
  let manifestPath = path__namespace.posix.join(viteConfig.build.assetsDir, `manifest-${version}.js`);
400
- let url = `${ctx.reactRouterConfig.publicPath}${manifestPath}`;
464
+ let url = `${ctx.publicPath}${manifestPath}`;
401
465
  let nonFingerprintedValues = {
402
466
  url,
403
467
  version
@@ -432,7 +496,7 @@ const reactRouterVitePlugin = _config => {
432
496
  path: route.path,
433
497
  index: route.index,
434
498
  caseSensitive: route.caseSensitive,
435
- module: path__namespace.posix.join(ctx.reactRouterConfig.publicPath, `${resolveFileUrl.resolveFileUrl(ctx, resolveRelativeRouteFilePath(route, ctx.reactRouterConfig))}`),
499
+ module: path__namespace.posix.join(ctx.publicPath, `${resolveFileUrl.resolveFileUrl(ctx, resolveRelativeRouteFilePath(route, ctx.reactRouterConfig))}`),
436
500
  hasAction: sourceExports.includes("action"),
437
501
  hasLoader: sourceExports.includes("loader"),
438
502
  hasClientAction: sourceExports.includes("clientAction"),
@@ -443,12 +507,12 @@ const reactRouterVitePlugin = _config => {
443
507
  }
444
508
  return {
445
509
  version: String(Math.random()),
446
- url: path__namespace.posix.join(ctx.reactRouterConfig.publicPath, vmod.url(browserManifestId)),
510
+ url: path__namespace.posix.join(ctx.publicPath, vmod.url(browserManifestId)),
447
511
  hmr: {
448
- runtime: path__namespace.posix.join(ctx.reactRouterConfig.publicPath, vmod.url(injectHmrRuntimeId))
512
+ runtime: path__namespace.posix.join(ctx.publicPath, vmod.url(injectHmrRuntimeId))
449
513
  },
450
514
  entry: {
451
- module: path__namespace.posix.join(ctx.reactRouterConfig.publicPath, resolveFileUrl.resolveFileUrl(ctx, ctx.entryClientFilePath)),
515
+ module: path__namespace.posix.join(ctx.publicPath, resolveFileUrl.resolveFileUrl(ctx, ctx.entryClientFilePath)),
452
516
  imports: []
453
517
  },
454
518
  routes
@@ -538,9 +602,9 @@ const reactRouterVitePlugin = _config => {
538
602
  rollupOptions: {
539
603
  ...baseRollupOptions,
540
604
  preserveEntrySignatures: "exports-only",
541
- input: [ctx.entryClientFilePath, ...Object.values(ctx.reactRouterConfig.routes).map(route => `${path__namespace.resolve(ctx.reactRouterConfig.appDirectory, route.file)}${BUILD_CLIENT_ROUTE_QUERY_STRING}`)]
605
+ input: [ctx.entryClientFilePath, ...Object.values(ctx.reactRouterConfig.routes).map(route => `${path__namespace.resolve(ctx.reactRouterConfig.appDirectory, route.file)}${BUILD_CLIENT_ROUTE_QUERY_STRING}`), ...(ctx.reactRouterConfig.future.unstable_serverComponents ? clientModules : [])]
542
606
  }
543
- } : {
607
+ } : !ctx.reactRouterConfig.future.unstable_serverComponents || !process.env.REACT_SERVER_BUILD ? {
544
608
  // We move SSR-only assets to client assets. Note that the
545
609
  // SSR build can also emit code-split JS files (e.g. by
546
610
  // dynamic import) under the same assets directory
@@ -561,6 +625,28 @@ const reactRouterVitePlugin = _config => {
561
625
  format: ctx.reactRouterConfig.serverModuleFormat
562
626
  }
563
627
  }
628
+ } : {
629
+ // We move SSR-only assets to client assets. Note that the
630
+ // SSR build can also emit code-split JS files (e.g. by
631
+ // dynamic import) under the same assets directory
632
+ // regardless of "ssrEmitAssets" option, so we also need to
633
+ // keep these JS files have to be kept as-is.
634
+ ssrEmitAssets: true,
635
+ copyPublicDir: false,
636
+ // Assets in the public directory are only used by the client
637
+ manifest: true,
638
+ // We need the manifest to detect SSR-only assets
639
+ outDir: getReactServerBuildDirectory(ctx.reactRouterConfig),
640
+ rollupOptions: {
641
+ ...baseRollupOptions,
642
+ preserveEntrySignatures: "exports-only",
643
+ // TODO: Add server references (serverModules) to input
644
+ input: reactServerBuildId,
645
+ output: {
646
+ entryFileNames: ctx.reactRouterConfig.serverBuildFile,
647
+ format: ctx.reactRouterConfig.serverModuleFormat
648
+ }
649
+ }
564
650
  })
565
651
  }
566
652
  } : undefined),
@@ -714,7 +800,7 @@ const reactRouterVitePlugin = _config => {
714
800
  // After the SSR build is finished, we inspect the Vite manifest for
715
801
  // the SSR build and move server-only assets to client assets directory
716
802
  async handler() {
717
- if (!ctx.isSsrBuild) {
803
+ if (!ctx.isSsrBuild || process.env.REACT_SERVER_BUILD) {
718
804
  return;
719
805
  }
720
806
  invariant["default"](viteConfig);
@@ -798,6 +884,18 @@ const reactRouterVitePlugin = _config => {
798
884
  });
799
885
  return `window.__remixManifest=${reactRouterManifestString};`;
800
886
  }
887
+ case vmod.resolve(reactServerBuildId):
888
+ {
889
+ return getReactServerEntry();
890
+ }
891
+ case vmod.resolve(clientReferencesId):
892
+ {
893
+ return getClientReferencesEntry();
894
+ }
895
+ case vmod.resolve(serverReferencesId):
896
+ {
897
+ return getServerReferencesEntry();
898
+ }
801
899
  }
802
900
  }
803
901
  }, {
@@ -853,9 +951,20 @@ const reactRouterVitePlugin = _config => {
853
951
  }, {
854
952
  name: "react-router-route-exports",
855
953
  async transform(code, id, options) {
856
- if (options !== null && options !== void 0 && options.ssr) return;
954
+ var _ctx;
955
+ if (options !== null && options !== void 0 && options.ssr && !((_ctx = ctx) !== null && _ctx !== void 0 && _ctx.reactRouterConfig.future.unstable_serverComponents)) {
956
+ return;
957
+ }
857
958
  let route = getRoute(ctx.reactRouterConfig, id);
858
959
  if (!route) return;
960
+ let [filepath] = id.split("?");
961
+ if (ctx.reactRouterConfig.future.unstable_serverComponents && process.env.REACT_SERVER_BUILD) {
962
+ return removeExports.removeExports(code, CLIENT_ROUTE_EXPORTS, {
963
+ sourceMaps: true,
964
+ filename: id,
965
+ sourceFileName: filepath
966
+ });
967
+ }
859
968
  if (!ctx.reactRouterConfig.ssr) {
860
969
  let serverOnlyExports = esModuleLexer.parse(code)[1].map(exp => exp.n).filter(exp => SERVER_ONLY_ROUTE_EXPORTS.includes(exp));
861
970
  if (serverOnlyExports.length > 0) {
@@ -871,7 +980,6 @@ const reactRouterVitePlugin = _config => {
871
980
  }
872
981
  }
873
982
  }
874
- let [filepath] = id.split("?");
875
983
  return removeExports.removeExports(code, SERVER_ONLY_ROUTE_EXPORTS, {
876
984
  sourceMaps: true,
877
985
  filename: id,
@@ -967,6 +1075,88 @@ const reactRouterVitePlugin = _config => {
967
1075
  });
968
1076
  return modules;
969
1077
  }
1078
+ }, {
1079
+ name: "remix:react-server",
1080
+ config() {
1081
+ const env = process.env.REACT_SERVER_BUILD ? "server" : "client";
1082
+ switch (env) {
1083
+ case "client":
1084
+ return {
1085
+ optimizeDeps: {
1086
+ include: ["react", "react/jsx-runtime", "react/jsx-dev-runtime", "react-server-dom-diy/client"]
1087
+ }
1088
+ };
1089
+ case "server":
1090
+ return {
1091
+ optimizeDeps: {
1092
+ include: ["react", "react/jsx-runtime", "react/jsx-dev-runtime", "react-server-dom-diy/server"]
1093
+ },
1094
+ resolve: {
1095
+ conditions: ["react-server"]
1096
+ },
1097
+ ssr: {
1098
+ noExternal: ["react", "react/jsx-runtime", "react/jsx-dev-runtime", "react-server-dom-diy/server"],
1099
+ optimizeDeps: {
1100
+ include: ["react", "react/jsx-runtime", "react/jsx-dev-runtime", "react-server-dom-diy/server"]
1101
+ },
1102
+ resolve: {
1103
+ conditions: ["react-server"],
1104
+ externalConditions: ["react-server"]
1105
+ }
1106
+ }
1107
+ };
1108
+ }
1109
+ },
1110
+ configResolved(resolvedViteConfig) {
1111
+ viteConfig = resolvedViteConfig;
1112
+ invariant["default"](viteConfig);
1113
+ },
1114
+ transform(...args) {
1115
+ invariant["default"](viteConfig);
1116
+ const env = process.env.REACT_SERVER_BUILD ? "server" : "client";
1117
+ let hash = viteConfig.mode !== "production" ? devHash : prodHash;
1118
+ switch (env) {
1119
+ case "client":
1120
+ return unpluginRsc.rscClientPlugin.vite({
1121
+ include: ["**/*"],
1122
+ transformModuleId: hash,
1123
+ useServerRuntime: {
1124
+ function: "createServerReference",
1125
+ module: "@react-router/dev/dist/runtime.client.js"
1126
+ },
1127
+ onModuleFound(id, type) {
1128
+ switch (type) {
1129
+ case "use server":
1130
+ serverModules.add(id);
1131
+ break;
1132
+ }
1133
+ }
1134
+ }).transform.call(this, ...args);
1135
+ case "server":
1136
+ return unpluginRsc.rscServerPlugin.vite({
1137
+ include: ["**/*"],
1138
+ transformModuleId: hash,
1139
+ useClientRuntime: {
1140
+ function: "registerClientReference",
1141
+ module: "react-server-dom-diy/server"
1142
+ },
1143
+ useServerRuntime: {
1144
+ function: "registerServerReference",
1145
+ module: "react-server-dom-diy/server"
1146
+ },
1147
+ onModuleFound(id, type) {
1148
+ switch (type) {
1149
+ case "use client":
1150
+ clientModules.add(id);
1151
+ break;
1152
+ case "use server":
1153
+ serverModules.add(id);
1154
+ break;
1155
+ }
1156
+ }
1157
+ }).transform.call(this, ...args);
1158
+ }
1159
+ }
970
1160
  }];
971
1161
  };
972
1162
  function isInReactRouterMonorepo() {
@@ -1033,8 +1223,8 @@ async function getRouteMetadata(ctx, viteChildCompiler, route, readRouteFile) {
1033
1223
  path: route.path,
1034
1224
  index: route.index,
1035
1225
  caseSensitive: route.caseSensitive,
1036
- url: path__namespace.posix.join(ctx.reactRouterConfig.publicPath, "/" + path__namespace.relative(ctx.rootDirectory, resolveRelativeRouteFilePath(route, ctx.reactRouterConfig))),
1037
- module: path__namespace.posix.join(ctx.reactRouterConfig.publicPath, `${resolveFileUrl.resolveFileUrl(ctx, resolveRelativeRouteFilePath(route, ctx.reactRouterConfig))}?import`),
1226
+ url: path__namespace.posix.join(ctx.publicPath, "/" + path__namespace.relative(ctx.rootDirectory, resolveRelativeRouteFilePath(route, ctx.reactRouterConfig))),
1227
+ module: path__namespace.posix.join(ctx.publicPath, `${resolveFileUrl.resolveFileUrl(ctx, resolveRelativeRouteFilePath(route, ctx.reactRouterConfig))}?import`),
1038
1228
  // Ensure the Vite dev server responds with a JS module
1039
1229
  hasAction: sourceExports.includes("action"),
1040
1230
  hasClientAction: sourceExports.includes("clientAction"),
@@ -1165,8 +1355,31 @@ function createPrerenderRoutes(manifest, parentId = "", routesByParentId = group
1165
1355
  };
1166
1356
  });
1167
1357
  }
1358
+ function prodHash(str, _) {
1359
+ return `/${path__namespace.relative(process.cwd(), str)}`;
1360
+ }
1361
+ function devHash(str, _) {
1362
+ const resolved = path__namespace.resolve(str);
1363
+ let unixPath = resolved.replace(/\\/g, "/");
1364
+ if (!unixPath.startsWith("/")) {
1365
+ unixPath = `/${unixPath}`;
1366
+ }
1367
+ if (resolved.startsWith(process.cwd())) {
1368
+ return `/${path__namespace.relative(process.cwd(), unixPath)}`;
1369
+ }
1370
+ return `/@fs${unixPath}`;
1371
+ }
1372
+ global.__clientModules = global.__clientModules || new Set();
1373
+ global.__serverModules = global.__serverModules || new Set();
1374
+ function getReactServerOptions() {
1375
+ return {
1376
+ clientModules: global.__clientModules,
1377
+ serverModules: global.__serverModules
1378
+ };
1379
+ }
1168
1380
 
1169
1381
  exports.extractPluginContext = extractPluginContext;
1382
+ exports.getReactServerOptions = getReactServerOptions;
1170
1383
  exports.getServerBuildDirectory = getServerBuildDirectory;
1171
1384
  exports.loadPluginContext = loadPluginContext;
1172
1385
  exports.reactRouterVitePlugin = reactRouterVitePlugin;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,2 +1,4 @@
1
1
  import type { GeneratorOptions } from "@babel/generator";
2
- export declare const removeExports: (source: string, exportsToRemove: string[], generateOptions?: GeneratorOptions) => import("@babel/generator").GeneratorResult;
2
+ export declare const removeExports: (source: string, exportsToRemove: string[], generateOptions?: GeneratorOptions) => import("@babel/generator").GeneratorResult | {
3
+ code: string;
4
+ };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -179,6 +179,20 @@ const removeExports = (source, exportsToRemove, generateOptions = {}) => {
179
179
  if (shouldRemove) {
180
180
  path.remove();
181
181
  }
182
+ },
183
+ ExportDefaultDeclaration(path) {
184
+ if (exportsToRemove.includes("default")) {
185
+ removedExports.add("default");
186
+ path.remove();
187
+ return false;
188
+ }
189
+ },
190
+ ExportDefaultSpecifier(path) {
191
+ if (exportsToRemove.includes("default")) {
192
+ removedExports.add("default");
193
+ path.remove();
194
+ return false;
195
+ }
182
196
  }
183
197
  });
184
198
  if (removedExports.size === 0) {
@@ -272,7 +286,9 @@ const removeExports = (source, exportsToRemove, generateOptions = {}) => {
272
286
  ImportNamespaceSpecifier: sweepImport
273
287
  });
274
288
  } while (referencesRemovedInThisPass);
275
- return babel.generate(document, generateOptions);
289
+ return {
290
+ code: babel.generate(document, generateOptions).code + `\n${[...removedExports].map(exp => exp === "default" ? "export default 1;" : `export const ${exp} = 1;`).join("\n")}`
291
+ };
276
292
  };
277
293
 
278
294
  exports.removeExports = removeExports;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/vite/vmod.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *