Skip to content

Commit 97404ec

Browse files
committed
chore(deps): bump to latest
Signed-off-by: Logan McAnsh <logan@mcan.sh>
1 parent 9fd5b94 commit 97404ec

File tree

8 files changed

+2219
-2604
lines changed

8 files changed

+2219
-2604
lines changed

example/app/entry.client.tsx

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,22 @@
1-
import ReactDOM from "react-dom/client";
21
import { RemixBrowser } from "@remix-run/react";
2+
import { startTransition, StrictMode } from "react";
3+
import { hydrateRoot } from "react-dom/client";
34

4-
ReactDOM.hydrateRoot(document, <RemixBrowser />);
5+
function hydrate() {
6+
startTransition(() => {
7+
hydrateRoot(
8+
document,
9+
<StrictMode>
10+
<RemixBrowser />
11+
</StrictMode>
12+
);
13+
});
14+
}
15+
16+
if (typeof requestIdleCallback === "function") {
17+
requestIdleCallback(hydrate);
18+
} else {
19+
// Safari doesn't support requestIdleCallback
20+
// https://caniuse.com/requestidlecallback
21+
setTimeout(hydrate, 1);
22+
}

example/app/entry.server.tsx

+102-8
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,115 @@
1-
import ReactDOMServer from "react-dom/server";
1+
import { PassThrough } from "stream";
22
import type { EntryContext } from "@remix-run/node";
3+
import { Response } from "@remix-run/node";
34
import { RemixServer } from "@remix-run/react";
5+
import isbot from "isbot";
6+
import { renderToPipeableStream } from "react-dom/server";
7+
8+
const ABORT_DELAY = 5000;
49

