@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.
- package/bin.js +1 -1
- package/dist/cli/commands.js +1 -1
- package/dist/cli/detectPackageManager.js +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +7 -6
- package/dist/cli/run.js +1 -1
- package/dist/cli/useJavascript.js +1 -1
- package/dist/colors.js +1 -1
- package/dist/config/defaults/entry.client.tsx +1 -1
- package/dist/config/format.js +1 -1
- package/dist/config/routes.d.ts +77 -50
- package/dist/config/routes.js +175 -43
- package/dist/invariant.js +1 -1
- package/dist/routes.d.ts +2 -0
- package/dist/routes.js +23 -0
- package/dist/vite/babel.d.ts +10 -10
- package/dist/vite/babel.js +1 -1
- package/dist/vite/build.js +2 -2
- package/dist/vite/cloudflare-dev-proxy.d.ts +7 -1
- package/dist/vite/cloudflare-dev-proxy.js +14 -7
- package/dist/vite/cloudflare.d.ts +1 -0
- package/dist/vite/cloudflare.js +19 -0
- package/dist/vite/combine-urls.js +1 -1
- package/dist/{config.d.ts → vite/config.d.ts} +15 -24
- package/dist/{config.js → vite/config.js} +61 -39
- package/dist/vite/dev.js +1 -1
- package/dist/vite/import-vite-esm-sync.js +1 -1
- package/dist/vite/node-adapter.d.ts +1 -1
- package/dist/vite/node-adapter.js +7 -3
- package/dist/vite/plugin.d.ts +6 -3
- package/dist/vite/plugin.js +152 -103
- package/dist/vite/profiler.js +1 -1
- package/dist/vite/remove-exports.d.ts +2 -2
- package/dist/vite/remove-exports.js +113 -243
- package/dist/vite/resolve-file-url.js +1 -1
- package/dist/vite/static/refresh-utils.cjs +7 -26
- package/dist/vite/styles.d.ts +3 -2
- package/dist/vite/styles.js +23 -2
- package/dist/vite/vmod.js +1 -1
- package/dist/vite/with-props.d.ts +4 -0
- package/dist/vite/with-props.js +151 -0
- package/dist/vite.d.ts +2 -0
- package/dist/{cli.js → vite.js} +7 -8
- package/package.json +21 -12
- package/dist/cli.d.ts +0 -1
- package/dist/config/findConfig.d.ts +0 -1
- package/dist/config/findConfig.js +0 -32
- package/dist/config/flatRoutes.d.ts +0 -14
- package/dist/config/flatRoutes.js +0 -418
- package/dist/index.d.ts +0 -5
- package/dist/index.js +0 -23
- package/dist/vite/define-route.d.ts +0 -5
- package/dist/vite/define-route.js +0 -207
package/dist/vite/plugin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v0.0.0-experimental-
|
|
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('
|
|
34
|
-
var
|
|
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
|
|
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
|
|
366
|
-
|
|
367
|
-
|
|
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:
|
|
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",
|
|
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,
|
|
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
|
|
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" &&
|
|
694
|
-
|
|
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
|
-
|
|
747
|
-
|
|
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(
|
|
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
|
-
|
|
789
|
-
|
|
790
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
}`.
|
|
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
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
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;
|
package/dist/vite/profiler.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare const removeExports: (
|
|
1
|
+
import type { Babel, ParseResult } from "./babel";
|
|
2
|
+
export declare const removeExports: (ast: ParseResult<Babel.File>, exportsToRemove: string[]) => void;
|