Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@remix-run/server-runtime

Package Overview
Dependencies
Maintainers
2
Versions
1042
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@remix-run/server-runtime - npm Package Compare versions

Comparing version 0.0.0-nightly-df59cc6-20240229 to 0.0.0-nightly-dfc3401f7-20240815

dist/deprecations.d.ts

1

dist/build.d.ts

@@ -38,2 +38,3 @@ import type { ActionFunctionArgs, LoaderFunctionArgs } from "./routeModules";

handleError?: HandleErrorFunction;
streamTimeout?: number;
}

2

dist/cookies.js
/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

@@ -15,3 +15,3 @@ import type { ActionFunction, ActionFunctionArgs, LoaderFunction, LoaderFunctionArgs } from "./routeModules";

export type AppData = unknown;
export declare function callRouteActionRR({ loadContext, action, params, request, routeId, }: {
export declare function callRouteAction({ loadContext, action, params, request, routeId, singleFetch, }: {
request: Request;

@@ -22,4 +22,5 @@ action: ActionFunction;

routeId: string;
}): Promise<Response>;
export declare function callRouteLoaderRR({ loadContext, loader, params, request, routeId, }: {
singleFetch: boolean;
}): Promise<{} | Response | null>;
export declare function callRouteLoader({ loadContext, loader, params, request, routeId, singleFetch, }: {
request: Request;

@@ -30,2 +31,3 @@ loader: LoaderFunction;

routeId: string;
}): Promise<import("@remix-run/router").UNSAFE_DeferredData | Response>;
singleFetch: boolean;
}): Promise<{} | Response | null>;
/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -28,3 +28,3 @@ * Copyright (c) Remix Software Inc.

