@react-router/dev 0.0.0-experimental-23ff92a9d → 0.0.0-experimental-35027c3be

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v0.0.0-experimental-23ff92a9d
3
+ * @react-router/dev v0.0.0-experimental-35027c3be
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -100,27 +100,53 @@ var init_vite = __esm({
100
100
  }
101
101
  });
102
102
 
103
+ // vite/ssr-externals.ts
104
+ var ssrExternals;
105
+ var init_ssr_externals = __esm({
106
+ "vite/ssr-externals.ts"() {
107
+ "use strict";
108
+ init_is_react_router_repo();
109
+ ssrExternals = isReactRouterRepo() ? [
110
+ // This is only needed within this repo because these packages
111
+ // are linked to a directory outside of node_modules so Vite
112
+ // treats them as internal code by default.
113
+ "react-router",
114
+ "react-router-dom",
115
+ "@react-router/architect",
116
+ "@react-router/cloudflare",
117
+ "@react-router/dev",
118
+ "@react-router/express",
119
+ "@react-router/node",
120
+ "@react-router/serve"
121
+ ] : void 0;
122
+ }
123
+ });
124
+
103
125
  // vite/vite-node.ts
104
- async function createContext(viteConfig = {}) {
126
+ async function createContext({
127
+ root,
128
+ mode
129
+ }) {
105
130
  await preloadVite();
106
131
  const vite2 = getVite();
107
- const devServer = await vite2.createServer(
108
- vite2.mergeConfig(
109
- {
110
- server: {
111
- preTransformRequests: false,
112
- hmr: false
113
- },
114
- optimizeDeps: {
115
- noDiscovery: true
116
- },
117
- configFile: false,
118
- envFile: false,
119
- plugins: []
120
- },
121
- viteConfig
122
- )
123
- );
132
+ const devServer = await vite2.createServer({
133
+ root,
134
+ mode,
135
+ server: {
136
+ preTransformRequests: false,
137
+ hmr: false,
138
+ watch: null
139
+ },
140
+ ssr: {
141
+ external: ssrExternals
142
+ },
143
+ optimizeDeps: {
144
+ noDiscovery: true
145
+ },
146
+ configFile: false,
147
+ envFile: false,
148
+ plugins: []
149
+ });
124
150
  await devServer.pluginContainer.buildStart({});
125
151
  const server = new import_server.ViteNodeServer(devServer);
126
152
  (0, import_source_map.installSourcemapsSupport)({
@@ -146,6 +172,7 @@ var init_vite_node = __esm({
146
172
  import_client = require("vite-node/client");
147
173
  import_source_map = require("vite-node/source-map");
148
174
  init_vite();
175
+ init_ssr_externals();
149
176
  }
150
177
  });
151
178
 
@@ -392,6 +419,7 @@ async function resolveConfig({
392
419
  unstable_middleware: reactRouterUserConfig.future?.unstable_middleware ?? false,
393
420
  unstable_optimizeDeps: reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
394
421
  unstable_splitRouteModules: reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
422
+ unstable_subResourceIntegrity: reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
395
423
  unstable_viteEnvironmentApi: reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false
396
424
  };
397
425
  let reactRouterConfig = deepFreeze({
@@ -419,11 +447,7 @@ async function createConfigLoader({
419
447
  root = root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
420
448
  let viteNodeContext = await createContext({
421
449
  root,
422
- mode: watch2 ? "development" : "production",
423
- server: !watch2 ? { watch: null } : {},
424
- ssr: {
425
- external: ssrExternals
426
- }
450
+ mode: watch2 ? "development" : "production"
427
451
  });
428
452
  let reactRouterConfigFile = findEntry(root, "react-router.config", {
429
453
  absolute: true
@@ -517,7 +541,7 @@ function findEntry(dir, basename2, options) {
517
541
  }
518
542
  return void 0;
519
543
  }
520
- 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, ssrExternals, entryExts;
544
+ 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;
521
545
  var init_config = __esm({
522
546
  "config/config.ts"() {
523
547
  "use strict";
@@ -534,7 +558,6 @@ var init_config = __esm({
534
558
  import_isEqual = __toESM(require("lodash/isEqual"));
535
559
  init_routes();
536
560
  init_detectPackageManager();
537
- init_is_react_router_repo();
538
561
  excludedConfigPresetKeys = ["presets"];
539
562
  mergeReactRouterConfig = (...configs) => {
540
563
  let reducer = (configA, configB) => {
@@ -574,19 +597,6 @@ var init_config = __esm({
574
597
  });
575
598
  return o;
576
599
  };
577
- ssrExternals = isReactRouterRepo() ? [
578
- // This is only needed within this repo because these packages
579
- // are linked to a directory outside of node_modules so Vite
580
- // treats them as internal code by default.
581
- "react-router",
582
- "react-router-dom",
583
- "@react-router/architect",
584
- "@react-router/cloudflare",
585
- "@react-router/dev",
586
- "@react-router/express",
587
- "@react-router/node",
588
- "@react-router/serve"
589
- ] : void 0;
590
600
  entryExts = [".js", ".jsx", ".ts", ".tsx"];
591
601
  }
592
602
  });
@@ -851,6 +861,8 @@ async function writeAll(ctx) {
851
861
  });
852
862
  const registerPath = Path4.join(typegenDir, "+register.ts");
853
863
  import_node_fs3.default.writeFileSync(registerPath, register(ctx));
864
+ const virtualPath = Path4.join(typegenDir, "+virtual.ts");
865
+ import_node_fs3.default.writeFileSync(virtualPath, virtual);
854
866
  }
855
867
  function register(ctx) {
856
868
  const register2 = import_dedent2.default`
@@ -863,12 +875,16 @@ function register(ctx) {
863
875
  }
864
876
  `;
865
877
  const { t: t2 } = babel_exports;
878
+ const indexPaths = new Set(
879
+ Object.values(ctx.config.routes).filter((route) => route.index).map((route) => route.path)
880
+ );
866
881
  const typeParams = t2.tsTypeAliasDeclaration(
867
882
  t2.identifier("Params"),
868
883
  null,
869
884
  t2.tsTypeLiteral(
870
885
  Object.values(ctx.config.routes).map((route) => {
871
886
  if (route.id !== "root" && !route.path) return void 0;
887
+ if (!route.index && indexPaths.has(route.path)) return void 0;
872
888
  const lineage2 = lineage(ctx.config.routes, route);
873
889
  const fullpath2 = fullpath(lineage2);
874
890
  const params = parse2(fullpath2);
@@ -892,7 +908,7 @@ function register(ctx) {
892
908
  );
893
909
  return [register2, generate(typeParams).code].join("\n\n");
894
910
  }
895
- var import_node_fs3, import_dedent2, Path4, import_picocolors3;
911
+ var import_node_fs3, import_dedent2, Path4, import_picocolors3, virtual;
896
912
  var init_typegen = __esm({
897
913
  "typegen/index.ts"() {
898
914
  "use strict";
@@ -906,6 +922,22 @@ var init_typegen = __esm({
906
922
  init_paths();
907
923
  init_params();
908
924
  init_route();
925
+ virtual = import_dedent2.default`
926
+ declare module "virtual:react-router/server-build" {
927
+ import { ServerBuild } from "react-router";
928
+ export const assets: ServerBuild["assets"];
929
+ export const assetsBuildDirectory: ServerBuild["assetsBuildDirectory"];
930
+ export const basename: ServerBuild["basename"];
931
+ export const entry: ServerBuild["entry"];
932
+ export const future: ServerBuild["future"];
933
+ export const isSpaMode: ServerBuild["isSpaMode"];
934
+ export const prerender: ServerBuild["prerender"];
935
+ export const publicPath: ServerBuild["publicPath"];
936
+ export const routes: ServerBuild["routes"];
937
+ export const ssr: ServerBuild["ssr"];
938
+ export const unstable_getCriticalCss: ServerBuild["unstable_getCriticalCss"];
939
+ }
940
+ `;
909
941
  }
910
942
  });
911
943
 
@@ -1187,7 +1219,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
1187
1219
  copyPublicDir: false,
1188
1220
  // Assets in the public directory are only used by the client
1189
1221
  rollupOptions: {
1190
- input: (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig.environments?.ssr?.build?.rollupOptions?.input : viteUserConfig.build?.rollupOptions?.input) ?? virtual.serverBuild.id,
1222
+ input: (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig.environments?.ssr?.build?.rollupOptions?.input : viteUserConfig.build?.rollupOptions?.input) ?? virtual2.serverBuild.id,
1191
1223
  output: {
1192
1224
  entryFileNames: serverBuildFile,
1193
1225
  format: serverModuleFormat
@@ -1291,11 +1323,12 @@ function resolveEnvironmentsOptions(environmentResolvers, resolverOptions) {
1291
1323
  function isNonNullable(x) {
1292
1324
  return x != null;
1293
1325
  }
1294
- var import_node_crypto, path7, 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, CSS_DEV_HELPER_ENVIRONMENT_NAME, virtualHmrRuntime, virtualInjectHmrRuntime, resolveRelativeRouteFilePath, virtual, getServerBuildDirectory, getClientBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER;
1326
+ var import_node_crypto, fs4, path7, 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, CSS_DEV_HELPER_ENVIRONMENT_NAME, virtualHmrRuntime, virtualInjectHmrRuntime, resolveRelativeRouteFilePath, virtual2, getServerBuildDirectory, getClientBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER;
1295
1327
  var init_plugin = __esm({
1296
1328
  "vite/plugin.ts"() {
1297
1329
  "use strict";
1298
1330
  import_node_crypto = require("crypto");
1331
+ fs4 = __toESM(require("fs"));
1299
1332
  path7 = __toESM(require("path"));
1300
1333
  url = __toESM(require("url"));
1301
1334
  fse = __toESM(require("fs-extra"));
@@ -1315,6 +1348,7 @@ var init_plugin = __esm({
1315
1348
  init_resolve_file_url();
1316
1349
  init_combine_urls();
1317
1350
  init_remove_exports();
1351
+ init_ssr_externals();
1318
1352
  init_route_chunks();
1319
1353
  init_vite();
1320
1354
  init_config();
@@ -1346,7 +1380,7 @@ var init_plugin = __esm({
1346
1380
  let fullPath = path7.resolve(reactRouterConfig.appDirectory, file);
1347
1381
  return vite2.normalizePath(fullPath);
1348
1382
  };
1349
- virtual = {
1383
+ virtual2 = {
1350
1384
  serverBuild: create("server-build"),
1351
1385
  serverManifest: create("server-manifest"),
1352
1386
  browserManifest: create("browser-manifest")
@@ -15,6 +15,8 @@ export default function handleRequest(
15
15
  responseHeaders: Headers,
16
16
  routerContext: EntryContext,
17
17
  loadContext: AppLoadContext
18
+ // If you have middleware enabled:
19
+ // loadContext: unstable_RouterContextProvider
18
20
  ) {
19
21
  return new Promise((resolve, reject) => {
20
22
  let shellRendered = false;
package/dist/config.d.ts CHANGED
@@ -46,6 +46,7 @@ interface FutureConfig {
46
46
  * Automatically split route modules into multiple chunks when possible.
47
47
  */
48
48
  unstable_splitRouteModules: boolean | "enforce";
49
+ unstable_subResourceIntegrity: boolean;
49
50
  /**
50
51
  * Use Vite Environment API (experimental)
51
52
  */
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-23ff92a9d
2
+ * @react-router/dev v0.0.0-experimental-35027c3be
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/routes.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-23ff92a9d
2
+ * @react-router/dev v0.0.0-experimental-35027c3be
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,7 +1,8 @@
1
- import { AppLoadContext } from 'react-router';
1
+ import { UNSAFE_MiddlewareEnabled, unstable_InitialContext, AppLoadContext } from 'react-router';
2
2
  import { Plugin } from 'vite';
3
3
  import { GetPlatformProxyOptions, PlatformProxy } from 'wrangler';
4
4
 
5
+ type MaybePromise<T> = T | Promise<T>;
5
6
  type CfProperties = Record<string, unknown>;
6
7
  type LoadContext<Env, Cf extends CfProperties> = {
7
8
  cloudflare: Omit<PlatformProxy<Env, Cf>, "dispose">;
@@ -9,7 +10,7 @@ type LoadContext<Env, Cf extends CfProperties> = {
9
10
  type GetLoadContext<Env, Cf extends CfProperties> = (args: {
10
11
  request: Request;
11
12
  context: LoadContext<Env, Cf>;
12
- }) => AppLoadContext | Promise<AppLoadContext>;
13
+ }) => UNSAFE_MiddlewareEnabled extends true ? MaybePromise<unstable_InitialContext> : MaybePromise<AppLoadContext>;
13
14
  /**
14
15
  * Vite plugin that provides [Node proxies to local workerd
15
16
  * bindings](https://developers.cloudflare.com/workers/wrangler/api/#getplatformproxy)
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-23ff92a9d
2
+ * @react-router/dev v0.0.0-experimental-35027c3be
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -176,26 +176,47 @@ var import_package_json = __toESM(require("@npmcli/package-json"));
176
176
  var import_server = require("vite-node/server");
177
177
  var import_client = require("vite-node/client");
178
178
  var import_source_map = require("vite-node/source-map");
179
- async function createContext(viteConfig = {}) {
179
+
180
+ // vite/ssr-externals.ts
181
+ var ssrExternals = isReactRouterRepo() ? [
182
+ // This is only needed within this repo because these packages
183
+ // are linked to a directory outside of node_modules so Vite
184
+ // treats them as internal code by default.
185
+ "react-router",
186
+ "react-router-dom",
187
+ "@react-router/architect",
188
+ "@react-router/cloudflare",
189
+ "@react-router/dev",
190
+ "@react-router/express",
191
+ "@react-router/node",
192
+ "@react-router/serve"
193
+ ] : void 0;
194
+
195
+ // vite/vite-node.ts
196
+ async function createContext({
197
+ root,
198
+ mode
199
+ }) {
180
200
  await preloadVite();
181
201
  const vite2 = getVite();
182
- const devServer = await vite2.createServer(
183
- vite2.mergeConfig(
184
- {
185
- server: {
186
- preTransformRequests: false,
187
- hmr: false
188
- },
189
- optimizeDeps: {
190
- noDiscovery: true
191
- },
192
- configFile: false,
193
- envFile: false,
194
- plugins: []
195
- },
196
- viteConfig
197
- )
198
- );
202
+ const devServer = await vite2.createServer({
203
+ root,
204
+ mode,
205
+ server: {
206
+ preTransformRequests: false,
207
+ hmr: false,
208
+ watch: null
209
+ },
210
+ ssr: {
211
+ external: ssrExternals
212
+ },
213
+ optimizeDeps: {
214
+ noDiscovery: true
215
+ },
216
+ configFile: false,
217
+ envFile: false,
218
+ plugins: []
219
+ });
199
220
  await devServer.pluginContainer.buildStart({});
200
221
  const server = new import_server.ViteNodeServer(devServer);
201
222
  (0, import_source_map.installSourcemapsSupport)({
@@ -491,6 +512,7 @@ async function resolveConfig({
491
512
  unstable_middleware: reactRouterUserConfig.future?.unstable_middleware ?? false,
492
513
  unstable_optimizeDeps: reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
493
514
  unstable_splitRouteModules: reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
515
+ unstable_subResourceIntegrity: reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
494
516
  unstable_viteEnvironmentApi: reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false
495
517
  };
496
518
  let reactRouterConfig = deepFreeze({
@@ -518,11 +540,7 @@ async function createConfigLoader({
518
540
  root = root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
519
541
  let viteNodeContext = await createContext({
520
542
  root,
521
- mode: watch ? "development" : "production",
522
- server: !watch ? { watch: null } : {},
523
- ssr: {
524
- external: ssrExternals
525
- }
543
+ mode: watch ? "development" : "production"
526
544
  });
527
545
  let reactRouterConfigFile = findEntry(root, "react-router.config", {
528
546
  absolute: true
@@ -607,19 +625,6 @@ async function loadConfig({ rootDirectory }) {
607
625
  await configLoader.close();
608
626
  return config;
609
627
  }
610
- var ssrExternals = isReactRouterRepo() ? [
611
- // This is only needed within this repo because these packages
612
- // are linked to a directory outside of node_modules so Vite
613
- // treats them as internal code by default.
614
- "react-router",
615
- "react-router-dom",
616
- "@react-router/architect",
617
- "@react-router/cloudflare",
618
- "@react-router/dev",
619
- "@react-router/express",
620
- "@react-router/node",
621
- "@react-router/serve"
622
- ] : void 0;
623
628
  var entryExts = [".js", ".jsx", ".ts", ".tsx"];
624
629
  function findEntry(dir, basename, options) {
625
630
  for (let ext of entryExts) {
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-23ff92a9d
2
+ * @react-router/dev v0.0.0-experimental-35027c3be
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -46,6 +46,7 @@ module.exports = __toCommonJS(vite_exports);
46
46
 
47
47
  // vite/plugin.ts
48
48
  var import_node_crypto = require("crypto");
49
+ var fs3 = __toESM(require("fs"));
49
50
  var path6 = __toESM(require("path"));
50
51
  var url = __toESM(require("url"));
51
52
  var fse = __toESM(require("fs-extra"));
@@ -117,27 +118,46 @@ function getVite() {
117
118
  return vite;
118
119
  }
119
120
 
121
+ // vite/ssr-externals.ts
122
+ var ssrExternals = isReactRouterRepo() ? [
123
+ // This is only needed within this repo because these packages
124
+ // are linked to a directory outside of node_modules so Vite
125
+ // treats them as internal code by default.
126
+ "react-router",
127
+ "react-router-dom",
128
+ "@react-router/architect",
129
+ "@react-router/cloudflare",
130
+ "@react-router/dev",
131
+ "@react-router/express",
132
+ "@react-router/node",
133
+ "@react-router/serve"
134
+ ] : void 0;
135
+
120
136
  // vite/vite-node.ts
121
- async function createContext(viteConfig = {}) {
137
+ async function createContext({
138
+ root,
139
+ mode
140
+ }) {
122
141
  await preloadVite();
123
142
  const vite2 = getVite();
124
- const devServer = await vite2.createServer(
125
- vite2.mergeConfig(
126
- {
127
- server: {
128
- preTransformRequests: false,
129
- hmr: false
130
- },
131
- optimizeDeps: {
132
- noDiscovery: true
133
- },
134
- configFile: false,
135
- envFile: false,
136
- plugins: []
137
- },
138
- viteConfig
139
- )
140
- );
143
+ const devServer = await vite2.createServer({
144
+ root,
145
+ mode,
146
+ server: {
147
+ preTransformRequests: false,
148
+ hmr: false,
149
+ watch: null
150
+ },
151
+ ssr: {
152
+ external: ssrExternals
153
+ },
154
+ optimizeDeps: {
155
+ noDiscovery: true
156
+ },
157
+ configFile: false,
158
+ envFile: false,
159
+ plugins: []
160
+ });
141
161
  await devServer.pluginContainer.buildStart({});
142
162
  const server = new import_server.ViteNodeServer(devServer);
143
163
  (0, import_source_map.installSourcemapsSupport)({
@@ -456,6 +476,7 @@ async function resolveConfig({
456
476
  unstable_middleware: reactRouterUserConfig.future?.unstable_middleware ?? false,
457
477
  unstable_optimizeDeps: reactRouterUserConfig.future?.unstable_optimizeDeps ?? false,
458
478
  unstable_splitRouteModules: reactRouterUserConfig.future?.unstable_splitRouteModules ?? false,
479
+ unstable_subResourceIntegrity: reactRouterUserConfig.future?.unstable_subResourceIntegrity ?? false,
459
480
  unstable_viteEnvironmentApi: reactRouterUserConfig.future?.unstable_viteEnvironmentApi ?? false
460
481
  };
461
482
  let reactRouterConfig = deepFreeze({
@@ -483,11 +504,7 @@ async function createConfigLoader({
483
504
  root = root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
484
505
  let viteNodeContext = await createContext({
485
506
  root,
486
- mode: watch2 ? "development" : "production",
487
- server: !watch2 ? { watch: null } : {},
488
- ssr: {
489
- external: ssrExternals
490
- }
507
+ mode: watch2 ? "development" : "production"
491
508
  });
492
509
  let reactRouterConfigFile = findEntry(root, "react-router.config", {
493
510
  absolute: true
@@ -611,19 +628,6 @@ async function resolveEntryFiles({
611
628
  let entryServerFilePath = userEntryServerFile ? import_pathe3.default.resolve(reactRouterConfig.appDirectory, userEntryServerFile) : import_pathe3.default.resolve(defaultsDirectory, entryServerFile);
612
629
  return { entryClientFilePath, entryServerFilePath };
613
630
  }
614
- var ssrExternals = isReactRouterRepo() ? [
615
- // This is only needed within this repo because these packages
616
- // are linked to a directory outside of node_modules so Vite
617
- // treats them as internal code by default.
618
- "react-router",
619
- "react-router-dom",
620
- "@react-router/architect",
621
- "@react-router/cloudflare",
622
- "@react-router/dev",
623
- "@react-router/express",
624
- "@react-router/node",
625
- "@react-router/serve"
626
- ] : void 0;
627
631
  var entryExts = [".js", ".jsx", ".ts", ".tsx"];
628
632
  function findEntry(dir, basename2, options) {
629
633
  for (let ext of entryExts) {
@@ -823,6 +827,8 @@ async function writeAll(ctx) {
823
827
  });
824
828
  const registerPath = Path4.join(typegenDir, "+register.ts");
825
829
  import_node_fs2.default.writeFileSync(registerPath, register(ctx));
830
+ const virtualPath = Path4.join(typegenDir, "+virtual.ts");
831
+ import_node_fs2.default.writeFileSync(virtualPath, virtual);
826
832
  }
827
833
  function register(ctx) {
828
834
  const register2 = import_dedent2.default`
@@ -835,12 +841,16 @@ function register(ctx) {
835
841
  }
836
842
  `;
837
843
  const { t: t2 } = babel_exports;
844
+ const indexPaths = new Set(
845
+ Object.values(ctx.config.routes).filter((route) => route.index).map((route) => route.path)
846
+ );
838
847
  const typeParams = t2.tsTypeAliasDeclaration(
839
848
  t2.identifier("Params"),
840
849
  null,
841
850
  t2.tsTypeLiteral(
842
851
  Object.values(ctx.config.routes).map((route) => {
843
852
  if (route.id !== "root" && !route.path) return void 0;
853
+ if (!route.index && indexPaths.has(route.path)) return void 0;
844
854
  const lineage2 = lineage(ctx.config.routes, route);
845
855
  const fullpath2 = fullpath(lineage2);
846
856
  const params = parse2(fullpath2);
@@ -864,6 +874,22 @@ function register(ctx) {
864
874
  );
865
875
  return [register2, generate(typeParams).code].join("\n\n");
866
876
  }
877
+ var virtual = import_dedent2.default`
878
+ declare module "virtual:react-router/server-build" {
879
+ import { ServerBuild } from "react-router";
880
+ export const assets: ServerBuild["assets"];
881
+ export const assetsBuildDirectory: ServerBuild["assetsBuildDirectory"];
882
+ export const basename: ServerBuild["basename"];
883
+ export const entry: ServerBuild["entry"];
884
+ export const future: ServerBuild["future"];
885
+ export const isSpaMode: ServerBuild["isSpaMode"];
886
+ export const prerender: ServerBuild["prerender"];
887
+ export const publicPath: ServerBuild["publicPath"];
888
+ export const routes: ServerBuild["routes"];
889
+ export const ssr: ServerBuild["ssr"];
890
+ export const unstable_getCriticalCss: ServerBuild["unstable_getCriticalCss"];
891
+ }
892
+ `;
867
893
 
868
894
  // vite/node-adapter.ts
869
895
  var import_node_events = require("events");
@@ -2008,7 +2034,7 @@ var isRouteVirtualModule = (id) => {
2008
2034
  return isRouteEntryModuleId(id) || isRouteChunkModuleId(id);
2009
2035
  };
2010
2036
  var isServerBuildVirtualModuleId = (id) => {
2011
- return id.split("?")[0] === virtual.serverBuild.id;
2037
+ return id.split("?")[0] === virtual2.serverBuild.id;
2012
2038
  };
2013
2039
  var getServerBuildFile = (viteManifest) => {
2014
2040
  let serverBuildIds = Object.keys(viteManifest).filter(
@@ -2038,13 +2064,13 @@ var resolveRelativeRouteFilePath = (route, reactRouterConfig) => {
2038
2064
  let fullPath = path6.resolve(reactRouterConfig.appDirectory, file);
2039
2065
  return vite2.normalizePath(fullPath);
2040
2066
  };
2041
- var virtual = {
2067
+ var virtual2 = {
2042
2068
  serverBuild: create("server-build"),
2043
2069
  serverManifest: create("server-manifest"),
2044
2070
  browserManifest: create("browser-manifest")
2045
2071
  };
2046
2072
  var invalidateVirtualModules = (viteDevServer) => {
2047
- Object.values(virtual).forEach((vmod2) => {
2073
+ Object.values(virtual2).forEach((vmod2) => {
2048
2074
  let mod = viteDevServer.moduleGraph.getModuleById(vmod2.resolvedId);
2049
2075
  if (mod) {
2050
2076
  viteDevServer.moduleGraph.invalidateModule(mod);
@@ -2316,7 +2342,7 @@ var reactRouterVitePlugin = () => {
2316
2342
  }
2317
2343
  }).join("\n")}
2318
2344
  export { default as assets } from ${JSON.stringify(
2319
- virtual.serverManifest.id
2345
+ virtual2.serverManifest.id
2320
2346
  )};
2321
2347
  export const assetsBuildDirectory = ${JSON.stringify(
2322
2348
  path6.relative(
@@ -2345,7 +2371,7 @@ var reactRouterVitePlugin = () => {
2345
2371
  }).join(",\n ")}
2346
2372
  };
2347
2373
  ${ctx.reactRouterConfig.future.unstable_viteEnvironmentApi && viteCommand === "serve" ? `
2348
- export const getCriticalCss = ({ pathname }) => {
2374
+ export const unstable_getCriticalCss = ({ pathname }) => {
2349
2375
  return {
2350
2376
  rel: "stylesheet",
2351
2377
  href: "${viteUserConfig.base ?? "/"}@react-router/critical.css?pathname=" + pathname,
@@ -2374,6 +2400,34 @@ var reactRouterVitePlugin = () => {
2374
2400
  );
2375
2401
  return /* @__PURE__ */ new Set([...cssUrlPaths, ...chunkAssetPaths]);
2376
2402
  };
2403
+ let generateSriManifest = async (ctx2) => {
2404
+ let clientBuildDirectory = getClientBuildDirectory(ctx2.reactRouterConfig);
2405
+ let entries = fs3.readdirSync(clientBuildDirectory, {
2406
+ withFileTypes: true,
2407
+ recursive: true
2408
+ });
2409
+ let sriManifest = {};
2410
+ for (const entry of entries) {
2411
+ if (entry.isFile() && entry.name.endsWith(".js")) {
2412
+ let contents;
2413
+ try {
2414
+ contents = await fse.readFile(
2415
+ path6.join(entry.path, entry.name),
2416
+ "utf-8"
2417
+ );
2418
+ } catch (e) {
2419
+ logger.error(`Failed to read file for SRI generation: ${entry.name}`);
2420
+ throw e;
2421
+ }
2422
+ let hash = (0, import_node_crypto.createHash)("sha384").update(contents).digest().toString("base64");
2423
+ let filepath = getVite().normalizePath(
2424
+ path6.relative(clientBuildDirectory, path6.join(entry.path, entry.name))
2425
+ );
2426
+ sriManifest[`${ctx2.publicPath}${filepath}`] = `sha384-${hash}`;
2427
+ }
2428
+ }
2429
+ return sriManifest;
2430
+ };
2377
2431
  let generateReactRouterManifestsForBuild = async ({
2378
2432
  routeIds
2379
2433
  }) => {
@@ -2468,7 +2522,8 @@ var reactRouterVitePlugin = () => {
2468
2522
  let nonFingerprintedValues = { url: url2, version };
2469
2523
  let reactRouterBrowserManifest = {
2470
2524
  ...fingerprintedValues,
2471
- ...nonFingerprintedValues
2525
+ ...nonFingerprintedValues,
2526
+ sri: void 0
2472
2527
  };
2473
2528
  await writeFileSafe(
2474
2529
  path6.join(getClientBuildDirectory(ctx.reactRouterConfig), manifestPath),
@@ -2476,9 +2531,14 @@ var reactRouterVitePlugin = () => {
2476
2531
  reactRouterBrowserManifest
2477
2532
  )};`
2478
2533
  );
2534
+ let sri = void 0;
2535
+ if (ctx.reactRouterConfig.future.unstable_subResourceIntegrity) {
2536
+ sri = await generateSriManifest(ctx);
2537
+ }
2479
2538
  let reactRouterServerManifest = {
2480
2539
  ...reactRouterBrowserManifest,
2481
- routes: serverRoutes
2540
+ routes: serverRoutes,
2541
+ sri
2482
2542
  };
2483
2543
  return {
2484
2544
  reactRouterBrowserManifest,
@@ -2542,9 +2602,10 @@ var reactRouterVitePlugin = () => {
2542
2602
  imports: []
2543
2603
  };
2544
2604
  }
2605
+ let sri = void 0;
2545
2606
  let reactRouterManifestForDev = {
2546
2607
  version: String(Math.random()),
2547
- url: combineURLs(ctx.publicPath, virtual.browserManifest.url),
2608
+ url: combineURLs(ctx.publicPath, virtual2.browserManifest.url),
2548
2609
  hmr: {
2549
2610
  runtime: combineURLs(ctx.publicPath, virtualInjectHmrRuntime.url)
2550
2611
  },
@@ -2555,6 +2616,7 @@ var reactRouterVitePlugin = () => {
2555
2616
  ),
2556
2617
  imports: []
2557
2618
  },
2619
+ sri,
2558
2620
  routes
2559
2621
  };
2560
2622
  currentReactRouterManifestForDev = reactRouterManifestForDev;
@@ -2913,11 +2975,11 @@ var reactRouterVitePlugin = () => {
2913
2975
  return;
2914
2976
  }
2915
2977
  build = await ssrEnvironment.runner.import(
2916
- virtual.serverBuild.id
2978
+ virtual2.serverBuild.id
2917
2979
  );
2918
2980
  } else {
2919
2981
  build = await viteDevServer.ssrLoadModule(
2920
- virtual.serverBuild.id
2982
+ virtual2.serverBuild.id
2921
2983
  );
2922
2984
  }
2923
2985
  let handler = (0, import_react_router2.createRequestHandler)(build, "development");
@@ -3138,16 +3200,16 @@ var reactRouterVitePlugin = () => {
3138
3200
  name: "react-router:virtual-modules",
3139
3201
  enforce: "pre",
3140
3202
  resolveId(id) {
3141
- const vmod2 = Object.values(virtual).find((vmod3) => vmod3.id === id);
3203
+ const vmod2 = Object.values(virtual2).find((vmod3) => vmod3.id === id);
3142
3204
  if (vmod2) return vmod2.resolvedId;
3143
3205
  },
3144
3206
  async load(id) {
3145
3207
  switch (id) {
3146
- case virtual.serverBuild.resolvedId: {
3208
+ case virtual2.serverBuild.resolvedId: {
3147
3209
  let routeIds = getServerBundleRouteIds(this, ctx);
3148
3210
  return await getServerEntry({ routeIds });
3149
3211
  }
3150
- case virtual.serverManifest.resolvedId: {
3212
+ case virtual2.serverManifest.resolvedId: {
3151
3213
  let routeIds = getServerBundleRouteIds(this, ctx);
3152
3214
  let reactRouterManifest = viteCommand === "build" ? (await generateReactRouterManifestsForBuild({
3153
3215
  routeIds
@@ -3165,7 +3227,7 @@ var reactRouterVitePlugin = () => {
3165
3227
  es6: true
3166
3228
  })};`;
3167
3229
  }
3168
- case virtual.browserManifest.resolvedId: {
3230
+ case virtual2.browserManifest.resolvedId: {
3169
3231
  if (viteCommand === "build") {
3170
3232
  throw new Error("This module only exists in development");
3171
3233
  }
@@ -4209,7 +4271,7 @@ async function getEnvironmentOptionsResolvers(ctx, viteCommand) {
4209
4271
  copyPublicDir: false,
4210
4272
  // Assets in the public directory are only used by the client
4211
4273
  rollupOptions: {
4212
- input: (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig.environments?.ssr?.build?.rollupOptions?.input : viteUserConfig.build?.rollupOptions?.input) ?? virtual.serverBuild.id,
4274
+ input: (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi ? viteUserConfig.environments?.ssr?.build?.rollupOptions?.input : viteUserConfig.build?.rollupOptions?.input) ?? virtual2.serverBuild.id,
4213
4275
  output: {
4214
4276
  entryFileNames: serverBuildFile,
4215
4277
  format: serverModuleFormat
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
- "version": "0.0.0-experimental-23ff92a9d",
3
+ "version": "0.0.0-experimental-35027c3be",
4
4
  "description": "Dev tools and CLI for React Router",
5
5
  "homepage": "https://reactrouter.com",
6
6
  "bugs": {
@@ -76,19 +76,17 @@
76
76
  "es-module-lexer": "^1.3.1",
77
77
  "exit-hook": "2.2.1",
78
78
  "fs-extra": "^10.0.0",
79
- "gunzip-maybe": "^1.4.2",
80
79
  "jsesc": "3.0.2",
81
80
  "lodash": "^4.17.21",
82
81
  "pathe": "^1.1.2",
83
82
  "picocolors": "^1.1.1",
84
- "picomatch": "^2.3.1",
85
83
  "prettier": "^2.7.1",
86
84
  "react-refresh": "^0.14.0",
87
85
  "semver": "^7.3.7",
88
86
  "set-cookie-parser": "^2.6.0",
89
87
  "valibot": "^0.41.0",
90
88
  "vite-node": "3.0.0-beta.2",
91
- "@react-router/node": "0.0.0-experimental-23ff92a9d"
89
+ "@react-router/node": "0.0.0-experimental-35027c3be"
92
90
  },
93
91
  "devDependencies": {
94
92
  "@types/babel__core": "^7.20.5",
@@ -97,35 +95,30 @@
97
95
  "@types/dedent": "^0.7.0",
98
96
  "@types/express": "^4.17.9",
99
97
  "@types/fs-extra": "^8.1.2",
100
- "@types/gunzip-maybe": "^1.4.0",
101
98
  "@types/jsesc": "^3.0.1",
102
99
  "@types/lodash": "^4.14.182",
103
100
  "@types/node": "^20.0.0",
104
101
  "@types/npmcli__package-json": "^4.0.0",
105
- "@types/picomatch": "^2.3.0",
106
102
  "@types/prettier": "^2.7.3",
107
103
  "@types/set-cookie-parser": "^2.4.1",
108
- "dotenv": "^16.0.0",
109
104
  "esbuild-register": "^3.6.0",
110
105
  "execa": "5.1.1",
111
106
  "express": "^4.19.2",
112
107
  "fast-glob": "3.2.11",
113
- "strip-ansi": "^6.0.1",
114
- "tiny-invariant": "^1.2.0",
115
108
  "tsup": "^8.3.0",
116
109
  "typescript": "^5.1.6",
117
110
  "vite": "^6.1.0",
118
111
  "wireit": "0.14.9",
119
112
  "wrangler": "^3.109.2",
120
- "@react-router/serve": "0.0.0-experimental-23ff92a9d",
121
- "react-router": "^0.0.0-experimental-23ff92a9d"
113
+ "@react-router/serve": "0.0.0-experimental-35027c3be",
114
+ "react-router": "^0.0.0-experimental-35027c3be"
122
115
  },
123
116
  "peerDependencies": {
124
117
  "typescript": "^5.1.0",
125
118
  "vite": "^5.1.0 || ^6.0.0",
126
119
  "wrangler": "^3.28.2",
127
- "@react-router/serve": "^0.0.0-experimental-23ff92a9d",
128
- "react-router": "^0.0.0-experimental-23ff92a9d"
120
+ "@react-router/serve": "^0.0.0-experimental-35027c3be",
121
+ "react-router": "^0.0.0-experimental-35027c3be"
129
122
  },
130
123
  "peerDependenciesMeta": {
131
124
  "@react-router/serve": {