@react-router/dev 0.0.0-experimental-9c1812606 → 0.0.0-experimental-3278f3ca6

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 (53) hide show
  1. package/bin.js +1 -1
  2. package/dist/cli/commands.js +1 -1
  3. package/dist/cli/detectPackageManager.js +1 -1
  4. package/dist/cli/index.d.ts +1 -1
  5. package/dist/cli/index.js +7 -6
  6. package/dist/cli/run.js +1 -1
  7. package/dist/cli/useJavascript.js +1 -1
  8. package/dist/colors.js +1 -1
  9. package/dist/config/defaults/entry.client.tsx +1 -1
  10. package/dist/config/format.js +1 -1
  11. package/dist/config/routes.d.ts +77 -50
  12. package/dist/config/routes.js +175 -43
  13. package/dist/invariant.js +1 -1
  14. package/dist/routes.d.ts +2 -0
  15. package/dist/routes.js +23 -0
  16. package/dist/vite/babel.d.ts +10 -10
  17. package/dist/vite/babel.js +1 -1
  18. package/dist/vite/build.js +2 -2
  19. package/dist/vite/cloudflare-dev-proxy.d.ts +7 -1
  20. package/dist/vite/cloudflare-dev-proxy.js +14 -7
  21. package/dist/vite/cloudflare.d.ts +1 -0
  22. package/dist/vite/cloudflare.js +19 -0
  23. package/dist/vite/combine-urls.js +1 -1
  24. package/dist/{config.d.ts → vite/config.d.ts} +15 -24
  25. package/dist/{config.js → vite/config.js} +61 -39
  26. package/dist/vite/dev.js +1 -1
  27. package/dist/vite/import-vite-esm-sync.js +1 -1
  28. package/dist/vite/node-adapter.d.ts +1 -1
  29. package/dist/vite/node-adapter.js +7 -3
  30. package/dist/vite/plugin.d.ts +6 -3
  31. package/dist/vite/plugin.js +152 -103
  32. package/dist/vite/profiler.js +1 -1
  33. package/dist/vite/remove-exports.d.ts +2 -2
  34. package/dist/vite/remove-exports.js +113 -243
  35. package/dist/vite/resolve-file-url.js +1 -1
  36. package/dist/vite/static/refresh-utils.cjs +7 -26
  37. package/dist/vite/styles.d.ts +3 -2
  38. package/dist/vite/styles.js +23 -2
  39. package/dist/vite/vmod.js +1 -1
  40. package/dist/vite/with-props.d.ts +4 -0
  41. package/dist/vite/with-props.js +151 -0
  42. package/dist/vite.d.ts +2 -0
  43. package/dist/{cli.js → vite.js} +7 -8
  44. package/package.json +21 -12
  45. package/dist/cli.d.ts +0 -1
  46. package/dist/config/findConfig.d.ts +0 -1
  47. package/dist/config/findConfig.js +0 -32
  48. package/dist/config/flatRoutes.d.ts +0 -14
  49. package/dist/config/flatRoutes.js +0 -418
  50. package/dist/index.d.ts +0 -5
  51. package/dist/index.js +0 -23
  52. package/dist/vite/define-route.d.ts +0 -5
  53. package/dist/vite/define-route.js +0 -207
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-9c1812606
2
+ * @react-router/dev v0.0.0-experimental-3278f3ca6
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -15,14 +15,17 @@ Object.defineProperty(exports, '__esModule', { value: true });
15
15
  var node_crypto = require('node:crypto');
16
16
  var path = require('node:path');
17
17
  var url = require('node:url');
18
+ var server = require('vite-node/server');
19
+ var client = require('vite-node/client');
20
+ var sourceMap = require('vite-node/source-map');
18
21
  var fse = require('fs-extra');
19
- var babel = require('@babel/core');
22
+ var babel$1 = require('@babel/core');
20
23
  var reactRouter = require('react-router');
21
24
  var esModuleLexer = require('es-module-lexer');
22
25
  var jsesc = require('jsesc');
23
26
  var colors = require('picocolors');
24
- var findConfig = require('../config/findConfig.js');
25
27
  var invariant = require('../invariant.js');
28
+ var babel = require('./babel.js');
26
29
  var nodeAdapter = require('./node-adapter.js');
27
30
  var styles = require('./styles.js');
28
31
  var vmod = require('./vmod.js');
@@ -30,8 +33,9 @@ var resolveFileUrl = require('./resolve-file-url.js');
30
33
  var combineUrls = require('./combine-urls.js');
