@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.
- package/dist/cli/commands.js +4 -11
- package/dist/cli/detectPackageManager.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/run.js +1 -1
- package/dist/cli/useJavascript.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/colors.js +1 -1
- package/dist/config/defaults/entry.server.node.tsx +4 -4
- package/dist/config/findConfig.js +1 -1
- package/dist/config/flatRoutes.js +1 -1
- package/dist/config/format.js +1 -1
- package/dist/config/routes.js +1 -1
- package/dist/config.js +6 -24
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -3
- package/dist/invariant.js +1 -1
- package/dist/vite/babel.js +1 -1
- package/dist/vite/build.js +1 -1
- package/dist/vite/define-route.d.ts +2 -0
- package/dist/vite/define-route.js +172 -0
- package/dist/vite/dev.js +1 -1
- package/dist/vite/import-vite-esm-sync.js +1 -1
- package/dist/vite/index.d.ts +0 -1
- package/dist/vite/index.js +1 -7
- package/dist/vite/node-adapter.js +2 -2
- package/dist/vite/plugin.js +25 -12
- package/dist/vite/profiler.js +1 -1
- package/dist/vite/remove-exports.js +1 -1
- package/dist/vite/resolve-file-url.js +1 -1
- package/dist/vite/styles.d.ts +1 -1
- package/dist/vite/styles.js +1 -1
- package/dist/vite/vmod.js +1 -1
- package/package.json +9 -18
- package/dist/config/defaults/entry.server.cloudflare.tsx +0 -55
- package/dist/config/defaults/entry.server.deno.tsx +0 -55
- package/dist/config/defaults/entry.server.spa.tsx +0 -73
- package/dist/vite/cloudflare-proxy-plugin.d.ts +0 -15
- package/dist/vite/cloudflare-proxy-plugin.js +0 -82
package/dist/cli/commands.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v0.0.0-experimental-
|
|
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
|
-
|
|
123
|
-
|
|
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,
|
|
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;
|
package/dist/cli/index.js
CHANGED
package/dist/cli/run.js
CHANGED
package/dist/cli.js
CHANGED
package/dist/colors.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { PassThrough } from "node:stream";
|
|
2
2
|
|
|
3
|
-
import type { AppLoadContext, EntryContext } from "
|
|
3
|
+
import type { AppLoadContext, EntryContext } from "react-router";
|
|
4
4
|
import { createReadableStreamFromReadable } from "@react-router/node";
|
|
5
|
-
import {
|
|
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
|
-
<
|
|
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
|
-
<
|
|
116
|
+
<ServerRouter
|
|
117
117
|
context={remixContext}
|
|
118
118
|
url={request.url}
|
|
119
119
|
abortDelay={ABORT_DELAY}
|
package/dist/config/format.js
CHANGED
package/dist/config/routes.js
CHANGED
package/dist/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v0.0.0-experimental-
|
|
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 (
|
|
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
|
-
|
|
243
|
-
|
|
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
|
|
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
|
|
4
|
+
export { vitePlugin } from "./vite";
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v0.0.0-experimental-
|
|
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
package/dist/vite/babel.js
CHANGED
package/dist/vite/build.js
CHANGED
|
@@ -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
package/dist/vite/index.d.ts
CHANGED
package/dist/vite/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v0.0.0-experimental-
|
|
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-
|
|
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/
|
|
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
|
package/dist/vite/plugin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @react-router/dev v0.0.0-experimental-
|
|
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/
|
|
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
|
-
|
|
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 =
|
|
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/
|
|
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/
|
|
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('
|
|
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
|
|
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
|
|
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 = {
|
package/dist/vite/profiler.js
CHANGED
package/dist/vite/styles.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ServerBuild } from "
|
|
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;
|
package/dist/vite/styles.js
CHANGED
package/dist/vite/vmod.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-router/dev",
|
|
3
|
-
"version": "0.0.0-experimental-
|
|
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/
|
|
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-
|
|
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
|
-
"
|
|
72
|
-
"
|
|
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
|
-
"
|
|
78
|
-
"react-router": "^0.0.0-experimental-
|
|
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;
|