async function callRouteActionRR({
async function callRouteAction({
loadContext,

@@ -34,3 +34,4 @@ action,

request,
routeId
routeId,
singleFetch
}) {

@@ -45,5 +46,10 @@ let result = await action({

}
// Allow naked object returns when single fetch is enabled
if (singleFetch) {
return result;
}
return responses.isResponse(result) ? result : responses.json(result);
}
async function callRouteLoaderRR({
async function callRouteLoader({
loadContext,

@@ -53,3 +59,4 @@ loader,

request,
routeId
routeId,
singleFetch
}) {

@@ -70,2 +77,7 @@ let result = await loader({

}
// Allow naked object returns when single fetch is enabled
if (singleFetch) {
return result;
}
return responses.isResponse(result) ? result : responses.json(result);

@@ -118,3 +130,3 @@ }

exports.callRouteActionRR = callRouteActionRR;
exports.callRouteLoaderRR = callRouteLoaderRR;
exports.callRouteAction = callRouteAction;
exports.callRouteLoader = callRouteLoader;
/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

@@ -10,2 +10,13 @@ import type { StaticHandlerContext } from "@remix-run/router";

serverHandoffString?: string;
serverHandoffStream?: ReadableStream<Uint8Array>;
renderMeta?: {
didRenderScripts?: boolean;
streamCache?: Record<number, Promise<void> & {
result?: {
done: boolean;
value: string;
};
error?: unknown;
}>;
};
staticHandlerContext: StaticHandlerContext;

@@ -20,2 +31,4 @@ future: FutureConfig;

v3_throwAbortReason: boolean;
unstable_lazyRouteDiscovery: boolean;
unstable_singleFetch: boolean;
}

@@ -22,0 +35,0 @@ export interface AssetsManifest {

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -24,3 +24,3 @@ * Copyright (c) Remix Software Inc.

async function callRouteActionRR({
async function callRouteAction({
loadContext,

@@ -30,3 +30,4 @@ action,

request,
routeId
routeId,
singleFetch
}) {

@@ -41,5 +42,10 @@ let result = await action({

}
// Allow naked object returns when single fetch is enabled
if (singleFetch) {
return result;
}
return isResponse(result) ? result : json(result);
}
async function callRouteLoaderRR({
async function callRouteLoader({
loadContext,

@@ -49,3 +55,4 @@ loader,

request,
routeId
routeId,
singleFetch
}) {

@@ -66,2 +73,7 @@ let result = await loader({

}
// Allow naked object returns when single fetch is enabled
if (singleFetch) {
return result;
}
return isResponse(result) ? result : json(result);

@@ -114,2 +126,2 @@ }

export { callRouteActionRR, callRouteLoaderRR };
export { callRouteAction, callRouteLoader };
/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -13,3 +13,3 @@ * Copyright (c) Remix Software Inc.

function getDocumentHeadersRR(build, context) {
function getDocumentHeaders(build, context) {
let boundaryIdx = context.errors ? context.matches.findIndex(m => context.errors[m.route.id]) : -1;

@@ -91,2 +91,2 @@ let matches = boundaryIdx >= 0 ? context.matches.slice(0, boundaryIdx + 1) : context.matches;

export { getDocumentHeadersRR };
export { getDocumentHeaders };
/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -13,3 +13,4 @@ * Copyright (c) Remix Software Inc.

export { composeUploadHandlers as unstable_composeUploadHandlers, parseMultipartFormData as unstable_parseMultipartFormData } from './formData.js';
export { defer, json, redirect, redirectDocument } from './responses.js';
export { defer, json, redirect, redirectDocument, replace } from './responses.js';
export { SingleFetchRedirectSymbol as UNSAFE_SingleFetchRedirectSymbol, data as unstable_data, defineAction as unstable_defineAction, defineLoader as unstable_defineLoader } from './single-fetch.js';
export { createRequestHandler } from './server.js';

@@ -16,0 +17,0 @@ export { createSession, createSessionStorageFactory, isSession } from './sessions.js';

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -11,3 +11,3 @@ * Copyright (c) Remix Software Inc.

*/
import { json as json$1, defer as defer$1, redirect as redirect$1, redirectDocument as redirectDocument$1 } from '@remix-run/router';
import { json as json$1, defer as defer$1, redirect as redirect$1, replace as replace$1, redirectDocument as redirectDocument$1 } from '@remix-run/router';
import { serializeError } from './errors.js';

@@ -47,2 +47,12 @@

/**
* A redirect response. Sets the status code and the `Location` header.
* Defaults to "302 Found".
*
* @see https://remix.run/utils/redirect
*/
const replace = (url, init = 302) => {
return replace$1(url, init);
};
/**
* A redirect response that will force a document reload to the new location.

@@ -125,2 +135,2 @@ * Sets the status code and the `Location` header.

export { createDeferredReadableStream, defer, isDeferredData, isRedirectResponse, isRedirectStatusCode, isResponse, json, redirect, redirectDocument };
export { createDeferredReadableStream, defer, isDeferredData, isRedirectResponse, isRedirectStatusCode, isResponse, json, redirect, redirectDocument, replace };
/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -11,3 +11,3 @@ * Copyright (c) Remix Software Inc.

*/
import { callRouteLoaderRR, callRouteActionRR } from './data.js';
import { callRouteLoader, callRouteAction } from './data.js';

@@ -51,3 +51,3 @@ // NOTE: make sure to change the Route in remix-react if you change this

// though we know it'll always be provided in remix
args => callRouteLoaderRR({
(args, dataStrategyCtx) => callRouteLoader({
request: args.request,

@@ -57,5 +57,6 @@ params: args.params,

loader: route.module.loader,
routeId: route.id
routeId: route.id,
singleFetch: future.unstable_singleFetch === true
}) : undefined,
action: route.module.action ? args => callRouteActionRR({
action: route.module.action ? (args, dataStrategyCtx) => callRouteAction({
request: args.request,

@@ -65,3 +66,4 @@ params: args.params,

action: route.module.action,
routeId: route.id
routeId: route.id,
singleFetch: future.unstable_singleFetch === true
}) : undefined,

@@ -68,0 +70,0 @@ handle: route.module.handle

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -11,6 +11,6 @@ * Copyright (c) Remix Software Inc.

*/
import { stripBasename, UNSAFE_DEFERRED_SYMBOL, isRouteErrorResponse, json, UNSAFE_ErrorResponseImpl, getStaticContextFromError, createStaticHandler } from '@remix-run/router';
import { UNSAFE_DEFERRED_SYMBOL, isRouteErrorResponse, json as json$1, UNSAFE_ErrorResponseImpl, getStaticContextFromError, stripBasename, createStaticHandler } from '@remix-run/router';
import { createEntryRouteModules } from './entry.js';
import { serializeError, sanitizeErrors, serializeErrors } from './errors.js';
import { getDocumentHeadersRR } from './headers.js';
import { getDocumentHeaders } from './headers.js';
import invariant from './invariant.js';

@@ -20,5 +20,7 @@ import { ServerMode, isServerMode } from './mode.js';

import { createRoutes, createStaticHandlerDataRoutes } from './routes.js';
import { isRedirectResponse, createDeferredReadableStream, isResponse } from './responses.js';
import { isRedirectResponse, json, createDeferredReadableStream, isResponse } from './responses.js';
import { createServerHandoffString } from './serverHandoff.js';
import { getDevServerHooks } from './dev.js';
import { getSingleFetchRedirect, encodeViaTurboStream, SINGLE_FETCH_REDIRECT_STATUS, singleFetchAction, singleFetchLoaders, SingleFetchRedirectSymbol } from './single-fetch.js';
import { resourceRouteJsonWarning } from './deprecations.js';

@@ -77,3 +79,3 @@ function derive(build, mode) {

let url = new URL(request.url);
let matches = matchServerRoutes(routes, url.pathname, _build.basename);
let params = {};
let handleError = error => {

@@ -86,24 +88,74 @@ if (mode === ServerMode.Development) {

context: loadContext,
params: matches && matches.length > 0 ? matches[0].params : {},
params,
request
});
};
// Manifest request for fog of war
let manifestUrl = `${_build.basename ?? "/"}/__manifest`.replace(/\/+/g, "/");
if (url.pathname === manifestUrl) {
try {
let res = await handleManifestRequest(_build, routes, url);
return res;
} catch (e) {
handleError(e);
return new Response("Unknown Server Error", {
status: 500
});
}
}
let matches = matchServerRoutes(routes, url.pathname, _build.basename);
if (matches && matches.length > 0) {
Object.assign(params, matches[0].params);
}
let response;
if (url.searchParams.has("_data")) {
if (_build.future.unstable_singleFetch) {
handleError(new Error("Warning: Single fetch-enabled apps should not be making ?_data requests, " + "this is likely to break in the future"));
}
let routeId = url.searchParams.get("_data");
response = await handleDataRequestRR(serverMode, _build, staticHandler, routeId, request, loadContext, handleError);
response = await handleDataRequest(serverMode, _build, staticHandler, routeId, request, loadContext, handleError);
if (_build.entry.module.handleDataRequest) {
var _matches$find;
response = await _build.entry.module.handleDataRequest(response, {
context: loadContext,
params: (matches === null || matches === void 0 ? void 0 : (_matches$find = matches.find(m => m.route.id == routeId)) === null || _matches$find === void 0 ? void 0 : _matches$find.params) || {},
params,
request
});
if (isRedirectResponse(response)) {
response = createRemixRedirectResponse(response, _build.basename);
}
}
} else if (_build.future.unstable_singleFetch && url.pathname.endsWith(".data")) {
let handlerUrl = new URL(request.url);
handlerUrl.pathname = handlerUrl.pathname.replace(/\.data$/, "").replace(/^\/_root$/, "/");
let singleFetchMatches = matchServerRoutes(routes, handlerUrl.pathname, _build.basename);
response = await handleSingleFetchRequest(serverMode, _build, staticHandler, request, handlerUrl, loadContext, handleError);
if (_build.entry.module.handleDataRequest) {
response = await _build.entry.module.handleDataRequest(response, {
context: loadContext,
params: singleFetchMatches ? singleFetchMatches[0].params : {},
request
});
if (isRedirectResponse(response)) {
let result = getSingleFetchRedirect(response.status, response.headers, _build.basename);
if (request.method === "GET") {
result = {
[SingleFetchRedirectSymbol]: result
};
}
let headers = new Headers(response.headers);
headers.set("Content-Type", "text/x-turbo");
return new Response(encodeViaTurboStream(result, request.signal, _build.entry.module.streamTimeout, serverMode), {
status: SINGLE_FETCH_REDIRECT_STATUS,
headers
});
}
}
} else if (matches && matches[matches.length - 1].route.module.default == null && matches[matches.length - 1].route.module.ErrorBoundary == null) {
response = await handleResourceRequestRR(serverMode, staticHandler, matches.slice(-1)[0].route.id, request, loadContext, handleError);
response = await handleResourceRequest(serverMode, _build, staticHandler, matches.slice(-1)[0].route.id, request, loadContext, handleError);
} else {
var _getDevServerHooks2, _getDevServerHooks2$g;
let criticalCss = mode === ServerMode.Development ? await ((_getDevServerHooks2 = getDevServerHooks()) === null || _getDevServerHooks2 === void 0 ? void 0 : (_getDevServerHooks2$g = _getDevServerHooks2.getCriticalCss) === null || _getDevServerHooks2$g === void 0 ? void 0 : _getDevServerHooks2$g.call(_getDevServerHooks2, _build, url.pathname)) : undefined;
response = await handleDocumentRequestRR(serverMode, _build, staticHandler, request, loadContext, handleError, criticalCss);
response = await handleDocumentRequest(serverMode, _build, staticHandler, request, loadContext, handleError, criticalCss);
}

@@ -120,3 +172,25 @@ if (request.method === "HEAD") {

};
async function handleDataRequestRR(serverMode, build, staticHandler, routeId, request, loadContext, handleError) {
async function handleManifestRequest(build, routes, url) {
let patches = {};
if (url.searchParams.has("p")) {
for (let path of url.searchParams.getAll("p")) {
let matches = matchServerRoutes(routes, path, build.basename);
if (matches) {
for (let match of matches) {
let routeId = match.route.id;
patches[routeId] = build.assets.routes[routeId];
}
}
}
return json(patches, {
headers: {
"Cache-Control": "public, max-age=31536000, immutable"
}
}); // Override the TypedResponse stuff from json()
}
return new Response("Invalid Request", {
status: 400
});
}
async function handleDataRequest(serverMode, build, staticHandler, routeId, request, loadContext, handleError) {
try {

@@ -128,17 +202,3 @@ let response = await staticHandler.queryRoute(request, {

if (isRedirectResponse(response)) {
// We don't have any way to prevent a fetch request from following
// redirects. So we use the `X-Remix-Redirect` header to indicate the
// next URL, and then "follow" the redirect manually on the client.
let headers = new Headers(response.headers);
let redirectUrl = headers.get("Location");
headers.set("X-Remix-Redirect", build.basename ? stripBasename(redirectUrl, build.basename) || redirectUrl : redirectUrl);
headers.set("X-Remix-Status", response.status);
headers.delete("Location");
if (response.headers.get("Set-Cookie") !== null) {
headers.set("X-Remix-Revalidate", "yes");
}
return new Response(null, {
status: 204,
headers
});
return createRemixRedirectResponse(response, build.basename);
}

@@ -160,13 +220,11 @@ if (UNSAFE_DEFERRED_SYMBOL in response) {

// network errors that are missing this header
response.headers.set("X-Remix-Response", "yes");
response = safelySetHeader(response, "X-Remix-Response", "yes");
return response;
} catch (error) {
if (isResponse(error)) {
error.headers.set("X-Remix-Catch", "yes");
return error;
let response = safelySetHeader(error, "X-Remix-Catch", "yes");
return response;
}
if (isRouteErrorResponse(error)) {
if (error) {
handleError(error);
}
handleError(error);
return errorResponseToJson(error, serverMode);

@@ -176,3 +234,3 @@ }

handleError(errorInstance);
return json(serializeError(errorInstance, serverMode), {
return json$1(serializeError(errorInstance, serverMode), {
status: 500,

@@ -185,3 +243,23 @@ headers: {

}
async function handleDocumentRequestRR(serverMode, build, staticHandler, request, loadContext, handleError, criticalCss) {
async function handleSingleFetchRequest(serverMode, build, staticHandler, request, handlerUrl, loadContext, handleError) {
let {
result,
headers,
status
} = request.method !== "GET" ? await singleFetchAction(build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError) : await singleFetchLoaders(build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError);
// Mark all successful responses with a header so we can identify in-flight
// network errors that are missing this header
let resultHeaders = new Headers(headers);
resultHeaders.set("X-Remix-Response", "yes");
resultHeaders.set("Content-Type", "text/x-turbo");
// Note: Deferred data is already just Promises, so we don't have to mess
// `activeDeferreds` or anything :)
return new Response(encodeViaTurboStream(result, request.signal, build.entry.module.streamTimeout, serverMode), {
status: status || 200,
headers: resultHeaders
});
}
async function handleDocumentRequest(serverMode, build, staticHandler, request, loadContext, handleError, criticalCss) {
let context;

@@ -201,2 +279,3 @@ try {

}
let headers = getDocumentHeaders(build, context);

@@ -206,3 +285,3 @@ // Sanitize errors outside of development environments

Object.values(context.errors).forEach(err => {
// @ts-expect-error This is "private" from users but intended for internal use
// @ts-expect-error `err.error` is "private" from users but intended for internal use
if (!isRouteErrorResponse(err) || err.error) {

@@ -214,3 +293,11 @@ handleError(err);

}
let headers = getDocumentHeadersRR(build, context);
// Server UI state to send to the client.
// - When single fetch is enabled, this is streamed down via `serverHandoffStream`
// - Otherwise it's stringified into `serverHandoffString`
let state = {
loaderData: context.loaderData,
actionData: context.actionData,
errors: serializeErrors(context.errors, serverMode)
};
let entryContext = {

@@ -225,10 +312,12 @@ manifest: build.assets,

criticalCss,
state: {
loaderData: context.loaderData,
actionData: context.actionData,
errors: serializeErrors(context.errors, serverMode)
},
future: build.future,
isSpaMode: build.isSpaMode
isSpaMode: build.isSpaMode,
...(!build.future.unstable_singleFetch ? {
state
} : null)
}),
...(build.future.unstable_singleFetch ? {
serverHandoffStream: encodeViaTurboStream(state, request.signal, build.entry.module.streamTimeout, serverMode),
renderMeta: {}
} : null),
future: build.future,

@@ -248,16 +337,4 @@ isSpaMode: build.isSpaMode,

if (isResponse(error)) {
let data;
try {
let contentType = error.headers.get("Content-Type");
// Check between word boundaries instead of startsWith() due to the last
// paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type
if (contentType && /\bapplication\/json\b/.test(contentType)) {
if (error.body == null) {
data = null;
} else {
data = await error.json();
}
} else {
data = await error.text();
}
let data = await unwrapResponse(error);
errorForSecondRender = new UNSAFE_ErrorResponseImpl(error.status, error.statusText, data);

@@ -277,3 +354,11 @@ } catch (e) {

// Update entryContext for the second render pass
// Get a new entryContext for the second render pass
// Server UI state to send to the client.
// - When single fetch is enabled, this is streamed down via `serverHandoffStream`
// - Otherwise it's stringified into `serverHandoffString`
let state = {
loaderData: context.loaderData,
actionData: context.actionData,
errors: serializeErrors(context.errors, serverMode)
};
entryContext = {

@@ -285,10 +370,12 @@ ...entryContext,

basename: build.basename,
state: {
loaderData: context.loaderData,
actionData: context.actionData,
errors: serializeErrors(context.errors, serverMode)
},
future: build.future,
isSpaMode: build.isSpaMode
})
isSpaMode: build.isSpaMode,
...(!build.future.unstable_singleFetch ? {
state
} : null)
}),
...(build.future.unstable_singleFetch ? {
serverHandoffStream: encodeViaTurboStream(state, request.signal, build.entry.module.streamTimeout, serverMode),
renderMeta: {}
} : null)
};

@@ -303,3 +390,3 @@ try {

}
async function handleResourceRequestRR(serverMode, staticHandler, routeId, request, loadContext, handleError) {
async function handleResourceRequest(serverMode, build, staticHandler, routeId, request, loadContext, handleError) {
try {

@@ -313,4 +400,12 @@ // Note we keep the routeId here to align with the Remix handling of

});
invariant(!(UNSAFE_DEFERRED_SYMBOL in response), `You cannot return a \`defer()\` response from a Resource Route. Did you ` + `forget to export a default UI component from the "${routeId}" route?`);
// callRouteLoader/callRouteAction always return responses
if (typeof response === "object" && response !== null) {
invariant(!(UNSAFE_DEFERRED_SYMBOL in response), `You cannot return a \`defer()\` response from a Resource Route. Did you ` + `forget to export a default UI component from the "${routeId}" route?`);
}
if (build.future.unstable_singleFetch && !isResponse(response)) {
console.warn(resourceRouteJsonWarning(request.method === "GET" ? "loader" : "action", routeId));
response = json(response);
}
// callRouteLoader/callRouteAction always return responses (w/o single fetch).
// With single fetch, users should always be Responses from resource routes
invariant(isResponse(response), "Expected a Response to be returned from queryRoute");

@@ -322,4 +417,4 @@ return response;

// match identically to what Remix returns
error.headers.set("X-Remix-Catch", "yes");
return error;
let response = safelySetHeader(error, "X-Remix-Catch", "yes");
return response;
}

@@ -337,3 +432,3 @@ if (isRouteErrorResponse(error)) {

function errorResponseToJson(errorResponse, serverMode) {
return json(serializeError(
return json$1(serializeError(
// @ts-expect-error This is "private" from users but intended for internal use

@@ -362,3 +457,42 @@ errorResponse.error || new Error("Unexpected Server Error"), serverMode), {

}
function unwrapResponse(response) {
let contentType = response.headers.get("Content-Type");
// Check between word boundaries instead of startsWith() due to the last
// paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type
return contentType && /\bapplication\/json\b/.test(contentType) ? response.body == null ? null : response.json() : response.text();
}
function createRemixRedirectResponse(response, basename) {
// We don't have any way to prevent a fetch request from following
// redirects. So we use the `X-Remix-Redirect` header to indicate the
// next URL, and then "follow" the redirect manually on the client.
let headers = new Headers(response.headers);
let redirectUrl = headers.get("Location");
headers.set("X-Remix-Redirect", basename ? stripBasename(redirectUrl, basename) || redirectUrl : redirectUrl);
headers.set("X-Remix-Status", String(response.status));
headers.delete("Location");
if (response.headers.get("Set-Cookie") !== null) {
headers.set("X-Remix-Revalidate", "yes");
}
return new Response(null, {
status: 204,
headers
});
}
// Anytime we are setting a header on a `Response` created in the loader/action,
// we have to so it in this manner since in an `undici` world, if the `Response`
// came directly from a `fetch` call, the headers are immutable will throw if
// we try to set a new header. This is a sort of shallow clone of the `Response`
// so we can safely set our own header.
function safelySetHeader(response, name, value) {
let headers = new Headers(response.headers);
headers.set(name, value);
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers,
duplex: response.body ? "half" : undefined
});
}
export { createRequestHandler };
/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

import type { StaticHandlerContext } from "@remix-run/router";
import type { ServerBuild } from "./build";
export declare function getDocumentHeadersRR(build: ServerBuild, context: StaticHandlerContext): Headers;
export declare function getDocumentHeaders(build: ServerBuild, context: StaticHandlerContext): Headers;
/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -17,3 +17,3 @@ * Copyright (c) Remix Software Inc.

function getDocumentHeadersRR(build, context) {
function getDocumentHeaders(build, context) {
let boundaryIdx = context.errors ? context.matches.findIndex(m => context.errors[m.route.id]) : -1;

@@ -95,2 +95,2 @@ let matches = boundaryIdx >= 0 ? context.matches.slice(0, boundaryIdx + 1) : context.matches;

exports.getDocumentHeadersRR = getDocumentHeadersRR;
exports.getDocumentHeaders = getDocumentHeaders;
export { createCookieFactory, isCookie } from "./cookies";
export { composeUploadHandlers as unstable_composeUploadHandlers, parseMultipartFormData as unstable_parseMultipartFormData, } from "./formData";
export { defer, json, redirect, redirectDocument } from "./responses";
export { defer, json, redirect, redirectDocument, replace } from "./responses";
export { SingleFetchRedirectSymbol as UNSAFE_SingleFetchRedirectSymbol, data as unstable_data, defineLoader as unstable_defineLoader, defineAction as unstable_defineAction, } from "./single-fetch";
export type { Loader as unstable_Loader, Action as unstable_Action, Serialize as unstable_Serialize, SingleFetchResult as UNSAFE_SingleFetchResult, SingleFetchResults as UNSAFE_SingleFetchResults, } from "./single-fetch";
export { createRequestHandler } from "./server";

@@ -5,0 +7,0 @@ export { createSession, createSessionStorageFactory, isSession, } from "./sessions";

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -18,2 +18,3 @@ * Copyright (c) Remix Software Inc.

var responses = require('./responses.js');
var singleFetch = require('./single-fetch.js');
var server = require('./server.js');

@@ -37,2 +38,7 @@ var sessions = require('./sessions.js');

exports.redirectDocument = responses.redirectDocument;
exports.replace = responses.replace;
exports.UNSAFE_SingleFetchRedirectSymbol = singleFetch.SingleFetchRedirectSymbol;
exports.unstable_data = singleFetch.data;
exports.unstable_defineAction = singleFetch.defineAction;
exports.unstable_defineLoader = singleFetch.defineLoader;
exports.createRequestHandler = server.createRequestHandler;

@@ -39,0 +45,0 @@ exports.createSession = sessions.createSession;

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

@@ -35,2 +35,9 @@ import { type UNSAFE_DeferredData as DeferredData } from "@remix-run/router";

/**
* A redirect response. Sets the status code and the `Location` header.
* Defaults to "302 Found".
*
* @see https://remix.run/utils/redirect
*/
export declare const replace: RedirectFunction;
/**
* A redirect response that will force a document reload to the new location.

@@ -37,0 +44,0 @@ * Sets the status code and the `Location` header.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -50,2 +50,12 @@ * Copyright (c) Remix Software Inc.

/**
* A redirect response. Sets the status code and the `Location` header.
* Defaults to "302 Found".
*
* @see https://remix.run/utils/redirect
*/
const replace = (url, init = 302) => {
return router.replace(url, init);
};
/**
* A redirect response that will force a document reload to the new location.

@@ -137,1 +147,2 @@ * Sets the status code and the `Location` header.

exports.redirectDocument = redirectDocument;
exports.replace = replace;
/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -54,3 +54,3 @@ * Copyright (c) Remix Software Inc.

// though we know it'll always be provided in remix
args => data.callRouteLoaderRR({
(args, dataStrategyCtx) => data.callRouteLoader({
request: args.request,

@@ -60,5 +60,6 @@ params: args.params,

loader: route.module.loader,
routeId: route.id
routeId: route.id,
singleFetch: future.unstable_singleFetch === true
}) : undefined,
action: route.module.action ? args => data.callRouteActionRR({
action: route.module.action ? (args, dataStrategyCtx) => data.callRouteAction({
request: args.request,

@@ -68,3 +69,4 @@ params: args.params,

action: route.module.action,
routeId: route.id
routeId: route.id,
singleFetch: future.unstable_singleFetch === true
}) : undefined,

@@ -71,0 +73,0 @@ handle: route.module.handle

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -26,2 +26,4 @@ * Copyright (c) Remix Software Inc.

var dev = require('./dev.js');
var singleFetch = require('./single-fetch.js');
var deprecations = require('./deprecations.js');

@@ -80,3 +82,3 @@ function derive(build, mode$1) {

let url = new URL(request.url);
let matches = routeMatching.matchServerRoutes(routes, url.pathname, _build.basename);
let params = {};
let handleError = error => {

@@ -89,24 +91,74 @@ if (mode$1 === mode.ServerMode.Development) {

context: loadContext,
params: matches && matches.length > 0 ? matches[0].params : {},
params,
request
});
};
// Manifest request for fog of war
let manifestUrl = `${_build.basename ?? "/"}/__manifest`.replace(/\/+/g, "/");
if (url.pathname === manifestUrl) {
try {
let res = await handleManifestRequest(_build, routes, url);
return res;
} catch (e) {
handleError(e);
return new Response("Unknown Server Error", {
status: 500
});
}
}
let matches = routeMatching.matchServerRoutes(routes, url.pathname, _build.basename);
if (matches && matches.length > 0) {
Object.assign(params, matches[0].params);
}
let response;
if (url.searchParams.has("_data")) {
if (_build.future.unstable_singleFetch) {
handleError(new Error("Warning: Single fetch-enabled apps should not be making ?_data requests, " + "this is likely to break in the future"));
}
let routeId = url.searchParams.get("_data");
response = await handleDataRequestRR(serverMode, _build, staticHandler, routeId, request, loadContext, handleError);
response = await handleDataRequest(serverMode, _build, staticHandler, routeId, request, loadContext, handleError);
if (_build.entry.module.handleDataRequest) {
var _matches$find;
response = await _build.entry.module.handleDataRequest(response, {
context: loadContext,
params: (matches === null || matches === void 0 ? void 0 : (_matches$find = matches.find(m => m.route.id == routeId)) === null || _matches$find === void 0 ? void 0 : _matches$find.params) || {},
params,
request
});
if (responses.isRedirectResponse(response)) {
response = createRemixRedirectResponse(response, _build.basename);
}
}
} else if (_build.future.unstable_singleFetch && url.pathname.endsWith(".data")) {
let handlerUrl = new URL(request.url);
handlerUrl.pathname = handlerUrl.pathname.replace(/\.data$/, "").replace(/^\/_root$/, "/");
let singleFetchMatches = routeMatching.matchServerRoutes(routes, handlerUrl.pathname, _build.basename);
response = await handleSingleFetchRequest(serverMode, _build, staticHandler, request, handlerUrl, loadContext, handleError);
if (_build.entry.module.handleDataRequest) {
response = await _build.entry.module.handleDataRequest(response, {
context: loadContext,
params: singleFetchMatches ? singleFetchMatches[0].params : {},
request
});
if (responses.isRedirectResponse(response)) {
let result = singleFetch.getSingleFetchRedirect(response.status, response.headers, _build.basename);
if (request.method === "GET") {
result = {
[singleFetch.SingleFetchRedirectSymbol]: result
};
}
let headers = new Headers(response.headers);
headers.set("Content-Type", "text/x-turbo");
return new Response(singleFetch.encodeViaTurboStream(result, request.signal, _build.entry.module.streamTimeout, serverMode), {
status: singleFetch.SINGLE_FETCH_REDIRECT_STATUS,
headers
});
}
}
} else if (matches && matches[matches.length - 1].route.module.default == null && matches[matches.length - 1].route.module.ErrorBoundary == null) {
response = await handleResourceRequestRR(serverMode, staticHandler, matches.slice(-1)[0].route.id, request, loadContext, handleError);
response = await handleResourceRequest(serverMode, _build, staticHandler, matches.slice(-1)[0].route.id, request, loadContext, handleError);
} else {
var _getDevServerHooks2, _getDevServerHooks2$g;
let criticalCss = mode$1 === mode.ServerMode.Development ? await ((_getDevServerHooks2 = dev.getDevServerHooks()) === null || _getDevServerHooks2 === void 0 ? void 0 : (_getDevServerHooks2$g = _getDevServerHooks2.getCriticalCss) === null || _getDevServerHooks2$g === void 0 ? void 0 : _getDevServerHooks2$g.call(_getDevServerHooks2, _build, url.pathname)) : undefined;
response = await handleDocumentRequestRR(serverMode, _build, staticHandler, request, loadContext, handleError, criticalCss);
response = await handleDocumentRequest(serverMode, _build, staticHandler, request, loadContext, handleError, criticalCss);
}

@@ -123,3 +175,25 @@ if (request.method === "HEAD") {

};
async function handleDataRequestRR(serverMode, build, staticHandler, routeId, request, loadContext, handleError) {
async function handleManifestRequest(build, routes, url) {
let patches = {};
if (url.searchParams.has("p")) {
for (let path of url.searchParams.getAll("p")) {
let matches = routeMatching.matchServerRoutes(routes, path, build.basename);
if (matches) {
for (let match of matches) {
let routeId = match.route.id;
patches[routeId] = build.assets.routes[routeId];
}
}
}
return responses.json(patches, {
headers: {
"Cache-Control": "public, max-age=31536000, immutable"
}
}); // Override the TypedResponse stuff from json()
}
return new Response("Invalid Request", {
status: 400
});
}
async function handleDataRequest(serverMode, build, staticHandler, routeId, request, loadContext, handleError) {
try {

@@ -131,17 +205,3 @@ let response = await staticHandler.queryRoute(request, {

if (responses.isRedirectResponse(response)) {
// We don't have any way to prevent a fetch request from following
// redirects. So we use the `X-Remix-Redirect` header to indicate the
// next URL, and then "follow" the redirect manually on the client.
let headers = new Headers(response.headers);
let redirectUrl = headers.get("Location");
headers.set("X-Remix-Redirect", build.basename ? router.stripBasename(redirectUrl, build.basename) || redirectUrl : redirectUrl);
headers.set("X-Remix-Status", response.status);
headers.delete("Location");
if (response.headers.get("Set-Cookie") !== null) {
headers.set("X-Remix-Revalidate", "yes");
}
return new Response(null, {
status: 204,
headers
});
return createRemixRedirectResponse(response, build.basename);
}

@@ -163,13 +223,11 @@ if (router.UNSAFE_DEFERRED_SYMBOL in response) {

// network errors that are missing this header
response.headers.set("X-Remix-Response", "yes");
response = safelySetHeader(response, "X-Remix-Response", "yes");
return response;
} catch (error) {
if (responses.isResponse(error)) {
error.headers.set("X-Remix-Catch", "yes");
return error;
let response = safelySetHeader(error, "X-Remix-Catch", "yes");
return response;
}
if (router.isRouteErrorResponse(error)) {
if (error) {
handleError(error);
}
handleError(error);
return errorResponseToJson(error, serverMode);

@@ -187,3 +245,23 @@ }

}
async function handleDocumentRequestRR(serverMode, build, staticHandler, request, loadContext, handleError, criticalCss) {
async function handleSingleFetchRequest(serverMode, build, staticHandler, request, handlerUrl, loadContext, handleError) {
let {
result,
headers,
status
} = request.method !== "GET" ? await singleFetch.singleFetchAction(build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError) : await singleFetch.singleFetchLoaders(build, serverMode, staticHandler, request, handlerUrl, loadContext, handleError);
// Mark all successful responses with a header so we can identify in-flight
// network errors that are missing this header
let resultHeaders = new Headers(headers);
resultHeaders.set("X-Remix-Response", "yes");
resultHeaders.set("Content-Type", "text/x-turbo");
// Note: Deferred data is already just Promises, so we don't have to mess
// `activeDeferreds` or anything :)
return new Response(singleFetch.encodeViaTurboStream(result, request.signal, build.entry.module.streamTimeout, serverMode), {
status: status || 200,
headers: resultHeaders
});
}
async function handleDocumentRequest(serverMode, build, staticHandler, request, loadContext, handleError, criticalCss) {
let context;

@@ -203,2 +281,3 @@ try {

}
let headers$1 = headers.getDocumentHeaders(build, context);

@@ -208,3 +287,3 @@ // Sanitize errors outside of development environments

Object.values(context.errors).forEach(err => {
// @ts-expect-error This is "private" from users but intended for internal use
// @ts-expect-error `err.error` is "private" from users but intended for internal use
if (!router.isRouteErrorResponse(err) || err.error) {

@@ -216,3 +295,11 @@ handleError(err);

}
let headers$1 = headers.getDocumentHeadersRR(build, context);
// Server UI state to send to the client.
// - When single fetch is enabled, this is streamed down via `serverHandoffStream`
// - Otherwise it's stringified into `serverHandoffString`
let state = {
loaderData: context.loaderData,
actionData: context.actionData,
errors: errors.serializeErrors(context.errors, serverMode)
};
let entryContext = {

@@ -227,10 +314,12 @@ manifest: build.assets,

criticalCss,
state: {
loaderData: context.loaderData,
actionData: context.actionData,
errors: errors.serializeErrors(context.errors, serverMode)
},
future: build.future,
isSpaMode: build.isSpaMode
isSpaMode: build.isSpaMode,
...(!build.future.unstable_singleFetch ? {
state
} : null)
}),
...(build.future.unstable_singleFetch ? {
serverHandoffStream: singleFetch.encodeViaTurboStream(state, request.signal, build.entry.module.streamTimeout, serverMode),
renderMeta: {}
} : null),
future: build.future,

@@ -250,16 +339,4 @@ isSpaMode: build.isSpaMode,

if (responses.isResponse(error)) {
let data;
try {
let contentType = error.headers.get("Content-Type");
// Check between word boundaries instead of startsWith() due to the last
// paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type
if (contentType && /\bapplication\/json\b/.test(contentType)) {
if (error.body == null) {
data = null;
} else {
data = await error.json();
}
} else {
data = await error.text();
}
let data = await unwrapResponse(error);
errorForSecondRender = new router.UNSAFE_ErrorResponseImpl(error.status, error.statusText, data);

@@ -279,3 +356,11 @@ } catch (e) {

// Update entryContext for the second render pass
// Get a new entryContext for the second render pass
// Server UI state to send to the client.
// - When single fetch is enabled, this is streamed down via `serverHandoffStream`
// - Otherwise it's stringified into `serverHandoffString`
let state = {
loaderData: context.loaderData,
actionData: context.actionData,
errors: errors.serializeErrors(context.errors, serverMode)
};
entryContext = {

@@ -287,10 +372,12 @@ ...entryContext,

basename: build.basename,
state: {
loaderData: context.loaderData,
actionData: context.actionData,
errors: errors.serializeErrors(context.errors, serverMode)
},
future: build.future,
isSpaMode: build.isSpaMode
})
isSpaMode: build.isSpaMode,
...(!build.future.unstable_singleFetch ? {
state
} : null)
}),
...(build.future.unstable_singleFetch ? {
serverHandoffStream: singleFetch.encodeViaTurboStream(state, request.signal, build.entry.module.streamTimeout, serverMode),
renderMeta: {}
} : null)
};

@@ -305,3 +392,3 @@ try {

}
async function handleResourceRequestRR(serverMode, staticHandler, routeId, request, loadContext, handleError) {
async function handleResourceRequest(serverMode, build, staticHandler, routeId, request, loadContext, handleError) {
try {

@@ -315,4 +402,12 @@ // Note we keep the routeId here to align with the Remix handling of

});
invariant["default"](!(router.UNSAFE_DEFERRED_SYMBOL in response), `You cannot return a \`defer()\` response from a Resource Route. Did you ` + `forget to export a default UI component from the "${routeId}" route?`);
// callRouteLoader/callRouteAction always return responses
if (typeof response === "object" && response !== null) {
invariant["default"](!(router.UNSAFE_DEFERRED_SYMBOL in response), `You cannot return a \`defer()\` response from a Resource Route. Did you ` + `forget to export a default UI component from the "${routeId}" route?`);
}
if (build.future.unstable_singleFetch && !responses.isResponse(response)) {
console.warn(deprecations.resourceRouteJsonWarning(request.method === "GET" ? "loader" : "action", routeId));
response = responses.json(response);
}
// callRouteLoader/callRouteAction always return responses (w/o single fetch).
// With single fetch, users should always be Responses from resource routes
invariant["default"](responses.isResponse(response), "Expected a Response to be returned from queryRoute");

@@ -324,4 +419,4 @@ return response;

// match identically to what Remix returns
error.headers.set("X-Remix-Catch", "yes");
return error;
let response = safelySetHeader(error, "X-Remix-Catch", "yes");
return response;
}

@@ -363,3 +458,42 @@ if (router.isRouteErrorResponse(error)) {

}
function unwrapResponse(response) {
let contentType = response.headers.get("Content-Type");
// Check between word boundaries instead of startsWith() due to the last
// paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type
return contentType && /\bapplication\/json\b/.test(contentType) ? response.body == null ? null : response.json() : response.text();
}
function createRemixRedirectResponse(response, basename) {
// We don't have any way to prevent a fetch request from following
// redirects. So we use the `X-Remix-Redirect` header to indicate the
// next URL, and then "follow" the redirect manually on the client.
let headers = new Headers(response.headers);
let redirectUrl = headers.get("Location");
headers.set("X-Remix-Redirect", basename ? router.stripBasename(redirectUrl, basename) || redirectUrl : redirectUrl);
headers.set("X-Remix-Status", String(response.status));
headers.delete("Location");
if (response.headers.get("Set-Cookie") !== null) {
headers.set("X-Remix-Revalidate", "yes");
}
return new Response(null, {
status: 204,
headers
});
}
// Anytime we are setting a header on a `Response` created in the loader/action,
// we have to so it in this manner since in an `undici` world, if the `Response`
// came directly from a `fetch` call, the headers are immutable will throw if
// we try to set a new header. This is a sort of shallow clone of the `Response`
// so we can safely set our own header.
function safelySetHeader(response, name, value) {
let headers = new Headers(response.headers);
headers.set(name, value);
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers,
duplex: response.body ? "half" : undefined
});
}
exports.createRequestHandler = createRequestHandler;

@@ -5,3 +5,3 @@ import type { HydrationState } from "@remix-run/router";

export declare function createServerHandoffString<T>(serverHandoff: {
state: ValidateShape<T, HydrationState>;
state?: ValidateShape<T, HydrationState>;
criticalCss?: string;

@@ -8,0 +8,0 @@ url: string;

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

@@ -1,2 +0,2 @@

import type { UploadHandler } from "@remix-run/server-runtime";
import type { UploadHandler } from "../formData";
export type MemoryUploadHandlerFilterArgs = {

@@ -3,0 +3,0 @@ filename?: string;

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

/**
* @remix-run/server-runtime v0.0.0-nightly-df59cc6-20240229
* @remix-run/server-runtime v0.0.0-nightly-dfc3401f7-20240815
*

@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc.

{
"name": "@remix-run/server-runtime",
"version": "0.0.0-nightly-df59cc6-20240229",
"version": "0.0.0-nightly-dfc3401f7-20240815",
"description": "Server runtime for Remix",

@@ -19,3 +19,3 @@ "bugs": {

"dependencies": {
"@remix-run/router": "1.15.2",
"@remix-run/router": "1.19.1-pre.0",
"@types/cookie": "^0.6.0",

@@ -25,3 +25,4 @@ "@web3-storage/multipart-parser": "^1.0.0",

"set-cookie-parser": "^2.4.8",
"source-map": "^0.7.3"
"source-map": "^0.7.3",
"turbo-stream": "2.3.0"
},

@@ -48,3 +49,6 @@ "devDependencies": {

"README.md"
]
}
],
"scripts": {
"tsc": "tsc"
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc