@react-router/dev 0.0.0-experimental-3b8ea09a1 → 0.0.0-experimental-7db49e8d4

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/CHANGELOG.md CHANGED
@@ -1,67 +1,5 @@
1
1
  # `@react-router/dev`
2
2
 
3
- ## 7.6.2
4
-
5
- ### Patch Changes
6
-
7
- - Avoid additional `with-props` chunk in Framework Mode by moving route module component prop logic from the Vite plugin to `react-router` ([#13650](https://github.com/remix-run/react-router/pull/13650))
8
-
9
- - When `future.unstable_viteEnvironmentApi` is enabled and an absolute Vite `base` has been configured, ensure critical CSS is handled correctly during development ([#13598](https://github.com/remix-run/react-router/pull/13598))
10
-
11
- - Update `vite-node` ([#13673](https://github.com/remix-run/react-router/pull/13673))
12
-
13
- - Fix typegen for non-{.js,.jsx,.ts,.tsx} routes like .mdx ([#12453](https://github.com/remix-run/react-router/pull/12453))
14
-
15
- - Fix href types for optional dynamic params ([#13725](https://github.com/remix-run/react-router/pull/13725))
16
-
17
- 7.6.1 introduced fixes for `href` when using optional static segments,
18
- but those fixes caused regressions with how optional dynamic params worked in 7.6.0:
19
-
20
- ```ts
21
- // 7.6.0
22
- href("/users/:id?"); // ✅
23
- href("/users/:id?", { id: 1 }); // ✅
24
-
25
- // 7.6.1
26
- href("/users/:id?"); // ❌
27
- href("/users/:id?", { id: 1 }); // ❌
28
- ```
29
-
30
- Now, optional static segments are expanded into different paths for `href`, but optional dynamic params are not.
31
- This way `href` can unambiguously refer to an exact URL path, all while keeping the number of path options to a minimum.
32
-
33
- ```ts
34
- // 7.6.2
35
-
36
- // path: /users/:id?/edit?
37
- href("
38
- // ^ suggestions when cursor is here:
39
- //
40
- // /users/:id?
41
- // /users/:id?/edit
42
- ```
43
-
44
- Additionally, you can pass `params` from component props without needing to narrow them manually:
45
-
46
- ```ts
47
- declare const params: { id?: number };
48
-
49
- // 7.6.0
50
- href("/users/:id?", params);
51
-
52
- // 7.6.1
53
- href("/users/:id?", params); // ❌
54
- "id" in params ? href("/users/:id", params) : href("/users"); // works... but is annoying
55
-
56
- // 7.6.2
57
- href("/users/:id?", params); // restores behavior of 7.6.0
58
- ```
59
-
60
- - Updated dependencies:
61
- - `react-router@7.6.2`
62
- - `@react-router/node@7.6.2`
63
- - `@react-router/serve@7.6.2`
64
-
65
3
  ## 7.6.1
66
4
 
67
5
  ### Patch Changes
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-3b8ea09a1
3
+ * @react-router/dev v0.0.0-experimental-7db49e8d4
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
@@ -130,10 +130,6 @@ async function createContext({
130
130
  }) {
131
131
  await preloadVite();
132
132
  const vite2 = getVite();
133
- const [{ ViteNodeServer }, { ViteNodeRunner }] = await Promise.all([
134
- import("vite-node/server"),
135
- import("vite-node/client")
136
- ]);
137
133
  const devServer = await vite2.createServer({
138
134
  root,
139
135
  mode,
@@ -163,11 +159,11 @@ async function createContext({
163
159
  plugins: []
164
160
  });
165
161
  await devServer.pluginContainer.buildStart({});
166
- const server = new ViteNodeServer(devServer);
162
+ const server = new import_server.ViteNodeServer(devServer);
167
163
  (0, import_source_map.installSourcemapsSupport)({
168
164
  getSourceMap: (source) => server.getSourceMap(source)
169
165
  });
170
- const runner = new ViteNodeRunner({
166
+ const runner = new import_client.ViteNodeRunner({
171
167
  root: devServer.config.root,
172
168
  base: devServer.config.base,
173
169
  fetchModule(id) {
@@ -179,10 +175,12 @@ async function createContext({
179
175
  });
180
176
  return { devServer, server, runner };
181
177
  }
182
- var import_source_map;
178
+ var import_server, import_client, import_source_map;
183
179
  var init_vite_node = __esm({
184
180
  "vite/vite-node.ts"() {
185
181
  "use strict";
182
+ import_server = require("vite-node/server");
183
+ import_client = require("vite-node/client");
186
184
  import_source_map = require("vite-node/source-map");
187
185
  init_vite();
188
186
  init_ssr_externals();
@@ -930,7 +928,7 @@ function generateRoutes(ctx) {
930
928
  lineages.set(route.id, lineage2);
931
929
  const fullpath2 = fullpath(lineage2);
932
930
  if (!fullpath2) continue;
933
- const pages = expand(fullpath2);
931
+ const pages = explodeOptionalSegments(fullpath2);
934
932
  pages.forEach((page) => allPages.add(page));
935
933
  lineage2.forEach(({ id }) => {
936
934
  let routePages = routeToPages.get(id);
@@ -1138,13 +1136,9 @@ function getRouteAnnotations({
1138
1136
  }
1139
1137
  function relativeImportSource(from, to) {
1140
1138
  let path8 = Path3.relative(Path3.dirname(from), to);
1141
- let extension = Path3.extname(path8);
1142
1139
  path8 = Path3.join(Path3.dirname(path8), Pathe.filename(path8));
1143
1140
  if (!path8.startsWith("../")) path8 = "./" + path8;
1144
- if (!extension || /\.(js|ts)x?$/.test(extension)) {
1145
- extension = ".js";
1146
- }
1147
- return path8 + extension;
1141
+ return path8 + ".js";
1148
1142
  }
1149
1143
  function rootDirsPath(ctx, typesPath) {
1150
1144
  const rel = Path3.relative(typesDirectory(ctx), typesPath);
@@ -1163,27 +1157,28 @@ function paramsType(path8) {
1163
1157
  })
1164
1158
  );
1165
1159
  }
1166
- function expand(fullpath2) {
1167
- function recurse(segments2, index) {
1168
- if (index === segments2.length) return [""];
1169
- const segment = segments2[index];
1170
- const isOptional = segment.endsWith("?");
1171
- const isDynamic = segment.startsWith(":");
1172
- const required = segment.replace(/\?$/, "");
1173
- const keep = !isOptional || isDynamic;
1174
- const kept = isDynamic ? segment : required;
1175
- const withoutSegment = recurse(segments2, index + 1);
1176
- const withSegment = withoutSegment.map((rest) => [kept, rest].join("/"));
1177
- if (keep) return withSegment;
1178
- return [...withoutSegment, ...withSegment];
1179
- }
1180
- const segments = fullpath2.split("/");
1181
- const expanded = /* @__PURE__ */ new Set();
1182
- for (let result of recurse(segments, 0)) {
1183
- if (result !== "/") result = result.replace(/\/$/, "");
1184
- expanded.add(result);
1185
- }
1186
- return expanded;
1160
+ function explodeOptionalSegments(path8) {
1161
+ let segments = path8.split("/");
1162
+ if (segments.length === 0) return [];
1163
+ let [first, ...rest] = segments;
1164
+ let isOptional = first.endsWith("?");
1165
+ let required = first.replace(/\?$/, "");
1166
+ if (rest.length === 0) {
1167
+ return isOptional ? [required, ""] : [required];
1168
+ }
1169
+ let restExploded = explodeOptionalSegments(rest.join("/"));
1170
+ let result = [];
1171
+ result.push(
1172
+ ...restExploded.map(
1173
+ (subpath) => subpath === "" ? required : [required, subpath].join("/")
1174
+ )
1175
+ );
1176
+ if (isOptional) {
1177
+ result.push(...restExploded);
1178
+ }
1179
+ return result.map(
1180
+ (exploded) => path8.startsWith("/") && exploded === "" ? "/" : exploded
1181
+ );
1187
1182
  }
1188
1183
  var import_dedent, Path3, Pathe, t2;
1189
1184
  var init_generate = __esm({
@@ -1636,7 +1631,7 @@ function resolveEnvironmentsOptions(environmentResolvers, resolverOptions) {
1636
1631
  function isNonNullable(x) {
1637
1632
  return x != null;
1638
1633
  }
1639
- var import_node_crypto, fs4, path6, url, fse, babel2, import_react_router2, import_es_module_lexer, import_tinyglobby, import_pick3, import_jsesc, import_picocolors4, import_kebabCase, CLIENT_NON_COMPONENT_EXPORTS, CLIENT_ROUTE_EXPORTS, BUILD_CLIENT_ROUTE_QUERY_STRING, SSR_BUNDLE_PREFIX, virtualHmrRuntime, virtualInjectHmrRuntime, virtual, getServerBuildDirectory, getClientBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER;
1634
+ var import_node_crypto, fs4, path6, url, fse, babel2, import_react_router2, import_es_module_lexer, import_pick3, import_jsesc, import_picocolors4, import_kebabCase, CLIENT_NON_COMPONENT_EXPORTS, CLIENT_ROUTE_EXPORTS, BUILD_CLIENT_ROUTE_QUERY_STRING, SSR_BUNDLE_PREFIX, virtualHmrRuntime, virtualInjectHmrRuntime, virtual, getServerBuildDirectory, getClientBuildDirectory, defaultEntriesDir, defaultEntries, REACT_REFRESH_HEADER;
1640
1635
  var init_plugin = __esm({
1641
1636
  "vite/plugin.ts"() {
1642
1637
  "use strict";
@@ -1648,7 +1643,6 @@ var init_plugin = __esm({
1648
1643
  babel2 = __toESM(require("@babel/core"));
1649
1644
  import_react_router2 = require("react-router");
1650
1645
  import_es_module_lexer = require("es-module-lexer");
1651
- import_tinyglobby = require("tinyglobby");
1652
1646
  import_pick3 = __toESM(require("lodash/pick"));
1653
1647
  import_jsesc = __toESM(require("jsesc"));
1654
1648
  import_picocolors4 = __toESM(require("picocolors"));
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-3b8ea09a1
2
+ * @react-router/dev v0.0.0-experimental-7db49e8d4
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-3b8ea09a1
2
+ * @react-router/dev v0.0.0-experimental-7db49e8d4
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,6 +1,6 @@
1
1
  import { UNSAFE_MiddlewareEnabled, unstable_InitialContext, AppLoadContext } from 'react-router';
2
2
  import { Plugin } from 'vite';
3
- import { GetPlatformProxyOptions, PlatformProxy } from 'wrangler';
3
+ import { PlatformProxy, GetPlatformProxyOptions } from 'wrangler';
4
4
 
5
5
  type MaybePromise<T> = T | Promise<T>;
6
6
  type CfProperties = Record<string, unknown>;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-3b8ea09a1
2
+ * @react-router/dev v0.0.0-experimental-7db49e8d4
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -175,6 +175,8 @@ var import_node_child_process = require("child_process");
175
175
  var import_package_json = __toESM(require("@npmcli/package-json"));
176
176
 
177
177
  // vite/vite-node.ts
178
+ var import_server = require("vite-node/server");
179
+ var import_client = require("vite-node/client");
178
180
  var import_source_map = require("vite-node/source-map");
179
181
 
180
182
  // vite/ssr-externals.ts
@@ -200,10 +202,6 @@ async function createContext({
200
202
  }) {
201
203
  await preloadVite();
202
204
  const vite2 = getVite();
203
- const [{ ViteNodeServer }, { ViteNodeRunner }] = await Promise.all([
204
- import("vite-node/server"),
205
- import("vite-node/client")
206
- ]);
207
205
  const devServer = await vite2.createServer({
208
206
  root,
209
207
  mode,
@@ -233,11 +231,11 @@ async function createContext({
233
231
  plugins: []
234
232
  });
235
233
  await devServer.pluginContainer.buildStart({});
236
- const server = new ViteNodeServer(devServer);
234
+ const server = new import_server.ViteNodeServer(devServer);
237
235
  (0, import_source_map.installSourcemapsSupport)({
238
236
  getSourceMap: (source) => server.getSourceMap(source)
239
237
  });
240
- const runner = new ViteNodeRunner({
238
+ const runner = new import_client.ViteNodeRunner({
241
239
  root: devServer.config.root,
242
240
  base: devServer.config.base,
243
241
  fetchModule(id) {
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-3b8ea09a1
2
+ * @react-router/dev v0.0.0-experimental-7db49e8d4
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -53,7 +53,6 @@ var fse = __toESM(require("fs-extra"));
53
53
  var babel = __toESM(require("@babel/core"));
54
54
  var import_react_router2 = require("react-router");
55
55
  var import_es_module_lexer = require("es-module-lexer");
56
- var import_tinyglobby = require("tinyglobby");
57
56
  var import_pick3 = __toESM(require("lodash/pick"));
58
57
  var import_jsesc = __toESM(require("jsesc"));
59
58
  var import_picocolors3 = __toESM(require("picocolors"));
@@ -70,6 +69,8 @@ var import_node_child_process = require("child_process");
70
69
  var import_package_json = __toESM(require("@npmcli/package-json"));
71
70
 
72
71
  // vite/vite-node.ts
72
+ var import_server = require("vite-node/server");
73
+ var import_client = require("vite-node/client");
73
74
  var import_source_map = require("vite-node/source-map");
74
75
 
75
76
  // vite/vite.ts
@@ -139,10 +140,6 @@ async function createContext({
139
140
  }) {
140
141
  await preloadVite();
141
142
  const vite2 = getVite();
142
- const [{ ViteNodeServer }, { ViteNodeRunner }] = await Promise.all([
143
- import("vite-node/server"),
144
- import("vite-node/client")
145
- ]);
146
143
  const devServer = await vite2.createServer({
147
144
  root,
148
145
  mode,
@@ -172,11 +169,11 @@ async function createContext({
172
169
  plugins: []
173
170
  });
174
171
  await devServer.pluginContainer.buildStart({});
175
- const server = new ViteNodeServer(devServer);
172
+ const server = new import_server.ViteNodeServer(devServer);
176
173
  (0, import_source_map.installSourcemapsSupport)({
177
174
  getSourceMap: (source) => server.getSourceMap(source)
178
175
  });
179
- const runner = new ViteNodeRunner({
176
+ const runner = new import_client.ViteNodeRunner({
180
177
  root: devServer.config.root,
181
178
  base: devServer.config.base,
182
179
  fetchModule(id) {
@@ -918,7 +915,7 @@ function generateRoutes(ctx) {
918
915
  lineages.set(route.id, lineage2);
919
916
  const fullpath2 = fullpath(lineage2);
920
917
  if (!fullpath2) continue;
921
- const pages = expand(fullpath2);
918
+ const pages = explodeOptionalSegments(fullpath2);
922
919
  pages.forEach((page) => allPages.add(page));
923
920
  lineage2.forEach(({ id }) => {
924
921
  let routePages = routeToPages.get(id);
@@ -1126,13 +1123,9 @@ function getRouteAnnotations({
1126
1123
  }
1127
1124
  function relativeImportSource(from, to) {
1128
1125
  let path6 = Path3.relative(Path3.dirname(from), to);
1129
- let extension = Path3.extname(path6);
1130
1126
  path6 = Path3.join(Path3.dirname(path6), Pathe.filename(path6));
1131
1127
  if (!path6.startsWith("../")) path6 = "./" + path6;
1132
- if (!extension || /\.(js|ts)x?$/.test(extension)) {
1133
- extension = ".js";
1134
- }
1135
- return path6 + extension;
1128
+ return path6 + ".js";
1136
1129
  }
1137
1130
  function rootDirsPath(ctx, typesPath) {
1138
1131
  const rel = Path3.relative(typesDirectory(ctx), typesPath);
@@ -1151,27 +1144,28 @@ function paramsType(path6) {
1151
1144
  })
1152
1145
  );
1153
1146
  }
1154
- function expand(fullpath2) {
1155
- function recurse(segments2, index) {
1156
- if (index === segments2.length) return [""];
1157
- const segment = segments2[index];
1158
- const isOptional = segment.endsWith("?");
1159
- const isDynamic = segment.startsWith(":");
1160
- const required = segment.replace(/\?$/, "");
1161
- const keep = !isOptional || isDynamic;
1162
- const kept = isDynamic ? segment : required;
1163
- const withoutSegment = recurse(segments2, index + 1);
1164
- const withSegment = withoutSegment.map((rest) => [kept, rest].join("/"));
1165
- if (keep) return withSegment;
1166
- return [...withoutSegment, ...withSegment];
1147
+ function explodeOptionalSegments(path6) {
1148
+ let segments = path6.split("/");
1149
+ if (segments.length === 0) return [];
1150
+ let [first, ...rest] = segments;
1151
+ let isOptional = first.endsWith("?");
1152
+ let required = first.replace(/\?$/, "");
1153
+ if (rest.length === 0) {
1154
+ return isOptional ? [required, ""] : [required];
1167
1155
  }
1168
- const segments = fullpath2.split("/");
1169
- const expanded = /* @__PURE__ */ new Set();
1170
- for (let result of recurse(segments, 0)) {
1171
- if (result !== "/") result = result.replace(/\/$/, "");
1172
- expanded.add(result);
1156
+ let restExploded = explodeOptionalSegments(rest.join("/"));
1157
+ let result = [];
1158
+ result.push(
1159
+ ...restExploded.map(
1160
+ (subpath) => subpath === "" ? required : [required, subpath].join("/")
1161
+ )
1162
+ );
1163
+ if (isOptional) {
1164
+ result.push(...restExploded);
1173
1165
  }
1174
- return expanded;
1166
+ return result.map(
1167
+ (exploded) => path6.startsWith("/") && exploded === "" ? "/" : exploded
1168
+ );
1175
1169
  }
1176
1170
 
1177
1171
  // typegen/index.ts
@@ -2972,7 +2966,6 @@ var reactRouterVitePlugin = () => {
2972
2966
  config: async (_viteUserConfig, _viteConfigEnv) => {
2973
2967
  await preloadVite();
2974
2968
  let vite2 = getVite();
2975
- let viteMajorVersion = parseInt(vite2.version.split(".")[0], 10);
2976
2969
  viteUserConfig = _viteUserConfig;
2977
2970
  viteConfigEnv = _viteConfigEnv;
2978
2971
  viteCommand = viteConfigEnv.command;
@@ -3031,13 +3024,7 @@ var reactRouterVitePlugin = () => {
3031
3024
  ...Object.values(ctx.reactRouterConfig.routes).map(
3032
3025
  (route) => resolveRelativeRouteFilePath(route, ctx.reactRouterConfig)
3033
3026
  )
3034
- ].map(
3035
- (entry) => (
3036
- // In Vite 7, the `optimizeDeps.entries` option only accepts glob patterns.
3037
- // In prior versions, absolute file paths were treated differently.
3038
- viteMajorVersion >= 7 ? (0, import_tinyglobby.escapePath)(entry) : entry
3039
- )
3040
- ) : [],
3027
+ ] : [],
3041
3028
  include: [
3042
3029
  // Pre-bundle React dependencies to avoid React duplicates,
3043
3030
  // even if React dependencies are not direct dependencies.
@@ -3284,7 +3271,7 @@ var reactRouterVitePlugin = () => {
3284
3271
  if (ctx.reactRouterConfig.future.unstable_viteEnvironmentApi) {
3285
3272
  viteDevServer.middlewares.use(async (req, res, next) => {
3286
3273
  let [reqPathname, reqSearch] = (req.url ?? "").split("?");
3287
- if (reqPathname.endsWith("/@react-router/critical.css")) {
3274
+ if (reqPathname === `${ctx.publicPath}@react-router/critical.css`) {
3288
3275
  let pathname = new URLSearchParams(reqSearch).get("pathname");
3289
3276
  if (!pathname) {
3290
3277
  return next("No pathname provided");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
- "version": "0.0.0-experimental-3b8ea09a1",
3
+ "version": "0.0.0-experimental-7db49e8d4",
4
4
  "description": "Dev tools and CLI for React Router",
5
5
  "homepage": "https://reactrouter.com",
6
6
  "bugs": {
@@ -84,10 +84,9 @@
84
84
  "react-refresh": "^0.14.0",
85
85
  "semver": "^7.3.7",
86
86
  "set-cookie-parser": "^2.6.0",
87
- "tinyglobby": "^0.2.14",
88
87
  "valibot": "^0.41.0",
89
88
  "vite-node": "^3.1.4",
90
- "@react-router/node": "0.0.0-experimental-3b8ea09a1"
89
+ "@react-router/node": "0.0.0-experimental-7db49e8d4"
91
90
  },
92
91
  "devDependencies": {
93
92
  "@types/babel__core": "^7.20.5",
@@ -111,15 +110,15 @@
111
110
  "vite": "^6.1.0",
112
111
  "wireit": "0.14.9",
113
112
  "wrangler": "^4.2.0",
114
- "@react-router/serve": "0.0.0-experimental-3b8ea09a1",
115
- "react-router": "^0.0.0-experimental-3b8ea09a1"
113
+ "@react-router/serve": "0.0.0-experimental-7db49e8d4",
114
+ "react-router": "^0.0.0-experimental-7db49e8d4"
116
115
  },
117
116
  "peerDependencies": {
118
117
  "typescript": "^5.1.0",
119
- "vite": "^5.1.0 || ^6.0.0 || ^7.0.0",
118
+ "vite": "^5.1.0 || ^6.0.0",
120
119
  "wrangler": "^3.28.2 || ^4.0.0",
121
- "@react-router/serve": "^0.0.0-experimental-3b8ea09a1",
122
- "react-router": "^0.0.0-experimental-3b8ea09a1"
120
+ "@react-router/serve": "^0.0.0-experimental-7db49e8d4",
121
+ "react-router": "^0.0.0-experimental-7db49e8d4"
123
122
  },
124
123
  "peerDependenciesMeta": {
125
124
  "@react-router/serve": {