Update app and tooling

This commit is contained in:
Lawrence Chen 2026-01-29 17:36:26 -08:00
parent 3046531bdd
commit e620ec7349
4950 changed files with 2975120 additions and 10 deletions

View file

@ -0,0 +1,12 @@
import { RemixBrowser } from '@remix-run/react';
import { startTransition, StrictMode } from 'react';
import { hydrateRoot } from 'react-dom/client';
startTransition(() => {
hydrateRoot(
document,
<StrictMode>
<RemixBrowser />
</StrictMode>
);
});

View file

@ -0,0 +1,17 @@
import { RemixServer } from '@remix-run/react';
import { handleRequest } from '@vercel/remix';
export default function (
request,
responseStatusCode,
responseHeaders,
remixContext
) {
const remixServer = <RemixServer context={remixContext} url={request.url} />;
return handleRequest(
request,
responseStatusCode,
responseHeaders,
remixServer
);
}

View file

@ -0,0 +1,3 @@
import { createRequestHandler } from '@remix-run/server-runtime';
import * as build from '@remix-run/dev/server-build';
export default createRequestHandler(build.default || build);

View file

@ -0,0 +1,89 @@
import {
createRequestHandler as createRemixRequestHandler,
createReadableStreamFromReadable,
writeReadableStreamToWritable,
installGlobals,
} from '@remix-run/node';
import * as build from '@remix-run/dev/server-build';
installGlobals({
nativeFetch:
// Explicit opt-in to native fetch via runtime env var
(parseInt(process.versions.node, 10) >= 20 &&
process.env.VERCEL_REMIX_NATIVE_FETCH === '1') ||
// `unstable_singleFetch` future flag added in Remix v2.9.0
build.future.unstable_singleFetch ||
// `v3_singleFetch` future flag stabilized in Remix v2.13.0
build.future.v3_singleFetch,
});
const handleRequest = createRemixRequestHandler(
build.default || build,
process.env.NODE_ENV
);
function toWebHeaders(nodeHeaders) {
const headers = new Headers();
for (const key in nodeHeaders) {
const header = nodeHeaders[key];
// set-cookie is an array (maybe others)
if (Array.isArray(header)) {
for (const value of header) {
headers.append(key, value);
}
} else {
headers.append(key, header);
}
}
return headers;
}
function toNodeHeaders(webHeaders) {
return webHeaders.raw?.() || [...webHeaders].flat();
}
function createRemixRequest(req, res) {
const host = req.headers['x-forwarded-host'] || req.headers.host;
const protocol = req.headers['x-forwarded-proto'] || 'https';
const url = new URL(req.url, `${protocol}://${host}`);
// Abort action/loaders once we can no longer write a response
const controller = new AbortController();
res.on('close', () => controller.abort());
const init = {
method: req.method,
headers: toWebHeaders(req.headers),
signal: controller.signal,
};
if (req.method !== 'GET' && req.method !== 'HEAD') {
init.body = createReadableStreamFromReadable(req);
init.duplex = 'half';
}
return new Request(url.href, init);
}
async function sendRemixResponse(res, nodeResponse) {
res.statusMessage = nodeResponse.statusText;
res.writeHead(
nodeResponse.status,
nodeResponse.statusText,
toNodeHeaders(nodeResponse.headers)
);
if (nodeResponse.body) {
await writeReadableStreamToWritable(nodeResponse.body, res);
} else {
res.end();
}
}
export default async (req, res) => {
const request = createRemixRequest(req, res);
const response = await handleRequest(request);
await sendRemixResponse(res, response);
};

View file

@ -0,0 +1,10 @@
import { createRequestHandler } from 'react-router';
import * as build_ from 'virtual:react-router/server-build';
const build = build_.default || build_;
export default typeof build === 'function'
? // A custom server entrypoint is expected to export
// a Web API-compatible handler function
build
: // Otherwise, assume the default export is
// the React Router app manifest
createRequestHandler(build);

View file

@ -0,0 +1,21 @@
/**
* Edge runtime entrypoint for `@remix-run/vercel`.
*/
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var serverRuntime = require('@remix-run/server-runtime');
/**
* Returns a request handler for the Vercel Edge runtime that serves
* the Remix SSR response.
*/
function createRequestHandler({ build, mode }) {
let handleRequest = serverRuntime.createRequestHandler(build, mode);
return request => {
return handleRequest(request);
};
}
exports.createRequestHandler = createRequestHandler;