@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.
Files changed (68) hide show
  1. package/CHANGELOG.md +1773 -0
  2. package/LICENSE.md +23 -0
  3. package/README.md +13 -0
  4. package/dist/cli/commands.d.ts +12 -0
  5. package/dist/cli/commands.js +174 -0
  6. package/dist/cli/detectPackageManager.d.ts +10 -0
  7. package/dist/cli/detectPackageManager.js +39 -0
  8. package/dist/cli/index.d.ts +1 -0
  9. package/dist/cli/index.js +19 -0
  10. package/dist/cli/run.d.ts +5 -0
  11. package/dist/cli/run.js +180 -0
  12. package/dist/cli/useJavascript.d.ts +4 -0
  13. package/dist/cli/useJavascript.js +66 -0
  14. package/dist/cli.d.ts +1 -0
  15. package/dist/cli.js +21 -0
  16. package/dist/colors.d.ts +17 -0
  17. package/dist/colors.js +49 -0
  18. package/dist/config/defaults/entry.client.tsx +12 -0
  19. package/dist/config/defaults/entry.dev.d.ts +2 -0
  20. package/dist/config/defaults/entry.dev.ts +13 -0
  21. package/dist/config/defaults/entry.server.cloudflare.tsx +55 -0
  22. package/dist/config/defaults/entry.server.deno.tsx +55 -0
  23. package/dist/config/defaults/entry.server.node.tsx +155 -0
  24. package/dist/config/defaults/entry.server.spa.tsx +20 -0
  25. package/dist/config/flat-routes.d.ts +14 -0
  26. package/dist/config/flat-routes.js +418 -0
  27. package/dist/config/format.d.ts +5 -0
  28. package/dist/config/format.js +68 -0
  29. package/dist/config/routes.d.ts +98 -0
  30. package/dist/config/routes.js +93 -0
  31. package/dist/config/serverModes.d.ts +9 -0
  32. package/dist/config/serverModes.js +28 -0
  33. package/dist/config.d.ts +75 -0
  34. package/dist/config.js +152 -0
  35. package/dist/index.d.ts +4 -0
  36. package/dist/index.js +23 -0
  37. package/dist/invariant.d.ts +2 -0
  38. package/dist/invariant.js +22 -0
  39. package/dist/manifest.d.ts +28 -0
  40. package/dist/vite/babel.d.ts +20 -0
  41. package/dist/vite/babel.js +49 -0
  42. package/dist/vite/build.d.ts +15 -0
  43. package/dist/vite/build.js +271 -0
  44. package/dist/vite/cloudflare-proxy-plugin.d.ts +15 -0
  45. package/dist/vite/cloudflare-proxy-plugin.js +82 -0
  46. package/dist/vite/dev.d.ts +15 -0
  47. package/dist/vite/dev.js +81 -0
  48. package/dist/vite/import-vite-esm-sync.d.ts +4 -0
  49. package/dist/vite/import-vite-esm-sync.js +28 -0
  50. package/dist/vite/index.d.ts +4 -0
  51. package/dist/vite/index.js +30 -0
  52. package/dist/vite/node-adapter.d.ts +6 -0
  53. package/dist/vite/node-adapter.js +78 -0
  54. package/dist/vite/plugin.d.ts +165 -0
  55. package/dist/vite/plugin.js +1178 -0
  56. package/dist/vite/profiler.d.ts +5 -0
  57. package/dist/vite/profiler.js +55 -0
  58. package/dist/vite/remove-exports-test.d.ts +1 -0
  59. package/dist/vite/remove-exports.d.ts +2 -0
  60. package/dist/vite/remove-exports.js +278 -0
  61. package/dist/vite/resolve-file-url.d.ts +3 -0
  62. package/dist/vite/resolve-file-url.js +53 -0
  63. package/dist/vite/static/refresh-utils.cjs +185 -0
  64. package/dist/vite/styles.d.ts +13 -0
  65. package/dist/vite/styles.js +176 -0
  66. package/dist/vite/vmod.d.ts +3 -0
  67. package/dist/vite/vmod.js +21 -0
  68. 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>;
@@ -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,4 @@
1
+ type Vite = typeof import("vite");
2
+ export declare function preloadViteEsm(): Promise<void>;
3
+ export declare function importViteEsmSync(): Vite;
4
+ export {};
@@ -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;