31
34
  var removeExports = require('./remove-exports.js');
32
35
  var importViteEsmSync = require('./import-vite-esm-sync.js');
33
- var config = require('../config.js');
34
- var defineRoute = require('./define-route.js');
36
+ var config = require('./config.js');
37
+ var withProps = require('./with-props.js');
38
+ var parser = require('@babel/parser');
35
39
 
36
40
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
37
41
 
@@ -56,7 +60,7 @@ function _interopNamespace(e) {
56
60
  var path__namespace = /*#__PURE__*/_interopNamespace(path);
57
61
  var url__namespace = /*#__PURE__*/_interopNamespace(url);
58
62
  var fse__namespace = /*#__PURE__*/_interopNamespace(fse);
59
- var babel__default = /*#__PURE__*/_interopDefaultLegacy(babel);
63
+ var babel__default = /*#__PURE__*/_interopDefaultLegacy(babel$1);
60
64
  var jsesc__default = /*#__PURE__*/_interopDefaultLegacy(jsesc);
61
65
  var colors__default = /*#__PURE__*/_interopDefaultLegacy(colors);
62
66
 
@@ -91,7 +95,7 @@ async function loadPluginContext({
91
95
  if (!root) {
92
96
  root = process.env.REACT_ROUTER_ROOT || process.cwd();
93
97
  }
94
- configFile = configFile ?? findConfig.findConfig(root, "vite.config", [".ts", ".cts", ".mts", ".js", ".cjs", ".mjs"]);
98
+ configFile = configFile ?? findConfig(root, "vite.config", [".ts", ".cts", ".mts", ".js", ".cjs", ".mjs"]);
95
99
  if (!configFile) {
96
100
  console.error(colors__default["default"].red("Vite config file not found"));
97
101
  process.exit(1);
@@ -169,12 +173,12 @@ function resolveDependantChunks(viteManifest, entryChunks) {
169
173
  if (chunks.has(chunk)) {
170
174
  return;
171
175
  }
176
+ chunks.add(chunk);
172
177
  if (chunk.imports) {
173
178
  for (let importKey of chunk.imports) {
174
179
  walk(viteManifest[importKey]);
175
180
  }
176
181
  }
177
- chunks.add(chunk);
178
182
  }
179
183
  for (let entryChunk of entryChunks) {
180
184
  walk(entryChunk);
@@ -196,20 +200,6 @@ const getRouteManifestModuleExports = async (viteChildCompiler, ctx) => {
196
200
  return Object.fromEntries(entries);
197
201
  };
198
202
  const getRouteModuleExports = async (viteChildCompiler, ctx, routeFile, readRouteFile) => {
199
- let routePath = path__namespace.resolve(ctx.reactRouterConfig.appDirectory, routeFile);
200
- let code = await ((readRouteFile === null || readRouteFile === void 0 ? void 0 : readRouteFile()) ?? fse__namespace.readFile(routePath, "utf-8"));
201
- if (!code.includes("defineRoute")) {
202
- return _getRouteModuleExports(viteChildCompiler, ctx, routeFile, readRouteFile);
203
- }
204
- let renameFields = ["Component", "serverLoader", "actionLoader"];
205
- let fields = defineRoute.parseFields(code);
206
- let exports = fields.filter(exportName => !renameFields.includes(exportName));
207
- if (fields.includes("Component")) exports.push("default");
208
- if (fields.includes("serverLoader")) exports.push("loader");
209
- if (fields.includes("serverAction")) exports.push("action");
210
- return exports;
211
- };
212
- const _getRouteModuleExports = async (viteChildCompiler, ctx, routeFile, readRouteFile) => {
213
203
  if (!viteChildCompiler) {
214
204
  throw new Error("Vite child compiler not found");
215
205
  }
@@ -253,9 +243,6 @@ let defaultEntriesDir = path__namespace.resolve(__dirname, "..", "config", "defa
253
243
  let defaultEntries = fse__namespace.readdirSync(defaultEntriesDir).map(filename => path__namespace.join(defaultEntriesDir, filename));
254
244
  invariant["default"](defaultEntries.length > 0, "No default entries found");
255
245
  let reactRouterDevLoadContext = () => ({});
256
- let setReactRouterDevLoadContext = loadContext => {
257
- reactRouterDevLoadContext = loadContext;
258
- };
259
246
  // Inlined from https://github.com/jsdf/deep-freeze
260
247
  let deepFreeze = o => {
261
248
  Object.freeze(o);
@@ -268,6 +255,9 @@ let deepFreeze = o => {
268
255
  });
269
256
  return o;
270
257
  };
258
+ /**
259
+ * React Router [Vite plugin.](https://vitejs.dev/guide/using-plugins.html)
260
+ */
271
261
  const reactRouterVitePlugin = _config => {
272
262
  let reactRouterUserConfig = _config ?? {};
273
263
  // Prevent mutations to the user config
@@ -278,20 +268,32 @@ const reactRouterVitePlugin = _config => {
278
268
  let viteConfig;
279
269
  let cssModulesManifest = {};
280
270
  let viteChildCompiler = null;
271
+ let routeConfigViteServer = null;
272
+ let viteNodeRunner = null;
273
+ let ssrExternals = isInReactRouterMonorepo() ? [
274
+ // This is only needed within this repo because these packages
275
+ // are linked to a directory outside of node_modules so Vite
276
+ // treats them as internal code by default.
277
+ "react-router", "react-router-dom", "@react-router/architect", "@react-router/cloudflare", "@react-router/dev", "@react-router/express", "@react-router/node", "@react-router/serve"] : undefined;
281
278
  // This is initialized by `updatePluginContext` during Vite's `config`
282
279
  // hook, so most of the code can assume this defined without null check.
283
280
  // During dev, `updatePluginContext` is called again on every config file
284
281
  // change or route file addition/removal.
285
282
  let ctx;
286
283
  /** Mutates `ctx` as a side-effect */
287
- let updatePluginContext = async () => {
284
+ let updatePluginContext = async ({
285
+ routeConfigChanged = false
286
+ } = {}) => {
288
287
  var _viteUserConfig$build;
289
288
  let rootDirectory = viteUserConfig.root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
289
+ invariant["default"](viteNodeRunner);
290
290
  let reactRouterConfig = await config.resolveReactRouterConfig({
291
291
  rootDirectory,
292
292
  reactRouterUserConfig,
293
+ routeConfigChanged,
293
294
  viteUserConfig,
294
- viteCommand
295
+ viteCommand,
296
+ viteNodeRunner
295
297
  });
296
298
  let {
297
299
  entryClientFilePath,
@@ -362,9 +364,14 @@ const reactRouterVitePlugin = _config => {
362
364
  let manifestContents = await fse__namespace.readFile(path__namespace.resolve(directory, ".vite", "manifest.json"), "utf-8");
363
365
  return JSON.parse(manifestContents);
364
366
  };
365
- let getViteManifestFilePaths = viteManifest => {
366
- let filePaths = Object.values(viteManifest).map(chunk => chunk.file);
367
- return new Set(filePaths);
367
+ let hasDependency = name => {
368
+ try {
369
+ return Boolean(require.resolve(name, {
370
+ paths: [ctx.rootDirectory]
371
+ }));
372
+ } catch (err) {
373
+ return false;
374
+ }
368
375
  };
369
376
  let getViteManifestAssetPaths = viteManifest => {
370
377
  // Get .css?url imports and CSS entry points
@@ -482,6 +489,38 @@ const reactRouterVitePlugin = _config => {
482
489
  viteUserConfig = _viteUserConfig;
483
490
  viteConfigEnv = _viteConfigEnv;
484
491
  viteCommand = viteConfigEnv.command;
492
+ routeConfigViteServer = await vite.createServer({
493
+ mode: viteConfigEnv.mode,
494
+ server: {
495
+ watch: viteCommand === "build" ? null : undefined,
496
+ preTransformRequests: false,
497
+ hmr: false
498
+ },
499
+ ssr: {
500
+ external: ssrExternals
501
+ },
502
+ optimizeDeps: {
503
+ noDiscovery: true
504
+ },
505
+ configFile: false,
506
+ envFile: false,
507
+ plugins: []
508
+ });
509
+ await routeConfigViteServer.pluginContainer.buildStart({});
510
+ let viteNodeServer = new server.ViteNodeServer(routeConfigViteServer);
511
+ sourceMap.installSourcemapsSupport({
512
+ getSourceMap: source => viteNodeServer.getSourceMap(source)
513
+ });
514
+ viteNodeRunner = new client.ViteNodeRunner({
515
+ root: routeConfigViteServer.config.root,
516
+ base: routeConfigViteServer.config.base,
517
+ fetchModule(id) {
518
+ return viteNodeServer.fetchModule(id);
519
+ },
520
+ resolveId(id, importer) {
521
+ return viteNodeServer.resolveId(id, importer);
522
+ }
523
+ });
485
524
  await updatePluginContext();
486
525
  Object.assign(process.env, vite.loadEnv(viteConfigEnv.mode, ctx.rootDirectory,
487
526
  // We override default prefix of "VITE_" with a blank string since
@@ -507,11 +546,7 @@ const reactRouterVitePlugin = _config => {
507
546
  __reactRouterPluginContext: ctx,
508
547
  appType: viteCommand === "serve" && viteConfigEnv.mode === "production" && ctx.reactRouterConfig.ssr === false ? "spa" : "custom",
509
548
  ssr: {
510
- external: isInReactRouterMonorepo() ? [
511
- // This is only needed within this repo because these packages
512
- // are linked to a directory outside of node_modules so Vite
513
- // treats them as internal code by default.
514
- "react-router", "react-router-dom", "@react-router/cloudflare", "@react-router/dev", "@react-router/express", "@react-router/node", "@react-router/serve"] : undefined
549
+ external: ssrExternals
515
550
  },
516
551
  optimizeDeps: {
517
552
  include: [
@@ -521,7 +556,9 @@ const reactRouterVitePlugin = _config => {
521
556
  "react", "react/jsx-runtime", "react/jsx-dev-runtime", "react-dom/client",
522
557
  // Pre-bundle router dependencies to avoid router duplicates.
523
558
  // Mismatching routers cause `Error: You must render this element inside a <Remix> element`.
524
- "react-router", "react-router-dom"]
559
+ "react-router",
560
+ // Check to avoid "Failed to resolve dependency: react-router-dom, present in 'optimizeDeps.include'"
561
+ ...(hasDependency("react-router-dom") ? ["react-router-dom"] : [])]
525
562
  },
526
563
  esbuild: {
527
564
  jsx: "automatic",
@@ -683,17 +720,26 @@ const reactRouterVitePlugin = _config => {
683
720
  }
684
721
  });
685
722
  // Invalidate virtual modules and update cached plugin config via file watcher
686
- viteDevServer.watcher.on("all", async (eventName, filepath) => {
687
- var _viteConfig;
723
+ viteDevServer.watcher.on("all", async (eventName, rawFilepath) => {
724
+ var _viteConfig, _routeConfigViteServe;
688
725
  let {
689
726
  normalizePath
690
727
  } = importViteEsmSync.importViteEsmSync();
691
- let appFileAddedOrRemoved = (eventName === "add" || eventName === "unlink") && normalizePath(filepath).startsWith(normalizePath(ctx.reactRouterConfig.appDirectory));
728
+ let filepath = normalizePath(rawFilepath);
729
+ let appFileAddedOrRemoved = (eventName === "add" || eventName === "unlink") && filepath.startsWith(normalizePath(ctx.reactRouterConfig.appDirectory));
692
730
  invariant["default"]((_viteConfig = viteConfig) === null || _viteConfig === void 0 ? void 0 : _viteConfig.configFile);
693
- let viteConfigChanged = eventName === "change" && normalizePath(filepath) === normalizePath(viteConfig.configFile);
694
- if (appFileAddedOrRemoved || viteConfigChanged) {
731
+ let viteConfigChanged = eventName === "change" && filepath === normalizePath(viteConfig.configFile);
732
+ let routeConfigChanged = Boolean((_routeConfigViteServe = routeConfigViteServer) === null || _routeConfigViteServe === void 0 ? void 0 : _routeConfigViteServe.moduleGraph.getModuleById(filepath));
733
+ if (routeConfigChanged || appFileAddedOrRemoved) {
734
+ var _routeConfigViteServe2, _viteNodeRunner;
735
+ (_routeConfigViteServe2 = routeConfigViteServer) === null || _routeConfigViteServe2 === void 0 ? void 0 : _routeConfigViteServe2.moduleGraph.invalidateAll();
736
+ (_viteNodeRunner = viteNodeRunner) === null || _viteNodeRunner === void 0 ? void 0 : _viteNodeRunner.moduleCache.clear();
737
+ }
738
+ if (appFileAddedOrRemoved || viteConfigChanged || routeConfigChanged) {
695
739
  let lastReactRouterConfig = ctx.reactRouterConfig;
696
- await updatePluginContext();
740
+ await updatePluginContext({
741
+ routeConfigChanged
742
+ });
697
743
  if (!isEqualJson(lastReactRouterConfig, ctx.reactRouterConfig)) {
698
744
  invalidateVirtualModules(viteDevServer);
699
745
  }
@@ -708,7 +754,7 @@ const reactRouterVitePlugin = _config => {
708
754
  let build = await viteDevServer.ssrLoadModule(serverBuildId);
709
755
  let handler = reactRouter.createRequestHandler(build, "development");
710
756
  let nodeHandler = async (nodeReq, nodeRes) => {
711
- let req = nodeAdapter.fromNodeRequest(nodeReq);
757
+ let req = nodeAdapter.fromNodeRequest(nodeReq, nodeRes);
712
758
  let res = await handler(req, await reactRouterDevLoadContext(req));
713
759
  await nodeAdapter.toNodeRequest(res, nodeRes);
714
760
  };
@@ -731,8 +777,6 @@ const reactRouterVitePlugin = _config => {
731
777
  let clientBuildDirectory = getClientBuildDirectory(ctx.reactRouterConfig);
732
778
  let serverBuildDirectory = getServerBuildDirectory(ctx);
733
779
  let ssrViteManifest = await loadViteManifest(serverBuildDirectory);
734
- let clientViteManifest = await loadViteManifest(clientBuildDirectory);
735
- let clientFilePaths = getViteManifestFilePaths(clientViteManifest);
736
780
  let ssrAssetPaths = getViteManifestAssetPaths(ssrViteManifest);
737
781
  // We only move assets that aren't in the client build, otherwise we
738
782
  // remove them. These assets only exist because we explicitly set
@@ -743,8 +787,8 @@ const reactRouterVitePlugin = _config => {
743
787
  let movedAssetPaths = [];
744
788
  for (let ssrAssetPath of ssrAssetPaths) {
745
789
  let src = path__namespace.join(serverBuildDirectory, ssrAssetPath);
746
- if (!clientFilePaths.has(ssrAssetPath)) {
747
- let dest = path__namespace.join(clientBuildDirectory, ssrAssetPath);
790
+ let dest = path__namespace.join(clientBuildDirectory, ssrAssetPath);
791
+ if (!fse__namespace.existsSync(dest)) {
748
792
  await fse__namespace.move(src, dest);
749
793
  movedAssetPaths.push(dest);
750
794
  } else {
@@ -775,36 +819,20 @@ const reactRouterVitePlugin = _config => {
775
819
  }
776
820
  },
777
821
  async buildEnd() {
778
- var _viteChildCompiler;
822
+ var _viteChildCompiler, _routeConfigViteServe3;
779
823
  await ((_viteChildCompiler = viteChildCompiler) === null || _viteChildCompiler === void 0 ? void 0 : _viteChildCompiler.close());
824
+ await ((_routeConfigViteServe3 = routeConfigViteServer) === null || _routeConfigViteServe3 === void 0 ? void 0 : _routeConfigViteServe3.close());
780
825
  }
781
826
  }, {
782
827
  name: "react-router-route-entry",
783
828
  enforce: "pre",
784
- async transform(code, id, options) {
829
+ async transform(_code, id, options) {
785
830
  if (!isRouteEntry(id)) return;
786
831
  let routeModuleId = id.replace(ROUTE_ENTRY_QUERY_STRING, "");
787
832
  let routeFileName = path__namespace.basename(routeModuleId);
788
- if (!code.includes("defineRoute")) {
789
- let sourceExports = await getRouteModuleExports(viteChildCompiler, ctx, routeModuleId);
790
- let reexports = sourceExports.filter(exportName => (options === null || options === void 0 ? void 0 : options.ssr) && SERVER_ONLY_ROUTE_EXPORTS.includes(exportName) || CLIENT_ROUTE_EXPORTS.includes(exportName)).join(", ");
791
- return `export { ${reexports} } from "./${routeFileName}";`;
792
- }
793
- let renameFields = ["Component", "serverLoader", "serverAction"];
794
- let fields = defineRoute.parseFields(code);
795
- let reexports = fields.filter(exportName => !renameFields.includes(exportName)).filter(exportName => (options === null || options === void 0 ? void 0 : options.ssr) && SERVER_ONLY_ROUTE_EXPORTS.includes(exportName) || CLIENT_ROUTE_EXPORTS.includes(exportName)).map(reexport => `export const ${reexport} = route.${reexport};`);
796
- let content = `import route from "./${routeFileName}";`;
797
- if (fields.includes("Component")) {
798
- content += `\n` + [`import { createElement } from "react";`, `import { useParams, useLoaderData, useActionData } from "react-router";`, `export default function Route() {`, ` let params = useParams();`, ` let loaderData = useLoaderData();`, ` let actionData = useActionData();`, ` return createElement(route.Component, { params, loaderData, actionData });`, `}`].join("\n");
799
- }
800
- if (options !== null && options !== void 0 && options.ssr && fields.includes("serverLoader")) {
801
- content += `\nexport const loader = route.serverLoader;`;
802
- }
803
- if (options !== null && options !== void 0 && options.ssr && fields.includes("serverAction")) {
804
- content += `\nexport const action = route.serverAction;`;
805
- }
806
- content += "\n" + reexports.join("\n");
807
- return content;
833
+ let sourceExports = await getRouteModuleExports(viteChildCompiler, ctx, routeModuleId);
834
+ let reexports = sourceExports.filter(exportName => (options === null || options === void 0 ? void 0 : options.ssr) && SERVER_ONLY_ROUTE_EXPORTS.includes(exportName) || CLIENT_ROUTE_EXPORTS.includes(exportName)).join(", ");
835
+ return `export { ${reexports} } from "./${routeFileName}";`;
808
836
  }
809
837
  }, {
810
838
  name: "react-router-virtual-modules",
@@ -838,25 +866,14 @@ const reactRouterVitePlugin = _config => {
838
866
  }
839
867
  }
840
868
  }
841
- }, {
842
- name: "react-router-define-route",
843
- enforce: "pre",
844
- async transform(code, id, options) {
845
- if (options !== null && options !== void 0 && options.ssr) return;
846
- if (!code.includes("defineRoute")) return; // temporary back compat, remove once old style routes are unsupported
847
- if (id.endsWith(ROUTE_ENTRY_QUERY_STRING)) return;
848
- let route = getRoute(ctx.reactRouterConfig, id);
849
- if (!route && code.includes("defineRoute")) {
850
- return defineRoute.assertNotImported(code);
851
- }
852
- return defineRoute.transform(code, id, options);
853
- }
854
869
  }, {
855
870
  name: "react-router-dot-server",
856
871
  enforce: "pre",
857
872
  async resolveId(id, importer, options) {
858
873
  var _options$custom;
859
- if (options !== null && options !== void 0 && options.ssr) return;
874
+ // https://vitejs.dev/config/dep-optimization-options
875
+ let isOptimizeDeps = viteCommand === "serve" && (options === null || options === void 0 ? void 0 : options.scan) === true;
876
+ if (isOptimizeDeps || options !== null && options !== void 0 && options.ssr) return;
860
877
  let isResolving = (options === null || options === void 0 ? void 0 : (_options$custom = options.custom) === null || _options$custom === void 0 ? void 0 : _options$custom["react-router-dot-server"]) ?? false;
861
878
  if (isResolving) return;
862
879
  options.custom = {
@@ -901,7 +918,7 @@ const reactRouterVitePlugin = _config => {
901
918
  };
902
919
  }
903
920
  }
904
- }, {
921
+ }, withProps.plugin, {
905
922
  name: "react-router-route-exports",
906
923
  async transform(code, id, options) {
907
924
  if (options !== null && options !== void 0 && options.ssr) return;
@@ -923,7 +940,12 @@ const reactRouterVitePlugin = _config => {
923
940
  }
924
941
  }
925
942
  let [filepath] = id.split("?");
926
- return removeExports.removeExports(code, SERVER_ONLY_ROUTE_EXPORTS, {
943
+ let ast = parser.parse(code, {
944
+ sourceType: "module"
945
+ });
946
+ removeExports.removeExports(ast, SERVER_ONLY_ROUTE_EXPORTS);
947
+ withProps.transform(ast);
948
+ return babel.generate(ast, {
927
949
  sourceMaps: true,
928
950
  filename: id,
929
951
  sourceFileName: filepath
@@ -1016,7 +1038,7 @@ const reactRouterVitePlugin = _config => {
1016
1038
  invalidateVirtualModules(server);
1017
1039
  }
1018
1040
  }
1019
- server.ws.send({
1041
+ server.hot.send({
1020
1042
  type: "custom",
1021
1043
  event: "react-router:hmr",
1022
1044
  data: hmrEventData
@@ -1025,6 +1047,14 @@ const reactRouterVitePlugin = _config => {
1025
1047
  }
1026
1048
  }];
1027
1049
  };
1050
+ function findConfig(dir, basename, extensions) {
1051
+ for (let ext of extensions) {
1052
+ let name = basename + ext;
1053
+ let file = path__namespace.join(dir, name);
1054
+ if (fse__namespace.existsSync(file)) return file;
1055
+ }
1056
+ return undefined;
1057
+ }
1028
1058
  function isInReactRouterMonorepo() {
1029
1059
  // We use '@react-router/node' for this check since it's a
1030
1060
  // dependency of this package and guaranteed to be in node_modules
@@ -1038,7 +1068,14 @@ function isEqualJson(v1, v2) {
1038
1068
  function addRefreshWrapper(reactRouterConfig, code, id) {
1039
1069
  let route = getRoute(reactRouterConfig, id);
1040
1070
  let acceptExports = route || isRouteEntry(id) ? ["clientAction", "clientLoader", "handle", "meta", "links", "shouldRevalidate"] : [];
1041
- return REACT_REFRESH_HEADER.replaceAll("__SOURCE__", JSON.stringify(id)) + code + REACT_REFRESH_FOOTER.replaceAll("__SOURCE__", JSON.stringify(id)).replaceAll("__ACCEPT_EXPORTS__", JSON.stringify(acceptExports)).replaceAll("__ROUTE_ID__", JSON.stringify(route === null || route === void 0 ? void 0 : route.id));
1071
+ return "\n\n" + withCommentBoundaries("REACT REFRESH HEADER", REACT_REFRESH_HEADER.replaceAll("__SOURCE__", JSON.stringify(id))) + "\n\n" + withCommentBoundaries("REACT REFRESH BODY", code) + "\n\n" + withCommentBoundaries("REACT REFRESH FOOTER", REACT_REFRESH_FOOTER.replaceAll("__SOURCE__", JSON.stringify(id)).replaceAll("__ACCEPT_EXPORTS__", JSON.stringify(acceptExports)).replaceAll("__ROUTE_ID__", JSON.stringify(route === null || route === void 0 ? void 0 : route.id))) + "\n";
1072
+ }
1073
+ function withCommentBoundaries(label, text) {
1074
+ let begin = `// [BEGIN] ${label} `;
1075
+ begin += "-".repeat(80 - begin.length);
1076
+ let end = `// [END] ${label} `;
1077
+ end += "-".repeat(80 - end.length);
1078
+ return `${begin}\n${text}\n${end}`;
1042
1079
  }
1043
1080
  const REACT_REFRESH_HEADER = `
1044
1081
  import RefreshRuntime from "${hmrRuntimeId}";
@@ -1060,7 +1097,7 @@ if (import.meta.hot && !inWebWorker) {
1060
1097
  RefreshRuntime.register(type, __SOURCE__ + " " + id)
1061
1098
  };
1062
1099
  window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;
1063
- }`.replace(/\n+/g, "");
1100
+ }`.trim();
1064
1101
  const REACT_REFRESH_FOOTER = `
1065
1102
  if (import.meta.hot && !inWebWorker) {
1066
1103
  window.$RefreshReg$ = prevRefreshReg;
@@ -1074,7 +1111,7 @@ if (import.meta.hot && !inWebWorker) {
1074
1111
  if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
1075
1112
  });
1076
1113
  });
1077
- }`;
1114
+ }`.trim();
1078
1115
  function getRoute(pluginConfig, file) {
1079
1116
  let vite = importViteEsmSync.importViteEsmSync();
1080
1117
  let routePath = vite.normalizePath(path__namespace.relative(pluginConfig.appDirectory, file));
@@ -1147,19 +1184,20 @@ async function handlePrerender(viteConfig, reactRouterConfig, serverBuildDirecto
1147
1184
  }
1148
1185
  await prerenderRoute(handler, path, clientBuildDirectory, reactRouterConfig, viteConfig, requestInit);
1149
1186
  }
1150
- async function prerenderData(handler, prerenderPath, clientBuildDirectory, reactRouterConfig, viteConfig, requestInit) {
1151
- let normalizedPath = `${reactRouterConfig.basename}${prerenderPath === "/" ? "/_root.data" : `${prerenderPath.replace(/\/$/, "")}.data`}`.replace(/\/\/+/g, "/");
1152
- let request = new Request(`http://localhost${normalizedPath}`, requestInit);
1153
- let response = await handler(request);
1154
- let data = await response.text();
1155
- validatePrerenderedResponse(response, data, "Prerender", normalizedPath);
1156
- // Write out the .data file
1157
- let outdir = path__namespace.relative(process.cwd(), clientBuildDirectory);
1158
- let outfile = path__namespace.join(outdir, normalizedPath.split("/").join(path__namespace.sep));
1159
- await fse__namespace.ensureDir(path__namespace.dirname(outfile));
1160
- await fse__namespace.outputFile(outfile, data);
1161
- viteConfig.logger.info(`Prerender: Generated ${colors__default["default"].bold(outfile)}`);
1162
- }
1187
+ await prerenderManifest(build, clientBuildDirectory, reactRouterConfig, viteConfig);
1188
+ }
1189
+ async function prerenderData(handler, prerenderPath, clientBuildDirectory, reactRouterConfig, viteConfig, requestInit) {
1190
+ let normalizedPath = `${reactRouterConfig.basename}${prerenderPath === "/" ? "/_root.data" : `${prerenderPath.replace(/\/$/, "")}.data`}`.replace(/\/\/+/g, "/");
1191
+ let request = new Request(`http://localhost${normalizedPath}`, requestInit);
1192
+ let response = await handler(request);
1193
+ let data = await response.text();
1194
+ validatePrerenderedResponse(response, data, "Prerender", normalizedPath);
1195
+ // Write out the .data file
1196
+ let outdir = path__namespace.relative(process.cwd(), clientBuildDirectory);
1197
+ let outfile = path__namespace.join(outdir, ...normalizedPath.split("/"));
1198
+ await fse__namespace.ensureDir(path__namespace.dirname(outfile));
1199
+ await fse__namespace.outputFile(outfile, data);
1200
+ viteConfig.logger.info(`Prerender: Generated ${colors__default["default"].bold(outfile)}`);
1163
1201
  }
1164
1202
  async function prerenderRoute(handler, prerenderPath, clientBuildDirectory, reactRouterConfig, viteConfig, requestInit) {
1165
1203
  let normalizedPath = `${reactRouterConfig.basename}${prerenderPath}/`.replace(/\/\/+/g, "/");
@@ -1177,6 +1215,18 @@ async function prerenderRoute(handler, prerenderPath, clientBuildDirectory, reac
1177
1215
  await fse__namespace.outputFile(outfile, html);
1178
1216
  viteConfig.logger.info(`Prerender: Generated ${colors__default["default"].bold(outfile)}`);
1179
1217
  }
1218
+ async function prerenderManifest(build, clientBuildDirectory, reactRouterConfig, viteConfig) {
1219
+ let normalizedPath = `${reactRouterConfig.basename}/__manifest`.replace(/\/\/+/g, "/");
1220
+ let outdir = path__namespace.relative(process.cwd(), clientBuildDirectory);
1221
+ let outfile = path__namespace.join(outdir, ...normalizedPath.split("/"));
1222
+ await fse__namespace.ensureDir(path__namespace.dirname(outfile));
1223
+ let manifestData = JSON.stringify({
1224
+ notFoundPaths: [],
1225
+ patches: build.assets.routes
1226
+ });
1227
+ await fse__namespace.outputFile(outfile, manifestData);
1228
+ viteConfig.logger.info(`Prerender: Generated ${colors__default["default"].bold(outfile)}`);
1229
+ }
1180
1230
  function validatePrerenderedResponse(response, html, prefix, path) {
1181
1231
  if (response.status !== 200) {
1182
1232
  throw new Error(`${prefix}: Received a ${response.status} status code from ` + `\`entry.server.tsx\` while prerendering the \`${path}\` ` + `path.\n${html}`);
@@ -1227,4 +1277,3 @@ exports.getServerBuildDirectory = getServerBuildDirectory;
1227
1277
  exports.loadPluginContext = loadPluginContext;
1228
1278
  exports.reactRouterVitePlugin = reactRouterVitePlugin;
1229
1279
  exports.resolveViteConfig = resolveViteConfig;
1230
- exports.setReactRouterDevLoadContext = setReactRouterDevLoadContext;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-9c1812606
2
+ * @react-router/dev v0.0.0-experimental-3278f3ca6
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,2 +1,2 @@
1
- import type { GeneratorOptions } from "@babel/generator";
2
- export declare const removeExports: (source: string, exportsToRemove: string[], generateOptions?: GeneratorOptions) => import("@babel/generator").GeneratorResult;
1
+ import type { Babel, ParseResult } from "./babel";
2
+ export declare const removeExports: (ast: ParseResult<Babel.File>, exportsToRemove: string[]) => void;