@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.
Files changed (39) hide show
  1. package/dist/cli/commands.js +1 -1
  2. package/dist/cli/detectPackageManager.js +1 -1
  3. package/dist/cli/index.js +1 -1
  4. package/dist/cli/run.js +1 -1
  5. package/dist/cli/useJavascript.js +1 -1
  6. package/dist/cli.js +1 -1
  7. package/dist/colors.js +1 -1
  8. package/dist/config/defaults/entry.client.rsc.tsx +119 -0
  9. package/dist/config/defaults/entry.react-server.node.tsx +19 -0
  10. package/dist/config/defaults/entry.react-server.web.tsx +13 -0
  11. package/dist/config/defaults/entry.server.node.rsc.tsx +164 -0
  12. package/dist/config/findConfig.js +1 -1
  13. package/dist/config/flatRoutes.js +1 -1
  14. package/dist/config/format.js +1 -1
  15. package/dist/config/routes.js +1 -1
  16. package/dist/config.d.ts +3 -23
  17. package/dist/config.js +27 -10
  18. package/dist/index.js +1 -1
  19. package/dist/invariant.js +1 -1
  20. package/dist/runtime.client.d.ts +1 -0
  21. package/dist/runtime.client.js +19 -0
  22. package/dist/vite/babel.js +1 -1
  23. package/dist/vite/build.js +24 -34
  24. package/dist/vite/cloudflare-proxy-plugin.js +1 -1
  25. package/dist/vite/dev.js +1 -1
  26. package/dist/vite/import-vite-esm-sync.js +1 -1
  27. package/dist/vite/index.js +1 -1
  28. package/dist/vite/node-adapter.js +1 -1
  29. package/dist/vite/plugin.d.ts +10 -0
  30. package/dist/vite/plugin.js +232 -19
  31. package/dist/vite/profiler.js +1 -1
  32. package/dist/vite/remove-exports.d.ts +3 -1
  33. package/dist/vite/remove-exports.js +18 -2
  34. package/dist/vite/resolve-file-url.js +1 -1
  35. package/dist/vite/styles.js +1 -1
  36. package/dist/vite/vmod.js +1 -1
  37. package/package.json +13 -7
  38. package/dist/config/defaults/entry.dev.d.ts +0 -2
  39. package/dist/config/defaults/entry.dev.ts +0 -13
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/cli/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/cli/run.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @react-router/dev v0.0.0-experimental-13d6d438f
3
+ * @react-router/dev v0.0.0-experimental-9aebdc522
4
4
  *
5
5
  * Copyright (c) Remix Software Inc.
6
6
  *
package/dist/colors.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -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
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
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-13d6d438f
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.base ?? "/";
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 entryClientFile = userEntryClientFile || "entry.client.tsx";
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
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
package/dist/invariant.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -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;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-13d6d438f
2
+ * @react-router/dev v0.0.0-experimental-9aebdc522
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *