@react-router/dev 0.0.0-experimental-818f8e08d → 0.0.0-experimental-aecfb0db1
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/dist/cli/index.js +243 -154
- package/dist/config.js +1 -1
- package/dist/routes.js +1 -1
- package/dist/vite/cloudflare.js +163 -80
- package/dist/vite.js +371 -294
- package/package.json +6 -6
package/dist/cli/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* @react-router/dev v0.0.0-experimental-
|
|
3
|
+
* @react-router/dev v0.0.0-experimental-aecfb0db1
|
|
4
4
|
*
|
|
5
5
|
* Copyright (c) Remix Software Inc.
|
|
6
6
|
*
|
|
@@ -125,13 +125,15 @@ var init_ssr_externals = __esm({
|
|
|
125
125
|
// vite/vite-node.ts
|
|
126
126
|
async function createContext({
|
|
127
127
|
root,
|
|
128
|
-
mode
|
|
128
|
+
mode,
|
|
129
|
+
customLogger
|
|
129
130
|
}) {
|
|
130
131
|
await preloadVite();
|
|
131
132
|
const vite2 = getVite();
|
|
132
133
|
const devServer = await vite2.createServer({
|
|
133
134
|
root,
|
|
134
135
|
mode,
|
|
136
|
+
customLogger,
|
|
135
137
|
server: {
|
|
136
138
|
preTransformRequests: false,
|
|
137
139
|
hmr: false,
|
|
@@ -214,7 +216,7 @@ function validateRouteConfig({
|
|
|
214
216
|
`Route config in "${routeConfigFile}" is invalid.`,
|
|
215
217
|
root ? `${root}` : [],
|
|
216
218
|
nested ? Object.entries(nested).map(
|
|
217
|
-
([
|
|
219
|
+
([path8, message]) => `Path: routes.${path8}
|
|
218
220
|
${message}`
|
|
219
221
|
) : []
|
|
220
222
|
].flat().join("\n\n")
|
|
@@ -299,7 +301,8 @@ function err(error) {
|
|
|
299
301
|
async function resolveConfig({
|
|
300
302
|
root,
|
|
301
303
|
viteNodeContext,
|
|
302
|
-
reactRouterConfigFile
|
|
304
|
+
reactRouterConfigFile,
|
|
305
|
+
skipRoutes
|
|
303
306
|
}) {
|
|
304
307
|
let reactRouterUserConfig = {};
|
|
305
308
|
if (reactRouterConfigFile) {
|
|
@@ -415,45 +418,50 @@ async function resolveConfig({
|
|
|
415
418
|
`Could not find a root route module in the app directory as "${rootRouteDisplayPath}"`
|
|
416
419
|
);
|
|
417
420
|
}
|
|
418
|
-
let routes2 = {
|
|
419
|
-
|
|
420
|
-
};
|
|
421
|
-
let routeConfigFile = findEntry(appDirectory, "routes");
|
|
422
|
-
try {
|
|
423
|
-
if (!routeConfigFile) {
|
|
424
|
-
let routeConfigDisplayPath = import_pathe3.default.relative(
|
|
425
|
-
root,
|
|
426
|
-
import_pathe3.default.join(appDirectory, "routes.ts")
|
|
427
|
-
);
|
|
428
|
-
return err(`Route config file not found at "${routeConfigDisplayPath}".`);
|
|
429
|
-
}
|
|
430
|
-
setAppDirectory(appDirectory);
|
|
431
|
-
let routeConfigExport = (await viteNodeContext.runner.executeFile(
|
|
432
|
-
import_pathe3.default.join(appDirectory, routeConfigFile)
|
|
433
|
-
)).default;
|
|
434
|
-
let routeConfig = await routeConfigExport;
|
|
435
|
-
let result = validateRouteConfig({
|
|
436
|
-
routeConfigFile,
|
|
437
|
-
routeConfig
|
|
438
|
-
});
|
|
439
|
-
if (!result.valid) {
|
|
440
|
-
return err(result.message);
|
|
441
|
-
}
|
|
421
|
+
let routes2 = {};
|
|
422
|
+
if (!skipRoutes) {
|
|
442
423
|
routes2 = {
|
|
443
|
-
|
|
444
|
-
...configRoutesToRouteManifest(appDirectory, routeConfig)
|
|
424
|
+
root: { path: "", id: "root", file: rootRouteFile }
|
|
445
425
|
};
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
426
|
+
let routeConfigFile = findEntry(appDirectory, "routes");
|
|
427
|
+
try {
|
|
428
|
+
if (!routeConfigFile) {
|
|
429
|
+
let routeConfigDisplayPath = import_pathe3.default.relative(
|
|
430
|
+
root,
|
|
431
|
+
import_pathe3.default.join(appDirectory, "routes.ts")
|
|
432
|
+
);
|
|
433
|
+
return err(
|
|
434
|
+
`Route config file not found at "${routeConfigDisplayPath}".`
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
setAppDirectory(appDirectory);
|
|
438
|
+
let routeConfigExport = (await viteNodeContext.runner.executeFile(
|
|
439
|
+
import_pathe3.default.join(appDirectory, routeConfigFile)
|
|
440
|
+
)).default;
|
|
441
|
+
let routeConfig = await routeConfigExport;
|
|
442
|
+
let result = validateRouteConfig({
|
|
443
|
+
routeConfigFile,
|
|
444
|
+
routeConfig
|
|
445
|
+
});
|
|
446
|
+
if (!result.valid) {
|
|
447
|
+
return err(result.message);
|
|
448
|
+
}
|
|
449
|
+
routes2 = {
|
|
450
|
+
...routes2,
|
|
451
|
+
...configRoutesToRouteManifest(appDirectory, routeConfig)
|
|
452
|
+
};
|
|
453
|
+
} catch (error) {
|
|
454
|
+
return err(
|
|
455
|
+
[
|
|
456
|
+
import_picocolors.default.red(`Route config in "${routeConfigFile}" is invalid.`),
|
|
457
|
+
"",
|
|
458
|
+
error.loc?.file && error.loc?.column && error.frame ? [
|
|
459
|
+
import_pathe3.default.relative(appDirectory, error.loc.file) + ":" + error.loc.line + ":" + error.loc.column,
|
|
460
|
+
error.frame.trim?.()
|
|
461
|
+
] : error.stack
|
|
462
|
+
].flat().join("\n")
|
|
463
|
+
);
|
|
464
|
+
}
|
|
457
465
|
}
|
|
458
466
|
let future = {
|
|
459
467
|
unstable_middleware: reactRouterUserConfig.future?.unstable_middleware ?? false,
|
|
@@ -484,24 +492,34 @@ async function resolveConfig({
|
|
|
484
492
|
async function createConfigLoader({
|
|
485
493
|
rootDirectory: root,
|
|
486
494
|
watch: watch2,
|
|
487
|
-
mode
|
|
495
|
+
mode,
|
|
496
|
+
skipRoutes
|
|
488
497
|
}) {
|
|
489
|
-
root = root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
|
|
498
|
+
root = import_pathe3.default.normalize(root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd());
|
|
499
|
+
let vite2 = await import("vite");
|
|
490
500
|
let viteNodeContext = await createContext({
|
|
491
501
|
root,
|
|
492
|
-
mode
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
502
|
+
mode,
|
|
503
|
+
// Filter out any info level logs from vite-node
|
|
504
|
+
customLogger: vite2.createLogger("warn", {
|
|
505
|
+
prefix: "[react-router]"
|
|
506
|
+
})
|
|
496
507
|
});
|
|
497
|
-
let
|
|
508
|
+
let reactRouterConfigFile;
|
|
509
|
+
let updateReactRouterConfigFile = () => {
|
|
510
|
+
reactRouterConfigFile = findEntry(root, "react-router.config", {
|
|
511
|
+
absolute: true
|
|
512
|
+
});
|
|
513
|
+
};
|
|
514
|
+
updateReactRouterConfigFile();
|
|
515
|
+
let getConfig = () => resolveConfig({ root, viteNodeContext, reactRouterConfigFile, skipRoutes });
|
|
498
516
|
let appDirectory;
|
|
499
517
|
let initialConfigResult = await getConfig();
|
|
500
518
|
if (!initialConfigResult.ok) {
|
|
501
519
|
throw new Error(initialConfigResult.error);
|
|
502
520
|
}
|
|
503
|
-
appDirectory = initialConfigResult.value.appDirectory;
|
|
504
|
-
let
|
|
521
|
+
appDirectory = import_pathe3.default.normalize(initialConfigResult.value.appDirectory);
|
|
522
|
+
let currentConfig = initialConfigResult.value;
|
|
505
523
|
let fsWatcher;
|
|
506
524
|
let changeHandlers = [];
|
|
507
525
|
return {
|
|
@@ -514,41 +532,71 @@ async function createConfigLoader({
|
|
|
514
532
|
}
|
|
515
533
|
changeHandlers.push(handler);
|
|
516
534
|
if (!fsWatcher) {
|
|
517
|
-
fsWatcher = import_chokidar.default.watch(
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
535
|
+
fsWatcher = import_chokidar.default.watch([root, appDirectory], {
|
|
536
|
+
ignoreInitial: true,
|
|
537
|
+
ignored: (path8) => {
|
|
538
|
+
let dirname6 = import_pathe3.default.dirname(path8);
|
|
539
|
+
return !dirname6.startsWith(appDirectory) && // Ensure we're only watching files outside of the app directory
|
|
540
|
+
// that are at the root level, not nested in subdirectories
|
|
541
|
+
path8 !== root && // Watch the root directory itself
|
|
542
|
+
dirname6 !== root;
|
|
543
|
+
}
|
|
544
|
+
});
|
|
524
545
|
fsWatcher.on("all", async (...args) => {
|
|
525
546
|
let [event, rawFilepath] = args;
|
|
526
547
|
let filepath = import_pathe3.default.normalize(rawFilepath);
|
|
527
|
-
let
|
|
528
|
-
let
|
|
548
|
+
let fileAddedOrRemoved = event === "add" || event === "unlink";
|
|
549
|
+
let appFileAddedOrRemoved = fileAddedOrRemoved && filepath.startsWith(import_pathe3.default.normalize(appDirectory));
|
|
550
|
+
let rootRelativeFilepath = import_pathe3.default.relative(root, filepath);
|
|
551
|
+
let configFileAddedOrRemoved = fileAddedOrRemoved && isEntryFile("react-router.config", rootRelativeFilepath);
|
|
552
|
+
if (configFileAddedOrRemoved) {
|
|
553
|
+
updateReactRouterConfigFile();
|
|
554
|
+
}
|
|
555
|
+
let moduleGraphChanged = configFileAddedOrRemoved || Boolean(
|
|
529
556
|
viteNodeContext.devServer?.moduleGraph.getModuleById(filepath)
|
|
530
557
|
);
|
|
531
|
-
if (
|
|
532
|
-
|
|
533
|
-
viteNodeContext.runner?.moduleCache.clear();
|
|
558
|
+
if (!moduleGraphChanged && !appFileAddedOrRemoved) {
|
|
559
|
+
return;
|
|
534
560
|
}
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
561
|
+
viteNodeContext.devServer?.moduleGraph.invalidateAll();
|
|
562
|
+
viteNodeContext.runner?.moduleCache.clear();
|
|
563
|
+
let result = await getConfig();
|
|
564
|
+
let prevAppDirectory = appDirectory;
|
|
565
|
+
appDirectory = import_pathe3.default.normalize(
|
|
566
|
+
(result.value ?? currentConfig).appDirectory
|
|
567
|
+
);
|
|
568
|
+
if (appDirectory !== prevAppDirectory) {
|
|
569
|
+
fsWatcher.unwatch(prevAppDirectory);
|
|
570
|
+
fsWatcher.add(appDirectory);
|
|
571
|
+
}
|
|
572
|
+
let configCodeChanged = configFileAddedOrRemoved || reactRouterConfigFile !== void 0 && isEntryFileDependency(
|
|
573
|
+
viteNodeContext.devServer.moduleGraph,
|
|
574
|
+
reactRouterConfigFile,
|
|
575
|
+
filepath
|
|
576
|
+
);
|
|
577
|
+
let routeConfigFile = !skipRoutes ? findEntry(appDirectory, "routes", {
|
|
578
|
+
absolute: true
|
|
579
|
+
}) : void 0;
|
|
580
|
+
let routeConfigCodeChanged = routeConfigFile !== void 0 && isEntryFileDependency(
|
|
581
|
+
viteNodeContext.devServer.moduleGraph,
|
|
582
|
+
routeConfigFile,
|
|
583
|
+
filepath
|
|
584
|
+
);
|
|
585
|
+
let configChanged = result.ok && !(0, import_isEqual.default)(omitRoutes(currentConfig), omitRoutes(result.value));
|
|
586
|
+
let routeConfigChanged = result.ok && !(0, import_isEqual.default)(currentConfig?.routes, result.value.routes);
|
|
587
|
+
for (let handler2 of changeHandlers) {
|
|
588
|
+
handler2({
|
|
589
|
+
result,
|
|
590
|
+
configCodeChanged,
|
|
591
|
+
routeConfigCodeChanged,
|
|
592
|
+
configChanged,
|
|
593
|
+
routeConfigChanged,
|
|
594
|
+
path: filepath,
|
|
595
|
+
event
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
if (result.ok) {
|
|
599
|
+
currentConfig = result.value;
|
|
552
600
|
}
|
|
553
601
|
});
|
|
554
602
|
}
|
|
@@ -567,17 +615,28 @@ async function createConfigLoader({
|
|
|
567
615
|
}
|
|
568
616
|
async function loadConfig({
|
|
569
617
|
rootDirectory,
|
|
570
|
-
mode
|
|
618
|
+
mode,
|
|
619
|
+
skipRoutes
|
|
571
620
|
}) {
|
|
572
621
|
let configLoader = await createConfigLoader({
|
|
573
622
|
rootDirectory,
|
|
574
623
|
mode,
|
|
624
|
+
skipRoutes,
|
|
575
625
|
watch: false
|
|
576
626
|
});
|
|
577
627
|
let config = await configLoader.getConfig();
|
|
578
628
|
await configLoader.close();
|
|
579
629
|
return config;
|
|
580
630
|
}
|
|
631
|
+
function omitRoutes(config) {
|
|
632
|
+
return {
|
|
633
|
+
...config,
|
|
634
|
+
routes: {}
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
function isEntryFile(entryBasename, filename3) {
|
|
638
|
+
return entryExts.some((ext) => filename3 === `${entryBasename}${ext}`);
|
|
639
|
+
}
|
|
581
640
|
function findEntry(dir, basename2, options) {
|
|
582
641
|
let currentDir = import_pathe3.default.resolve(dir);
|
|
583
642
|
let { root } = import_pathe3.default.parse(currentDir);
|
|
@@ -598,6 +657,30 @@ function findEntry(dir, basename2, options) {
|
|
|
598
657
|
currentDir = parentDir;
|
|
599
658
|
}
|
|
600
659
|
}
|
|
660
|
+
function isEntryFileDependency(moduleGraph, entryFilepath, filepath, visited = /* @__PURE__ */ new Set()) {
|
|
661
|
+
entryFilepath = import_pathe3.default.normalize(entryFilepath);
|
|
662
|
+
filepath = import_pathe3.default.normalize(filepath);
|
|
663
|
+
if (visited.has(filepath)) {
|
|
664
|
+
return false;
|
|
665
|
+
}
|
|
666
|
+
visited.add(filepath);
|
|
667
|
+
if (filepath === entryFilepath) {
|
|
668
|
+
return true;
|
|
669
|
+
}
|
|
670
|
+
let mod = moduleGraph.getModuleById(filepath);
|
|
671
|
+
if (!mod) {
|
|
672
|
+
return false;
|
|
673
|
+
}
|
|
674
|
+
for (let importer of mod.importers) {
|
|
675
|
+
if (!importer.id) {
|
|
676
|
+
continue;
|
|
677
|
+
}
|
|
678
|
+
if (importer.id === entryFilepath || isEntryFileDependency(moduleGraph, entryFilepath, importer.id, visited)) {
|
|
679
|
+
return true;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
return false;
|
|
683
|
+
}
|
|
601
684
|
var import_node_fs, import_node_child_process, import_package_json, import_pathe3, import_chokidar, import_picocolors, import_pick2, import_omit, import_cloneDeep, import_isEqual, excludedConfigPresetKeys, mergeReactRouterConfig, deepFreeze, entryExts;
|
|
602
685
|
var init_config = __esm({
|
|
603
686
|
"config/config.ts"() {
|
|
@@ -718,21 +801,21 @@ var init_babel = __esm({
|
|
|
718
801
|
|
|
719
802
|
// typegen/paths.ts
|
|
720
803
|
function getTypesDir(ctx) {
|
|
721
|
-
return
|
|
804
|
+
return Path3.join(ctx.rootDirectory, ".react-router/types");
|
|
722
805
|
}
|
|
723
806
|
function getTypesPath(ctx, route) {
|
|
724
|
-
return
|
|
807
|
+
return Path3.join(
|
|
725
808
|
getTypesDir(ctx),
|
|
726
|
-
|
|
727
|
-
|
|
809
|
+
Path3.relative(ctx.rootDirectory, ctx.config.appDirectory),
|
|
810
|
+
Path3.dirname(route.file),
|
|
728
811
|
"+types/" + Pathe.filename(route.file) + ".ts"
|
|
729
812
|
);
|
|
730
813
|
}
|
|
731
|
-
var
|
|
814
|
+
var Path3, Pathe;
|
|
732
815
|
var init_paths = __esm({
|
|
733
816
|
"typegen/paths.ts"() {
|
|
734
817
|
"use strict";
|
|
735
|
-
|
|
818
|
+
Path3 = __toESM(require("pathe"));
|
|
736
819
|
Pathe = __toESM(require("pathe/utils"));
|
|
737
820
|
}
|
|
738
821
|
});
|
|
@@ -772,7 +855,7 @@ function lineage(routes2, route) {
|
|
|
772
855
|
}
|
|
773
856
|
function fullpath(lineage2) {
|
|
774
857
|
if (lineage2.length === 1 && lineage2[0].id === "root") return "/";
|
|
775
|
-
return "/" + lineage2.map((route) => route.path?.replace(/^\//, "")?.replace(/\/$/, "")).filter((
|
|
858
|
+
return "/" + lineage2.map((route) => route.path?.replace(/^\//, "")?.replace(/\/$/, "")).filter((path8) => path8 !== void 0 && path8 !== "").join("/");
|
|
776
859
|
}
|
|
777
860
|
var init_route = __esm({
|
|
778
861
|
"typegen/route.ts"() {
|
|
@@ -787,8 +870,8 @@ function generate2(ctx, route) {
|
|
|
787
870
|
const typesPath = getTypesPath(ctx, route);
|
|
788
871
|
const parents = lineage2.slice(0, -1);
|
|
789
872
|
const parentTypeImports = parents.map((parent, i) => {
|
|
790
|
-
const rel =
|
|
791
|
-
|
|
873
|
+
const rel = Path4.relative(
|
|
874
|
+
Path4.dirname(typesPath),
|
|
792
875
|
getTypesPath(ctx, parent)
|
|
793
876
|
);
|
|
794
877
|
const indent = i === 0 ? "" : " ".repeat(2);
|
|
@@ -850,17 +933,17 @@ function formatParamProperties(fullpath2) {
|
|
|
850
933
|
);
|
|
851
934
|
return properties.join("; ");
|
|
852
935
|
}
|
|
853
|
-
var import_dedent,
|
|
936
|
+
var import_dedent, Path4, Pathe2, noExtension;
|
|
854
937
|
var init_generate = __esm({
|
|
855
938
|
"typegen/generate.ts"() {
|
|
856
939
|
"use strict";
|
|
857
940
|
import_dedent = __toESM(require("dedent"));
|
|
858
|
-
|
|
941
|
+
Path4 = __toESM(require("pathe"));
|
|
859
942
|
Pathe2 = __toESM(require("pathe/utils"));
|
|
860
943
|
init_paths();
|
|
861
944
|
init_params();
|
|
862
945
|
init_route();
|
|
863
|
-
noExtension = (
|
|
946
|
+
noExtension = (path8) => Path4.join(Path4.dirname(path8), Pathe2.filename(path8));
|
|
864
947
|
}
|
|
865
948
|
});
|
|
866
949
|
|
|
@@ -873,20 +956,22 @@ async function watch(rootDirectory, { mode, logger }) {
|
|
|
873
956
|
const ctx = await createContext2({ rootDirectory, mode, watch: true });
|
|
874
957
|
await writeAll(ctx);
|
|
875
958
|
logger?.info(import_picocolors3.default.green("generated types"), { timestamp: true, clear: true });
|
|
876
|
-
ctx.configLoader.onChange(
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
959
|
+
ctx.configLoader.onChange(
|
|
960
|
+
async ({ result, configChanged, routeConfigChanged }) => {
|
|
961
|
+
if (!result.ok) {
|
|
962
|
+
logger?.error(import_picocolors3.default.red(result.error), { timestamp: true, clear: true });
|
|
963
|
+
return;
|
|
964
|
+
}
|
|
965
|
+
ctx.config = result.value;
|
|
966
|
+
if (configChanged || routeConfigChanged) {
|
|
967
|
+
await writeAll(ctx);
|
|
968
|
+
logger?.info(import_picocolors3.default.green("regenerated types"), {
|
|
969
|
+
timestamp: true,
|
|
970
|
+
clear: true
|
|
971
|
+
});
|
|
972
|
+
}
|
|
888
973
|
}
|
|
889
|
-
|
|
974
|
+
);
|
|
890
975
|
return {
|
|
891
976
|
close: async () => await ctx.configLoader.close()
|
|
892
977
|
};
|
|
@@ -914,12 +999,12 @@ async function writeAll(ctx) {
|
|
|
914
999
|
Object.values(ctx.config.routes).forEach((route) => {
|
|
915
1000
|
const typesPath = getTypesPath(ctx, route);
|
|
916
1001
|
const content = generate2(ctx, route);
|
|
917
|
-
import_node_fs3.default.mkdirSync(
|
|
1002
|
+
import_node_fs3.default.mkdirSync(Path5.dirname(typesPath), { recursive: true });
|
|
918
1003
|
import_node_fs3.default.writeFileSync(typesPath, content);
|
|
919
1004
|
});
|
|
920
|
-
const registerPath =
|
|
1005
|
+
const registerPath = Path5.join(typegenDir, "+register.ts");
|
|
921
1006
|
import_node_fs3.default.writeFileSync(registerPath, register(ctx));
|
|
922
|
-
const virtualPath =
|
|
1007
|
+
const virtualPath = Path5.join(typegenDir, "+virtual.d.ts");
|
|
923
1008
|
import_node_fs3.default.writeFileSync(virtualPath, virtual);
|
|
924
1009
|
}
|
|
925
1010
|
function register(ctx) {
|
|
@@ -930,21 +1015,25 @@ function register(ctx) {
|
|
|
930
1015
|
interface Register {
|
|
931
1016
|
params: Params;
|
|
932
1017
|
}
|
|
1018
|
+
|
|
1019
|
+
interface Future {
|
|
1020
|
+
unstable_middleware: ${ctx.config.future.unstable_middleware}
|
|
1021
|
+
}
|
|
933
1022
|
}
|
|
934
1023
|
`;
|
|
935
1024
|
const { t: t2 } = babel_exports;
|
|
936
|
-
const
|
|
937
|
-
|
|
938
|
-
|
|
1025
|
+
const fullpaths = /* @__PURE__ */ new Set();
|
|
1026
|
+
Object.values(ctx.config.routes).forEach((route) => {
|
|
1027
|
+
if (route.id !== "root" && !route.path) return;
|
|
1028
|
+
const lineage2 = lineage(ctx.config.routes, route);
|
|
1029
|
+
const fullpath2 = fullpath(lineage2);
|
|
1030
|
+
fullpaths.add(fullpath2);
|
|
1031
|
+
});
|
|
939
1032
|
const typeParams = t2.tsTypeAliasDeclaration(
|
|
940
1033
|
t2.identifier("Params"),
|
|
941
1034
|
null,
|
|
942
1035
|
t2.tsTypeLiteral(
|
|
943
|
-
|
|
944
|
-
if (route.id !== "root" && !route.path) return void 0;
|
|
945
|
-
if (!route.index && indexPaths.has(route.path)) return void 0;
|
|
946
|
-
const lineage2 = lineage(ctx.config.routes, route);
|
|
947
|
-
const fullpath2 = fullpath(lineage2);
|
|
1036
|
+
Array.from(fullpaths).map((fullpath2) => {
|
|
948
1037
|
const params = parse2(fullpath2);
|
|
949
1038
|
return t2.tsPropertySignature(
|
|
950
1039
|
t2.stringLiteral(fullpath2),
|
|
@@ -961,18 +1050,18 @@ function register(ctx) {
|
|
|
961
1050
|
)
|
|
962
1051
|
)
|
|
963
1052
|
);
|
|
964
|
-
})
|
|
1053
|
+
})
|
|
965
1054
|
)
|
|
966
1055
|
);
|
|
967
1056
|
return [register2, generate(typeParams).code].join("\n\n");
|
|
968
1057
|
}
|
|
969
|
-
var import_node_fs3, import_dedent2,
|
|
1058
|
+
var import_node_fs3, import_dedent2, Path5, import_picocolors3, virtual;
|
|
970
1059
|
var init_typegen = __esm({
|
|
971
1060
|
"typegen/index.ts"() {
|
|
972
1061
|
"use strict";
|
|
973
1062
|
import_node_fs3 = __toESM(require("fs"));
|
|
974
1063
|
import_dedent2 = __toESM(require("dedent"));
|
|
975
|
-
|
|
1064
|
+
Path5 = __toESM(require("pathe"));
|
|
976
1065
|
import_picocolors3 = __toESM(require("picocolors"));
|
|
977
1066
|
init_config();
|
|
978
1067
|
init_babel();
|
|
@@ -1014,23 +1103,24 @@ var init_node_adapter = __esm({
|
|
|
1014
1103
|
});
|
|
1015
1104
|
|
|
1016
1105
|
// vite/resolve-file-url.ts
|
|
1017
|
-
var
|
|
1106
|
+
var path4;
|
|
1018
1107
|
var init_resolve_file_url = __esm({
|
|
1019
1108
|
"vite/resolve-file-url.ts"() {
|
|
1020
1109
|
"use strict";
|
|
1021
|
-
|
|
1110
|
+
path4 = __toESM(require("path"));
|
|
1022
1111
|
init_vite();
|
|
1023
1112
|
}
|
|
1024
1113
|
});
|
|
1025
1114
|
|
|
1026
1115
|
// vite/styles.ts
|
|
1027
|
-
var
|
|
1116
|
+
var path5, import_react_router, cssFileRegExp, cssModulesRegExp;
|
|
1028
1117
|
var init_styles = __esm({
|
|
1029
1118
|
"vite/styles.ts"() {
|
|
1030
1119
|
"use strict";
|
|
1031
|
-
|
|
1120
|
+
path5 = __toESM(require("path"));
|
|
1032
1121
|
import_react_router = require("react-router");
|
|
1033
1122
|
init_resolve_file_url();
|
|
1123
|
+
init_babel();
|
|
1034
1124
|
cssFileRegExp = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/;
|
|
1035
1125
|
cssModulesRegExp = new RegExp(`\\.module${cssFileRegExp.source}`);
|
|
1036
1126
|
}
|
|
@@ -1177,8 +1267,8 @@ function getServerBundleIds(ctx) {
|
|
|
1177
1267
|
async function cleanBuildDirectory(viteConfig, ctx) {
|
|
1178
1268
|
let buildDirectory = ctx.reactRouterConfig.buildDirectory;
|
|
1179
1269
|
let isWithinRoot = () => {
|
|
1180
|
-
let relativePath =
|
|
1181
|
-
return !relativePath.startsWith("..") && !
|
|
1270
|
+
let relativePath = path6.relative(ctx.rootDirectory, buildDirectory);
|
|
1271
|
+
return !relativePath.startsWith("..") && !path6.isAbsolute(relativePath);
|
|
1182
1272
|
};
|
|
1183
1273
|
if (viteConfig.build.emptyOutDir ?? isWithinRoot()) {
|
|
1184
1274
|
await fse.remove(buildDirectory);
|
|
@@ -1189,7 +1279,7 @@ async function cleanViteManifests(environmentsOptions, ctx) {
|
|
|
1189
1279
|
([environmentName, options]) => {
|
|
1190
1280
|
let outDir = options.build?.outDir;
|
|
1191
1281
|
invariant(outDir, `Expected build.outDir for ${environmentName}`);
|
|
1192
|
-
return
|
|
1282
|
+
return path6.join(outDir, ".vite/manifest.json");
|
|
1193
1283
|
}
|
|
1194
1284
|
);
|
|
1195
1285
|
await Promise.all(
|
|
@@ -1199,7 +1289,7 @@ async function cleanViteManifests(environmentsOptions, ctx) {
|
|
|
1199
1289
|
if (!ctx.viteManifestEnabled) {
|
|
1200
1290
|
await fse.remove(viteManifestPath);
|
|
1201
1291
|
}
|
|
1202
|
-
let viteDir =
|
|
1292
|
+
let viteDir = path6.dirname(viteManifestPath);
|
|
1203
1293
|
let viteDirFiles = await fse.readdir(viteDir);
|
|
1204
1294
|
if (viteDirFiles.length === 0) {
|
|
1205
1295
|
await fse.remove(viteDir);
|
|
@@ -1216,10 +1306,10 @@ function mergeEnvironmentOptions(base, ...overrides) {
|
|
|
1216
1306
|
}
|
|
1217
1307
|
async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
|
|
1218
1308
|
let { serverBuildFile, serverModuleFormat } = ctx.reactRouterConfig;
|
|
1219
|
-
let packageRoot =
|
|
1309
|
+
let packageRoot = path6.dirname(
|
|
1220
1310
|
require.resolve("@react-router/dev/package.json")
|
|
1221
1311
|
);
|
|
1222
|
-
let { moduleSyncEnabled } = await import(`file:///${
|
|
1312
|
+
let { moduleSyncEnabled } = await import(`file:///${path6.join(packageRoot, "module-sync-enabled/index.mjs")}`);
|
|
1223
1313
|
let vite2 = getVite();
|
|
1224
1314
|
let viteServerConditions = [
|
|
1225
1315
|
...vite2.defaultServerConditions ?? [],
|
|
@@ -1293,7 +1383,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
|
|
|
1293
1383
|
ctx.entryClientFilePath,
|
|
1294
1384
|
...Object.values(ctx.reactRouterConfig.routes).flatMap(
|
|
1295
1385
|
(route) => {
|
|
1296
|
-
let routeFilePath =
|
|
1386
|
+
let routeFilePath = path6.resolve(
|
|
1297
1387
|
ctx.reactRouterConfig.appDirectory,
|
|
1298
1388
|
route.file
|
|
1299
1389
|
);
|
|
@@ -1317,7 +1407,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
|
|
|
1317
1407
|
) : null;
|
|
1318
1408
|
let routeChunkSuffix = routeChunkName ? `-${(0, import_kebabCase.default)(routeChunkName)}` : "";
|
|
1319
1409
|
let assetsDir = (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig?.environments?.client?.build?.assetsDir : null) ?? viteUserConfig?.build?.assetsDir ?? "assets";
|
|
1320
|
-
return
|
|
1410
|
+
return path6.posix.join(
|
|
1321
1411
|
assetsDir,
|
|
1322
1412
|
`[name]${routeChunkSuffix}-[hash].js`
|
|
1323
1413
|
);
|
|
@@ -1353,9 +1443,6 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
|
|
|
1353
1443
|
}
|
|
1354
1444
|
});
|
|
1355
1445
|
}
|
|
1356
|
-
if (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && viteCommand === "serve") {
|
|
1357
|
-
environmentOptionsResolvers[CSS_DEV_HELPER_ENVIRONMENT_NAME] = () => ({});
|
|
1358
|
-
}
|
|
1359
1446
|
return environmentOptionsResolvers;
|
|
1360
1447
|
}
|
|
1361
1448
|
function resolveEnvironmentsOptions(environmentResolvers, resolverOptions) {
|
|
@@ -1370,13 +1457,13 @@ function resolveEnvironmentsOptions(environmentResolvers, resolverOptions) {
|
|
|
1370
1457
|
function isNonNullable(x) {
|
|
1371
1458
|
return x != null;
|
|
1372
1459
|
}
|
|
1373
|
-
var import_node_crypto, fs4,
|
|
1460
|
+
var import_node_crypto, fs4, path6, url, fse, babel2, import_react_router2, import_es_module_lexer, import_pick3, import_jsesc, import_picocolors4, import_kebabCase, CLIENT_NON_COMPONENT_EXPORTS, CLIENT_ROUTE_EXPORTS, BUILD_CLIENT_ROUTE_QUERY_STRING, SSR_BUNDLE_PREFIX, virtualHmrRuntime, virtualInjectHmrRuntime, virtual2, getServerBuildDirectory, getClientBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER;
|
|
1374
1461
|
var init_plugin = __esm({
|
|
1375
1462
|
"vite/plugin.ts"() {
|
|
1376
1463
|
"use strict";
|
|
1377
1464
|
import_node_crypto = require("crypto");
|
|
1378
1465
|
fs4 = __toESM(require("fs"));
|
|
1379
|
-
|
|
1466
|
+
path6 = __toESM(require("path"));
|
|
1380
1467
|
url = __toESM(require("url"));
|
|
1381
1468
|
fse = __toESM(require("fs-extra"));
|
|
1382
1469
|
babel2 = __toESM(require("@babel/core"));
|
|
@@ -1418,7 +1505,6 @@ var init_plugin = __esm({
|
|
|
1418
1505
|
];
|
|
1419
1506
|
BUILD_CLIENT_ROUTE_QUERY_STRING = "?__react-router-build-client-route";
|
|
1420
1507
|
SSR_BUNDLE_PREFIX = "ssrBundle_";
|
|
1421
|
-
CSS_DEV_HELPER_ENVIRONMENT_NAME = "__react_router_css_dev_helper__";
|
|
1422
1508
|
virtualHmrRuntime = create("hmr-runtime");
|
|
1423
1509
|
virtualInjectHmrRuntime = create("inject-hmr-runtime");
|
|
1424
1510
|
virtual2 = {
|
|
@@ -1426,19 +1512,19 @@ var init_plugin = __esm({
|
|
|
1426
1512
|
serverManifest: create("server-manifest"),
|
|
1427
1513
|
browserManifest: create("browser-manifest")
|
|
1428
1514
|
};
|
|
1429
|
-
getServerBuildDirectory = (reactRouterConfig, { serverBundleId } = {}) =>
|
|
1515
|
+
getServerBuildDirectory = (reactRouterConfig, { serverBundleId } = {}) => path6.join(
|
|
1430
1516
|
reactRouterConfig.buildDirectory,
|
|
1431
1517
|
"server",
|
|
1432
1518
|
...serverBundleId ? [serverBundleId] : []
|
|
1433
1519
|
);
|
|
1434
|
-
getClientBuildDirectory = (reactRouterConfig) =>
|
|
1435
|
-
defaultEntriesDir =
|
|
1436
|
-
|
|
1520
|
+
getClientBuildDirectory = (reactRouterConfig) => path6.join(reactRouterConfig.buildDirectory, "client");
|
|
1521
|
+
defaultEntriesDir = path6.resolve(
|
|
1522
|
+
path6.dirname(require.resolve("@react-router/dev/package.json")),
|
|
1437
1523
|
"dist",
|
|
1438
1524
|
"config",
|
|
1439
1525
|
"defaults"
|
|
1440
1526
|
);
|
|
1441
|
-
defaultEntries = fse.readdirSync(defaultEntriesDir).map((filename3) =>
|
|
1527
|
+
defaultEntries = fse.readdirSync(defaultEntriesDir).map((filename3) => path6.join(defaultEntriesDir, filename3));
|
|
1442
1528
|
invariant(defaultEntries.length > 0, "No default entries found");
|
|
1443
1529
|
REACT_REFRESH_HEADER = `
|
|
1444
1530
|
import RefreshRuntime from "${virtualHmrRuntime.id}";
|
|
@@ -1474,7 +1560,10 @@ async function build(root, viteBuildOptions) {
|
|
|
1474
1560
|
let vite2 = getVite();
|
|
1475
1561
|
let configResult = await loadConfig({
|
|
1476
1562
|
rootDirectory: root,
|
|
1477
|
-
mode: viteBuildOptions.mode ?? "production"
|
|
1563
|
+
mode: viteBuildOptions.mode ?? "production",
|
|
1564
|
+
// In this scope we only need future flags, so we can skip evaluating
|
|
1565
|
+
// routes.ts until we're within the Vite build context
|
|
1566
|
+
skipRoutes: true
|
|
1478
1567
|
});
|
|
1479
1568
|
if (!configResult.ok) {
|
|
1480
1569
|
throw new Error(configResult.error);
|
|
@@ -1715,7 +1804,7 @@ var import_semver = __toESM(require("semver"));
|
|
|
1715
1804
|
var import_picocolors8 = __toESM(require("picocolors"));
|
|
1716
1805
|
|
|
1717
1806
|
// cli/commands.ts
|
|
1718
|
-
var
|
|
1807
|
+
var path7 = __toESM(require("path"));
|
|
1719
1808
|
var import_fs_extra = __toESM(require("fs-extra"));
|
|
1720
1809
|
var import_package_json2 = __toESM(require("@npmcli/package-json"));
|
|
1721
1810
|
var import_exit_hook = __toESM(require("exit-hook"));
|
|
@@ -1874,14 +1963,14 @@ async function generateEntry(entry, rootDirectory, flags = {}) {
|
|
|
1874
1963
|
console.error(import_picocolors7.default.red(`No default server entry detected.`));
|
|
1875
1964
|
return;
|
|
1876
1965
|
}
|
|
1877
|
-
let defaultsDirectory =
|
|
1878
|
-
|
|
1966
|
+
let defaultsDirectory = path7.resolve(
|
|
1967
|
+
path7.dirname(require.resolve("@react-router/dev/package.json")),
|
|
1879
1968
|
"dist",
|
|
1880
1969
|
"config",
|
|
1881
1970
|
"defaults"
|
|
1882
1971
|
);
|
|
1883
|
-
let defaultEntryClient =
|
|
1884
|
-
let defaultEntryServer =
|
|
1972
|
+
let defaultEntryClient = path7.resolve(defaultsDirectory, "entry.client.tsx");
|
|
1973
|
+
let defaultEntryServer = path7.resolve(
|
|
1885
1974
|
defaultsDirectory,
|
|
1886
1975
|
`entry.server.node.tsx`
|
|
1887
1976
|
);
|
|
@@ -1890,7 +1979,7 @@ async function generateEntry(entry, rootDirectory, flags = {}) {
|
|
|
1890
1979
|
let useTypeScript = flags.typescript ?? true;
|
|
1891
1980
|
let outputExtension = useTypeScript ? "tsx" : "jsx";
|
|
1892
1981
|
let outputEntry = `${entry}.${outputExtension}`;
|
|
1893
|
-
let outputFile2 =
|
|
1982
|
+
let outputFile2 = path7.resolve(appDirectory, outputEntry);
|
|
1894
1983
|
if (!useTypeScript) {
|
|
1895
1984
|
let javascript = transpile(contents, {
|
|
1896
1985
|
cwd: rootDirectory,
|
|
@@ -1902,7 +1991,7 @@ async function generateEntry(entry, rootDirectory, flags = {}) {
|
|
|
1902
1991
|
}
|
|
1903
1992
|
console.log(
|
|
1904
1993
|
import_picocolors7.default.blue(
|
|
1905
|
-
`Entry file ${entry} created at ${
|
|
1994
|
+
`Entry file ${entry} created at ${path7.relative(
|
|
1906
1995
|
rootDirectory,
|
|
1907
1996
|
outputFile2
|
|
1908
1997
|
)}.`
|
|
@@ -1911,16 +2000,16 @@ async function generateEntry(entry, rootDirectory, flags = {}) {
|
|
|
1911
2000
|
}
|
|
1912
2001
|
function resolveRootDirectory(root, flags) {
|
|
1913
2002
|
if (root) {
|
|
1914
|
-
return
|
|
2003
|
+
return path7.resolve(root);
|
|
1915
2004
|
}
|
|
1916
|
-
return process.env.REACT_ROUTER_ROOT || (flags?.config ?
|
|
2005
|
+
return process.env.REACT_ROUTER_ROOT || (flags?.config ? path7.dirname(path7.resolve(flags.config)) : process.cwd());
|
|
1917
2006
|
}
|
|
1918
2007
|
async function checkForEntry(rootDirectory, appDirectory, entries2) {
|
|
1919
2008
|
for (let entry of entries2) {
|
|
1920
|
-
let entryPath =
|
|
2009
|
+
let entryPath = path7.resolve(appDirectory, entry);
|
|
1921
2010
|
let exists = await import_fs_extra.default.pathExists(entryPath);
|
|
1922
2011
|
if (exists) {
|
|
1923
|
-
let relative8 =
|
|
2012
|
+
let relative8 = path7.relative(rootDirectory, entryPath);
|
|
1924
2013
|
console.error(import_picocolors7.default.red(`Entry file ${relative8} already exists.`));
|
|
1925
2014
|
return process.exit(1);
|
|
1926
2015
|
}
|