@react-router/dev 0.0.0-experimental-c0856287f
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 +1773 -0
- package/LICENSE.md +23 -0
- package/README.md +13 -0
- package/dist/cli/commands.d.ts +12 -0
- package/dist/cli/commands.js +174 -0
- package/dist/cli/detectPackageManager.d.ts +10 -0
- package/dist/cli/detectPackageManager.js +39 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +19 -0
- package/dist/cli/run.d.ts +5 -0
- package/dist/cli/run.js +180 -0
- package/dist/cli/useJavascript.d.ts +4 -0
- package/dist/cli/useJavascript.js +66 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +21 -0
- package/dist/colors.d.ts +17 -0
- package/dist/colors.js +49 -0
- package/dist/config/defaults/entry.client.tsx +12 -0
- package/dist/config/defaults/entry.dev.d.ts +2 -0
- package/dist/config/defaults/entry.dev.ts +13 -0
- package/dist/config/defaults/entry.server.cloudflare.tsx +55 -0
- package/dist/config/defaults/entry.server.deno.tsx +55 -0
- package/dist/config/defaults/entry.server.node.tsx +155 -0
- package/dist/config/defaults/entry.server.spa.tsx +20 -0
- package/dist/config/flat-routes.d.ts +14 -0
- package/dist/config/flat-routes.js +418 -0
- package/dist/config/format.d.ts +5 -0
- package/dist/config/format.js +68 -0
- package/dist/config/routes.d.ts +98 -0
- package/dist/config/routes.js +93 -0
- package/dist/config/serverModes.d.ts +9 -0
- package/dist/config/serverModes.js +28 -0
- package/dist/config.d.ts +75 -0
- package/dist/config.js +152 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +23 -0
- package/dist/invariant.d.ts +2 -0
- package/dist/invariant.js +22 -0
- package/dist/manifest.d.ts +28 -0
- package/dist/vite/babel.d.ts +20 -0
- package/dist/vite/babel.js +49 -0
- package/dist/vite/build.d.ts +15 -0
- package/dist/vite/build.js +271 -0
- package/dist/vite/cloudflare-proxy-plugin.d.ts +15 -0
- package/dist/vite/cloudflare-proxy-plugin.js +82 -0
- package/dist/vite/dev.d.ts +15 -0
- package/dist/vite/dev.js +81 -0
- package/dist/vite/import-vite-esm-sync.d.ts +4 -0
- package/dist/vite/import-vite-esm-sync.js +28 -0
- package/dist/vite/index.d.ts +4 -0
- package/dist/vite/index.js +30 -0
- package/dist/vite/node-adapter.d.ts +6 -0
- package/dist/vite/node-adapter.js +78 -0
- package/dist/vite/plugin.d.ts +165 -0
- package/dist/vite/plugin.js +1178 -0
- package/dist/vite/profiler.d.ts +5 -0
- package/dist/vite/profiler.js +55 -0
- package/dist/vite/remove-exports-test.d.ts +1 -0
- package/dist/vite/remove-exports.d.ts +2 -0
- package/dist/vite/remove-exports.js +278 -0
- package/dist/vite/resolve-file-url.d.ts +3 -0
- package/dist/vite/resolve-file-url.js +53 -0
- package/dist/vite/static/refresh-utils.cjs +185 -0
- package/dist/vite/styles.d.ts +13 -0
- package/dist/vite/styles.js +176 -0
- package/dist/vite/vmod.d.ts +3 -0
- package/dist/vite/vmod.js +21 -0
- package/package.json +107 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @react-router/dev v0.0.0-experimental-c0856287f
|
|
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 path = require('node:path');
|
|
16
|
+
var fse = require('fs-extra');
|
|
17
|
+
var colors = require('picocolors');
|
|
18
|
+
var plugin = require('./plugin.js');
|
|
19
|
+
var invariant = require('../invariant.js');
|
|
20
|
+
var importViteEsmSync = require('./import-vite-esm-sync.js');
|
|
21
|
+
|
|
22
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
23
|
+
|
|
24
|
+
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
|
|
25
|
+
var fse__default = /*#__PURE__*/_interopDefaultLegacy(fse);
|
|
26
|
+
var colors__default = /*#__PURE__*/_interopDefaultLegacy(colors);
|
|
27
|
+
|
|
28
|
+
function getAddressableRoutes(routes) {
|
|
29
|
+
let nonAddressableIds = new Set();
|
|
30
|
+
for (let id in routes) {
|
|
31
|
+
let route = routes[id];
|
|
32
|
+
// We omit the parent route of index routes since the index route takes ownership of its parent's path
|
|
33
|
+
if (route.index) {
|
|
34
|
+
invariant["default"](route.parentId, `Expected index route "${route.id}" to have "parentId" set`);
|
|
35
|
+
nonAddressableIds.add(route.parentId);
|
|
36
|
+
}
|
|
37
|
+
// We omit pathless routes since they can only be addressed via descendant routes
|
|
38
|
+
if (typeof route.path !== "string" && !route.index) {
|
|
39
|
+
nonAddressableIds.add(id);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return Object.values(routes).filter(route => !nonAddressableIds.has(route.id));
|
|
43
|
+
}
|
|
44
|
+
function getRouteBranch(routes, routeId) {
|
|
45
|
+
let branch = [];
|
|
46
|
+
let currentRouteId = routeId;
|
|
47
|
+
while (currentRouteId) {
|
|
48
|
+
let route = routes[currentRouteId];
|
|
49
|
+
invariant["default"](route, `Missing route for ${currentRouteId}`);
|
|
50
|
+
branch.push(route);
|
|
51
|
+
currentRouteId = route.parentId;
|
|
52
|
+
}
|
|
53
|
+
return branch.reverse();
|
|
54
|
+
}
|
|
55
|
+
async function getServerBuilds(ctx) {
|
|
56
|
+
let {
|
|
57
|
+
rootDirectory
|
|
58
|
+
} = ctx;
|
|
59
|
+
const {
|
|
60
|
+
routes,
|
|
61
|
+
serverBuildFile,
|
|
62
|
+
serverBundles,
|
|
63
|
+
appDirectory
|
|
64
|
+
} = ctx.reactRouterConfig;
|
|
65
|
+
let serverBuildDirectory = plugin.getServerBuildDirectory(ctx);
|
|
66
|
+
if (!serverBundles) {
|
|
67
|
+
return {
|
|
68
|
+
serverBuilds: [{
|
|
69
|
+
ssr: true
|
|
70
|
+
}],
|
|
71
|
+
buildManifest: {
|
|
72
|
+
routes
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
let {
|
|
77
|
+
normalizePath
|
|
78
|
+
} = await import('vite');
|
|
79
|
+
let resolvedAppDirectory = path__default["default"].resolve(rootDirectory, appDirectory);
|
|
80
|
+
let rootRelativeRoutes = Object.fromEntries(Object.entries(routes).map(([id, route]) => {
|
|
81
|
+
let filePath = path__default["default"].join(resolvedAppDirectory, route.file);
|
|
82
|
+
let rootRelativeFilePath = normalizePath(path__default["default"].relative(rootDirectory, filePath));
|
|
83
|
+
return [id, {
|
|
84
|
+
...route,
|
|
85
|
+
file: rootRelativeFilePath
|
|
86
|
+
}];
|
|
87
|
+
}));
|
|
88
|
+
let buildManifest = {
|
|
89
|
+
serverBundles: {},
|
|
90
|
+
routeIdToServerBundleId: {},
|
|
91
|
+
routes: rootRelativeRoutes
|
|
92
|
+
};
|
|
93
|
+
let serverBundleBuildConfigById = new Map();
|
|
94
|
+
await Promise.all(getAddressableRoutes(routes).map(async route => {
|
|
95
|
+
let branch = getRouteBranch(routes, route.id);
|
|
96
|
+
let serverBundleId = await serverBundles({
|
|
97
|
+
branch: branch.map(route => plugin.configRouteToBranchRoute({
|
|
98
|
+
...route,
|
|
99
|
+
// Ensure absolute paths are passed to the serverBundles function
|
|
100
|
+
file: path__default["default"].join(resolvedAppDirectory, route.file)
|
|
101
|
+
}))
|
|
102
|
+
});
|
|
103
|
+
if (typeof serverBundleId !== "string") {
|
|
104
|
+
throw new Error(`The "serverBundles" function must return a string`);
|
|
105
|
+
}
|
|
106
|
+
if (!/^[a-zA-Z0-9-_]+$/.test(serverBundleId)) {
|
|
107
|
+
throw new Error(`The "serverBundles" function must only return strings containing alphanumeric characters, hyphens and underscores.`);
|
|
108
|
+
}
|
|
109
|
+
buildManifest.routeIdToServerBundleId[route.id] = serverBundleId;
|
|
110
|
+
let relativeServerBundleDirectory = path__default["default"].relative(rootDirectory, path__default["default"].join(serverBuildDirectory, serverBundleId));
|
|
111
|
+
let serverBuildConfig = serverBundleBuildConfigById.get(serverBundleId);
|
|
112
|
+
if (!serverBuildConfig) {
|
|
113
|
+
buildManifest.serverBundles[serverBundleId] = {
|
|
114
|
+
id: serverBundleId,
|
|
115
|
+
file: normalizePath(path__default["default"].join(relativeServerBundleDirectory, serverBuildFile))
|
|
116
|
+
};
|
|
117
|
+
serverBuildConfig = {
|
|
118
|
+
routes: {},
|
|
119
|
+
serverBundleId
|
|
120
|
+
};
|
|
121
|
+
serverBundleBuildConfigById.set(serverBundleId, serverBuildConfig);
|
|
122
|
+
}
|
|
123
|
+
for (let route of branch) {
|
|
124
|
+
serverBuildConfig.routes[route.id] = route;
|
|
125
|
+
}
|
|
126
|
+
}));
|
|
127
|
+
let serverBuilds = Array.from(serverBundleBuildConfigById.values()).map(serverBundleBuildConfig => {
|
|
128
|
+
let serverBuild = {
|
|
129
|
+
ssr: true,
|
|
130
|
+
serverBundleBuildConfig
|
|
131
|
+
};
|
|
132
|
+
return serverBuild;
|
|
133
|
+
});
|
|
134
|
+
return {
|
|
135
|
+
serverBuilds,
|
|
136
|
+
buildManifest
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async function cleanBuildDirectory(viteConfig, ctx) {
|
|
140
|
+
let buildDirectory = ctx.reactRouterConfig.buildDirectory;
|
|
141
|
+
let isWithinRoot = () => {
|
|
142
|
+
let relativePath = path__default["default"].relative(ctx.rootDirectory, buildDirectory);
|
|
143
|
+
return !relativePath.startsWith("..") && !path__default["default"].isAbsolute(relativePath);
|
|
144
|
+
};
|
|
145
|
+
if (viteConfig.build.emptyOutDir ?? isWithinRoot()) {
|
|
146
|
+
await fse__default["default"].remove(buildDirectory);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function getViteManifestPaths(ctx, serverBuilds) {
|
|
150
|
+
let buildRelative = pathname => path__default["default"].resolve(ctx.reactRouterConfig.buildDirectory, pathname);
|
|
151
|
+
let viteManifestPaths = [{
|
|
152
|
+
srcPath: "client/.vite/manifest.json",
|
|
153
|
+
destPath: ".vite/client-manifest.json"
|
|
154
|
+
}, ...serverBuilds.map(({
|
|
155
|
+
serverBundleBuildConfig
|
|
156
|
+
}) => {
|
|
157
|
+
let serverBundleId = serverBundleBuildConfig === null || serverBundleBuildConfig === void 0 ? void 0 : serverBundleBuildConfig.serverBundleId;
|
|
158
|
+
let serverBundlePath = serverBundleId ? serverBundleId + "/" : "";
|
|
159
|
+
let serverBundleSuffix = serverBundleId ? serverBundleId + "-" : "";
|
|
160
|
+
return {
|
|
161
|
+
srcPath: `server/${serverBundlePath}.vite/manifest.json`,
|
|
162
|
+
destPath: `.vite/server-${serverBundleSuffix}manifest.json`
|
|
163
|
+
};
|
|
164
|
+
})].map(({
|
|
165
|
+
srcPath,
|
|
166
|
+
destPath
|
|
167
|
+
}) => ({
|
|
168
|
+
srcPath: buildRelative(srcPath),
|
|
169
|
+
destPath: buildRelative(destPath)
|
|
170
|
+
}));
|
|
171
|
+
return viteManifestPaths;
|
|
172
|
+
}
|
|
173
|
+
async function build(root, {
|
|
174
|
+
assetsInlineLimit,
|
|
175
|
+
clearScreen,
|
|
176
|
+
config: configFile,
|
|
177
|
+
emptyOutDir,
|
|
178
|
+
force,
|
|
179
|
+
logLevel,
|
|
180
|
+
minify,
|
|
181
|
+
mode,
|
|
182
|
+
sourcemapClient,
|
|
183
|
+
sourcemapServer
|
|
184
|
+
}) {
|
|
185
|
+
var _reactRouterConfig$bu;
|
|
186
|
+
// Ensure Vite's ESM build is preloaded at the start of the process
|
|
187
|
+
// so it can be accessed synchronously via `importViteEsmSync`
|
|
188
|
+
await importViteEsmSync.preloadViteEsm();
|
|
189
|
+
let viteConfig = await plugin.resolveViteConfig({
|
|
190
|
+
configFile,
|
|
191
|
+
mode,
|
|
192
|
+
root
|
|
193
|
+
});
|
|
194
|
+
const ctx = await plugin.extractPluginContext(viteConfig);
|
|
195
|
+
if (!ctx) {
|
|
196
|
+
console.error(colors__default["default"].red("React Router Vite plugin not found in Vite config"));
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
let {
|
|
200
|
+
reactRouterConfig
|
|
201
|
+
} = ctx;
|
|
202
|
+
let vite = await import('vite');
|
|
203
|
+
async function viteBuild({
|
|
204
|
+
ssr,
|
|
205
|
+
serverBundleBuildConfig
|
|
206
|
+
}) {
|
|
207
|
+
await vite.build({
|
|
208
|
+
root,
|
|
209
|
+
mode,
|
|
210
|
+
configFile,
|
|
211
|
+
build: {
|
|
212
|
+
assetsInlineLimit,
|
|
213
|
+
emptyOutDir,
|
|
214
|
+
minify,
|
|
215
|
+
ssr,
|
|
216
|
+
sourcemap: ssr ? sourcemapServer : sourcemapClient
|
|
217
|
+
},
|
|
218
|
+
optimizeDeps: {
|
|
219
|
+
force
|
|
220
|
+
},
|
|
221
|
+
clearScreen,
|
|
222
|
+
logLevel,
|
|
223
|
+
...(serverBundleBuildConfig ? {
|
|
224
|
+
__reactRouterServerBundleBuildConfig: serverBundleBuildConfig
|
|
225
|
+
} : {})
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
await cleanBuildDirectory(viteConfig, ctx);
|
|
229
|
+
// Run the Vite client build first
|
|
230
|
+
await viteBuild({
|
|
231
|
+
ssr: false
|
|
232
|
+
});
|
|
233
|
+
// Then run Vite SSR builds in parallel
|
|
234
|
+
let {
|
|
235
|
+
serverBuilds,
|
|
236
|
+
buildManifest
|
|
237
|
+
} = await getServerBuilds(ctx);
|
|
238
|
+
await Promise.all(serverBuilds.map(viteBuild));
|
|
239
|
+
let viteManifestPaths = getViteManifestPaths(ctx, serverBuilds);
|
|
240
|
+
await Promise.all(viteManifestPaths.map(async ({
|
|
241
|
+
srcPath,
|
|
242
|
+
destPath
|
|
243
|
+
}) => {
|
|
244
|
+
let manifestExists = await fse__default["default"].pathExists(srcPath);
|
|
245
|
+
if (!manifestExists) return;
|
|
246
|
+
// Move/delete original Vite manifest file
|
|
247
|
+
if (ctx.viteManifestEnabled) {
|
|
248
|
+
await fse__default["default"].ensureDir(path__default["default"].dirname(destPath));
|
|
249
|
+
await fse__default["default"].move(srcPath, destPath);
|
|
250
|
+
} else {
|
|
251
|
+
await fse__default["default"].remove(srcPath);
|
|
252
|
+
}
|
|
253
|
+
// Remove .vite dir if it's now empty
|
|
254
|
+
let viteDir = path__default["default"].dirname(srcPath);
|
|
255
|
+
let viteDirFiles = await fse__default["default"].readdir(viteDir);
|
|
256
|
+
if (viteDirFiles.length === 0) {
|
|
257
|
+
await fse__default["default"].remove(viteDir);
|
|
258
|
+
}
|
|
259
|
+
}));
|
|
260
|
+
if (ctx.reactRouterConfig.manifest) {
|
|
261
|
+
await fse__default["default"].ensureDir(path__default["default"].join(ctx.reactRouterConfig.buildDirectory, ".react-router"));
|
|
262
|
+
await fse__default["default"].writeFile(path__default["default"].join(ctx.reactRouterConfig.buildDirectory, ".react-router", "manifest.json"), JSON.stringify(buildManifest, null, 2), "utf-8");
|
|
263
|
+
}
|
|
264
|
+
await ((_reactRouterConfig$bu = reactRouterConfig.buildEnd) === null || _reactRouterConfig$bu === void 0 ? void 0 : _reactRouterConfig$bu.call(reactRouterConfig, {
|
|
265
|
+
buildManifest,
|
|
266
|
+
reactRouterConfig,
|
|
267
|
+
viteConfig
|
|
268
|
+
}));
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
exports.build = build;
|
|
@@ -0,0 +1,15 @@
|
|
|
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 {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @react-router/dev v0.0.0-experimental-c0856287f
|
|
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;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type * as Vite from "vite";
|
|
2
|
+
export interface ViteDevOptions {
|
|
3
|
+
clearScreen?: boolean;
|
|
4
|
+
config?: string;
|
|
5
|
+
cors?: boolean;
|
|
6
|
+
force?: boolean;
|
|
7
|
+
host?: boolean | string;
|
|
8
|
+
logLevel?: Vite.LogLevel;
|
|
9
|
+
mode?: string;
|
|
10
|
+
open?: boolean | string;
|
|
11
|
+
port?: number;
|
|
12
|
+
strictPort?: boolean;
|
|
13
|
+
profile?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function dev(root: string, { clearScreen, config: configFile, cors, force, host, logLevel, mode, open, port, strictPort, }: ViteDevOptions): Promise<void>;
|
package/dist/vite/dev.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @react-router/dev v0.0.0-experimental-c0856287f
|
|
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 colors = require('picocolors');
|
|
16
|
+
var importViteEsmSync = require('./import-vite-esm-sync.js');
|
|
17
|
+
var profiler = require('./profiler.js');
|
|
18
|
+
|
|
19
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
20
|
+
|
|
21
|
+
var colors__default = /*#__PURE__*/_interopDefaultLegacy(colors);
|
|
22
|
+
|
|
23
|
+
async function dev(root, {
|
|
24
|
+
clearScreen,
|
|
25
|
+
config: configFile,
|
|
26
|
+
cors,
|
|
27
|
+
force,
|
|
28
|
+
host,
|
|
29
|
+
logLevel,
|
|
30
|
+
mode,
|
|
31
|
+
open,
|
|
32
|
+
port,
|
|
33
|
+
strictPort
|
|
34
|
+
}) {
|
|
35
|
+
// Ensure Vite's ESM build is preloaded at the start of the process
|
|
36
|
+
// so it can be accessed synchronously via `importViteEsmSync`
|
|
37
|
+
await importViteEsmSync.preloadViteEsm();
|
|
38
|
+
let vite = await import('vite');
|
|
39
|
+
let server = await vite.createServer({
|
|
40
|
+
root,
|
|
41
|
+
mode,
|
|
42
|
+
configFile,
|
|
43
|
+
server: {
|
|
44
|
+
open,
|
|
45
|
+
cors,
|
|
46
|
+
host,
|
|
47
|
+
port,
|
|
48
|
+
strictPort
|
|
49
|
+
},
|
|
50
|
+
optimizeDeps: {
|
|
51
|
+
force
|
|
52
|
+
},
|
|
53
|
+
clearScreen,
|
|
54
|
+
logLevel
|
|
55
|
+
});
|
|
56
|
+
if (!server.config.plugins.find(plugin => plugin.name === "react-router")) {
|
|
57
|
+
console.error(colors__default["default"].red("React Router Vite plugin not found in Vite config"));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
await server.listen();
|
|
61
|
+
server.printUrls();
|
|
62
|
+
let customShortcuts = [{
|
|
63
|
+
key: "p",
|
|
64
|
+
description: "start/stop the profiler",
|
|
65
|
+
async action(server) {
|
|
66
|
+
if (profiler.getSession()) {
|
|
67
|
+
await profiler.stop(server.config.logger.info);
|
|
68
|
+
} else {
|
|
69
|
+
await profiler.start(() => {
|
|
70
|
+
server.config.logger.info("Profiler started");
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}];
|
|
75
|
+
server.bindCLIShortcuts({
|
|
76
|
+
print: true,
|
|
77
|
+
customShortcuts
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
exports.dev = dev;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @react-router/dev v0.0.0-experimental-c0856287f
|
|
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 invariant = require('../invariant.js');
|
|
16
|
+
|
|
17
|
+
// This file is used to avoid CJS deprecation warnings in Vite 5 since
|
|
18
|
+
let vite;
|
|
19
|
+
async function preloadViteEsm() {
|
|
20
|
+
vite = await import('vite');
|
|
21
|
+
}
|
|
22
|
+
function importViteEsmSync() {
|
|
23
|
+
invariant["default"](vite, "importViteEsmSync() called before preloadViteEsm()");
|
|
24
|
+
return vite;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.importViteEsmSync = importViteEsmSync;
|
|
28
|
+
exports.preloadViteEsm = preloadViteEsm;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ReactRouterVitePlugin } from "./plugin";
|
|
2
|
+
export type { BuildManifest, Preset, VitePluginConfig, ServerBundlesFunction, } from "./plugin";
|
|
3
|
+
export declare const vitePlugin: ReactRouterVitePlugin;
|
|
4
|
+
export { cloudflareDevProxyVitePlugin } from "./cloudflare-proxy-plugin";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @react-router/dev v0.0.0-experimental-c0856287f
|
|
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
|
+
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
|
+
const vitePlugin = (...args) => {
|
|
22
|
+
let {
|
|
23
|
+
reactRouterVitePlugin
|
|
24
|
+
} =
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
26
|
+
require("./plugin");
|
|
27
|
+
return reactRouterVitePlugin(...args);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
exports.vitePlugin = vitePlugin;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { ServerResponse } from "node:http";
|
|
3
|
+
import type * as Vite from "vite";
|
|
4
|
+
export type NodeRequestHandler = (req: Vite.Connect.IncomingMessage, res: ServerResponse) => Promise<void>;
|
|
5
|
+
export declare function fromNodeRequest(nodeReq: Vite.Connect.IncomingMessage): Request;
|
|
6
|
+
export declare function toNodeRequest(res: Response, nodeRes: ServerResponse): Promise<void>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @react-router/dev v0.0.0-experimental-c0856287f
|
|
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 node_events = require('node:events');
|
|
16
|
+
var node_stream = require('node:stream');
|
|
17
|
+
var setCookieParser = require('set-cookie-parser');
|
|
18
|
+
var node = require('@react-router/node');
|
|
19
|
+
var invariant = require('../invariant.js');
|
|
20
|
+
|
|
21
|
+
function fromNodeHeaders(nodeHeaders) {
|
|
22
|
+
let headers = new Headers();
|
|
23
|
+
for (let [key, values] of Object.entries(nodeHeaders)) {
|
|
24
|
+
if (values) {
|
|
25
|
+
if (Array.isArray(values)) {
|
|
26
|
+
for (let value of values) {
|
|
27
|
+
headers.append(key, value);
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
headers.set(key, values);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return headers;
|
|
35
|
+
}
|
|
36
|
+
// Based on `createRemixRequest` in packages/remix-express/server.ts
|
|
37
|
+
function fromNodeRequest(nodeReq) {
|
|
38
|
+
let origin = nodeReq.headers.origin && "null" !== nodeReq.headers.origin ? nodeReq.headers.origin : `http://${nodeReq.headers.host}`;
|
|
39
|
+
// Use `req.originalUrl` so React Router is aware of the full path
|
|
40
|
+
invariant["default"](nodeReq.originalUrl, "Expected `nodeReq.originalUrl` to be defined");
|
|
41
|
+
let url = new URL(nodeReq.originalUrl, origin);
|
|
42
|
+
let init = {
|
|
43
|
+
method: nodeReq.method,
|
|
44
|
+
headers: fromNodeHeaders(nodeReq.headers)
|
|
45
|
+
};
|
|
46
|
+
if (nodeReq.method !== "GET" && nodeReq.method !== "HEAD") {
|
|
47
|
+
init.body = node.createReadableStreamFromReadable(nodeReq);
|
|
48
|
+
init.duplex = "half";
|
|
49
|
+
}
|
|
50
|
+
return new Request(url.href, init);
|
|
51
|
+
}
|
|
52
|
+
// Adapted from solid-start's `handleNodeResponse`:
|
|
53
|
+
// https://github.com/solidjs/solid-start/blob/7398163869b489cce503c167e284891cf51a6613/packages/start/node/fetch.js#L162-L185
|
|
54
|
+
async function toNodeRequest(res, nodeRes) {
|
|
55
|
+
nodeRes.statusCode = res.status;
|
|
56
|
+
nodeRes.statusMessage = res.statusText;
|
|
57
|
+
let cookiesStrings = [];
|
|
58
|
+
for (let [name, value] of res.headers) {
|
|
59
|
+
if (name === "set-cookie") {
|
|
60
|
+
cookiesStrings.push(...setCookieParser.splitCookiesString(value));
|
|
61
|
+
} else nodeRes.setHeader(name, value);
|
|
62
|
+
}
|
|
63
|
+
if (cookiesStrings.length) {
|
|
64
|
+
nodeRes.setHeader("set-cookie", cookiesStrings);
|
|
65
|
+
}
|
|
66
|
+
if (res.body) {
|
|
67
|
+
// https://github.com/microsoft/TypeScript/issues/29867
|
|
68
|
+
let responseBody = res.body;
|
|
69
|
+
let readable = node_stream.Readable.from(responseBody);
|
|
70
|
+
readable.pipe(nodeRes);
|
|
71
|
+
await node_events.once(readable, "end");
|
|
72
|
+
} else {
|
|
73
|
+
nodeRes.end();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
exports.fromNodeRequest = fromNodeRequest;
|
|
78
|
+
exports.toNodeRequest = toNodeRequest;
|