@react-router/dev 7.0.0-pre.2 → 7.0.0-pre.3

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 (67) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cli/index.d.ts +2 -1
  3. package/dist/cli/index.js +1352 -8
  4. package/dist/routes.d.ts +4 -2
  5. package/dist/routes.js +181 -11
  6. package/dist/typescript/plugin.d.ts +5 -2
  7. package/dist/typescript/plugin.js +479 -31
  8. package/dist/vite/cloudflare.d.ts +1 -1
  9. package/dist/vite/cloudflare.js +171 -5
  10. package/dist/vite.d.ts +2 -2
  11. package/dist/vite.js +2394 -5
  12. package/package.json +28 -7
  13. package/dist/cli/commands.d.ts +0 -13
  14. package/dist/cli/commands.js +0 -179
  15. package/dist/cli/detectPackageManager.d.ts +0 -10
  16. package/dist/cli/detectPackageManager.js +0 -39
  17. package/dist/cli/run.d.ts +0 -5
  18. package/dist/cli/run.js +0 -188
  19. package/dist/cli/useJavascript.d.ts +0 -4
  20. package/dist/cli/useJavascript.js +0 -66
  21. package/dist/colors.d.ts +0 -17
  22. package/dist/colors.js +0 -49
  23. package/dist/config/format.d.ts +0 -5
  24. package/dist/config/format.js +0 -68
  25. package/dist/config/routes.d.ts +0 -129
  26. package/dist/config/routes.js +0 -253
  27. package/dist/config/serverModes.d.ts +0 -9
  28. package/dist/invariant.d.ts +0 -2
  29. package/dist/invariant.js +0 -20
  30. package/dist/manifest.d.ts +0 -28
  31. package/dist/typescript/typegen.d.ts +0 -10
  32. package/dist/typescript/typegen.js +0 -190
  33. package/dist/vite/babel.d.ts +0 -20
  34. package/dist/vite/babel.js +0 -49
  35. package/dist/vite/build.d.ts +0 -15
  36. package/dist/vite/build.js +0 -249
  37. package/dist/vite/cloudflare-dev-proxy.d.ts +0 -21
  38. package/dist/vite/cloudflare-dev-proxy.js +0 -89
  39. package/dist/vite/combine-urls-test.d.ts +0 -1
  40. package/dist/vite/combine-urls.d.ts +0 -1
  41. package/dist/vite/combine-urls.js +0 -20
  42. package/dist/vite/config.d.ts +0 -234
  43. package/dist/vite/config.js +0 -282
  44. package/dist/vite/dev.d.ts +0 -15
  45. package/dist/vite/dev.js +0 -81
  46. package/dist/vite/import-vite-esm-sync.d.ts +0 -4
  47. package/dist/vite/import-vite-esm-sync.js +0 -28
  48. package/dist/vite/node-adapter.d.ts +0 -6
  49. package/dist/vite/node-adapter.js +0 -90
  50. package/dist/vite/plugin.d.ts +0 -75
  51. package/dist/vite/plugin.js +0 -1301
  52. package/dist/vite/profiler.d.ts +0 -5
  53. package/dist/vite/profiler.js +0 -55
  54. package/dist/vite/remove-exports-test.d.ts +0 -1
  55. package/dist/vite/remove-exports.d.ts +0 -2
  56. package/dist/vite/remove-exports.js +0 -148
  57. package/dist/vite/resolve-file-url.d.ts +0 -3
  58. package/dist/vite/resolve-file-url.js +0 -53
  59. package/dist/vite/styles.d.ts +0 -14
  60. package/dist/vite/styles.js +0 -199
  61. package/dist/vite/vite-node.d.ts +0 -9
  62. package/dist/vite/vite-node.js +0 -57
  63. package/dist/vite/vmod.d.ts +0 -3
  64. package/dist/vite/vmod.js +0 -21
  65. package/dist/vite/with-props.d.ts +0 -4
  66. package/dist/vite/with-props.js +0 -151
  67. /package/dist/{vite/static → static}/refresh-utils.cjs +0 -0
package/dist/cli/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v7.0.0-pre.2
2
+ * @react-router/dev v7.0.0-pre.3
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -8,13 +8,1357 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- 'use strict';
11
+ "use strict";
12
+ var __create = Object.create;
13
+ var __defProp = Object.defineProperty;
14
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
15
+ var __getOwnPropNames = Object.getOwnPropertyNames;
16
+ var __getProtoOf = Object.getPrototypeOf;
17
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
18
+ var __esm = (fn, res) => function __init() {
19
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
20
+ };
21
+ var __commonJS = (cb, mod) => function __require() {
22
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
23
+ };
24
+ var __export = (target, all) => {
25
+ for (var name in all)
26
+ __defProp(target, name, { get: all[name], enumerable: true });
27
+ };
28
+ var __copyProps = (to, from, except, desc) => {
29
+ if (from && typeof from === "object" || typeof from === "function") {
30
+ for (let key of __getOwnPropNames(from))
31
+ if (!__hasOwnProp.call(to, key) && key !== except)
32
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
33
+ }
34
+ return to;
35
+ };
36
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
37
+ // If the importer is in node compatibility mode or this is not an ESM
38
+ // file that has been converted to a CommonJS file using a Babel-
39
+ // compatible transform (i.e. "__esModule" has not been set), then set
40
+ // "default" to the CommonJS "module.exports" for node compatibility.
41
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
42
+ mod
43
+ ));
12
44
 