510
export default function handleRequest(
611
request: Request,
712
responseStatusCode: number,
813
responseHeaders: Headers,
914
remixContext: EntryContext
1015
) {
11-
let markup = ReactDOMServer.renderToString(
12-
<RemixServer context={remixContext} url={request.url} />
13-
);
16+
return isbot(request.headers.get("user-agent"))
17+
? handleBotRequest(
18+
request,
19+
responseStatusCode,
20+
responseHeaders,
21+
remixContext
22+
)
23+
: handleBrowserRequest(
24+
request,
25+
responseStatusCode,
26+
responseHeaders,
27+
remixContext
28+
);
29+
}
30+
31+
function handleBotRequest(
32+
request: Request,
33+
responseStatusCode: number,
34+
responseHeaders: Headers,
35+
remixContext: EntryContext
36+
) {
37+
return new Promise((resolve, reject) => {
38+
let didError = false;
39+
40+
let { pipe, abort } = renderToPipeableStream(
41+
<RemixServer
42+
context={remixContext}
43+
url={request.url}
44+
abortDelay={ABORT_DELAY}
45+
/>,
46+
{
47+
onAllReady() {
48+
let body = new PassThrough();
49+
50+
responseHeaders.set("Content-Type", "text/html");
51+
52+
resolve(
53+
new Response(body, {
54+
headers: responseHeaders,
55+
status: didError ? 500 : responseStatusCode,
56+
})
57+
);
58+
59+
pipe(body);
60+
},
61+
onShellError(error: unknown) {
62+
reject(error);
63+
},
64+
onError(error: unknown) {
65+
didError = true;
66+
67+
console.error(error);
68+
},
69+
}
70+
);
71+
72+
setTimeout(abort, ABORT_DELAY);
73+
});
74+
}
75+
76+
function handleBrowserRequest(
77+
request: Request,
78+
responseStatusCode: number,
79+
responseHeaders: Headers,
80+
remixContext: EntryContext
81+
) {
82+
return new Promise((resolve, reject) => {
83+
let didError = false;
84+
85+
let { pipe, abort } = renderToPipeableStream(
86+
<RemixServer context={remixContext} url={request.url} />,
87+
{
88+
onShellReady() {
89+
let body = new PassThrough();
90+
91+
responseHeaders.set("Content-Type", "text/html");
92+
93+
resolve(
94+
new Response(body, {
95+
headers: responseHeaders,
96+
status: didError ? 500 : responseStatusCode,
97+
})
98+
);
99+
100+
pipe(body);
101+
},
102+
onShellError(err: unknown) {
103+
reject(err);
104+
},
105+
onError(error: unknown) {
106+
didError = true;
14107

15-
responseHeaders.set("Content-Type", "text/html");
108+
console.error(error);
109+
},
110+
}
111+
);
16112

17-
return new Response("<!DOCTYPE html>" + markup, {
18-
status: responseStatusCode,
19-
headers: responseHeaders,
113+
setTimeout(abort, ABORT_DELAY);
20114
});
21115
}

example/app/routes/__layout/index.tsx

+19-12
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
1-
import type { ActionFunction, LoaderFunction } from "@remix-run/node";
2-
import { json, redirect } from "@remix-run/node";
3-
import { Form, Link, useLoaderData } from "@remix-run/react";
1+
import * as React from "react";
2+
import type { DataFunctionArgs } from "@remix-run/node";
3+
import { defer, redirect } from "@remix-run/node";
4+
import { Await, Form, Link, useLoaderData } from "@remix-run/react";
45

56
import { sessionStorage } from "~/session.server";
67

7-
export let loader: LoaderFunction = async ({ request, context }) => {
8+
export async function loader({ request, context }: DataFunctionArgs) {
89
let cookie = request.headers.get("Cookie");
910
let session = await sessionStorage.getSession(cookie);
10-
let name = session.get("name");
11+
let name = new Promise((resolve) =>
12+
setTimeout(() => resolve(session.get("name")), 1000)
13+
);
1114

12-
return json({
15+
return defer({
1316
message: "this is awesome 😎",
1417
name: name || "Anonymous",
1518
loadContextName: context.loadContextName,
1619
});
17-
};
20+
}
1821

19-
export let action: ActionFunction = async ({ request }) => {
22+
export async function action({ request }: DataFunctionArgs) {
2023
let cookie = request.headers.get("Cookie");
2124
let session = await sessionStorage.getSession(cookie);
2225
let formData = await request.formData();
@@ -34,7 +37,7 @@ export let action: ActionFunction = async ({ request }) => {
3437
"Set-Cookie": await sessionStorage.commitSession(session),
3538
},
3639
});
37-
};
40+
}
3841

3942
export default function Index() {
4043
let data = useLoaderData();
@@ -60,9 +63,13 @@ export default function Index() {
6063
</a>
6164
</h1>
6265

63-
<h2>
64-
Hello {data.name}, with context name {data.loadContextName}
65-
</h2>
66+
<React.Suspense fallback={<p>loading...</p>}>
67+
<Await resolve={data.name} errorElement={<div>failed...</div>}>
68+
<h2>
69+
Hello {data.name}, with context name {data.loadContextName}
70+
</h2>
71+
</Await>
72+
</React.Suspense>
6673

6774
<Form
6875
method="post"

example/package.json

+8-7
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,20 @@
1313
},
1414
"dependencies": {
1515
"@mcansh/remix-fastify": "workspace:*",
16-
"@remix-run/node": "^1.7.6",
17-
"@remix-run/react": "^1.7.6",
18-
"fastify": "^4.10.2",
16+
"@remix-run/node": "1.12.0",
17+
"@remix-run/react": "1.12.0",
18+
"fastify": "^4.12.0",
19+
"isbot": "^3.6.5",
1920
"react": "^18.2.0",
2021
"react-dom": "^18.2.0"
2122
},
2223
"devDependencies": {
23-
"@remix-run/dev": "^1.7.6",
24-
"@types/react": "^18.0.25",
25-
"@types/react-dom": "^18.0.9",
24+
"@remix-run/dev": "1.12.0",
25+
"@types/react": "^18.0.27",
26+
"@types/react-dom": "^18.0.10",
2627
"dotenv": "^16.0.3",
2728
"npm-run-all": "^4.1.5",
28-
"typescript": "^4.9.3"
29+
"typescript": "^4.9.5"
2930
},
3031
"engines": {
3132
"node": ">=14"

package.json

+10-10
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@
1414
"changeset:release": "pnpm run build && changeset publish"
1515
},
1616
"dependencies": {
17-
"@changesets/cli": "^2.25.2",
18-
"@remix-run/eslint-config": "1.7.6",
19-
"@types/glob": "^8.0.0",
20-
"@types/jest": "^29.2.3",
21-
"eslint": "8.28.0",
17+
"@changesets/cli": "^2.26.0",
18+
"@remix-run/eslint-config": "1.12.0",
19+
"@types/glob": "^8.0.1",
20+
"@types/jest": "^29.4.0",
21+
"eslint": "8.33.0",
2222
"eslint-plugin-prefer-let": "3.0.1",
2323
"estrella": "^1.4.1",
2424
"fs-extra": "^11.1.0",
25-
"glob": "^8.0.3",
26-
"jest": "^29.3.1",
27-
"prettier": "^2.8.0",
25+
"glob": "^8.1.0",
26+
"jest": "^29.4.1",
27+
"prettier": "^2.8.3",
2828
"semver": "^7.3.8",
29-
"ts-jest": "^29.0.3",
30-
"typescript": "^4.9.3"
29+
"ts-jest": "^29.0.5",
30+
"typescript": "^4.9.5"
3131
}
3232
}

packages/remix-fastify/package.json

+11-11
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,25 @@
3131
],
3232
"author": "Logan McAnsh <logan@remix.run> (https://remix.run)",
3333
"dependencies": {
34-
"@fastify/static": "^6.5.1",
35-
"fastify-plugin": "^4.3.0",
34+
"@fastify/static": "^6.8.0",
35+
"fastify-plugin": "^4.5.0",
3636
"fastify-racing": "^1.1.0",
37-
"glob": "^8.0.3",
37+
"glob": "^8.1.0",
3838
"tiny-invariant": "^1.3.1"
3939
},
4040
"devDependencies": {
41-
"@remix-run/node": "^1.7.6",
42-
"@remix-run/react": "^1.7.6",
43-
"@types/glob": "^8.0.0",
44-
"@types/node": "^18.11.9",
45-
"@types/react": "^18.0.25",
46-
"@types/react-dom": "^18.0.9",
41+
"@remix-run/node": "1.12.0",
42+
"@remix-run/react": "1.12.0",
43+
"@types/glob": "^8.0.1",
44+
"@types/node": "^18.11.18",
45+
"@types/react": "^18.0.27",
46+
"@types/react-dom": "^18.0.10",
4747
"@typescript/lib-dom": "npm:@types/web@^0.0.75",
48-
"fastify": "^4.10.2",
48+
"fastify": "^4.12.0",
4949
"node-mocks-http": "^1.12.1",
5050
"react": "^18.2.0",
5151
"react-dom": "^18.2.0",
52-
"typescript": "^4.9.3"
52+
"typescript": "^4.9.5"
5353
},
5454
"peerDependencies": {
5555
"@remix-run/node": "^1.6.0",

packages/remix-fastify/src/server.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,8 @@ export async function sendRemixResponse(
115115
if (nodeResponse.body) {
116116
let passthrough = new PassThrough();
117117
reply.send(passthrough);
118-
119-
await writeReadableStreamToWritable(
120-
nodeResponse.body,
121-
passthrough
122-
);
118+
119+
await writeReadableStreamToWritable(nodeResponse.body, passthrough);
123120
} else {
124121
reply.send();
125122
}

0 commit comments

Comments
 (0)