@react-router/dev 0.0.0-experimental-13d6d438f → 0.0.0-experimental-9aebdc522
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 +1 -1
- 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.client.rsc.tsx +119 -0
- package/dist/config/defaults/entry.react-server.node.tsx +19 -0
- package/dist/config/defaults/entry.react-server.web.tsx +13 -0
- package/dist/config/defaults/entry.server.node.rsc.tsx +164 -0
- 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.d.ts +3 -23
- package/dist/config.js +27 -10
- package/dist/index.js +1 -1
- package/dist/invariant.js +1 -1
- package/dist/runtime.client.d.ts +1 -0
- package/dist/runtime.client.js +19 -0
- package/dist/vite/babel.js +1 -1
- package/dist/vite/build.js +24 -34
- package/dist/vite/cloudflare-proxy-plugin.js +1 -1
- package/dist/vite/dev.js +1 -1
- package/dist/vite/import-vite-esm-sync.js +1 -1
- package/dist/vite/index.js +1 -1
- package/dist/vite/node-adapter.js +1 -1
- package/dist/vite/plugin.d.ts +10 -0
- package/dist/vite/plugin.js +232 -19
- package/dist/vite/profiler.js +1 -1
- package/dist/vite/remove-exports.d.ts +3 -1
- package/dist/vite/remove-exports.js +18 -2
- package/dist/vite/resolve-file-url.js +1 -1
- package/dist/vite/styles.js +1 -1
- package/dist/vite/vmod.js +1 -1
- package/package.json +13 -7
- package/dist/config/defaults/entry.dev.d.ts +0 -2
- package/dist/config/defaults/entry.dev.ts +0 -13
package/dist/cli/commands.js
CHANGED
package/dist/cli/index.js
CHANGED
package/dist/cli/run.js
CHANGED
package/dist/cli.js
CHANGED
package/dist/colors.js
CHANGED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { HydratedRouter } from "react-router";
|
|
2
|
+
import { startTransition, StrictMode } from "react";
|
|
3
|
+
import { hydrateRoot } from "react-dom/client";
|
|
4
|
+
// @ts-expect-error - no types
|
|
5
|
+
import ReactServerDOM from "react-server-dom-diy/client";
|
|
6
|
+
|
|
7
|
+
if (import.meta.env.PROD) {
|
|
8
|
+
window.__diy_client_manifest__ = {
|
|
9
|
+
_cache: new Map(),
|
|
10
|
+
resolveClientReference([id, exportName]) {
|
|
11
|
+
return {
|
|
12
|
+
preloadModule() {
|
|
13
|
+
if (window.__diy_client_manifest__._cache.has(id)) {
|
|
14
|
+
return window.__diy_client_manifest__._cache.get(id);
|
|
15
|
+
}
|
|
16
|
+
const promise = import("virtual:react-router/client-references")
|
|
17
|
+
.then(({ default: mods }) => mods[id]())
|
|
18
|
+
.then((mod) => {
|
|
19
|
+
promise.status = "fulfilled";
|
|
20
|
+
promise.value = mod;
|
|
21
|
+
})
|
|
22
|
+
.catch((res) => {
|
|
23
|
+
promise.status = "rejected";
|
|
24
|
+
promise.reason = res;
|
|
25
|
+
throw res;
|
|
26
|
+
});
|
|
27
|
+
promise.status = "pending";
|
|
28
|
+
window.__diy_client_manifest__._cache.set(id, promise);
|
|
29
|
+
return promise;
|
|
30
|
+
},
|
|
31
|
+
requireModule() {
|
|
32
|
+
const cached = window.__diy_client_manifest__._cache.get(id);
|
|
33
|
+
if (!cached) throw new Error(`Module ${id} not found`);
|
|
34
|
+
if (cached.reason) throw cached.reason;
|
|
35
|
+
return cached.value[exportName];
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
} else {
|
|
41
|
+
window.__diy_client_manifest__ = {
|
|
42
|
+
_cache: new Map(),
|
|
43
|
+
resolveClientReference([id, exportName]) {
|
|
44
|
+
return {
|
|
45
|
+
preloadModule() {
|
|
46
|
+
if (window.__diy_client_manifest__._cache.has(id)) {
|
|
47
|
+
return window.__diy_client_manifest__._cache.get(id);
|
|
48
|
+
}
|
|
49
|
+
const promise = import(id)
|
|
50
|
+
.then((mod) => {
|
|
51
|
+
promise.status = "fulfilled";
|
|
52
|
+
promise.value = mod;
|
|
53
|
+
})
|
|
54
|
+
.catch((res) => {
|
|
55
|
+
promise.status = "rejected";
|
|
56
|
+
promise.reason = res;
|
|
57
|
+
throw res;
|
|
58
|
+
});
|
|
59
|
+
promise.status = "pending";
|
|
60
|
+
window.__diy_client_manifest__._cache.set(id, promise);
|
|
61
|
+
return promise;
|
|
62
|
+
},
|
|
63
|
+
requireModule() {
|
|
64
|
+
const cached = window.__diy_client_manifest__._cache.get(id);
|
|
65
|
+
if (!cached) throw new Error(`Module ${id} not found`);
|
|
66
|
+
if (cached.reason) throw cached.reason;
|
|
67
|
+
return cached.value[exportName];
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
window.__diy_client_manifest__.callServer = async (id, args) => {
|
|
75
|
+
const href = window.location.href;
|
|
76
|
+
const headers = new Headers({
|
|
77
|
+
Accept: "text/x-component",
|
|
78
|
+
"rsc-action": id,
|
|
79
|
+
});
|
|
80
|
+
const responsePromise = fetch(href, {
|
|
81
|
+
method: "POST",
|
|
82
|
+
headers,
|
|
83
|
+
body: await ReactServerDOM.encodeReply(args),
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const result = await ReactServerDOM.createFromFetch(
|
|
87
|
+
responsePromise,
|
|
88
|
+
window.__diy_client_manifest__
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
window.__remixRouter.revalidate();
|
|
92
|
+
|
|
93
|
+
return result;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
window.createFromReadableStream = function createFromReadableStream(
|
|
97
|
+
body: ReadableStream<Uint8Array>
|
|
98
|
+
) {
|
|
99
|
+
return ReactServerDOM.createFromReadableStream(
|
|
100
|
+
body,
|
|
101
|
+
window.__diy_client_manifest__
|
|
102
|
+
);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
startTransition(() => {
|
|
106
|
+
hydrateRoot(
|
|
107
|
+
document,
|
|
108
|
+
<StrictMode>
|
|
109
|
+
<HydratedRouter />
|
|
110
|
+
</StrictMode>
|
|
111
|
+
);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
if (import.meta.hot) {
|
|
115
|
+
console.log("ACCEPTING HMR");
|
|
116
|
+
import.meta.hot.on("react-router:hmr", () => {
|
|
117
|
+
window.__remixRouter.revalidate();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as stream from "node:stream";
|
|
2
|
+
|
|
3
|
+
import { createReadableStreamFromReadable } from "@react-router/node";
|
|
4
|
+
// @ts-expect-error - no types
|
|
5
|
+
import ReactServerDOM from "react-server-dom-diy/server";
|
|
6
|
+
|
|
7
|
+
export function renderToReadableStream(data: unknown) {
|
|
8
|
+
const passthrough = new stream.PassThrough();
|
|
9
|
+
const { pipe } = ReactServerDOM.renderToPipeableStream(
|
|
10
|
+
data,
|
|
11
|
+
global.__diy_server_manifest__
|
|
12
|
+
);
|
|
13
|
+
pipe(passthrough);
|
|
14
|
+
return createReadableStreamFromReadable(passthrough);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const decodeAction = ReactServerDOM.decodeAction;
|
|
18
|
+
export const decodeFormState = ReactServerDOM.decodeFormState;
|
|
19
|
+
export const decodeReply = ReactServerDOM.decodeReply;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// @ts-expect-error - no types
|
|
2
|
+
import ReactServerDOM from "react-server-dom-diy/server";
|
|
3
|
+
|
|
4
|
+
export function renderToReadableStream(data: unknown) {
|
|
5
|
+
return ReactServerDOM.renderToReadableStream(
|
|
6
|
+
data,
|
|
7
|
+
global.__diy_server_manifest__
|
|
8
|
+
);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const decodeAction = ReactServerDOM.decodeAction;
|
|
12
|
+
export const decodeFormState = ReactServerDOM.decodeFormState;
|
|
13
|
+
export const decodeReply = ReactServerDOM.decodeReply;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { PassThrough, Readable } 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 * as isbotModule from "isbot";
|
|
7
|
+
import { renderToPipeableStream } from "react-dom/server";
|
|
8
|
+
// @ts-expect-error - no types
|
|
9
|
+
import ReactServerDOM from "react-server-dom-diy/client";
|
|
10
|
+
|
|
11
|
+
const ABORT_DELAY = 5_000;
|
|
12
|
+
|
|
13
|
+
export function createFromReadableStream(body: ReadableStream<Uint8Array>) {
|
|
14
|
+
return ReactServerDOM.createFromNodeStream(
|
|
15
|
+
Readable.fromWeb(body as any),
|
|
16
|
+
global.__diy_client_manifest__
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default function handleRequest(
|
|
21
|
+
request: Request,
|
|
22
|
+
responseStatusCode: number,
|
|
23
|
+
responseHeaders: Headers,
|
|
24
|
+
remixContext: EntryContext,
|
|
25
|
+
loadContext: AppLoadContext
|
|
26
|
+
) {
|
|
27
|
+
let prohibitOutOfOrderStreaming =
|
|
28
|
+
isBotRequest(request.headers.get("user-agent")) || remixContext.isSpaMode;
|
|
29
|
+
|
|
30
|
+
return prohibitOutOfOrderStreaming
|
|
31
|
+
? handleBotRequest(
|
|
32
|
+
request,
|
|
33
|
+
responseStatusCode,
|
|
34
|
+
responseHeaders,
|
|
35
|
+
remixContext
|
|
36
|
+
)
|
|
37
|
+
: handleBrowserRequest(
|
|
38
|
+
request,
|
|
39
|
+
responseStatusCode,
|
|
40
|
+
responseHeaders,
|
|
41
|
+
remixContext
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// We have some Remix apps in the wild already running with isbot@3 so we need
|
|
46
|
+
// to maintain backwards compatibility even though we want new apps to use
|
|
47
|
+
// isbot@4. That way, we can ship this as a minor Semver update to @react-router/dev.
|
|
48
|
+
function isBotRequest(userAgent: string | null) {
|
|
49
|
+
if (!userAgent) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// isbot >= 3.8.0, >4
|
|
54
|
+
if ("isbot" in isbotModule && typeof isbotModule.isbot === "function") {
|
|
55
|
+
return isbotModule.isbot(userAgent);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// isbot < 3.8.0
|
|
59
|
+
if ("default" in isbotModule && typeof isbotModule.default === "function") {
|
|
60
|
+
return isbotModule.default(userAgent);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function handleBotRequest(
|
|
67
|
+
request: Request,
|
|
68
|
+
responseStatusCode: number,
|
|
69
|
+
responseHeaders: Headers,
|
|
70
|
+
remixContext: EntryContext
|
|
71
|
+
) {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
let shellRendered = false;
|
|
74
|
+
const { pipe, abort } = renderToPipeableStream(
|
|
75
|
+
<RemixServer
|
|
76
|
+
context={remixContext}
|
|
77
|
+
url={request.url}
|
|
78
|
+
abortDelay={ABORT_DELAY}
|
|
79
|
+
/>,
|
|
80
|
+
{
|
|
81
|
+
onAllReady() {
|
|
82
|
+
shellRendered = true;
|
|
83
|
+
const body = new PassThrough();
|
|
84
|
+
const stream = createReadableStreamFromReadable(body);
|
|
85
|
+
|
|
86
|
+
responseHeaders.set("Content-Type", "text/html");
|
|
87
|
+
|
|
88
|
+
resolve(
|
|
89
|
+
new Response(stream, {
|
|
90
|
+
headers: responseHeaders,
|
|
91
|
+
status: responseStatusCode,
|
|
92
|
+
})
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
pipe(body);
|
|
96
|
+
},
|
|
97
|
+
onShellError(error: unknown) {
|
|
98
|
+
reject(error);
|
|
99
|
+
},
|
|
100
|
+
onError(error: unknown) {
|
|
101
|
+
responseStatusCode = 500;
|
|
102
|
+
// Log streaming rendering errors from inside the shell. Don't log
|
|
103
|
+
// errors encountered during initial shell rendering since they'll
|
|
104
|
+
// reject and get logged in handleDocumentRequest.
|
|
105
|
+
if (shellRendered) {
|
|
106
|
+
console.error(error);
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
setTimeout(abort, ABORT_DELAY);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function handleBrowserRequest(
|
|
117
|
+
request: Request,
|
|
118
|
+
responseStatusCode: number,
|
|
119
|
+
responseHeaders: Headers,
|
|
120
|
+
remixContext: EntryContext
|
|
121
|
+
) {
|
|
122
|
+
return new Promise((resolve, reject) => {
|
|
123
|
+
let shellRendered = false;
|
|
124
|
+
const { pipe, abort } = renderToPipeableStream(
|
|
125
|
+
<RemixServer
|
|
126
|
+
context={remixContext}
|
|
127
|
+
url={request.url}
|
|
128
|
+
abortDelay={ABORT_DELAY}
|
|
129
|
+
/>,
|
|
130
|
+
{
|
|
131
|
+
onShellReady() {
|
|
132
|
+
shellRendered = true;
|
|
133
|
+
const body = new PassThrough();
|
|
134
|
+
const stream = createReadableStreamFromReadable(body);
|
|
135
|
+
|
|
136
|
+
responseHeaders.set("Content-Type", "text/html");
|
|
137
|
+
|
|
138
|
+
resolve(
|
|
139
|
+
new Response(stream, {
|
|
140
|
+
headers: responseHeaders,
|
|
141
|
+
status: responseStatusCode,
|
|
142
|
+
})
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
pipe(body);
|
|
146
|
+
},
|
|
147
|
+
onShellError(error: unknown) {
|
|
148
|
+
reject(error);
|
|
149
|
+
},
|
|
150
|
+
onError(error: unknown) {
|
|
151
|
+
responseStatusCode = 500;
|
|
152
|
+
// Log streaming rendering errors from inside the shell. Don't log
|
|
153
|
+
// errors encountered during initial shell rendering since they'll
|
|
154
|
+
// reject and get logged in handleDocumentRequest.
|
|
155
|
+
if (shellRendered) {
|
|
156
|
+
console.error(error);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
setTimeout(abort, ABORT_DELAY);
|
|
163
|
+
});
|
|
164
|
+
}
|
package/dist/config/format.js
CHANGED
package/dist/config/routes.js
CHANGED
package/dist/config.d.ts
CHANGED
|
@@ -39,6 +39,7 @@ interface FutureConfig {
|
|
|
39
39
|
v3_fetcherPersist: boolean;
|
|
40
40
|
v3_relativeSplatPath: boolean;
|
|
41
41
|
v3_throwAbortReason: boolean;
|
|
42
|
+
unstable_serverComponents: boolean;
|
|
42
43
|
}
|
|
43
44
|
export type BuildManifest = DefaultBuildManifest | ServerBundlesBuildManifest;
|
|
44
45
|
type BuildEndHook = (args: {
|
|
@@ -87,11 +88,6 @@ export type VitePluginConfig = {
|
|
|
87
88
|
* A function that is called after the full React Router build is complete.
|
|
88
89
|
*/
|
|
89
90
|
buildEnd?: BuildEndHook;
|
|
90
|
-
/**
|
|
91
|
-
* Whether to write a `"manifest.json"` file to the build directory.`
|
|
92
|
-
* Defaults to `false`.
|
|
93
|
-
*/
|
|
94
|
-
manifest?: boolean;
|
|
95
91
|
/**
|
|
96
92
|
* An array of URLs to prerender to HTML files at build time. Can also be a
|
|
97
93
|
* function returning an array to dynamically generate URLs.
|
|
@@ -143,19 +139,10 @@ export type ResolvedVitePluginConfig = Readonly<{
|
|
|
143
139
|
* Enabled future flags
|
|
144
140
|
*/
|
|
145
141
|
future: FutureConfig;
|
|
146
|
-
/**
|
|
147
|
-
* Whether to write a `"manifest.json"` file to the build directory.`
|
|
148
|
-
* Defaults to `false`.
|
|
149
|
-
*/
|
|
150
|
-
manifest: boolean;
|
|
151
142
|
/**
|
|
152
143
|
* An array of URLs to prerender to HTML files at build time.
|
|
153
144
|
*/
|
|
154
145
|
prerender: Array<string> | null;
|
|
155
|
-
/**
|
|
156
|
-
* Derived from Vite's `base` config
|
|
157
|
-
* */
|
|
158
|
-
publicPath: string;
|
|
159
146
|
/**
|
|
160
147
|
* An object of all available routes, keyed by route id.
|
|
161
148
|
*/
|
|
@@ -184,6 +171,7 @@ export type ResolvedVitePluginConfig = Readonly<{
|
|
|
184
171
|
*/
|
|
185
172
|
ssr: boolean;
|
|
186
173
|
}>;
|
|
174
|
+
export declare function resolvePublicPath(viteUserConfig: Vite.UserConfig): string;
|
|
187
175
|
export declare function resolveReactRouterConfig({ rootDirectory, reactRouterUserConfig, viteUserConfig, viteCommand, }: {
|
|
188
176
|
rootDirectory: string;
|
|
189
177
|
reactRouterUserConfig: VitePluginConfig;
|
|
@@ -210,19 +198,10 @@ export declare function resolveReactRouterConfig({ rootDirectory, reactRouterUse
|
|
|
210
198
|
* Enabled future flags
|
|
211
199
|
*/
|
|
212
200
|
future: FutureConfig;
|
|
213
|
-
/**
|
|
214
|
-
* Whether to write a `"manifest.json"` file to the build directory.`
|
|
215
|
-
* Defaults to `false`.
|
|
216
|
-
*/
|
|
217
|
-
manifest: boolean;
|
|
218
201
|
/**
|
|
219
202
|
* An array of URLs to prerender to HTML files at build time.
|
|
220
203
|
*/
|
|
221
204
|
prerender: string[] | null;
|
|
222
|
-
/**
|
|
223
|
-
* Derived from Vite's `base` config
|
|
224
|
-
* */
|
|
225
|
-
publicPath: string;
|
|
226
205
|
/**
|
|
227
206
|
* An object of all available routes, keyed by route id.
|
|
228
207
|
*/
|
|
@@ -256,6 +235,7 @@ export declare function resolveEntryFiles({ rootDirectory, reactRouterConfig, }:
|
|
|
256
235
|
reactRouterConfig: ResolvedVitePluginConfig;
|
|
257
236
|
}): Promise<{
|
|
258
237
|
entryClientFilePath: string;
|
|
238
|
+
entryReactServerFilePath: string | undefined;
|
|
259
239
|
entryServerFilePath: string;
|
|
260
240
|
}>;
|
|
261
241
|
export {};
|
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-9aebdc522
|
|
3
3
|
*
|
|
4
4
|
* Copyright (c) Remix Software Inc.
|
|
5
5
|
*
|
|
@@ -86,6 +86,9 @@ let deepFreeze = o => {
|
|
|
86
86
|
});
|
|
87
87
|
return o;
|
|
88
88
|
};
|
|
89
|
+
function resolvePublicPath(viteUserConfig) {
|
|
90
|
+
return viteUserConfig.base ?? "/";
|
|
91
|
+
}
|
|
89
92
|
async function resolveReactRouterConfig({
|
|
90
93
|
rootDirectory,
|
|
91
94
|
reactRouterUserConfig,
|
|
@@ -110,7 +113,6 @@ async function resolveReactRouterConfig({
|
|
|
110
113
|
let defaults = {
|
|
111
114
|
basename: "/",
|
|
112
115
|
buildDirectory: "build",
|
|
113
|
-
manifest: false,
|
|
114
116
|
serverBuildFile: "index.js",
|
|
115
117
|
serverModuleFormat: "esm",
|
|
116
118
|
ssr: true
|
|
@@ -122,7 +124,6 @@ async function resolveReactRouterConfig({
|
|
|
122
124
|
buildEnd,
|
|
123
125
|
future: userFuture,
|
|
124
126
|
ignoredRouteFiles,
|
|
125
|
-
manifest,
|
|
126
127
|
routes: userRoutesFunction,
|
|
127
128
|
prerender: prerenderConfig,
|
|
128
129
|
serverBuildFile,
|
|
@@ -151,7 +152,7 @@ async function resolveReactRouterConfig({
|
|
|
151
152
|
}
|
|
152
153
|
let appDirectory = path__default["default"].resolve(rootDirectory, userAppDirectory || "app");
|
|
153
154
|
let buildDirectory = path__default["default"].resolve(rootDirectory, userBuildDirectory);
|
|
154
|
-
let publicPath = viteUserConfig
|
|
155
|
+
let publicPath = resolvePublicPath(viteUserConfig);
|
|
155
156
|
if (basename !== "/" && viteCommand === "serve" && !((_viteUserConfig$serve = viteUserConfig.server) !== null && _viteUserConfig$serve !== void 0 && _viteUserConfig$serve.middlewareMode) && !basename.startsWith(publicPath)) {
|
|
156
157
|
throw new Error("When using the React Router `basename` and the Vite `base` config, " + "the `basename` config must begin with `base` for the default " + "Vite dev server.");
|
|
157
158
|
}
|
|
@@ -187,7 +188,8 @@ async function resolveReactRouterConfig({
|
|
|
187
188
|
let future = {
|
|
188
189
|
v3_fetcherPersist: (userFuture === null || userFuture === void 0 ? void 0 : userFuture.v3_fetcherPersist) === true,
|
|
189
190
|
v3_relativeSplatPath: (userFuture === null || userFuture === void 0 ? void 0 : userFuture.v3_relativeSplatPath) === true,
|
|
190
|
-
v3_throwAbortReason: (userFuture === null || userFuture === void 0 ? void 0 : userFuture.v3_throwAbortReason) === true
|
|
191
|
+
v3_throwAbortReason: (userFuture === null || userFuture === void 0 ? void 0 : userFuture.v3_throwAbortReason) === true,
|
|
192
|
+
unstable_serverComponents: (userFuture === null || userFuture === void 0 ? void 0 : userFuture.unstable_serverComponents) === true
|
|
191
193
|
};
|
|
192
194
|
let reactRouterConfig = deepFreeze({
|
|
193
195
|
appDirectory,
|
|
@@ -195,9 +197,7 @@ async function resolveReactRouterConfig({
|
|
|
195
197
|
buildDirectory,
|
|
196
198
|
buildEnd,
|
|
197
199
|
future,
|
|
198
|
-
manifest,
|
|
199
200
|
prerender,
|
|
200
|
-
publicPath,
|
|
201
201
|
routes: routes$1,
|
|
202
202
|
serverBuildFile,
|
|
203
203
|
serverBundles,
|
|
@@ -223,10 +223,13 @@ async function resolveEntryFiles({
|
|
|
223
223
|
let defaultsDirectory = path__default["default"].resolve(__dirname, "config", "defaults");
|
|
224
224
|
let userEntryClientFile = findEntry(appDirectory, "entry.client");
|
|
225
225
|
let userEntryServerFile = findEntry(appDirectory, "entry.server");
|
|
226
|
+
let userEntryReactServerFile = findEntry(appDirectory, "entry.react-server");
|
|
226
227
|
let entryServerFile;
|
|
227
|
-
let
|
|
228
|
+
let entryReactServerFile;
|
|
229
|
+
let entryClientFile = userEntryClientFile || future.unstable_serverComponents ? "entry.client.rsc.tsx" : "entry.client.tsx";
|
|
228
230
|
let pkgJson = await PackageJson__default["default"].load(rootDirectory);
|
|
229
231
|
let deps = pkgJson.content.dependencies ?? {};
|
|
232
|
+
let serverRuntime = deps["@react-router/deno"] ? "deno" : deps["@react-router/cloudflare"] ? "cloudflare" : deps["@react-router/node"] ? "node" : undefined;
|
|
230
233
|
if (!reactRouterConfig.ssr) {
|
|
231
234
|
// This is a super-simple default since we don't need streaming in SPA Mode.
|
|
232
235
|
// We can include this in a remix-spa template, but right now `npx remix reveal`
|
|
@@ -240,7 +243,6 @@ async function resolveEntryFiles({
|
|
|
240
243
|
} else if (userEntryServerFile) {
|
|
241
244
|
entryServerFile = userEntryServerFile;
|
|
242
245
|
} else {
|
|
243
|
-
let serverRuntime = deps["@react-router/deno"] ? "deno" : deps["@react-router/cloudflare"] ? "cloudflare" : deps["@react-router/node"] ? "node" : undefined;
|
|
244
246
|
if (!serverRuntime) {
|
|
245
247
|
let serverRuntimes = ["@react-router/deno", "@react-router/cloudflare", "@react-router/node"];
|
|
246
248
|
let formattedList = disjunctionListFormat.format(serverRuntimes);
|
|
@@ -261,12 +263,26 @@ async function resolveEntryFiles({
|
|
|
261
263
|
stdio: "inherit"
|
|
262
264
|
});
|
|
263
265
|
}
|
|
264
|
-
entryServerFile = `entry.server.${serverRuntime}.tsx`;
|
|
266
|
+
entryServerFile = reactRouterConfig.future.unstable_serverComponents ? `entry.server.${serverRuntime}.rsc.tsx` : `entry.server.${serverRuntime}.tsx`;
|
|
267
|
+
}
|
|
268
|
+
if (future.unstable_serverComponents) {
|
|
269
|
+
if (userEntryReactServerFile) {
|
|
270
|
+
entryReactServerFile = userEntryReactServerFile;
|
|
271
|
+
} else {
|
|
272
|
+
if (!serverRuntime) {
|
|
273
|
+
let serverRuntimes = ["@react-router/deno", "@react-router/cloudflare", "@react-router/node"];
|
|
274
|
+
let formattedList = disjunctionListFormat.format(serverRuntimes);
|
|
275
|
+
throw new Error(`Could not determine server runtime. Please install one of the following: ${formattedList}`);
|
|
276
|
+
}
|
|
277
|
+
entryReactServerFile = `entry.react-server.${serverRuntime === "node" ? serverRuntime : "web"}.tsx`;
|
|
278
|
+
}
|
|
265
279
|
}
|
|
266
280
|
let entryClientFilePath = userEntryClientFile ? path__default["default"].resolve(reactRouterConfig.appDirectory, userEntryClientFile) : path__default["default"].resolve(defaultsDirectory, entryClientFile);
|
|
267
281
|
let entryServerFilePath = userEntryServerFile ? path__default["default"].resolve(reactRouterConfig.appDirectory, userEntryServerFile) : path__default["default"].resolve(defaultsDirectory, entryServerFile);
|
|
282
|
+
let entryReactServerFilePath = userEntryReactServerFile ? path__default["default"].resolve(reactRouterConfig.appDirectory, userEntryReactServerFile) : entryReactServerFile ? path__default["default"].resolve(defaultsDirectory, entryReactServerFile) : undefined;
|
|
268
283
|
return {
|
|
269
284
|
entryClientFilePath,
|
|
285
|
+
entryReactServerFilePath,
|
|
270
286
|
entryServerFilePath
|
|
271
287
|
};
|
|
272
288
|
}
|
|
@@ -285,4 +301,5 @@ let disjunctionListFormat = new Intl.ListFormat("en", {
|
|
|
285
301
|
|
|
286
302
|
exports.configRouteToBranchRoute = configRouteToBranchRoute;
|
|
287
303
|
exports.resolveEntryFiles = resolveEntryFiles;
|
|
304
|
+
exports.resolvePublicPath = resolvePublicPath;
|
|
288
305
|
exports.resolveReactRouterConfig = resolveReactRouterConfig;
|
package/dist/index.js
CHANGED
package/dist/invariant.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createServerReference(_: unknown, mod: string, name: string): void;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @react-router/dev v0.0.0-experimental-9aebdc522
|
|
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
|
+
function createServerReference(_, mod, name) {
|
|
16
|
+
throw new Error("Server references are not yet implemented.");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
exports.createServerReference = createServerReference;
|
package/dist/vite/babel.js
CHANGED