13
- var run = require('./run.js');
45
+ // invariant.ts
46
+ function invariant(value, message) {
47
+ if (value === false || value === null || typeof value === "undefined") {
48
+ console.error(
49
+ "The following error is a bug in React Router; please open an issue! https://github.com/remix-run/react-router/issues/new/choose"
50
+ );
51
+ throw new Error(message);
52
+ }
53
+ }
54
+ var init_invariant = __esm({
55
+ "invariant.ts"() {
56
+ "use strict";
57
+ }
58
+ });
59
+
60
+ // vite/babel.ts
61
+ var import_parser, t, traverse, generate;
62
+ var init_babel = __esm({
63
+ "vite/babel.ts"() {
64
+ "use strict";
65
+ import_parser = require("@babel/parser");
66
+ t = __toESM(require("@babel/types"));
67
+ traverse = require("@babel/traverse").default;
68
+ generate = require("@babel/generator").default;
69
+ }
70
+ });
71
+
72
+ // vite/node-adapter.ts
73
+ var import_node_events, import_node_stream, import_set_cookie_parser, import_node;
74
+ var init_node_adapter = __esm({
75
+ "vite/node-adapter.ts"() {
76
+ "use strict";
77
+ import_node_events = require("events");
78
+ import_node_stream = require("stream");
79
+ import_set_cookie_parser = require("set-cookie-parser");
80
+ import_node = require("@react-router/node");
81
+ init_invariant();
82
+ }
83
+ });
84
+
85
+ // vite/import-vite-esm-sync.ts
86
+ async function preloadViteEsm() {
87
+ vite = await import("vite");
88
+ }
89
+ var vite;
90
+ var init_import_vite_esm_sync = __esm({
91
+ "vite/import-vite-esm-sync.ts"() {
92
+ "use strict";
93
+ init_invariant();
94
+ }
95
+ });
96
+
97
+ // vite/resolve-file-url.ts
98
+ var path;
99
+ var init_resolve_file_url = __esm({
100
+ "vite/resolve-file-url.ts"() {
101
+ "use strict";
102
+ path = __toESM(require("path"));
103
+ init_import_vite_esm_sync();
104
+ }
105
+ });
106
+
107
+ // vite/styles.ts
108
+ var path2, import_react_router, cssFileRegExp, cssModulesRegExp;
109
+ var init_styles = __esm({
110
+ "vite/styles.ts"() {
111
+ "use strict";
112
+ path2 = __toESM(require("path"));
113
+ import_react_router = require("react-router");
114
+ init_resolve_file_url();
115
+ cssFileRegExp = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/;
116
+ cssModulesRegExp = new RegExp(`\\.module${cssFileRegExp.source}`);
117
+ }
118
+ });
119
+
120
+ // vite/vmod.ts
121
+ var id;
122
+ var init_vmod = __esm({
123
+ "vite/vmod.ts"() {
124
+ "use strict";
125
+ id = (name) => `virtual:react-router/${name}`;
126
+ }
127
+ });
128
+
129
+ // vite/combine-urls.ts
130
+ var init_combine_urls = __esm({
131
+ "vite/combine-urls.ts"() {
132
+ "use strict";
133
+ }
134
+ });
135
+
136
+ // vite/remove-exports.ts
137
+ var import_babel_dead_code_elimination;
138
+ var init_remove_exports = __esm({
139
+ "vite/remove-exports.ts"() {
140
+ "use strict";
141
+ import_babel_dead_code_elimination = require("babel-dead-code-elimination");
142
+ init_babel();
143
+ }
144
+ });
145
+
146
+ // config/routes.ts
147
+ var import_node_path, v, import_pick, routeConfigEntrySchema, resolvedRouteConfigSchema;
148
+ var init_routes = __esm({
149
+ "config/routes.ts"() {
150
+ "use strict";
151
+ import_node_path = require("path");
152
+ v = __toESM(require("valibot"));
153
+ import_pick = __toESM(require("lodash/pick"));
154
+ init_invariant();
155
+ routeConfigEntrySchema = v.pipe(
156
+ v.custom((value) => {
157
+ return !(typeof value === "object" && value !== null && "then" in value && "catch" in value);
158
+ }, "Invalid type: Expected object but received a promise. Did you forget to await?"),
159
+ v.object({
160
+ id: v.optional(v.string()),
161
+ path: v.optional(v.string()),
162
+ index: v.optional(v.boolean()),
163
+ caseSensitive: v.optional(v.boolean()),
164
+ file: v.string(),
165
+ children: v.optional(v.array(v.lazy(() => routeConfigEntrySchema)))
166
+ })
167
+ );
168
+ resolvedRouteConfigSchema = v.array(routeConfigEntrySchema);
169
+ }
170
+ });
171
+
172
+ // cli/detectPackageManager.ts
173
+ var init_detectPackageManager = __esm({
174
+ "cli/detectPackageManager.ts"() {
175
+ "use strict";
176
+ }
177
+ });
178
+
179
+ // vite/config.ts
180
+ var import_node_child_process, import_node_path2, import_fs_extra, import_picocolors, import_pick2, import_omit, import_package_json, branchRouteProperties, configRouteToBranchRoute;
181
+ var init_config = __esm({
182
+ "vite/config.ts"() {
183
+ "use strict";
184
+ import_node_child_process = require("child_process");
185
+ import_node_path2 = __toESM(require("path"));
186
+ import_fs_extra = __toESM(require("fs-extra"));
187
+ import_picocolors = __toESM(require("picocolors"));
188
+ import_pick2 = __toESM(require("lodash/pick"));
189
+ import_omit = __toESM(require("lodash/omit"));
190
+ import_package_json = __toESM(require("@npmcli/package-json"));
191
+ init_routes();
192
+ init_detectPackageManager();
193
+ init_import_vite_esm_sync();
194
+ branchRouteProperties = [
195
+ "id",
196
+ "path",
197
+ "file",
198
+ "index"
199
+ ];
200
+ configRouteToBranchRoute = (configRoute) => (0, import_pick2.default)(configRoute, branchRouteProperties);
201
+ }
202
+ });
203
+
204
+ // vite/with-props.ts
205
+ var import_dedent, vmodId;
206
+ var init_with_props = __esm({
207
+ "vite/with-props.ts"() {
208
+ "use strict";
209
+ import_dedent = __toESM(require("dedent"));
210
+ init_babel();
211
+ init_vmod();
212
+ vmodId = id("with-props");
213
+ }
214
+ });
215
+
216
+ // vite/vite-node.ts
217
+ var import_server, import_client, import_source_map;
218
+ var init_vite_node = __esm({
219
+ "vite/vite-node.ts"() {
220
+ "use strict";
221
+ import_server = require("vite-node/server");
222
+ import_client = require("vite-node/client");
223
+ import_source_map = require("vite-node/source-map");
224
+ init_import_vite_esm_sync();
225
+ }
226
+ });
227
+
228
+ // vite/plugin.ts
229
+ async function resolveViteConfig({
230
+ configFile,
231
+ mode,
232
+ root
233
+ }) {
234
+ let vite2 = await import("vite");
235
+ let viteConfig = await vite2.resolveConfig(
236
+ { mode, configFile, root },
237
+ "build",
238
+ // command
239
+ "production",
240
+ // default mode
241
+ "production"
242
+ // default NODE_ENV
243
+ );
244
+ if (typeof viteConfig.build.manifest === "string") {
245
+ throw new Error("Custom Vite manifest paths are not supported");
246
+ }
247
+ return viteConfig;
248
+ }
249
+ async function extractPluginContext(viteConfig) {
250
+ return viteConfig["__reactRouterPluginContext"];
251
+ }
252
+ async function loadPluginContext({
253
+ configFile,
254
+ root
255
+ }) {
256
+ if (!root) {
257
+ root = process.env.REACT_ROUTER_ROOT || process.cwd();
258
+ }
259
+ configFile = configFile ?? findConfig(root, "vite.config", [
260
+ ".ts",
261
+ ".cts",
262
+ ".mts",
263
+ ".js",
264
+ ".cjs",
265
+ ".mjs"
266
+ ]);
267
+ if (!configFile) {
268
+ console.error(import_picocolors2.default.red("Vite config file not found"));
269
+ process.exit(1);
270
+ }
271
+ let viteConfig = await resolveViteConfig({ configFile, root });
272
+ let ctx = await extractPluginContext(viteConfig);
273
+ if (!ctx) {
274
+ console.error(
275
+ import_picocolors2.default.red("React Router Vite plugin not found in Vite config")
276
+ );
277
+ process.exit(1);
278
+ }
279
+ return ctx;
280
+ }
281
+ function findConfig(dir, basename2, extensions) {
282
+ for (let ext of extensions) {
283
+ let name = basename2 + ext;
284
+ let file = path4.join(dir, name);
285
+ if (fse2.existsSync(file)) return file;
286
+ }
287
+ return void 0;
288
+ }
289
+ var import_node_crypto, path4, url, fse2, babel, import_react_router2, import_es_module_lexer, import_jsesc, import_picocolors2, serverBuildId, serverManifestId, browserManifestId, hmrRuntimeId, injectHmrRuntimeId, getServerBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER, REACT_REFRESH_FOOTER;
290
+ var init_plugin = __esm({
291
+ "vite/plugin.ts"() {
292
+ "use strict";
293
+ import_node_crypto = require("crypto");
294
+ path4 = __toESM(require("path"));
295
+ url = __toESM(require("url"));
296
+ fse2 = __toESM(require("fs-extra"));
297
+ babel = __toESM(require("@babel/core"));
298
+ import_react_router2 = require("react-router");
299
+ import_es_module_lexer = require("es-module-lexer");
300
+ import_jsesc = __toESM(require("jsesc"));
301
+ import_picocolors2 = __toESM(require("picocolors"));
302
+ init_invariant();
303
+ init_babel();
304
+ init_node_adapter();
305
+ init_styles();
306
+ init_vmod();
307
+ init_resolve_file_url();
308
+ init_combine_urls();
309
+ init_remove_exports();
310
+ init_import_vite_esm_sync();
311
+ init_config();
312
+ init_with_props();
313
+ init_vite_node();
314
+ serverBuildId = id("server-build");
315
+ serverManifestId = id("server-manifest");
316
+ browserManifestId = id("browser-manifest");
317
+ hmrRuntimeId = id("hmr-runtime");
318
+ injectHmrRuntimeId = id("inject-hmr-runtime");
319
+ getServerBuildDirectory = (ctx) => path4.join(
320
+ ctx.reactRouterConfig.buildDirectory,
321
+ "server",
322
+ ...ctx.serverBundleBuildConfig ? [ctx.serverBundleBuildConfig.serverBundleId] : []
323
+ );
324
+ defaultEntriesDir = path4.resolve(
325
+ path4.dirname(require.resolve("@react-router/dev/package.json")),
326
+ "dist",
327
+ "config",
328
+ "defaults"
329
+ );
330
+ defaultEntries = fse2.readdirSync(defaultEntriesDir).map((filename2) => path4.join(defaultEntriesDir, filename2));
331
+ invariant(defaultEntries.length > 0, "No default entries found");
332
+ REACT_REFRESH_HEADER = `
333
+ import RefreshRuntime from "${hmrRuntimeId}";
334
+
335
+ const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
336
+ let prevRefreshReg;
337
+ let prevRefreshSig;
338
+
339
+ if (import.meta.hot && !inWebWorker) {
340
+ if (!window.__vite_plugin_react_preamble_installed__) {
341
+ throw new Error(
342
+ "React Router Vite plugin can't detect preamble. Something is wrong."
343
+ );
344
+ }
345
+
346
+ prevRefreshReg = window.$RefreshReg$;
347
+ prevRefreshSig = window.$RefreshSig$;
348
+ window.$RefreshReg$ = (type, id) => {
349
+ RefreshRuntime.register(type, __SOURCE__ + " " + id)
350
+ };
351
+ window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;
352
+ }`.trim();
353
+ REACT_REFRESH_FOOTER = `
354
+ if (import.meta.hot && !inWebWorker) {
355
+ window.$RefreshReg$ = prevRefreshReg;
356
+ window.$RefreshSig$ = prevRefreshSig;
357
+ RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
358
+ RefreshRuntime.registerExportsForReactRefresh(__SOURCE__, currentExports);
359
+ import.meta.hot.accept((nextExports) => {
360
+ if (!nextExports) return;
361
+ __ROUTE_ID__ && window.__reactRouterRouteModuleUpdates.set(__ROUTE_ID__, nextExports);
362
+ const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(currentExports, nextExports, __ACCEPT_EXPORTS__);
363
+ if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
364
+ });
365
+ });
366
+ }`.trim();
367
+ }
368
+ });
369
+
370
+ // vite/profiler.ts
371
+ var import_node_fs, import_node_path3, import_picocolors3, getSession, start, profileCount, stop;
372
+ var init_profiler = __esm({
373
+ "vite/profiler.ts"() {
374
+ "use strict";
375
+ import_node_fs = __toESM(require("fs"));
376
+ import_node_path3 = __toESM(require("path"));
377
+ import_picocolors3 = __toESM(require("picocolors"));
378
+ getSession = () => global.__reactRouter_profile_session;
379
+ start = async (callback) => {
380
+ let inspector = await import("inspector").then((r) => r.default);
381
+ let session = global.__reactRouter_profile_session = new inspector.Session();
382
+ session.connect();
383
+ session.post("Profiler.enable", () => {
384
+ session.post("Profiler.start", callback);
385
+ });
386
+ };
387
+ profileCount = 0;
388
+ stop = (log) => {
389
+ let session = getSession();
390
+ if (!session) return;
391
+ return new Promise((res, rej) => {
392
+ session.post("Profiler.stop", (err, { profile }) => {
393
+ if (err) return rej(err);
394
+ let outPath = import_node_path3.default.resolve(`./react-router-${profileCount++}.cpuprofile`);
395
+ import_node_fs.default.writeFileSync(outPath, JSON.stringify(profile));
396
+ log(
397
+ import_picocolors3.default.yellow(
398
+ `CPU profile written to ${import_picocolors3.default.white(import_picocolors3.default.dim(outPath))}`
399
+ )
400
+ );
401
+ global.__reactRouter_profile_session = void 0;
402
+ res();
403
+ });
404
+ });
405
+ };
406
+ }
407
+ });
408
+
409
+ // vite/build.ts
410
+ var build_exports = {};
411
+ __export(build_exports, {
412
+ build: () => build
413
+ });
414
+ function getAddressableRoutes(routes2) {
415
+ let nonAddressableIds = /* @__PURE__ */ new Set();
416
+ for (let id2 in routes2) {
417
+ let route = routes2[id2];
418
+ if (route.index) {
419
+ invariant(
420
+ route.parentId,
421
+ `Expected index route "${route.id}" to have "parentId" set`
422
+ );
423
+ nonAddressableIds.add(route.parentId);
424
+ }
425
+ if (typeof route.path !== "string" && !route.index) {
426
+ nonAddressableIds.add(id2);
427
+ }
428
+ }
429
+ return Object.values(routes2).filter(
430
+ (route) => !nonAddressableIds.has(route.id)
431
+ );
432
+ }
433
+ function getRouteBranch(routes2, routeId) {
434
+ let branch = [];
435
+ let currentRouteId = routeId;
436
+ while (currentRouteId) {
437
+ let route = routes2[currentRouteId];
438
+ invariant(route, `Missing route for ${currentRouteId}`);
439
+ branch.push(route);
440
+ currentRouteId = route.parentId;
441
+ }
442
+ return branch.reverse();
443
+ }
444
+ async function getServerBuilds(ctx) {
445
+ let { rootDirectory } = ctx;
446
+ const { routes: routes2, serverBuildFile, serverBundles, appDirectory } = ctx.reactRouterConfig;
447
+ let serverBuildDirectory = getServerBuildDirectory(ctx);
448
+ if (!serverBundles) {
449
+ return {
450
+ serverBuilds: [{ ssr: true }],
451
+ buildManifest: { routes: routes2 }
452
+ };
453
+ }
454
+ let { normalizePath } = await import("vite");
455
+ let resolvedAppDirectory = import_node_path4.default.resolve(rootDirectory, appDirectory);
456
+ let rootRelativeRoutes = Object.fromEntries(
457
+ Object.entries(routes2).map(([id2, route]) => {
458
+ let filePath = import_node_path4.default.join(resolvedAppDirectory, route.file);
459
+ let rootRelativeFilePath = normalizePath(
460
+ import_node_path4.default.relative(rootDirectory, filePath)
461
+ );
462
+ return [id2, { ...route, file: rootRelativeFilePath }];
463
+ })
464
+ );
465
+ let buildManifest = {
466
+ serverBundles: {},
467
+ routeIdToServerBundleId: {},
468
+ routes: rootRelativeRoutes
469
+ };
470
+ let serverBundleBuildConfigById = /* @__PURE__ */ new Map();
471
+ await Promise.all(
472
+ getAddressableRoutes(routes2).map(async (route) => {
473
+ let branch = getRouteBranch(routes2, route.id);
474
+ let serverBundleId = await serverBundles({
475
+ branch: branch.map(
476
+ (route2) => configRouteToBranchRoute({
477
+ ...route2,
478
+ // Ensure absolute paths are passed to the serverBundles function
479
+ file: import_node_path4.default.join(resolvedAppDirectory, route2.file)
480
+ })
481
+ )
482
+ });
483
+ if (typeof serverBundleId !== "string") {
484
+ throw new Error(`The "serverBundles" function must return a string`);
485
+ }
486
+ if (!/^[a-zA-Z0-9-_]+$/.test(serverBundleId)) {
487
+ throw new Error(
488
+ `The "serverBundles" function must only return strings containing alphanumeric characters, hyphens and underscores.`
489
+ );
490
+ }
491
+ buildManifest.routeIdToServerBundleId[route.id] = serverBundleId;
492
+ let relativeServerBundleDirectory = import_node_path4.default.relative(
493
+ rootDirectory,
494
+ import_node_path4.default.join(serverBuildDirectory, serverBundleId)
495
+ );
496
+ let serverBuildConfig = serverBundleBuildConfigById.get(serverBundleId);
497
+ if (!serverBuildConfig) {
498
+ buildManifest.serverBundles[serverBundleId] = {
499
+ id: serverBundleId,
500
+ file: normalizePath(
501
+ import_node_path4.default.join(relativeServerBundleDirectory, serverBuildFile)
502
+ )
503
+ };
504
+ serverBuildConfig = {
505
+ routes: {},
506
+ serverBundleId
507
+ };
508
+ serverBundleBuildConfigById.set(serverBundleId, serverBuildConfig);
509
+ }
510
+ for (let route2 of branch) {
511
+ serverBuildConfig.routes[route2.id] = route2;
512
+ }
513
+ })
514
+ );
515
+ let serverBuilds = Array.from(serverBundleBuildConfigById.values()).map(
516
+ (serverBundleBuildConfig) => {
517
+ let serverBuild = {
518
+ ssr: true,
519
+ serverBundleBuildConfig
520
+ };
521
+ return serverBuild;
522
+ }
523
+ );
524
+ return {
525
+ serverBuilds,
526
+ buildManifest
527
+ };
528
+ }
529
+ async function cleanBuildDirectory(viteConfig, ctx) {
530
+ let buildDirectory = ctx.reactRouterConfig.buildDirectory;
531
+ let isWithinRoot = () => {
532
+ let relativePath = import_node_path4.default.relative(ctx.rootDirectory, buildDirectory);
533
+ return !relativePath.startsWith("..") && !import_node_path4.default.isAbsolute(relativePath);
534
+ };
535
+ if (viteConfig.build.emptyOutDir ?? isWithinRoot()) {
536
+ await import_fs_extra2.default.remove(buildDirectory);
537
+ }
538
+ }
539
+ function getViteManifestPaths(ctx, serverBuilds) {
540
+ let buildRelative = (pathname) => import_node_path4.default.resolve(ctx.reactRouterConfig.buildDirectory, pathname);
541
+ let viteManifestPaths = [
542
+ "client/.vite/manifest.json",
543
+ ...serverBuilds.map(({ serverBundleBuildConfig }) => {
544
+ let serverBundleId = serverBundleBuildConfig?.serverBundleId;
545
+ let serverBundlePath = serverBundleId ? serverBundleId + "/" : "";
546
+ return `server/${serverBundlePath}.vite/manifest.json`;
547
+ })
548
+ ].map((srcPath) => buildRelative(srcPath));
549
+ return viteManifestPaths;
550
+ }
551
+ async function build(root, {
552
+ assetsInlineLimit,
553
+ clearScreen,
554
+ config: configFile,
555
+ emptyOutDir,
556
+ force,
557
+ logLevel,
558
+ minify,
559
+ mode,
560
+ sourcemapClient,
561
+ sourcemapServer
562
+ }) {
563
+ await preloadViteEsm();
564
+ let viteConfig = await resolveViteConfig({ configFile, mode, root });
565
+ const ctx = await extractPluginContext(viteConfig);
566
+ if (!ctx) {
567
+ console.error(
568
+ import_picocolors4.default.red("React Router Vite plugin not found in Vite config")
569
+ );
570
+ process.exit(1);
571
+ }
572
+ let { reactRouterConfig } = ctx;
573
+ let vite2 = await import("vite");
574
+ async function viteBuild({
575
+ ssr,
576
+ serverBundleBuildConfig
577
+ }) {
578
+ await vite2.build({
579
+ root,
580
+ mode,
581
+ configFile,
582
+ build: {
583
+ assetsInlineLimit,
584
+ emptyOutDir,
585
+ minify,
586
+ ssr,
587
+ sourcemap: ssr ? sourcemapServer : sourcemapClient
588
+ },
589
+ optimizeDeps: { force },
590
+ clearScreen,
591
+ logLevel,
592
+ ...serverBundleBuildConfig ? { __reactRouterServerBundleBuildConfig: serverBundleBuildConfig } : {}
593
+ });
594
+ }
595
+ await cleanBuildDirectory(viteConfig, ctx);
596
+ await viteBuild({ ssr: false });
597
+ let { serverBuilds, buildManifest } = await getServerBuilds(ctx);
598
+ await Promise.all(serverBuilds.map(viteBuild));
599
+ let viteManifestPaths = getViteManifestPaths(ctx, serverBuilds);
600
+ await Promise.all(
601
+ viteManifestPaths.map(async (viteManifestPath) => {
602
+ let manifestExists = await import_fs_extra2.default.pathExists(viteManifestPath);
603
+ if (!manifestExists) return;
604
+ if (!ctx.viteManifestEnabled) {
605
+ await import_fs_extra2.default.remove(viteManifestPath);
606
+ }
607
+ let viteDir = import_node_path4.default.dirname(viteManifestPath);
608
+ let viteDirFiles = await import_fs_extra2.default.readdir(viteDir);
609
+ if (viteDirFiles.length === 0) {
610
+ await import_fs_extra2.default.remove(viteDir);
611
+ }
612
+ })
613
+ );
614
+ await reactRouterConfig.buildEnd?.({
615
+ buildManifest,
616
+ reactRouterConfig,
617
+ viteConfig
618
+ });
619
+ }
620
+ var import_node_path4, import_fs_extra2, import_picocolors4;
621
+ var init_build = __esm({
622
+ "vite/build.ts"() {
623
+ "use strict";
624
+ import_node_path4 = __toESM(require("path"));
625
+ import_fs_extra2 = __toESM(require("fs-extra"));
626
+ import_picocolors4 = __toESM(require("picocolors"));
627
+ init_plugin();
628
+ init_config();
629
+ init_invariant();
630
+ init_import_vite_esm_sync();
631
+ }
632
+ });
633
+
634
+ // vite/dev.ts
635
+ var dev_exports = {};
636
+ __export(dev_exports, {
637
+ dev: () => dev
638
+ });
639
+ async function dev(root, {
640
+ clearScreen,
641
+ config: configFile,
642
+ cors,
643
+ force,
644
+ host,
645
+ logLevel,
646
+ mode,
647
+ open,
648
+ port,
649
+ strictPort
650
+ }) {
651
+ await preloadViteEsm();
652
+ let vite2 = await import("vite");
653
+ let server = await vite2.createServer({
654
+ root,
655
+ mode,
656
+ configFile,
657
+ server: { open, cors, host, port, strictPort },
658
+ optimizeDeps: { force },
659
+ clearScreen,
660
+ logLevel
661
+ });
662
+ if (!server.config.plugins.find((plugin2) => plugin2.name === "react-router")) {
663
+ console.error(
664
+ import_picocolors5.default.red("React Router Vite plugin not found in Vite config")
665
+ );
666
+ process.exit(1);
667
+ }
668
+ await server.listen();
669
+ server.printUrls();
670
+ let customShortcuts = [
671
+ {
672
+ key: "p",
673
+ description: "start/stop the profiler",
674
+ async action(server2) {
675
+ if (getSession()) {
676
+ await stop(server2.config.logger.info);
677
+ } else {
678
+ await start(() => {
679
+ server2.config.logger.info("Profiler started");
680
+ });
681
+ }
682
+ }
683
+ }
684
+ ];
685
+ server.bindCLIShortcuts({ print: true, customShortcuts });
686
+ }
687
+ var import_picocolors5;
688
+ var init_dev = __esm({
689
+ "vite/dev.ts"() {
690
+ "use strict";
691
+ import_picocolors5 = __toESM(require("picocolors"));
692
+ init_import_vite_esm_sync();
693
+ init_profiler();
694
+ }
695
+ });
14
696
 
