@react-router/dev 0.0.0-experimental-10a6fd0e1 → 0.0.0-experimental-4996fbe2b

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 (38) hide show
  1. package/dist/cli/commands.js +4 -11
  2. package/dist/cli/detectPackageManager.js +1 -1
  3. package/dist/cli/index.js +1 -1
  4. package/dist/cli/run.js +1 -1
  5. package/dist/cli/useJavascript.js +1 -1
  6. package/dist/cli.js +1 -1
  7. package/dist/colors.js +1 -1
  8. package/dist/config/defaults/entry.server.node.tsx +4 -4
  9. package/dist/config/findConfig.js +1 -1
  10. package/dist/config/flatRoutes.js +1 -1
  11. package/dist/config/format.js +1 -1
  12. package/dist/config/routes.js +1 -1
  13. package/dist/config.js +6 -24
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.js +1 -3
  16. package/dist/invariant.js +1 -1
  17. package/dist/vite/babel.js +1 -1
  18. package/dist/vite/build.js +1 -1
  19. package/dist/vite/define-route.d.ts +2 -0
  20. package/dist/vite/define-route.js +172 -0
  21. package/dist/vite/dev.js +1 -1
  22. package/dist/vite/import-vite-esm-sync.js +1 -1
  23. package/dist/vite/index.d.ts +0 -1
  24. package/dist/vite/index.js +1 -7
  25. package/dist/vite/node-adapter.js +2 -2
  26. package/dist/vite/plugin.js +25 -12
  27. package/dist/vite/profiler.js +1 -1
  28. package/dist/vite/remove-exports.js +1 -1
  29. package/dist/vite/resolve-file-url.js +1 -1
  30. package/dist/vite/styles.d.ts +1 -1
  31. package/dist/vite/styles.js +1 -1
  32. package/dist/vite/vmod.js +1 -1
  33. package/package.json +9 -18
  34. package/dist/config/defaults/entry.server.cloudflare.tsx +0 -55
  35. package/dist/config/defaults/entry.server.deno.tsx +0 -55
  36. package/dist/config/defaults/entry.server.spa.tsx +0 -73
  37. package/dist/vite/cloudflare-proxy-plugin.d.ts +0 -15
  38. package/dist/vite/cloudflare-proxy-plugin.js +0 -82
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -94,10 +94,6 @@ let conjunctionListFormat = new Intl.ListFormat("en", {
94
94
  style: "long",
95
95
  type: "conjunction"
96
96
  });
