@react-router/dev 7.15.1 → 8.0.0-pre.0

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.
@@ -1,891 +0,0 @@
1
- /**
2
- * @react-router/dev v7.15.1
3
- *
4
- * Copyright (c) Remix Software Inc.
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE.md file in the root directory of this source tree.
8
- *
9
- * @license MIT
10
- */
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 __export = (target, all) => {
19
- for (var name in all)
20
- __defProp(target, name, { get: all[name], enumerable: true });
21
- };
22
- var __copyProps = (to, from, except, desc) => {
23
- if (from && typeof from === "object" || typeof from === "function") {
24
- for (let key of __getOwnPropNames(from))
25
- if (!__hasOwnProp.call(to, key) && key !== except)
26
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
27
- }
28
- return to;
29
- };
30
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
31
- // If the importer is in node compatibility mode or this is not an ESM
32
- // file that has been converted to a CommonJS file using a Babel-
33
- // compatible transform (i.e. "__esModule" has not been set), then set
34
- // "default" to the CommonJS "module.exports" for node compatibility.
35
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
36
- mod
37
- ));
38
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
39
-
40
- // vite/cloudflare.ts
41
- var cloudflare_exports = {};
42
- __export(cloudflare_exports, {
43
- cloudflareDevProxy: () => cloudflareDevProxyVitePlugin
44
- });
45
- module.exports = __toCommonJS(cloudflare_exports);
46
-
47
- // vite/cloudflare-dev-proxy.ts
48
- var import_react_router = require("react-router");
49
-
50
- // invariant.ts
51
- function invariant(value, message) {
52
- if (value === false || value === null || typeof value === "undefined") {
53
- console.error(
54
- "The following error is a bug in React Router; please open an issue! https://github.com/remix-run/react-router/issues/new/choose"
55
- );
56
- throw new Error(message);
57
- }
58
- }
59
-
60
- // vite/node-adapter.ts
61
- async function fromNodeRequest(nodeReq, nodeRes) {
62
- invariant(
63
- nodeReq.originalUrl,
64
- "Expected `nodeReq.originalUrl` to be defined"
65
- );
66
- nodeReq.url = nodeReq.originalUrl;
67
- const { createRequest } = await import("@remix-run/node-fetch-server");
68
- return createRequest(nodeReq, nodeRes);
69
- }
70
-
71
- // vite/vite.ts
72
- var import_pathe2 = __toESM(require("pathe"));
73
-
74
- // config/is-react-router-repo.ts
75
- var import_pathe = __toESM(require("pathe"));
76
- function isReactRouterRepo() {
77
- let serverRuntimePath = import_pathe.default.dirname(
78
- require.resolve("@react-router/node/package.json")
79
- );
80
- let serverRuntimeParentDir = import_pathe.default.basename(
81
- import_pathe.default.resolve(serverRuntimePath, "..")
82
- );
83
- return serverRuntimeParentDir === "packages";
84
- }
85
-
86
- // vite/vite.ts
87
- var vite;
88
- var viteImportSpecifier = isReactRouterRepo() ? (
89
- // Support testing against different versions of Vite by ensuring that Vite
90
- // is resolved from the current working directory when running within this
91
- // repo. If we don't do this, Vite will always be imported relative to this
92
- // file, which means that it will always resolve to Vite 6.
93
- `file:///${import_pathe2.default.normalize(
94
- require.resolve("vite/package.json", { paths: [process.cwd()] })
95
- ).replace("package.json", "dist/node/index.js")}`
96
- ) : "vite";
97
- async function preloadVite() {
98
- vite = await import(viteImportSpecifier);
99
- }
100
- function getVite() {
101
- invariant(vite, "getVite() called before preloadVite()");
102
- return vite;
103
- }
104
-
105
- // config/config.ts
106
- var import_node_fs = __toESM(require("fs"));
107
- var import_node_child_process = require("child_process");
108
-
109
- // vite/ssr-externals.ts
110
- var ssrExternals = isReactRouterRepo() ? [
111
- // This is only needed within this repo because these packages
112
- // are linked to a directory outside of node_modules so Vite
113
- // treats them as internal code by default.
114
- "react-router",
115
- "react-router-dom",
116
- "@react-router/architect",
117
- "@react-router/cloudflare",
118
- "@react-router/dev",
119
- "@react-router/express",
120
- "@react-router/node",
121
- "@react-router/serve"
122
- ] : void 0;
123
-
124
- // vite/vite-node.ts
125
- async function createContext({
126
- root,
127
- mode,
128
- customLogger
129
- }) {
130
- await preloadVite();
131
- const vite2 = getVite();
132
- const [{ ViteNodeServer }, { ViteNodeRunner }, { installSourcemapsSupport }] = await Promise.all([
133
- import("vite-node/server"),
134
- import("vite-node/client"),
135
- import("vite-node/source-map")
136
- ]);
137
- const devServer = await vite2.createServer({
138
- root,
139
- mode,
140
- customLogger,
141
- server: {
142
- preTransformRequests: false,
143
- hmr: false,
144
- watch: null
145
- },
146
- ssr: {
147
- external: ssrExternals
148
- },
149
- optimizeDeps: {
150
- noDiscovery: true
151
- },
152
- css: {
153
- // This empty PostCSS config object prevents the PostCSS config file from
154
- // being loaded. We don't need it in a React Router config context, and
155
- // there's also an issue in Vite 5 when using a .ts PostCSS config file in
156
- // an ESM project: https://github.com/vitejs/vite/issues/15869. Consumers
157
- // can work around this in their own Vite config file, but they can't
158
- // configure this internal usage of vite-node.
159
- postcss: {}
160
- },
161
- configFile: false,
162
- envFile: false,
163
- plugins: []
164
- });
165
- await devServer.pluginContainer.buildStart({});
166
- const server = new ViteNodeServer(devServer);
167
- installSourcemapsSupport({
168
- getSourceMap: (source) => server.getSourceMap(source)
169
- });
170
- const runner = new ViteNodeRunner({
171
- root: devServer.config.root,
172
- base: devServer.config.base,
173
- fetchModule(id) {
174
- return server.fetchModule(id);
175
- },
176
- resolveId(id, importer) {
177
- return server.resolveId(id, importer);
178
- }
179
- });
180
- return { devServer, server, runner };
181
- }
182
-
183
- // config/config.ts
184
- var import_pathe3 = __toESM(require("pathe"));
185
- var import_chokidar = __toESM(require("chokidar"));
186
- var import_picocolors = __toESM(require("picocolors"));
187
- var import_pick2 = __toESM(require("lodash/pick"));
188
- var import_omit = __toESM(require("lodash/omit"));
189
- var import_cloneDeep = __toESM(require("lodash/cloneDeep"));
190
- var import_isEqual = __toESM(require("lodash/isEqual"));
191
-
192
- // config/routes.ts
193
- var Path = __toESM(require("pathe"));
194
- var v = __toESM(require("valibot"));
195
- var import_pick = __toESM(require("lodash/pick"));
196
- function setAppDirectory(directory) {
197
- globalThis.__reactRouterAppDirectory = directory;
198
- }
199
- var routeConfigEntrySchema = v.pipe(
200
- v.custom((value) => {
201
- return !(typeof value === "object" && value !== null && "then" in value && "catch" in value);
202
- }, "Invalid type: Expected object but received a promise. Did you forget to await?"),
203
- v.object({
204
- id: v.optional(
205
- v.pipe(
206
- v.string(),
207
- v.notValue("root", "A route cannot use the reserved id 'root'.")
208
- )
209
- ),
210
- path: v.optional(v.string()),
211
- index: v.optional(v.boolean()),
212
- caseSensitive: v.optional(v.boolean()),
213
- file: v.string(),
214
- children: v.optional(v.array(v.lazy(() => routeConfigEntrySchema)))
215
- })
216
- );
217
- var resolvedRouteConfigSchema = v.array(routeConfigEntrySchema);
218
- function validateRouteConfig({
219
- routeConfigFile,
220
- routeConfig
221
- }) {
222
- if (!routeConfig) {
223
- return {
224
- valid: false,
225
- message: `Route config must be the default export in "${routeConfigFile}".`
226
- };
227
- }
228
- if (!Array.isArray(routeConfig)) {
229
- return {
230
- valid: false,
231
- message: `Route config in "${routeConfigFile}" must be an array.`
232
- };
233
- }
234
- let { issues } = v.safeParse(resolvedRouteConfigSchema, routeConfig);
235
- if (issues?.length) {
236
- let { root, nested } = v.flatten(issues);
237
- return {
238
- valid: false,
239
- message: [
240
- `Route config in "${routeConfigFile}" is invalid.`,
241
- root ? `${root}` : [],
242
- nested ? Object.entries(nested).map(
243
- ([path3, message]) => `Path: routes.${path3}
244
- ${message}`
245
- ) : []
246
- ].flat().join("\n\n")
247
- };
248
- }
249
- return {
250
- valid: true,
251
- routeConfig
252
- };
253
- }
254
- function configRoutesToRouteManifest(appDirectory, routes) {
255
- let routeManifest = {};
256
- function walk(route, parentId) {
257
- let id = route.id || createRouteId(route.file);
258
- let manifestItem = {
259
- id,
260
- parentId,
261
- file: Path.isAbsolute(route.file) ? Path.relative(appDirectory, route.file) : route.file,
262
- path: route.path,
263
- index: route.index,
264
- caseSensitive: route.caseSensitive
265
- };
266
- if (routeManifest.hasOwnProperty(id)) {
267
- throw new Error(
268
- `Unable to define routes with duplicate route id: "${id}"`
269
- );
270
- }
271
- routeManifest[id] = manifestItem;
272
- if (route.children) {
273
- for (let child of route.children) {
274
- walk(child, id);
275
- }
276
- }
277
- }
278
- for (let route of routes) {
279
- walk(route);
280
- }
281
- return routeManifest;
282
- }
283
- function createRouteId(file) {
284
- return Path.normalize(stripFileExtension(file));
285
- }
286
- function stripFileExtension(file) {
287
- return file.replace(/\.[a-z0-9]+$/i, "");
288
- }
289
-
290
- // config/config.ts
291
- var excludedConfigPresetKeys = ["presets"];
292
- var mergeReactRouterConfig = (...configs) => {
293
- let reducer = (configA, configB) => {
294
- let mergeRequired = (key) => configA[key] !== void 0 && configB[key] !== void 0;
295
- return {
296
- ...configA,
297
- ...configB,
298
- ...mergeRequired("buildEnd") ? {
299
- buildEnd: async (...args) => {
300
- await Promise.all([
301
- configA.buildEnd?.(...args),
302
- configB.buildEnd?.(...args)
303
- ]);
304
- }
305
- } : {},
306
- ...mergeRequired("future") ? {
307
- future: {
308
- ...configA.future,
309
- ...configB.future
310
- }
311
- } : {},
312
- ...mergeRequired("presets") ? {
313
- presets: [...configA.presets ?? [], ...configB.presets ?? []]
314
- } : {}
315
- };
316
- };
317
- return configs.reduce(reducer, {});
318
- };
319
- var deepFreeze = (o) => {
320
- Object.freeze(o);
321
- let oIsFunction = typeof o === "function";
322
- let hasOwnProp = Object.prototype.hasOwnProperty;
323
- Object.getOwnPropertyNames(o).forEach(function(prop) {
324
- if (hasOwnProp.call(o, prop) && (oIsFunction ? prop !== "caller" && prop !== "callee" && prop !== "arguments" : true) && o[prop] !== null && (typeof o[prop] === "object" || typeof o[prop] === "function") && !Object.isFrozen(o[prop])) {
325
- deepFreeze(o[prop]);
326
- }
327
- });
328
- return o;
329
- };
330
- function ok(value) {
331
- return { ok: true, value };
332
- }
333
- function err(error) {
334
- return { ok: false, error };
335
- }
336
- async function resolveConfig({
337
- root,
338
- viteNodeContext,
339
- reactRouterConfigFile,
340
- skipRoutes,
341
- validateConfig
342
- }) {
343
- let reactRouterUserConfig = {};
344
- if (reactRouterConfigFile) {
345
- try {
346
- if (!import_node_fs.default.existsSync(reactRouterConfigFile)) {
347
- return err(`${reactRouterConfigFile} no longer exists`);
348
- }
349
- let configModule = await viteNodeContext.runner.executeFile(
350
- reactRouterConfigFile
351
- );
352
- if (configModule.default === void 0) {
353
- return err(`${reactRouterConfigFile} must provide a default export`);
354
- }
355
- if (typeof configModule.default !== "object") {
356
- return err(`${reactRouterConfigFile} must export a config`);
357
- }
358
- reactRouterUserConfig = configModule.default;
359
- if (validateConfig) {
360
- const error = validateConfig(reactRouterUserConfig);
361
- if (error) {
362
- return err(error);
363
- }
364
- }
365
- } catch (error) {
366
- return err(`Error loading ${reactRouterConfigFile}: ${error}`);
367
- }
368
- }
369
- reactRouterUserConfig = deepFreeze((0, import_cloneDeep.default)(reactRouterUserConfig));
370
- let presets = (await Promise.all(
371
- (reactRouterUserConfig.presets ?? []).map(async (preset) => {
372
- if (!preset.name) {
373
- throw new Error(
374
- "React Router presets must have a `name` property defined."
375
- );
376
- }
377
- if (!preset.reactRouterConfig) {
378
- return null;
379
- }
380
- let configPreset = (0, import_omit.default)(
381
- await preset.reactRouterConfig({ reactRouterUserConfig }),
382
- excludedConfigPresetKeys
383
- );
384
- return configPreset;
385
- })
386
- )).filter(function isNotNull(value) {
387
- return value !== null;
388
- });
389
- let defaults = {
390
- basename: "/",
391
- buildDirectory: "build",
392
- serverBuildFile: "index.js",
393
- serverModuleFormat: "esm",
394
- ssr: true
395
- };
396
- let userAndPresetConfigs = mergeReactRouterConfig(
397
- ...presets,
398
- reactRouterUserConfig
399
- );
400
- let {
401
- appDirectory: userAppDirectory,
402
- basename,
403
- buildDirectory: userBuildDirectory,
404
- buildEnd,
405
- prerender,
406
- routeDiscovery: userRouteDiscovery,
407
- serverBuildFile,
408
- serverBundles,
409
- serverModuleFormat,
410
- ssr
411
- } = {
412
- ...defaults,
413
- // Default values should be completely overridden by user/preset config, not merged
414
- ...userAndPresetConfigs
415
- };
416
- if (!ssr && serverBundles) {
417
- serverBundles = void 0;
418
- }
419
- if (prerender) {
420
- let isValidPrerenderPathsConfig = (p) => typeof p === "boolean" || typeof p === "function" || Array.isArray(p);
421
- let isValidPrerenderConfig = isValidPrerenderPathsConfig(prerender) || typeof prerender === "object" && "paths" in prerender && isValidPrerenderPathsConfig(prerender.paths);
422
- if (!isValidPrerenderConfig) {
423
- return err(
424
- "The `prerender`/`prerender.paths` config must be a boolean, an array of string paths, or a function returning a boolean or array of string paths."
425
- );
426
- }
427
- if (typeof prerender === "object" && "unstable_concurrency" in prerender) {
428
- return err(
429
- "The `prerender.unstable_concurrency` config field has been stabilized as `prerender.concurrency`"
430
- );
431
- }
432
- let isValidConcurrencyConfig = typeof prerender != "object" || !("concurrency" in prerender) || typeof prerender.concurrency === "number" && Number.isInteger(prerender.concurrency) && prerender.concurrency > 0;
433
- if (!isValidConcurrencyConfig) {
434
- return err(
435
- "The `prerender.concurrency` config must be a positive integer if specified."
436
- );
437
- }
438
- }
439
- let routeDiscovery;
440
- if (userRouteDiscovery == null) {
441
- if (ssr) {
442
- routeDiscovery = {
443
- mode: "lazy",
444
- manifestPath: "/__manifest"
445
- };
446
- } else {
447
- routeDiscovery = { mode: "initial" };
448
- }
449
- } else if (userRouteDiscovery.mode === "initial") {
450
- routeDiscovery = userRouteDiscovery;
451
- } else if (userRouteDiscovery.mode === "lazy") {
452
- if (!ssr) {
453
- return err(
454
- 'The `routeDiscovery.mode` config cannot be set to "lazy" when setting `ssr:false`'
455
- );
456
- }
457
- let { manifestPath } = userRouteDiscovery;
458
- if (manifestPath != null && !manifestPath.startsWith("/")) {
459
- return err(
460
- 'The `routeDiscovery.manifestPath` config must be a root-relative pathname beginning with a slash (i.e., "/__manifest")'
461
- );
462
- }
463
- routeDiscovery = userRouteDiscovery;
464
- }
465
- let appDirectory = import_pathe3.default.resolve(root, userAppDirectory || "app");
466
- let buildDirectory = import_pathe3.default.resolve(root, userBuildDirectory);
467
- let rootRouteFile = findEntry(appDirectory, "root", { absolute: true });
468
- if (!rootRouteFile) {
469
- let rootRouteDisplayPath = import_pathe3.default.relative(
470
- root,
471
- import_pathe3.default.join(appDirectory, "root.tsx")
472
- );
473
- return err(
474
- `Could not find a root route module in the app directory as "${rootRouteDisplayPath}"`
475
- );
476
- }
477
- let routes;
478
- let routeConfig = [];
479
- if (skipRoutes) {
480
- routes = {};
481
- } else {
482
- let routeConfigFile = findEntry(appDirectory, "routes");
483
- try {
484
- if (!routeConfigFile) {
485
- let routeConfigDisplayPath = import_pathe3.default.relative(
486
- root,
487
- import_pathe3.default.join(appDirectory, "routes.ts")
488
- );
489
- return err(
490
- `Route config file not found at "${routeConfigDisplayPath}".`
491
- );
492
- }
493
- setAppDirectory(appDirectory);
494
- let routeConfigExport = (await viteNodeContext.runner.executeFile(
495
- import_pathe3.default.join(appDirectory, routeConfigFile)
496
- )).default;
497
- let result = validateRouteConfig({
498
- routeConfigFile,
499
- routeConfig: await routeConfigExport
500
- });
501
- if (!result.valid) {
502
- return err(result.message);
503
- }
504
- routeConfig = [
505
- {
506
- id: "root",
507
- path: "",
508
- file: import_pathe3.default.relative(appDirectory, rootRouteFile),
509
- children: result.routeConfig
510
- }
511
- ];
512
- routes = configRoutesToRouteManifest(appDirectory, routeConfig);
513
- } catch (error) {
514
- return err(
515
- [
516
- import_picocolors.default.red(`Route config in "${routeConfigFile}" is invalid.`),
517
- "",
518
- error.loc?.file && error.loc?.column && error.frame ? [
519
- import_pathe3.default.relative(appDirectory, error.loc.file) + ":" + error.loc.line + ":" + error.loc.column,
520
- error.frame.trim?.()
521
- ] : error.stack
522
- ].flat().join("\n")
523
- );
524
- }
525
- }
526
- let futureConfig = userAndPresetConfigs.future;
527
- if (futureConfig) {
528
- if ("unstable_splitRouteModules" in futureConfig) {
529
- return err(
530
- "The `future.unstable_splitRouteModules` flag has been stabilized as `future.v8_splitRouteModules`"
531
- );
532
- }
533
- if ("unstable_viteEnvironmentApi" in futureConfig) {
534
- return err(
535
- "The `future.unstable_viteEnvironmentApi` flag has been stabilized as `future.v8_viteEnvironmentApi`"
536
- );
537
- }
538
- if ("unstable_passThroughRequests" in futureConfig) {
539
- return err(
540
- "The `future.unstable_passThroughRequests` flag has been stabilized as `future.v8_passThroughRequests`"
541
- );
542
- }
543
- if ("unstable_subResourceIntegrity" in futureConfig) {
544
- return err(
545
- "The `future.unstable_subResourceIntegrity` flag has been stabilized and moved to a top-level `config.subResourceIntegrity` field"
546
- );
547
- }
548
- }
549
- let future = {
550
- unstable_optimizeDeps: userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,
551
- v8_passThroughRequests: userAndPresetConfigs.future?.v8_passThroughRequests ?? false,
552
- unstable_trailingSlashAwareDataRequests: userAndPresetConfigs.future?.unstable_trailingSlashAwareDataRequests ?? false,
553
- unstable_previewServerPrerendering: userAndPresetConfigs.future?.unstable_previewServerPrerendering ?? false,
554
- v8_middleware: userAndPresetConfigs.future?.v8_middleware ?? false,
555
- v8_splitRouteModules: userAndPresetConfigs.future?.v8_splitRouteModules ?? false,
556
- v8_viteEnvironmentApi: (userAndPresetConfigs.future?.v8_viteEnvironmentApi || userAndPresetConfigs.future?.unstable_previewServerPrerendering) ?? false
557
- };
558
- let allowedActionOrigins = userAndPresetConfigs.allowedActionOrigins ?? false;
559
- let subResourceIntegrity = userAndPresetConfigs.subResourceIntegrity ?? false;
560
- let reactRouterConfig = deepFreeze({
561
- appDirectory,
562
- basename,
563
- buildDirectory,
564
- buildEnd,
565
- future,
566
- prerender,
567
- routes,
568
- routeDiscovery,
569
- serverBuildFile,
570
- serverBundles,
571
- serverModuleFormat,
572
- ssr,
573
- subResourceIntegrity,
574
- allowedActionOrigins,
575
- unstable_routeConfig: routeConfig
576
- });
577
- for (let preset of reactRouterUserConfig.presets ?? []) {
578
- await preset.reactRouterConfigResolved?.({ reactRouterConfig });
579
- }
580
- return ok(reactRouterConfig);
581
- }
582
- async function createConfigLoader({
583
- rootDirectory: root,
584
- watch,
585
- mode,
586
- skipRoutes,
587
- validateConfig
588
- }) {
589
- root = import_pathe3.default.normalize(root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd());
590
- let vite2 = await import("vite");
591
- let viteNodeContext = await createContext({
592
- root,
593
- mode,
594
- // Filter out any info level logs from vite-node
595
- customLogger: vite2.createLogger("warn", {
596
- prefix: "[react-router]"
597
- })
598
- });
599
- let reactRouterConfigFile;
600
- let updateReactRouterConfigFile = () => {
601
- reactRouterConfigFile = findEntry(root, "react-router.config", {
602
- absolute: true
603
- });
604
- };
605
- updateReactRouterConfigFile();
606
- let getConfig = () => resolveConfig({
607
- root,
608
- viteNodeContext,
609
- reactRouterConfigFile,
610
- skipRoutes,
611
- validateConfig
612
- });
613
- let appDirectory;
614
- let initialConfigResult = await getConfig();
615
- if (!initialConfigResult.ok) {
616
- throw new Error(initialConfigResult.error);
617
- }
618
- appDirectory = import_pathe3.default.normalize(initialConfigResult.value.appDirectory);
619
- let currentConfig = initialConfigResult.value;
620
- let fsWatcher;
621
- let changeHandlers = [];
622
- return {
623
- getConfig,
624
- onChange: (handler) => {
625
- if (!watch) {
626
- throw new Error(
627
- "onChange is not supported when watch mode is disabled"
628
- );
629
- }
630
- changeHandlers.push(handler);
631
- if (!fsWatcher) {
632
- fsWatcher = import_chokidar.default.watch([root, appDirectory], {
633
- ignoreInitial: true,
634
- ignored: (path3) => isIgnoredByWatcher(path3, { root, appDirectory })
635
- });
636
- fsWatcher.on("error", (error) => {
637
- let message = error instanceof Error ? error.message : String(error);
638
- console.warn(import_picocolors.default.yellow(`File watcher error: ${message}`));
639
- });
640
- fsWatcher.on("all", async (...args) => {
641
- let [event, rawFilepath] = args;
642
- let filepath = import_pathe3.default.normalize(rawFilepath);
643
- let fileAddedOrRemoved = event === "add" || event === "unlink";
644
- let appFileAddedOrRemoved = fileAddedOrRemoved && filepath.startsWith(import_pathe3.default.normalize(appDirectory));
645
- let rootRelativeFilepath = import_pathe3.default.relative(root, filepath);
646
- let configFileAddedOrRemoved = fileAddedOrRemoved && isEntryFile("react-router.config", rootRelativeFilepath);
647
- if (configFileAddedOrRemoved) {
648
- updateReactRouterConfigFile();
649
- }
650
- let moduleGraphChanged = configFileAddedOrRemoved || Boolean(
651
- viteNodeContext.devServer?.moduleGraph.getModuleById(filepath)
652
- );
653
- if (!moduleGraphChanged && !appFileAddedOrRemoved) {
654
- return;
655
- }
656
- viteNodeContext.devServer?.moduleGraph.invalidateAll();
657
- viteNodeContext.runner?.moduleCache.clear();
658
- let result = await getConfig();
659
- let prevAppDirectory = appDirectory;
660
- appDirectory = import_pathe3.default.normalize(
661
- (result.value ?? currentConfig).appDirectory
662
- );
663
- if (appDirectory !== prevAppDirectory) {
664
- fsWatcher.unwatch(prevAppDirectory);
665
- fsWatcher.add(appDirectory);
666
- }
667
- let configCodeChanged = configFileAddedOrRemoved || reactRouterConfigFile !== void 0 && isEntryFileDependency(
668
- viteNodeContext.devServer.moduleGraph,
669
- reactRouterConfigFile,
670
- filepath
671
- );
672
- let routeConfigFile = !skipRoutes ? findEntry(appDirectory, "routes", {
673
- absolute: true
674
- }) : void 0;
675
- let routeConfigCodeChanged = routeConfigFile !== void 0 && isEntryFileDependency(
676
- viteNodeContext.devServer.moduleGraph,
677
- routeConfigFile,
678
- filepath
679
- );
680
- let configChanged = result.ok && !(0, import_isEqual.default)(omitRoutes(currentConfig), omitRoutes(result.value));
681
- let routeConfigChanged = result.ok && !(0, import_isEqual.default)(currentConfig?.routes, result.value.routes);
682
- for (let handler2 of changeHandlers) {
683
- handler2({
684
- result,
685
- configCodeChanged,
686
- routeConfigCodeChanged,
687
- configChanged,
688
- routeConfigChanged,
689
- path: filepath,
690
- event
691
- });
692
- }
693
- if (result.ok) {
694
- currentConfig = result.value;
695
- }
696
- });
697
- }
698
- return () => {
699
- changeHandlers = changeHandlers.filter(
700
- (changeHandler) => changeHandler !== handler
701
- );
702
- };
703
- },
704
- close: async () => {
705
- changeHandlers = [];
706
- await viteNodeContext.devServer.close();
707
- await fsWatcher?.close();
708
- }
709
- };
710
- }
711
- async function loadConfig({
712
- rootDirectory,
713
- mode,
714
- skipRoutes
715
- }) {
716
- let configLoader = await createConfigLoader({
717
- rootDirectory,
718
- mode,
719
- skipRoutes,
720
- watch: false
721
- });
722
- let config = await configLoader.getConfig();
723
- await configLoader.close();
724
- return config;
725
- }
726
- function omitRoutes(config) {
727
- return {
728
- ...config,
729
- routes: {}
730
- };
731
- }
732
- var entryExts = [".js", ".jsx", ".ts", ".tsx", ".mjs", ".mts"];
733
- function isEntryFile(entryBasename, filename) {
734
- return entryExts.some((ext) => filename === `${entryBasename}${ext}`);
735
- }
736
- function findEntry(dir, basename, options) {
737
- let currentDir = import_pathe3.default.resolve(dir);
738
- let { root } = import_pathe3.default.parse(currentDir);
739
- while (true) {
740
- for (let ext of options?.extensions ?? entryExts) {
741
- let file = import_pathe3.default.resolve(currentDir, basename + ext);
742
- if (import_node_fs.default.existsSync(file)) {
743
- return options?.absolute ?? false ? file : import_pathe3.default.relative(dir, file);
744
- }
745
- }
746
- if (!options?.walkParents) {
747
- return void 0;
748
- }
749
- let parentDir = import_pathe3.default.dirname(currentDir);
750
- if (currentDir === root || parentDir === currentDir) {
751
- return void 0;
752
- }
753
- currentDir = parentDir;
754
- }
755
- }
756
- function isEntryFileDependency(moduleGraph, entryFilepath, filepath, visited = /* @__PURE__ */ new Set()) {
757
- entryFilepath = import_pathe3.default.normalize(entryFilepath);
758
- filepath = import_pathe3.default.normalize(filepath);
759
- if (visited.has(filepath)) {
760
- return false;
761
- }
762
- visited.add(filepath);
763
- if (filepath === entryFilepath) {
764
- return true;
765
- }
766
- let mod = moduleGraph.getModuleById(filepath);
767
- if (!mod) {
768
- return false;
769
- }
770
- for (let importer of mod.importers) {
771
- if (!importer.id) {
772
- continue;
773
- }
774
- if (importer.id === entryFilepath || isEntryFileDependency(moduleGraph, entryFilepath, importer.id, visited)) {
775
- return true;
776
- }
777
- }
778
- return false;
779
- }
780
- function isIgnoredByWatcher(path3, { root, appDirectory }) {
781
- let dirname = import_pathe3.default.dirname(path3);
782
- let ignoredByPath = !dirname.startsWith(appDirectory) && // Ensure we're only watching files outside of the app directory
783
- // that are at the root level, not nested in subdirectories
784
- path3 !== root && // Watch the root directory itself
785
- dirname !== root;
786
- if (ignoredByPath) {
787
- return true;
788
- }
789
- try {
790
- let stat = import_node_fs.default.statSync(path3, { throwIfNoEntry: false });
791
- if (stat && !stat.isFile() && !stat.isDirectory()) {
792
- return true;
793
- }
794
- } catch {
795
- return true;
796
- }
797
- return false;
798
- }
799
-
800
- // vite/cloudflare-dev-proxy.ts
801
- var serverBuildId = "virtual:react-router/server-build";
802
- function importWrangler() {
803
- try {
804
- return import("wrangler");
805
- } catch (e) {
806
- throw Error("Could not import `wrangler`. Do you have it installed?");
807
- }
808
- }
809
- var PLUGIN_NAME = "react-router-cloudflare-vite-dev-proxy";
810
- var cloudflareDevProxyVitePlugin = (options = {}) => {
811
- let { getLoadContext, ...restOptions } = options;
812
- const workerdConditions = ["workerd", "worker"];
813
- let future;
814
- return {
815
- name: PLUGIN_NAME,
816
- config: async (config, configEnv) => {
817
- await preloadVite();
818
- const externalConditions = ["node"];
819
- let configResult = await loadConfig({
820
- rootDirectory: config.root ?? process.cwd(),
821
- mode: configEnv.mode
822
- });
823
- if (!configResult.ok) {
824
- throw new Error(configResult.error);
825
- }
826
- future = configResult.value.future;
827
- return {
828
- ssr: {
829
- resolve: {
830
- externalConditions: [...workerdConditions, ...externalConditions]
831
- }
832
- }
833
- };
834
- },
835
- configEnvironment: async (name, options2) => {
836
- if (!future.v8_viteEnvironmentApi) {
837
- return;
838
- }
839
- if (name !== "client") {
840
- options2.resolve = options2.resolve ?? {};
841
- options2.resolve.externalConditions = [
842
- ...workerdConditions,
843
- ...options2.resolve?.externalConditions ?? []
844
- ];
845
- }
846
- },
847
- configResolved: (viteConfig) => {
848
- let pluginIndex = (name) => viteConfig.plugins.findIndex((plugin) => plugin.name === name);
849
- let reactRouterPluginIndex = pluginIndex("react-router");
850
- if (reactRouterPluginIndex >= 0 && reactRouterPluginIndex < pluginIndex(PLUGIN_NAME)) {
851
- throw new Error(
852
- `The "${PLUGIN_NAME}" plugin should be placed before the React Router plugin in your Vite config file`
853
- );
854
- }
855
- },
856
- configureServer: async (viteDevServer) => {
857
- const { sendResponse } = await import("@remix-run/node-fetch-server");
858
- let context;
859
- let getContext = async () => {
860
- let { getPlatformProxy } = await importWrangler();
861
- let { dispose, ...cloudflare } = await getPlatformProxy(
862
- restOptions
863
- );
864
- return { cloudflare };
865
- };
866
- return () => {
867
- if (!viteDevServer.config.server.middlewareMode) {
868
- viteDevServer.middlewares.use(async (nodeReq, nodeRes, next) => {
869
- try {
870
- let build = await viteDevServer.ssrLoadModule(
871
- serverBuildId
872
- );
873
- let handler = (0, import_react_router.createRequestHandler)(build, "development");
874
- let req = await fromNodeRequest(nodeReq, nodeRes);
875
- context ??= await getContext();
876
- let loadContext = getLoadContext ? await getLoadContext({ request: req, context }) : context;
877
- let res = await handler(req, loadContext);
878
- await sendResponse(nodeRes, res);
879
- } catch (error) {
880
- next(error);
881
- }
882
- });
883
- }
884
- };
885
- }
886
- };
887
- };
888
- // Annotate the CommonJS export names for ESM import in node:
889
- 0 && (module.exports = {
890
- cloudflareDevProxy
891
- });