15
- run.run().then(() => {
16
- process.exit(0);
17
- }, error => {
18
- if (error) console.error(error);
19
- process.exit(1);
697
+ // package.json
698
+ var require_package = __commonJS({
699
+ "package.json"(exports2, module2) {
700
+ module2.exports = {
701
+ name: "@react-router/dev",
702
+ version: "7.0.0-pre.3",
703
+ description: "Dev tools and CLI for React Router",
704
+ homepage: "https://reactrouter.com",
705
+ bugs: {
706
+ url: "https://github.com/remix-run/react-router/issues"
707
+ },
708
+ repository: {
709
+ type: "git",
710
+ url: "https://github.com/remix-run/react-router",
711
+ directory: "packages/react-router-dev"
712
+ },
713
+ license: "MIT",
714
+ main: "./dist/typescript/plugin.ts",
715
+ exports: {
716
+ "./routes": {
717
+ types: "./dist/routes.d.ts",
718
+ default: "./dist/routes.js"
719
+ },
720
+ "./vite": {
721
+ types: "./dist/vite.d.ts",
722
+ default: "./dist/vite.js"
723
+ },
724
+ "./vite/cloudflare": {
725
+ types: "./dist/vite/cloudflare.d.ts",
726
+ default: "./dist/vite/cloudflare.js"
727
+ },
728
+ "./package.json": "./package.json"
729
+ },
730
+ bin: {
731
+ "react-router": "bin.js"
732
+ },
733
+ scripts: {
734
+ build: "wireit"
735
+ },
736
+ wireit: {
737
+ build: {
738
+ command: "tsup",
739
+ files: [
740
+ "cli/**",
741
+ "config/**",
742
+ "typescript/**",
743
+ "vite/**",
744
+ "*.ts",
745
+ "bin.js",
746
+ "tsconfig.json",
747
+ "package.json"
748
+ ],
749
+ output: [
750
+ "dist/**"
751
+ ]
752
+ }
753
+ },
754
+ dependencies: {
755
+ "@babel/core": "^7.21.8",
756
+ "@babel/generator": "^7.21.5",
757
+ "@babel/parser": "^7.21.8",
758
+ "@babel/plugin-syntax-decorators": "^7.22.10",
759
+ "@babel/plugin-syntax-jsx": "^7.21.4",
760
+ "@babel/preset-typescript": "^7.21.5",
761
+ "@babel/traverse": "^7.23.2",
762
+ "@babel/types": "^7.22.5",
763
+ "@npmcli/package-json": "^4.0.1",
764
+ "@react-router/node": "workspace:*",
765
+ arg: "^5.0.1",
766
+ "babel-dead-code-elimination": "^1.0.6",
767
+ chalk: "^4.1.2",
768
+ chokidar: "^4.0.0",
769
+ dedent: "^1.5.3",
770
+ "es-module-lexer": "^1.3.1",
771
+ "exit-hook": "2.2.1",
772
+ "fs-extra": "^10.0.0",
773
+ "gunzip-maybe": "^1.4.2",
774
+ jsesc: "3.0.2",
775
+ lodash: "^4.17.21",
776
+ pathe: "^1.1.2",
777
+ picocolors: "^1.0.0",
778
+ picomatch: "^2.3.1",
779
+ prettier: "^2.7.1",
780
+ "react-refresh": "^0.14.0",
781
+ semver: "^7.3.7",
782
+ "set-cookie-parser": "^2.6.0",
783
+ valibot: "^0.41.0",
784
+ "vite-node": "^1.6.0"
785
+ },
786
+ devDependencies: {
787
+ "@react-router/serve": "workspace:*",
788
+ "@types/babel__core": "^7.20.5",
789
+ "@types/babel__generator": "^7.6.8",
790
+ "@types/babel__traverse": "^7.20.5",
791
+ "@types/dedent": "^0.7.0",
792
+ "@types/express": "^4.17.9",
793
+ "@types/fs-extra": "^8.1.2",
794
+ "@types/gunzip-maybe": "^1.4.0",
795
+ "@types/jsesc": "^3.0.1",
796
+ "@types/lodash": "^4.14.182",
797
+ "@types/node": "^18.17.1",
798
+ "@types/npmcli__package-json": "^4.0.0",
799
+ "@types/picomatch": "^2.3.0",
800
+ "@types/prettier": "^2.7.3",
801
+ "@types/set-cookie-parser": "^2.4.1",
802
+ dotenv: "^16.0.0",
803
+ "esbuild-register": "^3.3.2",
804
+ execa: "5.1.1",
805
+ express: "^4.19.2",
806
+ "fast-glob": "3.2.11",
807
+ "react-router": "workspace:^",
808
+ "strip-ansi": "^6.0.1",
809
+ "tiny-invariant": "^1.2.0",
810
+ tsup: "^8.3.0",
811
+ typescript: "^5.1.6",
812
+ vite: "^5.1.0",
813
+ wireit: "0.14.9",
814
+ wrangler: "^3.28.2"
815
+ },
816
+ peerDependencies: {
817
+ "@react-router/serve": "workspace:^",
818
+ "react-router": "workspace:^",
819
+ typescript: "^5.1.0",
820
+ vite: "^5.1.0",
821
+ wrangler: "^3.28.2"
822
+ },
823
+ peerDependenciesMeta: {
824
+ "@react-router/serve": {
825
+ optional: true
826
+ },
827
+ typescript: {
828
+ optional: true
829
+ },
830
+ wrangler: {
831
+ optional: true
832
+ }
833
+ },
834
+ engines: {
835
+ node: ">=20.0.0"
836
+ },
837
+ files: [
838
+ "dist/",
839
+ "bin.js",
840
+ "CHANGELOG.md",
841
+ "LICENSE.md",
842
+ "README.md"
843
+ ]
844
+ };
845
+ }
20
846
  });
847
+
848
+ // cli/run.ts
849
+ var import_arg = __toESM(require("arg"));
850
+ var import_semver = __toESM(require("semver"));
851
+
852
+ // colors.ts
853
+ var import_chalk = __toESM(require("chalk"));
854
+ var useColor = import_chalk.default.supportsColor && !process.env.NO_COLOR;
855
+ var identity = (x) => x;
856
+ var safe = (style) => useColor ? style : identity;
857
+ var heading = safe(import_chalk.default.underline);
858
+ var arg = safe(import_chalk.default.yellowBright);
859
+ var error = safe(import_chalk.default.red);
860
+ var warning = safe(import_chalk.default.yellow);
861
+ var hint = safe(import_chalk.default.blue);
862
+ var logoBlue = safe(import_chalk.default.blueBright);
863
+ var logoGreen = safe(import_chalk.default.greenBright);
864
+ var logoYellow = safe(import_chalk.default.yellowBright);
865
+ var logoPink = safe(import_chalk.default.magentaBright);
866
+ var logoRed = safe(import_chalk.default.redBright);
867
+ var bold = safe(import_chalk.default.bold);
868
+ var blue = safe(import_chalk.default.blue);
869
+ var cyan = safe(import_chalk.default.cyan);
870
+ var gray = safe(import_chalk.default.gray);
871
+ var red = safe(import_chalk.default.red);
872
+ var yellow = safe(import_chalk.default.yellow);
873
+
874
+ // cli/commands.ts
875
+ var path7 = __toESM(require("path"));
876
+ var import_fs_extra3 = __toESM(require("fs-extra"));
877
+ var import_package_json2 = __toESM(require("@npmcli/package-json"));
878
+ var import_exit_hook = __toESM(require("exit-hook"));
879
+
880
+ // config/format.ts
881
+ function formatRoutes(routeManifest, format) {
882
+ switch (format) {
883
+ case "json":
884
+ return formatRoutesAsJson(routeManifest);
885
+ case "jsx":
886
+ return formatRoutesAsJsx(routeManifest);
887
+ }
888
+ }
889
+ function formatRoutesAsJson(routeManifest) {
890
+ function handleRoutesRecursive(parentId) {
891
+ let routes2 = Object.values(routeManifest).filter(
892
+ (route) => route.parentId === parentId
893
+ );
894
+ let children = [];
895
+ for (let route of routes2) {
896
+ children.push({
897
+ id: route.id,
898
+ index: route.index,
899
+ path: route.path,
900
+ caseSensitive: route.caseSensitive,
901
+ file: route.file,
902
+ children: handleRoutesRecursive(route.id)
903
+ });
904
+ }
905
+ if (children.length > 0) {
906
+ return children;
907
+ }
908
+ return void 0;
909
+ }
910
+ return JSON.stringify(handleRoutesRecursive() || null, null, 2);
911
+ }
912
+ function formatRoutesAsJsx(routeManifest) {
913
+ let output = "<Routes>";
914
+ function handleRoutesRecursive(parentId, level = 1) {
915
+ let routes2 = Object.values(routeManifest).filter(
916
+ (route) => route.parentId === parentId
917
+ );
918
+ let indent = Array(level * 2).fill(" ").join("");
919
+ for (let route of routes2) {
920
+ output += "\n" + indent;
921
+ output += `<Route${route.path ? ` path=${JSON.stringify(route.path)}` : ""}${route.index ? " index" : ""}${route.file ? ` file=${JSON.stringify(route.file)}` : ""}>`;
922
+ if (handleRoutesRecursive(route.id, level + 1)) {
923
+ output += "\n" + indent;
924
+ output += "</Route>";
925
+ } else {
926
+ output = output.slice(0, -1) + " />";
927
+ }
928
+ }
929
+ return routes2.length > 0;
930
+ }
931
+ handleRoutesRecursive();
932
+ output += "\n</Routes>";
933
+ return output;
934
+ }
935
+
936
+ // cli/commands.ts
937
+ init_plugin();
938
+
939
+ // cli/useJavascript.ts
940
+ var babel2 = __toESM(require("@babel/core"));
941
+ var import_plugin_syntax_jsx = __toESM(require("@babel/plugin-syntax-jsx"));
942
+ var import_preset_typescript = __toESM(require("@babel/preset-typescript"));
943
+ var import_prettier = __toESM(require("prettier"));
944
+ function transpile(tsx, options = {}) {
945
+ let mjs = babel2.transformSync(tsx, {
946
+ compact: false,
947
+ cwd: options.cwd,
948
+ filename: options.filename,
949
+ plugins: [import_plugin_syntax_jsx.default],
950
+ presets: [[import_preset_typescript.default, { jsx: "preserve" }]],
951
+ retainLines: true
952
+ });
953
+ if (!mjs || !mjs.code) throw new Error("Could not parse TypeScript");
954
+ return import_prettier.default.format(mjs.code, { parser: "babel" });
955
+ }
956
+
957
+ // cli/commands.ts
958
+ init_profiler();
959
+
960
+ // typescript/typegen.ts
961
+ var import_node_fs2 = __toESM(require("fs"));
962
+ var import_chokidar = __toESM(require("chokidar"));
963
+ var import_dedent2 = __toESM(require("dedent"));
964
+ var Path = __toESM(require("pathe"));
965
+ var Pathe = __toESM(require("pathe/utils"));
966
+ init_routes();
967
+ init_vite_node();
968
+ init_config();
969
+ init_plugin();
970
+ function getDirectory(ctx) {
971
+ return Path.join(ctx.rootDirectory, ".react-router/types");
972
+ }
973
+ function getPath(ctx, route) {
974
+ return Path.join(
975
+ getDirectory(ctx),
976
+ "app",
977
+ Path.dirname(route.file),
978
+ "+types." + Pathe.filename(route.file) + ".d.ts"
979
+ );
980
+ }
981
+ async function writeAll(ctx) {
982
+ import_node_fs2.default.rmSync(getDirectory(ctx), { recursive: true, force: true });
983
+ Object.values(ctx.routes).forEach((route) => {
984
+ if (!import_node_fs2.default.existsSync(Path.join(ctx.appDirectory, route.file))) return;
985
+ const typesPath = getPath(ctx, route);
986
+ const content = getModule(ctx.routes, route);
987
+ import_node_fs2.default.mkdirSync(Path.dirname(typesPath), { recursive: true });
988
+ import_node_fs2.default.writeFileSync(typesPath, content);
989
+ });
990
+ }
991
+ function getModule(routes2, route) {
992
+ return import_dedent2.default`
993
+ // React Router generated types for route:
994
+ // ${route.file}
995
+
996
+ import * as T from "react-router/types"
997
+
998
+ export type Params = {${formattedParamsProperties(routes2, route)}}
999
+
1000
+ type Route = typeof import("./${Pathe.filename(route.file)}")
1001
+
1002
+ export type LoaderData = T.CreateLoaderData<Route>
1003
+ export type ActionData = T.CreateActionData<Route>
1004
+
1005
+ export type LoaderArgs = T.CreateServerLoaderArgs<Params>
1006
+ export type ClientLoaderArgs = T.CreateClientLoaderArgs<Params, Route>
1007
+ export type ActionArgs = T.CreateServerActionArgs<Params>
1008
+ export type ClientActionArgs = T.CreateClientActionArgs<Params, Route>
1009
+
1010
+ export type HydrateFallbackProps = T.CreateHydrateFallbackProps<Params>
1011
+ export type ComponentProps = T.CreateComponentProps<Params, LoaderData, ActionData>
1012
+ export type ErrorBoundaryProps = T.CreateErrorBoundaryProps<Params, LoaderData, ActionData>
1013
+ `;
1014
+ }
1015
+ function formattedParamsProperties(routes2, route) {
1016
+ const urlpath = routeLineage(routes2, route).map((route2) => route2.path).join("/");
1017
+ const params = parseParams(urlpath);
1018
+ const indent = " ".repeat(3);
1019
+ const properties = Object.entries(params).map(([name, values]) => {
1020
+ if (values.length === 1) {
1021
+ const isOptional = values[0];
1022
+ return indent + (isOptional ? `${name}?: string` : `${name}: string`);
1023
+ }
1024
+ const items = values.map(
1025
+ (isOptional) => isOptional ? "string | undefined" : "string"
1026
+ );
1027
+ return indent + `${name}: [${items.join(", ")}]`;
1028
+ });
1029
+ const body = properties.length === 0 ? "" : "\n" + properties.join("\n") + "\n";
1030
+ return body;
1031
+ }
1032
+ function routeLineage(routes2, route) {
1033
+ const result = [];
1034
+ while (route) {
1035
+ result.push(route);
1036
+ if (!route.parentId) break;
1037
+ route = routes2[route.parentId];
1038
+ }
1039
+ result.reverse();
1040
+ return result;
1041
+ }
1042
+ function parseParams(urlpath) {
1043
+ const result = {};
1044
+ let segments = urlpath.split("/");
1045
+ segments.filter((s) => s.startsWith(":")).forEach((param) => {
1046
+ param = param.slice(1);
1047
+ let isOptional = param.endsWith("?");
1048
+ if (isOptional) {
1049
+ param = param.slice(0, -1);
1050
+ }
1051
+ result[param] ??= [];
1052
+ result[param].push(isOptional);
1053
+ return;
1054
+ });
1055
+ return result;
1056
+ }
1057
+
1058
+ // cli/commands.ts
1059
+ async function routes(reactRouterRoot, flags = {}) {
1060
+ let ctx = await loadPluginContext({
1061
+ root: reactRouterRoot,
1062
+ configFile: flags.config
1063
+ });
1064
+ if (!ctx) {
1065
+ console.error(
1066
+ red("React Router Vite plugin not found in Vite config")
1067
+ );
1068
+ process.exit(1);
1069
+ }
1070
+ let format = flags.json ? "json" : "jsx";
1071
+ console.log(formatRoutes(ctx.reactRouterConfig.routes, format));
1072
+ }
1073
+ async function build2(root, options = {}) {
1074
+ if (!root) {
1075
+ root = process.env.REACT_ROUTER_ROOT || process.cwd();
1076
+ }
1077
+ let { build: build3 } = await Promise.resolve().then(() => (init_build(), build_exports));
1078
+ if (options.profile) {
1079
+ await start();
1080
+ }
1081
+ try {
1082
+ await build3(root, options);
1083
+ } finally {
1084
+ await stop(console.info);
1085
+ }
1086
+ }
1087
+ async function dev2(root, options = {}) {
1088
+ let { dev: dev3 } = await Promise.resolve().then(() => (init_dev(), dev_exports));
1089
+ if (options.profile) {
1090
+ await start();
1091
+ }
1092
+ (0, import_exit_hook.default)(() => stop(console.info));
1093
+ await dev3(root, options);
1094
+ await new Promise(() => {
1095
+ });
1096
+ }
1097
+ var clientEntries = ["entry.client.tsx", "entry.client.js", "entry.client.jsx"];
1098
+ var serverEntries = ["entry.server.tsx", "entry.server.js", "entry.server.jsx"];
1099
+ var entries = ["entry.client", "entry.server"];
1100
+ var conjunctionListFormat = new Intl.ListFormat("en", {
1101
+ style: "long",
1102
+ type: "conjunction"
1103
+ });
1104
+ async function generateEntry(entry, reactRouterRoot, flags = {}) {
1105
+ let ctx = await loadPluginContext({
1106
+ root: reactRouterRoot,
1107
+ configFile: flags.config
1108
+ });
1109
+ let rootDirectory = ctx.rootDirectory;
1110
+ let appDirectory = ctx.reactRouterConfig.appDirectory;
1111
+ if (!entry) {
1112
+ await generateEntry("entry.client", reactRouterRoot, flags);
1113
+ await generateEntry("entry.server", reactRouterRoot, flags);
1114
+ return;
1115
+ }
1116
+ if (!entries.includes(entry)) {
1117
+ let entriesArray = Array.from(entries);
1118
+ let list = conjunctionListFormat.format(entriesArray);
1119
+ console.error(
1120
+ error(`Invalid entry file. Valid entry files are ${list}`)
1121
+ );
1122
+ return;
1123
+ }
1124
+ let pkgJson = await import_package_json2.default.load(rootDirectory);
1125
+ let deps = pkgJson.content.dependencies ?? {};
1126
+ if (!deps["@react-router/node"]) {
1127
+ console.error(error(`No default server entry detected.`));
1128
+ return;
1129
+ }
1130
+ let defaultsDirectory = path7.resolve(
1131
+ path7.dirname(require.resolve("@react-router/dev/package.json")),
1132
+ "dist",
1133
+ "config",
1134
+ "defaults"
1135
+ );
1136
+ let defaultEntryClient = path7.resolve(defaultsDirectory, "entry.client.tsx");
1137
+ let defaultEntryServer = path7.resolve(
1138
+ defaultsDirectory,
1139
+ `entry.server.node.tsx`
1140
+ );
1141
+ let isServerEntry = entry === "entry.server";
1142
+ let contents = isServerEntry ? await createServerEntry(rootDirectory, appDirectory, defaultEntryServer) : await createClientEntry(rootDirectory, appDirectory, defaultEntryClient);
1143
+ let useTypeScript = flags.typescript ?? true;
1144
+ let outputExtension = useTypeScript ? "tsx" : "jsx";
1145
+ let outputEntry = `${entry}.${outputExtension}`;
1146
+ let outputFile2 = path7.resolve(appDirectory, outputEntry);
1147
+ if (!useTypeScript) {
1148
+ let javascript = transpile(contents, {
1149
+ cwd: rootDirectory,
1150
+ filename: isServerEntry ? defaultEntryServer : defaultEntryClient
1151
+ });
1152
+ await import_fs_extra3.default.writeFile(outputFile2, javascript, "utf-8");
1153
+ } else {
1154
+ await import_fs_extra3.default.writeFile(outputFile2, contents, "utf-8");
1155
+ }
1156
+ console.log(
1157
+ blue(
1158
+ `Entry file ${entry} created at ${path7.relative(
1159
+ rootDirectory,
1160
+ outputFile2
1161
+ )}.`
1162
+ )
1163
+ );
1164
+ }
1165
+ async function checkForEntry(rootDirectory, appDirectory, entries2) {
1166
+ for (let entry of entries2) {
1167
+ let entryPath = path7.resolve(appDirectory, entry);
1168
+ let exists = await import_fs_extra3.default.pathExists(entryPath);
1169
+ if (exists) {
1170
+ let relative5 = path7.relative(rootDirectory, entryPath);
1171
+ console.error(error(`Entry file ${relative5} already exists.`));
1172
+ return process.exit(1);
1173
+ }
1174
+ }
1175
+ }
1176
+ async function createServerEntry(rootDirectory, appDirectory, inputFile) {
1177
+ await checkForEntry(rootDirectory, appDirectory, serverEntries);
1178
+ let contents = await import_fs_extra3.default.readFile(inputFile, "utf-8");
1179
+ return contents;
1180
+ }
1181
+ async function createClientEntry(rootDirectory, appDirectory, inputFile) {
1182
+ await checkForEntry(rootDirectory, appDirectory, clientEntries);
1183
+ let contents = await import_fs_extra3.default.readFile(inputFile, "utf-8");
1184
+ return contents;
1185
+ }
1186
+ async function typegen(root) {
1187
+ let ctx = await loadPluginContext({ root });
1188
+ await writeAll({
1189
+ rootDirectory: root,
1190
+ appDirectory: ctx.reactRouterConfig.appDirectory,
1191
+ routes: ctx.reactRouterConfig.routes
1192
+ });
1193
+ }
1194
+
1195
+ // cli/run.ts
1196
+ var helpText = `
1197
+ ${logoBlue("react-router")}
1198
+
1199
+ ${heading("Usage")}:
1200
+ $ react-router build [${arg("projectDir")}]
1201
+ $ react-router dev [${arg("projectDir")}]
1202
+ $ react-router routes [${arg("projectDir")}]
1203
+
1204
+ ${heading("Options")}:
1205
+ --help, -h Print this help message and exit
1206
+ --version, -v Print the CLI version and exit
1207
+ --no-color Disable ANSI colors in console output
1208
+ \`build\` Options:
1209
+ --assetsInlineLimit Static asset base64 inline threshold in bytes (default: 4096) (number)
1210
+ --clearScreen Allow/disable clear screen when logging (boolean)
1211
+ --config, -c Use specified config file (string)
1212
+ --emptyOutDir Force empty outDir when it's outside of root (boolean)
1213
+ --logLevel, -l Info | warn | error | silent (string)
1214
+ --minify Enable/disable minification, or specify minifier to use (default: "esbuild") (boolean | "terser" | "esbuild")
1215
+ --mode, -m Set env mode (string)
1216
+ --profile Start built-in Node.js inspector
1217
+ --sourcemapClient Output source maps for client build (default: false) (boolean | "inline" | "hidden")
1218
+ --sourcemapServer Output source maps for server build (default: false) (boolean | "inline" | "hidden")
1219
+ \`dev\` Options:
1220
+ --clearScreen Allow/disable clear screen when logging (boolean)
1221
+ --config, -c Use specified config file (string)
1222
+ --cors Enable CORS (boolean)
1223
+ --force Force the optimizer to ignore the cache and re-bundle (boolean)
1224
+ --host Specify hostname (string)
1225
+ --logLevel, -l Info | warn | error | silent (string)
1226
+ --mode, -m Set env mode (string)
1227
+ --open Open browser on startup (boolean | string)
1228
+ --port Specify port (number)
1229
+ --profile Start built-in Node.js inspector
1230
+ --strictPort Exit if specified port is already in use (boolean)
1231
+ \`routes\` Options:
1232
+ --config, -c Use specified Vite config file (string)
1233
+ --json Print the routes as JSON
1234
+ \`reveal\` Options:
1235
+ --config, -c Use specified Vite config file (string)
1236
+ --no-typescript Generate plain JavaScript files
1237
+
1238
+ ${heading("Build your project")}:
1239
+
1240
+ $ react-router build
1241
+
1242
+ ${heading("Run your project locally in development")}:
1243
+
1244
+ $ react-router dev
1245
+
1246
+ ${heading("Show all routes in your app")}:
1247
+
1248
+ $ react-router routes
1249
+ $ react-router routes my-app
1250
+ $ react-router routes --json
1251
+ $ react-router routes --config vite.react-router.config.ts
1252
+
1253
+ ${heading("Reveal the used entry point")}:
1254
+
1255
+ $ react-router reveal entry.client
1256
+ $ react-router reveal entry.server
1257
+ $ react-router reveal entry.client --no-typescript
1258
+ $ react-router reveal entry.server --no-typescript
1259
+ $ react-router reveal entry.server --config vite.react-router.config.ts
1260
+
1261
+ ${heading("Generate types for route modules")}:
1262
+
1263
+ $ react-router typegen
1264
+ `;
1265
+ async function run(argv = process.argv.slice(2)) {
1266
+ let versions = process.versions;
1267
+ let MINIMUM_NODE_VERSION = 20;
1268
+ if (versions && versions.node && import_semver.default.major(versions.node) < MINIMUM_NODE_VERSION) {
1269
+ throw new Error(
1270
+ `\uFE0F\u{1F6A8} Oops, Node v${versions.node} detected. react-router requires a Node version greater than ${MINIMUM_NODE_VERSION}.`
1271
+ );
1272
+ }
1273
+ let isBooleanFlag = (arg3) => {
1274
+ let index = argv.indexOf(arg3);
1275
+ let nextArg = argv[index + 1];
1276
+ return !nextArg || nextArg.startsWith("-");
1277
+ };
1278
+ let args = (0, import_arg.default)(
1279
+ {
1280
+ "--force": Boolean,
1281
+ "--help": Boolean,
1282
+ "-h": "--help",
1283
+ "--json": Boolean,
1284
+ "--token": String,
1285
+ "--typescript": Boolean,
1286
+ "--no-typescript": Boolean,
1287
+ "--version": Boolean,
1288
+ "-v": "--version",
1289
+ "--port": Number,
1290
+ "-p": "--port",
1291
+ "--config": String,
1292
+ "-c": "--config",
1293
+ "--assetsInlineLimit": Number,
1294
+ "--clearScreen": Boolean,
1295
+ "--cors": Boolean,
1296
+ "--emptyOutDir": Boolean,
1297
+ "--host": isBooleanFlag("--host") ? Boolean : String,
1298
+ "--logLevel": String,
1299
+ "-l": "--logLevel",
1300
+ "--minify": String,
1301
+ "--mode": String,
1302
+ "-m": "--mode",
1303
+ "--open": isBooleanFlag("--open") ? Boolean : String,
1304
+ "--strictPort": Boolean,
1305
+ "--profile": Boolean,
1306
+ "--sourcemapClient": isBooleanFlag("--sourcemapClient") ? Boolean : String,
1307
+ "--sourcemapServer": isBooleanFlag("--sourcemapServer") ? Boolean : String
1308
+ },
1309
+ {
1310
+ argv
1311
+ }
1312
+ );
1313
+ let input = args._;
1314
+ let flags = Object.entries(args).reduce((acc, [key, value]) => {
1315
+ key = key.replace(/^--/, "");
1316
+ acc[key] = value;
1317
+ return acc;
1318
+ }, {});
1319
+ if (flags.help) {
1320
+ console.log(helpText);
1321
+ return;
1322
+ }
1323
+ if (flags.version) {
1324
+ let version = require_package().version;
1325
+ console.log(version);
1326
+ return;
1327
+ }
1328
+ flags.interactive = flags.interactive ?? require.main === module;
1329
+ if (args["--no-typescript"]) {
1330
+ flags.typescript = false;
1331
+ }
1332
+ let command = input[0];
1333
+ switch (command) {
1334
+ case "routes":
1335
+ await routes(input[1], flags);
1336
+ break;
1337
+ case "build":
1338
+ await build2(input[1], flags);
1339
+ break;
1340
+ case "reveal": {
1341
+ await generateEntry(input[1], input[2], flags);
1342
+ break;
1343
+ }
1344
+ case "dev":
1345
+ await dev2(input[1], flags);
1346
+ break;
1347
+ case "typegen":
1348
+ await typegen(input[1]);
1349
+ break;
1350
+ default:
1351
+ await dev2(input[0], flags);
1352
+ }
1353
+ }
1354
+
1355
+ // cli/index.ts
1356
+ run().then(
1357
+ () => {
1358
+ process.exit(0);
1359
+ },
1360
+ (error2) => {
1361
+ if (error2) console.error(error2);
1362
+ process.exit(1);
1363
+ }
1364
+ );