97
- let disjunctionListFormat = new Intl.ListFormat("en", {
98
- style: "long",
99
- type: "disjunction"
100
- });
101
97
  async function generateEntry(entry, reactRouterRoot, flags = {}) {
102
98
  let ctx = await plugin.loadPluginContext({
103
99
  root: reactRouterRoot,
@@ -119,16 +115,13 @@ async function generateEntry(entry, reactRouterRoot, flags = {}) {
119
115
  }
120
116
  let pkgJson = await PackageJson__default["default"].load(rootDirectory);
121
117
  let deps = pkgJson.content.dependencies ?? {};
122
- let serverRuntime = deps["@react-router/deno"] ? "deno" : deps["@react-router/cloudflare"] ? "cloudflare" : deps["@react-router/node"] ? "node" : undefined;
123
- if (!serverRuntime) {
124
- let serverRuntimes = ["@react-router/deno", "@react-router/cloudflare", "@react-router/node"];
125
- let formattedList = disjunctionListFormat.format(serverRuntimes);
126
- console.error(colors.error(`Could not determine server runtime. Please install one of the following: ${formattedList}`));
118
+ if (!deps["@react-router/node"]) {
119
+ console.error(colors.error(`No default server entry detected.`));
127
120
  return;
128
121
  }
129
122
  let defaultsDirectory = path__namespace.resolve(__dirname, "..", "config", "defaults");
130
123
  let defaultEntryClient = path__namespace.resolve(defaultsDirectory, "entry.client.tsx");
131
- let defaultEntryServer = path__namespace.resolve(defaultsDirectory, (ctx === null || ctx === void 0 ? void 0 : ctx.reactRouterConfig.ssr) === false ? `entry.server.spa.tsx` : `entry.server.${serverRuntime}.tsx`);
124
+ let defaultEntryServer = path__namespace.resolve(defaultsDirectory, `entry.server.node.tsx`);
132
125
  let isServerEntry = entry === "entry.server";
133
126
  let contents = isServerEntry ? await createServerEntry(rootDirectory, appDirectory, defaultEntryServer) : await createClientEntry(rootDirectory, appDirectory, defaultEntryClient);
134
127
  let useTypeScript = flags.typescript ?? true;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/cli/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/cli/run.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
3
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
package/dist/colors.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,8 +1,8 @@
1
1
  import { PassThrough } from "node:stream";
2
2
 
3
- import type { AppLoadContext, EntryContext } from "@react-router/node";
3
+ import type { AppLoadContext, EntryContext } from "react-router";
4
4
  import { createReadableStreamFromReadable } from "@react-router/node";
5
- import { RemixServer } from "react-router";
5
+ import { ServerRouter } from "react-router";
6
6
  import * as isbotModule from "isbot";
7
7
  import { renderToPipeableStream } from "react-dom/server";
8
8
 
@@ -63,7 +63,7 @@ function handleBotRequest(
63
63
  return new Promise((resolve, reject) => {
64
64
  let shellRendered = false;
65
65
  const { pipe, abort } = renderToPipeableStream(
66
- <RemixServer
66
+ <ServerRouter
67
67
  context={remixContext}
68
68
  url={request.url}
69
69
  abortDelay={ABORT_DELAY}
@@ -113,7 +113,7 @@ function handleBrowserRequest(
113
113
  return new Promise((resolve, reject) => {
114
114
  let shellRendered = false;
115
115
  const { pipe, abort } = renderToPipeableStream(
116
- <RemixServer
116
+ <ServerRouter
117
117
  context={remixContext}
118
118
  url={request.url}
119
119
  abortDelay={ABORT_DELAY}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -216,8 +216,7 @@ async function resolveEntryFiles({
216
216
  reactRouterConfig
217
217
  }) {
218
218
  let {
219
- appDirectory,
220
- future
219
+ appDirectory
221
220
  } = reactRouterConfig;
222
221
  let defaultsDirectory = path__default["default"].resolve(__dirname, "config", "defaults");
223
222
  let userEntryClientFile = findEntry(appDirectory, "entry.client");
@@ -226,24 +225,11 @@ async function resolveEntryFiles({
226
225
  let entryClientFile = userEntryClientFile || "entry.client.tsx";
227
226
  let pkgJson = await PackageJson__default["default"].load(rootDirectory);
228
227
  let deps = pkgJson.content.dependencies ?? {};
229
- if (!reactRouterConfig.ssr) {
230
- // This is a super-simple default since we don't need streaming in SPA Mode.
231
- // We can include this in a remix-spa template, but right now `npx remix reveal`
232
- // will still expose the streaming template since that command doesn't have
233
- // access to the `ssr:false` flag in the vite config (the streaming template
234
- // works just fine so maybe instead of having this we _only have this version
235
- // in the template...). We let users manage an entry.server file in SPA Mode
236
- // so they can de ide if they want to hydrate the full document or just an
237
- // embedded `<div id="app">` or whatever.
238
- entryServerFile = "entry.server.spa.tsx";
239
- } else if (userEntryServerFile) {
228
+ if (userEntryServerFile) {
240
229
  entryServerFile = userEntryServerFile;
241
230
  } else {
242
- let serverRuntime = deps["@react-router/deno"] ? "deno" : deps["@react-router/cloudflare"] ? "cloudflare" : deps["@react-router/node"] ? "node" : undefined;
243
- if (!serverRuntime) {
244
- let serverRuntimes = ["@react-router/deno", "@react-router/cloudflare", "@react-router/node"];
245
- let formattedList = disjunctionListFormat.format(serverRuntimes);
246
- throw new Error(`Could not determine server runtime. Please install one of the following: ${formattedList}`);
231
+ if (!deps["@react-router/node"]) {
232
+ throw new Error(`Could not determine server runtime. Please install @react-router/node, or provide a custom entry.server.tsx/jsx file in your app directory.`);
247
233
  }
248
234
  if (!deps["isbot"]) {
249
235
  console.log("adding `isbot` to your package.json, you should commit this change");
@@ -260,7 +246,7 @@ async function resolveEntryFiles({
260
246
  stdio: "inherit"
261
247
  });
262
248
  }
263
- entryServerFile = `entry.server.${serverRuntime}.tsx`;
249
+ entryServerFile = `entry.server.node.tsx`;
264
250
  }
265
251
  let entryClientFilePath = userEntryClientFile ? path__default["default"].resolve(reactRouterConfig.appDirectory, userEntryClientFile) : path__default["default"].resolve(defaultsDirectory, entryClientFile);
266
252
  let entryServerFilePath = userEntryServerFile ? path__default["default"].resolve(reactRouterConfig.appDirectory, userEntryServerFile) : path__default["default"].resolve(defaultsDirectory, entryServerFile);
@@ -277,10 +263,6 @@ function findEntry(dir, basename) {
277
263
  }
278
264
  return undefined;
279
265
  }
280
- let disjunctionListFormat = new Intl.ListFormat("en", {
281
- style: "long",
282
- type: "disjunction"
283
- });
284
266
 
285
267
  exports.configRouteToBranchRoute = configRouteToBranchRoute;
286
268
  exports.resolveEntryFiles = resolveEntryFiles;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * as cli from "./cli/index";
2
2
  export type { Manifest as AssetsManifest } from "./manifest";
3
3
  export type { BuildManifest, Preset, ServerBundlesFunction, VitePluginConfig, } from "./config";
4
- export { vitePlugin, cloudflareDevProxyVitePlugin } from "./vite";
4
+ export { vitePlugin } from "./vite";
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -14,10 +14,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
14
14
 
15
15
  var index = require('./cli/index.js');
16
16
  var index$1 = require('./vite/index.js');
17
- var cloudflareProxyPlugin = require('./vite/cloudflare-proxy-plugin.js');
18
17
 
19
18
 
20
19
 
21
20
  exports.cli = index;
22
21
  exports.vitePlugin = index$1.vitePlugin;
23
- exports.cloudflareDevProxyVitePlugin = cloudflareProxyPlugin.cloudflareDevProxyVitePlugin;
package/dist/invariant.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -0,0 +1,2 @@
1
+ export declare function transform(code: string): void;
2
+ export declare function assertNotImported(code: string): void;
@@ -0,0 +1,172 @@
1
+ /**
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
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
+
13
+ Object.defineProperty(exports, '__esModule', { value: true });
14
+
15
+ var babel$1 = require('@babel/core');
16
+ var babel = require('./babel.js');
17
+ var t = require('@babel/types');
18
+ var parser = require('@babel/parser');
19
+
20
+ function _interopNamespace(e) {
21
+ if (e && e.__esModule) return e;
22
+ var n = Object.create(null);
23
+ if (e) {
24
+ Object.keys(e).forEach(function (k) {
25
+ if (k !== 'default') {
26
+ var d = Object.getOwnPropertyDescriptor(e, k);
27
+ Object.defineProperty(n, k, d.get ? d : {
28
+ enumerable: true,
29
+ get: function () { return e[k]; }
30
+ });
31
+ }
32
+ });
33
+ }
34
+ n["default"] = e;
35
+ return Object.freeze(n);
36
+ }
37
+
38
+ var babel__namespace = /*#__PURE__*/_interopNamespace(babel$1);
39
+ var t__namespace = /*#__PURE__*/_interopNamespace(t);
40
+
41
+ function transform(code) {
42
+ let ast = parse(code);
43
+ babel.traverse(ast, {
44
+ Identifier(path) {
45
+ if (!isDefineRoute(path)) return;
46
+ if (t__namespace.isImportSpecifier(path.parent)) return;
47
+ if (!t__namespace.isCallExpression(path.parent)) {
48
+ throw path.buildCodeFrameError("`defineRoute` must be a function call immediately after `export default`");
49
+ }
50
+ if (!t__namespace.isExportDefaultDeclaration(path.parentPath.parent)) {
51
+ throw path.buildCodeFrameError("`defineRoute` must be a function call immediately after `export default`");
52
+ }
53
+ },
54
+ ExportDefaultDeclaration(path) {
55
+ analyzeRouteExport(path);
56
+ }
57
+ });
58
+ }
59
+ function analyzeRouteExport(path) {
60
+ let route = path.node.declaration;
61
+ // export default {...}
62
+ if (t__namespace.isObjectExpression(route)) {
63
+ let routePath = path.get("declaration");
64
+ return analyzeRoute(routePath);
65
+ }
66
+ // export default defineRoute({...})
67
+ if (t__namespace.isCallExpression(route)) {
68
+ let routePath = path.get("declaration");
69
+ if (!isDefineRoute(routePath.get("callee"))) {
70
+ throw routePath.buildCodeFrameError("Default export of a route module must be either a literal object or a call to `defineRoute`");
71
+ }
72
+ if (routePath.node.arguments.length !== 1) {
73
+ throw routePath.buildCodeFrameError("`defineRoute` must take exactly one argument");
74
+ }
75
+ let arg = routePath.node.arguments[0];
76
+ let argPath = routePath.get("arguments.0");
77
+ if (!t__namespace.isObjectExpression(arg)) {
78
+ throw argPath.buildCodeFrameError("`defineRoute` argument must be a literal object");
79
+ }
80
+ return analyzeRoute(argPath);
81
+ }
82
+ throw path.get("declaration").buildCodeFrameError("Default export of a route module must be either a literal object or a call to `defineRoute`");
83
+ }
84
+ function analyzeRoute(path) {
85
+ for (let [i, property] of path.node.properties.entries()) {
86
+ // spread: defineRoute({ ...dynamic })
87
+ if (!t__namespace.isObjectProperty(property) && !t__namespace.isObjectMethod(property)) {
88
+ let propertyPath = path.get(`properties.${i}`);
89
+ throw propertyPath.buildCodeFrameError("Properties cannot be spread into route");
90
+ }
91
+ // defineRoute({ [dynamic]: ... })
92
+ let propertyPath = path.get(`properties.${i}`);
93
+ if (property.computed || !t__namespace.isIdentifier(property.key)) {
94
+ throw propertyPath.buildCodeFrameError("Route cannot have computed keys");
95
+ }
96
+ // defineRoute({ params: [...] })
97
+ let key = property.key.name;
98
+ if (key === "params") {
99
+ let paramsPath = propertyPath;
100
+ if (t__namespace.isObjectMethod(paramsPath.node)) {
101
+ throw paramsPath.buildCodeFrameError("Route params must be a literal array");
102
+ }
103
+ if (!t__namespace.isArrayExpression(paramsPath.node.value)) {
104
+ throw paramsPath.buildCodeFrameError("Route params must be a literal array");
105
+ }
106
+ for (let [i, element] of paramsPath.node.value.elements.entries()) {
107
+ if (!t__namespace.isStringLiteral(element)) {
108
+ let elementPath = paramsPath.get(`value.elements.${i}`);
109
+ throw elementPath.buildCodeFrameError("Route param must be a literal string");
110
+ }
111
+ }
112
+ continue;
113
+ }
114
+ }
115
+ throw path.buildCodeFrameError("TODO: not yet implemented");
116
+ }
117
+ function assertNotImported(code) {
118
+ let ast = parse(code);
119
+ babel.traverse(ast, {
120
+ Identifier(path) {
121
+ if (isDefineRoute(path)) {
122
+ throw path.buildCodeFrameError("`defineRoute` cannot be used outside of route modules");
123
+ }
124
+ }
125
+ });
126
+ }
127
+ function parse(source) {
128
+ let ast = parser.parse(source, {
129
+ sourceType: "module",
130
+ plugins: ["jsx", ["typescript", {}]]
131
+ });
132
+ // Workaround for `path.buildCodeFrameError`
133
+ // See:
134
+ // - https://github.com/babel/babel/issues/11889
135
+ // - https://github.com/babel/babel/issues/11350#issuecomment-606169054
136
+ // @ts-expect-error `@types/babel__core` is missing types for `File`
137
+ new babel__namespace.File({
138
+ filename: undefined
139
+ }, {
140
+ code: source,
141
+ ast
142
+ });
143
+ return ast;
144
+ }
145
+ function isDefineRoute(path) {
146
+ if (!t__namespace.isIdentifier(path.node)) return false;
147
+ let binding = path.scope.getBinding(path.node.name);
148
+ if (!binding) return false;
149
+ return isCanonicallyImportedAs(binding, {
150
+ imported: "defineRoute",
151
+ source: "react-router"
152
+ });
153
+ }
154
+ function isCanonicallyImportedAs(binding, {
155
+ source: sourceName,
156
+ imported: importedName
157
+ }) {
158
+ // import source
159
+ if (!t__namespace.isImportDeclaration(binding === null || binding === void 0 ? void 0 : binding.path.parent)) return false;
160
+ if (binding.path.parent.source.value !== sourceName) return false;
161
+ // import specifier
162
+ if (!t__namespace.isImportSpecifier(binding === null || binding === void 0 ? void 0 : binding.path.node)) return false;
163
+ let {
164
+ imported
165
+ } = binding.path.node;
166
+ if (!t__namespace.isIdentifier(imported)) return false;
167
+ if (imported.name !== importedName) return false;
168
+ return true;
169
+ }
170
+
171
+ exports.assertNotImported = assertNotImported;
172
+ exports.transform = transform;
package/dist/vite/dev.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,3 +1,2 @@
1
1
  import type { ReactRouterVitePlugin } from "./plugin";
2
2
  export declare const vitePlugin: ReactRouterVitePlugin;
3
- export { cloudflareDevProxyVitePlugin } from "./cloudflare-proxy-plugin";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -12,12 +12,6 @@
12
12
 
13
13
  Object.defineProperty(exports, '__esModule', { value: true });
14
14
 
15
- require('@react-router/server-runtime');
16
- require('node:events');
17
- require('node:stream');
18
- require('set-cookie-parser');
19
- require('@react-router/node');
20
-
21
15
  const vitePlugin = (...args) => {
22
16
  let {
23
17
  reactRouterVitePlugin
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -33,7 +33,7 @@ function fromNodeHeaders(nodeHeaders) {
33
33
  }
34
34
  return headers;
35
35
  }
36
- // Based on `createRemixRequest` in packages/remix-express/server.ts
36
+ // Based on `createRemixRequest` in packages/react-router-express/server.ts
37
37
  function fromNodeRequest(nodeReq) {
38
38
  let origin = nodeReq.headers.origin && "null" !== nodeReq.headers.origin ? nodeReq.headers.origin : `http://${nodeReq.headers.host}`;
39
39
  // Use `req.originalUrl` so React Router is aware of the full path
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -17,7 +17,6 @@ var path = require('node:path');
17
17
  var url = require('node:url');
18
18
  var fse = require('fs-extra');
19
19
  var babel = require('@babel/core');
20
- var serverRuntime = require('@react-router/server-runtime');
21
20
  var reactRouter = require('react-router');
22
21
  var esModuleLexer = require('es-module-lexer');
23
22
  var jsesc = require('jsesc');
@@ -31,6 +30,7 @@ var resolveFileUrl = require('./resolve-file-url.js');
31
30
  var removeExports = require('./remove-exports.js');
32
31
  var importViteEsmSync = require('./import-vite-esm-sync.js');
33
32
  var config = require('../config.js');
33
+ var defineRoute = require('./define-route.js');
34
34
 
35
35
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
36
36
 
@@ -459,7 +459,7 @@ const reactRouterVitePlugin = _config => {
459
459
  return [{
460
460
  name: "react-router",
461
461
  config: async (_viteUserConfig, _viteConfigEnv) => {
462
- var _viteUserConfig$serve, _viteUserConfig$serve2, _viteUserConfig$build4;
462
+ var _viteUserConfig$serve, _viteUserConfig$serve2, _viteUserConfig$build4, _viteUserConfig$build5, _viteUserConfig$build6;
463
463
  // Preload Vite's ESM build up-front as soon as we're in an async context
464
464
  await importViteEsmSync.preloadViteEsm();
465
465
  // Ensure sync import of Vite works after async preload
@@ -496,7 +496,7 @@ const reactRouterVitePlugin = _config => {
496
496
  // This is only needed within this repo because these packages
497
497
  // are linked to a directory outside of node_modules so Vite
498
498
  // treats them as internal code by default.
499
- "react-router", "react-router-dom", "@react-router/architect", "@react-router/cloudflare-pages", "@react-router/cloudflare-workers", "@react-router/cloudflare", "@react-router/deno", "@react-router/dev", "@react-router/express", "@react-router/netlify", "@react-router/node", "@react-router/serve", "@react-router/server-runtime"] : undefined
499
+ "react-router", "react-router-dom", "@react-router/dev", "@react-router/express", "@react-router/node", "@react-router/serve"] : undefined
500
500
  },
501
501
  optimizeDeps: {
502
502
  include: [
@@ -557,7 +557,7 @@ const reactRouterVitePlugin = _config => {
557
557
  rollupOptions: {
558
558
  ...baseRollupOptions,
559
559
  preserveEntrySignatures: "exports-only",
560
- input: serverBuildId,
560
+ input: ((_viteUserConfig$build5 = viteUserConfig.build) === null || _viteUserConfig$build5 === void 0 ? void 0 : (_viteUserConfig$build6 = _viteUserConfig$build5.rollupOptions) === null || _viteUserConfig$build6 === void 0 ? void 0 : _viteUserConfig$build6.input) ?? serverBuildId,
561
561
  output: {
562
562
  entryFileNames: ctx.reactRouterConfig.serverBuildFile,
563
563
  format: ctx.reactRouterConfig.serverModuleFormat
@@ -652,7 +652,7 @@ const reactRouterVitePlugin = _config => {
652
652
  }
653
653
  },
654
654
  async configureServer(viteDevServer) {
655
- serverRuntime.unstable_setDevServerHooks({
655
+ reactRouter.unstable_setDevServerHooks({
656
656
  // Give the request handler access to the critical CSS in dev to avoid a
657
657
  // flash of unstyled content since Vite injects CSS file contents via JS
658
658
  getCriticalCss: async (build, url) => {
@@ -698,7 +698,7 @@ const reactRouterVitePlugin = _config => {
698
698
  viteDevServer.middlewares.use(async (req, res, next) => {
699
699
  try {
700
700
  let build = await viteDevServer.ssrLoadModule(serverBuildId);
701
- let handler = serverRuntime.createRequestHandler(build, "development");
701
+ let handler = reactRouter.createRequestHandler(build, "development");
702
702
  let nodeHandler = async (nodeReq, nodeRes) => {
703
703
  let req = nodeAdapter.fromNodeRequest(nodeReq);
704
704
  let res = await handler(req, await reactRouterDevLoadContext(req));
@@ -802,6 +802,19 @@ const reactRouterVitePlugin = _config => {
802
802
  }
803
803
  }
804
804
  }
805
+ }, {
806
+ name: "react-router-define-route",
807
+ enforce: "pre",
808
+ async transform(code, id, options) {
809
+ if (options !== null && options !== void 0 && options.ssr) return;
810
+ if (id.endsWith(BUILD_CLIENT_ROUTE_QUERY_STRING)) return;
811
+ let route = getRoute(ctx.reactRouterConfig, id);
812
+ if (!route && code.includes("defineRoute")) {
813
+ return defineRoute.assertNotImported(code);
814
+ }
815
+ if (!code.includes("defineRoute")) return; // temporary back compat, remove once old style routes are unsupported
816
+ defineRoute.transform(code);
817
+ }
805
818
  }, {
806
819
  name: "react-router-dot-server",
807
820
  enforce: "pre",
@@ -972,9 +985,9 @@ const reactRouterVitePlugin = _config => {
972
985
  }];
973
986
  };
974
987
  function isInReactRouterMonorepo() {
975
- // We use '@react-router/server-runtime' for this check since it's a
988
+ // We use '@react-router/node' for this check since it's a
976
989
  // dependency of this package and guaranteed to be in node_modules
977
- let serverRuntimePath = path__namespace.dirname(require.resolve("@react-router/server-runtime/package.json"));
990
+ let serverRuntimePath = path__namespace.dirname(require.resolve("@react-router/node/package.json"));
978
991
  let serverRuntimeParentDir = path__namespace.basename(path__namespace.resolve(serverRuntimePath, ".."));
979
992
  return serverRuntimeParentDir === "packages";
980
993
  }
@@ -1052,7 +1065,7 @@ async function getPrerenderBuildAndHandler(viteConfig, reactRouterConfig, server
1052
1065
  let build = await import(url__namespace.pathToFileURL(serverBuildPath).toString());
1053
1066
  let {
1054
1067
  createRequestHandler: createHandler
1055
- } = await import('@react-router/node');
1068
+ } = await import('react-router');
1056
1069
  return {
1057
1070
  build,
1058
1071
  handler: createHandler(build, viteConfig.mode)
@@ -1133,7 +1146,7 @@ function validatePrerenderedHtml(html, prefix) {
1133
1146
  throw new Error(`${prefix}: Did you forget to include <Scripts/> in your root route? ` + "Your pre-rendered HTML files cannot hydrate without `<Scripts />`.");
1134
1147
  }
1135
1148
  }
1136
- // Note: Duplicated from remix-server-runtime
1149
+ // Note: Duplicated from react-router/lib/server-runtime
1137
1150
  function groupRoutesByParentId(manifest) {
1138
1151
  let routes = {};
1139
1152
  Object.values(manifest).forEach(route => {
@@ -1145,7 +1158,7 @@ function groupRoutesByParentId(manifest) {
1145
1158
  });
1146
1159
  return routes;
1147
1160
  }
1148
- // Note: Duplicated from remix-server-runtime
1161
+ // Note: Duplicated from react-router/lib/server-runtime
1149
1162
  function createPrerenderRoutes(manifest, parentId = "", routesByParentId = groupRoutesByParentId(manifest)) {
1150
1163
  return (routesByParentId[parentId] || []).map(route => {
1151
1164
  let commonRoute = {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,4 +1,4 @@
1
- import type { ServerBuild } from "@react-router/server-runtime";
1
+ import type { ServerBuild } from "react-router";
2
2
  import type { ViteDevServer } from "vite";
3
3
  import type { ResolvedVitePluginConfig } from "../config";
4
4
  export declare const isCssModulesFile: (file: string) => boolean;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/vite/vmod.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
2
+ * @react-router/dev v0.0.0-experimental-4996fbe2b
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-router/dev",
3
- "version": "0.0.0-experimental-10a6fd0e1",
3
+ "version": "0.0.0-experimental-4996fbe2b",
4
4
  "description": "Dev tools and CLI for React Router",
5
5
  "homepage": "https://reactrouter.com",
6
6
  "bugs": {
@@ -9,7 +9,7 @@
9
9
  "repository": {
10
10
  "type": "git",
11
11
  "url": "https://github.com/remix-run/react-router",
12
- "directory": "packages/remix-dev"
12
+ "directory": "packages/react-router-dev"
13
13
  },
14
14
  "license": "MIT",
15
15
  "main": "dist/index.js",
@@ -42,9 +42,7 @@
42
42
  "react-refresh": "^0.14.0",
43
43
  "semver": "^7.3.7",
44
44
  "set-cookie-parser": "^2.6.0",
45
- "@react-router/node": "0.0.0-experimental-10a6fd0e1",
46
- "@react-router/server-runtime": "0.0.0-experimental-10a6fd0e1",
47
- "react-router": "0.0.0-experimental-10a6fd0e1"
45
+ "@react-router/node": "0.0.0-experimental-4996fbe2b"
48
46
  },
49
47
  "devDependencies": {
50
48
  "@types/babel__core": "^7.20.5",
@@ -61,22 +59,21 @@
61
59
  "@types/prettier": "^2.7.3",
62
60
  "@types/set-cookie-parser": "^2.4.1",
63
61
  "dotenv": "^16.0.0",
64
- "execa": "5.1.1",
65
- "express": "^4.17.1",
66
62
  "esbuild-register": "^3.3.2",
63
+ "execa": "5.1.1",
64
+ "express": "^4.19.2",
67
65
  "fast-glob": "3.2.11",
68
66
  "strip-ansi": "^6.0.1",
69
67
  "tiny-invariant": "^1.2.0",
70
68
  "vite": "^5.1.0",
71
- "wrangler": "^3.28.2",
72
- "@react-router/serve": "0.0.0-experimental-10a6fd0e1"
69
+ "@react-router/serve": "0.0.0-experimental-4996fbe2b",
70
+ "react-router": "^0.0.0-experimental-4996fbe2b"
73
71
  },
74
72
  "peerDependencies": {
75
73
  "typescript": "^5.1.0",
76
74
  "vite": "^5.1.0",
77
- "wrangler": "^3.28.2",
78
- "react-router": "^0.0.0-experimental-10a6fd0e1",
79
- "@react-router/serve": "^0.0.0-experimental-10a6fd0e1"
75
+ "@react-router/serve": "^0.0.0-experimental-4996fbe2b",
76
+ "react-router": "^0.0.0-experimental-4996fbe2b"
80
77
  },
81
78
  "peerDependenciesMeta": {
82
79
  "@react-router/serve": {
@@ -84,12 +81,6 @@
84
81
  },
85
82
  "typescript": {
86
83
  "optional": true
87
- },
88
- "vite": {
89
- "optional": true
90
- },
91
- "wrangler": {
92
- "optional": true
93
84
  }
94
85
  },
95
86
  "engines": {
@@ -1,55 +0,0 @@
1
- import type { AppLoadContext, EntryContext } from "@react-router/cloudflare";
2
- import { RemixServer } from "react-router";
3
- import * as isbotModule from "isbot";
4
- import { renderToReadableStream } from "react-dom/server";
5
-
6
- export default async function handleRequest(
7
- request: Request,
8
- responseStatusCode: number,
9
- responseHeaders: Headers,
10
- remixContext: EntryContext,
11
- loadContext: AppLoadContext
12
- ) {
13
- const body = await renderToReadableStream(
14
- <RemixServer context={remixContext} url={request.url} />,
15
- {
16
- signal: request.signal,
17
- onError(error: unknown) {
18
- // Log streaming rendering errors from inside the shell
19
- console.error(error);
20
- responseStatusCode = 500;
21
- },
22
- }
23
- );
24
-
25
- if (isBotRequest(request.headers.get("user-agent"))) {
26
- await body.allReady;
27
- }
28
-
29
- responseHeaders.set("Content-Type", "text/html");
30
- return new Response(body, {
31
- headers: responseHeaders,
32
- status: responseStatusCode,
33
- });
34
- }
35
-
36
- // We have some Remix apps in the wild already running with isbot@3 so we need
37
- // to maintain backwards compatibility even though we want new apps to use
38
- // isbot@4. That way, we can ship this as a minor Semver update to @react-router/dev.
39
- function isBotRequest(userAgent: string | null) {
40
- if (!userAgent) {
41
- return false;
42
- }
43
-
44
- // isbot >= 3.8.0, >4
45
- if ("isbot" in isbotModule && typeof isbotModule.isbot === "function") {
46
- return isbotModule.isbot(userAgent);
47
- }
48
-
49
- // isbot < 3.8.0
50
- if ("default" in isbotModule && typeof isbotModule.default === "function") {
51
- return isbotModule.default(userAgent);
52
- }
53
-
54
- return false;
55
- }
@@ -1,55 +0,0 @@
1
- import type { AppLoadContext, EntryContext } from "@react-router/deno";
2
- import { RemixServer } from "@remix-run/react";
3
- import * as isbotModule from "isbot";
4
- import { renderToReadableStream } from "react-dom/server";
5
-
6
- export default async function handleRequest(
7
- request: Request,
8
- responseStatusCode: number,
9
- responseHeaders: Headers,
10
- remixContext: EntryContext,
11
- loadContext: AppLoadContext
12
- ) {
13
- const body = await renderToReadableStream(
14
- <RemixServer context={remixContext} url={request.url} />,
15
- {
16
- signal: request.signal,
17
- onError(error: unknown) {
18
- // Log streaming rendering errors from inside the shell
19
- console.error(error);
20
- responseStatusCode = 500;
21
- },
22
- }
23
- );
24
-
25
- if (isBotRequest(request.headers.get("user-agent"))) {
26
- await body.allReady;
27
- }
28
-
29
- responseHeaders.set("Content-Type", "text/html");
30
- return new Response(body, {
31
- headers: responseHeaders,
32
- status: responseStatusCode,
33
- });
34
- }
35
-
36
- // We have some Remix apps in the wild already running with isbot@3 so we need
37
- // to maintain backwards compatibility even though we want new apps to use
38
- // isbot@4. That way, we can ship this as a minor Semver update to @react-router/dev.
39
- function isBotRequest(userAgent: string | null) {
40
- if (!userAgent) {
41
- return false;
42
- }
43
-
44
- // isbot >= 3.8.0, >4
45
- if ("isbot" in isbotModule && typeof isbotModule.isbot === "function") {
46
- return isbotModule.isbot(userAgent);
47
- }
48
-
49
- // isbot < 3.8.0
50
- if ("default" in isbotModule && typeof isbotModule.default === "function") {
51
- return isbotModule.default(userAgent);
52
- }
53
-
54
- return false;
55
- }
@@ -1,73 +0,0 @@
1
- import { PassThrough } from "node:stream";
2
-
3
- import type { AppLoadContext, EntryContext } from "@react-router/node";
4
- import { createReadableStreamFromReadable } from "@react-router/node";
5
- import { RemixServer } from "react-router";
6
- import { renderToPipeableStream } from "react-dom/server";
7
-
8
- const ABORT_DELAY = 5_000;
9
-
10
- export default function handleRequest(
11
- request: Request,
12
- responseStatusCode: number,
13
- responseHeaders: Headers,
14
- remixContext: EntryContext,
15
- loadContext: AppLoadContext
16
- ) {
17
- return handleBotRequest(
18
- request,
19
- responseStatusCode,
20
- responseHeaders,
21
- remixContext
22
- );
23
- }
24
-
25
- function handleBotRequest(
26
- request: Request,
27
- responseStatusCode: number,
28
- responseHeaders: Headers,
29
- remixContext: EntryContext
30
- ) {
31
- return new Promise((resolve, reject) => {
32
- let shellRendered = false;
33
- const { pipe, abort } = renderToPipeableStream(
34
- <RemixServer
35
- context={remixContext}
36
- url={request.url}
37
- abortDelay={ABORT_DELAY}
38
- />,
39
- {
40
- onAllReady() {
41
- shellRendered = true;
42
- const body = new PassThrough();
43
- const stream = createReadableStreamFromReadable(body);
44
-
45
- responseHeaders.set("Content-Type", "text/html");
46
-
47
- resolve(
48
- new Response(stream, {
49
- headers: responseHeaders,
50
- status: responseStatusCode,
51
- })
52
- );
53
-
54
- pipe(body);
55
- },
56
- onShellError(error: unknown) {
57
- reject(error);
58
- },
59
- onError(error: unknown) {
60
- responseStatusCode = 500;
61
- // Log streaming rendering errors from inside the shell. Don't log
62
- // errors encountered during initial shell rendering since they'll
63
- // reject and get logged in handleDocumentRequest.
64
- if (shellRendered) {
65
- console.error(error);
66
- }
67
- },
68
- }
69
- );
70
-
71
- setTimeout(abort, ABORT_DELAY);
72
- });
73
- }
@@ -1,15 +0,0 @@
1
- import type { AppLoadContext } from "@react-router/server-runtime";
2
- import type { Plugin } from "vite";
3
- import type { GetPlatformProxyOptions, PlatformProxy } from "wrangler";
4
- type CfProperties = Record<string, unknown>;
5
- type LoadContext<Env, Cf extends CfProperties> = {
6
- cloudflare: Omit<PlatformProxy<Env, Cf>, "dispose">;
7
- };
8
- type GetLoadContext<Env, Cf extends CfProperties> = (args: {
9
- request: Request;
10
- context: LoadContext<Env, Cf>;
11
- }) => AppLoadContext | Promise<AppLoadContext>;
12
- export declare const cloudflareDevProxyVitePlugin: <Env, Cf extends CfProperties>({ getLoadContext, ...options }?: {
13
- getLoadContext?: GetLoadContext<Env, Cf>;
14
- } & GetPlatformProxyOptions) => Plugin;
15
- export {};
@@ -1,82 +0,0 @@
1
- /**
2
- * @react-router/dev v0.0.0-experimental-10a6fd0e1
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
-
13
- Object.defineProperty(exports, '__esModule', { value: true });
14
-
15
- var serverRuntime = require('@react-router/server-runtime');
16
- var nodeAdapter = require('./node-adapter.js');
17
-
18
- let serverBuildId = "virtual:react-router/server-build";
19
- function importWrangler() {
20
- try {
21
- return import('wrangler');
22
- } catch (_) {
23
- throw Error("Could not import `wrangler`. Do you have it installed?");
24
- }
25
- }
26
- const NAME = "vite-plugin-react-router-cloudflare-proxy";
27
- const cloudflareDevProxyVitePlugin = ({
28
- getLoadContext,
29
- ...options
30
- } = {}) => {
31
- return {
32
- name: NAME,
33
- config: () => ({
34
- ssr: {
35
- resolve: {
36
- externalConditions: ["workerd", "worker"]
37
- }
38
- }
39
- }),
40
- configResolved: viteConfig => {
41
- let pluginIndex = name => viteConfig.plugins.findIndex(plugin => plugin.name === name);
42
- let reactRouterPluginIndex = pluginIndex("react-router");
43
- if (reactRouterPluginIndex >= 0 && reactRouterPluginIndex < pluginIndex(NAME)) {
44
- throw new Error(`The "${NAME}" plugin should be placed before the React Router plugin in your Vite config file`);
45
- }
46
- },
47
- configureServer: async viteDevServer => {
48
- let {
49
- getPlatformProxy
50
- } = await importWrangler();
51
- // Do not include `dispose` in Cloudflare context
52
- let {
53
- dispose,
54
- ...cloudflare
55
- } = await getPlatformProxy(options);
56
- let context = {
57
- cloudflare
58
- };
59
- return () => {
60
- if (!viteDevServer.config.server.middlewareMode) {
61
- viteDevServer.middlewares.use(async (nodeReq, nodeRes, next) => {
62
- try {
63
- let build = await viteDevServer.ssrLoadModule(serverBuildId);
64
- let handler = serverRuntime.createRequestHandler(build, "development");
65
- let req = nodeAdapter.fromNodeRequest(nodeReq);
66
- let loadContext = getLoadContext ? await getLoadContext({
67
- request: req,
68
- context
69
- }) : context;
70
- let res = await handler(req, loadContext);
71
- await nodeAdapter.toNodeRequest(res, nodeRes);
72
- } catch (error) {
73
- next(error);
74
- }
75
- });
76
- }
77
- };
78
- }
79
- };
80
- };
81
-
82
- exports.cloudflareDevProxyVitePlugin = cloudflareDevProxyVitePlugin;