first commit

This commit is contained in:
2026-03-10 16:18:05 +00:00
commit 11f9c069b5
31635 changed files with 3187747 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
import type { Manifest, MiddlewareInfo, Route } from '../../manifest';
interface EnvironmentInput {
readText(request: string): Promise<string | null>;
readJson(request: string): Promise<unknown>;
loadModule(request: string): Promise<unknown>;
isDevelopment: boolean;
}
export interface CommonEnvironment {
getRoutesManifest(): Promise<Manifest | null>;
getHtml(request: Request, route: Route): Promise<string | Response | null>;
getApiRoute(route: Route): Promise<unknown>;
getMiddleware(middleware: MiddlewareInfo): Promise<any>;
getLoaderData(request: Request, route: Route): Promise<Response>;
preload(): Promise<void>;
}
export declare function createEnvironment(input: EnvironmentInput): CommonEnvironment;
export {};

View File

@@ -0,0 +1,171 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createEnvironment = createEnvironment;
const ImmutableRequest_1 = require("../../ImmutableRequest");
const matchers_1 = require("../../utils/matchers");
function initManifestRegExp(manifest) {
return {
...manifest,
htmlRoutes: manifest.htmlRoutes?.map((route) => ({
...route,
namedRegex: new RegExp(route.namedRegex),
})) ?? [],
apiRoutes: manifest.apiRoutes?.map((route) => ({
...route,
namedRegex: new RegExp(route.namedRegex),
})) ?? [],
notFoundRoutes: manifest.notFoundRoutes?.map((route) => ({
...route,
namedRegex: new RegExp(route.namedRegex),
})) ?? [],
redirects: manifest.redirects?.map((route) => ({
...route,
namedRegex: new RegExp(route.namedRegex),
})) ?? [],
rewrites: manifest.rewrites?.map((route) => ({
...route,
namedRegex: new RegExp(route.namedRegex),
})) ?? [],
};
}
function createEnvironment(input) {
// Cached manifest and SSR renderer, initialized on first request
let cachedManifest;
let ssrRenderer = null;
async function getRoutesManifest() {
if (cachedManifest === undefined || input.isDevelopment) {
const json = await input.readJson('_expo/routes.json');
cachedManifest = json ? initManifestRegExp(json) : null;
}
return cachedManifest;
}
async function getServerRenderer() {
if (ssrRenderer && !input.isDevelopment) {
return ssrRenderer;
}
const manifest = await getRoutesManifest();
if (manifest?.rendering?.mode !== 'ssr') {
return null;
}
// If `manifest.rendering.mode === 'ssr'`, we always expect the SSR rendering module to be
// available
const ssrModule = (await input.loadModule(manifest.rendering.file));
if (!ssrModule) {
throw new Error(`SSR module not found at: ${manifest.rendering.file}`);
}
const topLevelAssets = manifest.assets;
ssrRenderer = async (request, options) => {
const url = new URL(request.url);
const location = new URL(url.pathname + url.search, url.origin);
const assets = mergeAssets(topLevelAssets, options?.assets);
return ssrModule.getStaticContent(location, {
loader: options?.loader,
request,
assets,
});
};
return ssrRenderer;
}
async function executeLoader(request, route, params) {
if (!route.loader) {
return undefined;
}
const loaderModule = (await input.loadModule(route.loader));
if (!loaderModule) {
throw new Error(`Loader module not found at: ${route.loader}`);
}
return loaderModule.loader(new ImmutableRequest_1.ImmutableRequest(request), params);
}
return {
getRoutesManifest,
async getHtml(request, route) {
// SSR path: Render at runtime if SSR module is available
const renderer = await getServerRenderer();
if (renderer) {
let renderOptions = { assets: route.assets };
try {
if (route.loader) {
const params = (0, matchers_1.parseParams)(request, route);
const result = await executeLoader(request, route, params);
const data = (0, matchers_1.isResponse)(result) ? await result.json() : result;
renderOptions = {
assets: route.assets,
loader: {
data: data ?? null,
key: (0, matchers_1.resolveLoaderContextKey)(route.page, params),
},
};
}
return await renderer(request, renderOptions);
}
catch (error) {
console.error('SSR render error:', error);
throw error;
}
}
// SSG fallback: Read pre-rendered HTML from disk
let html;
if ((html = await input.readText(route.page + '.html')) != null) {
return html;
}
// Serve a static file by route name with hoisted index
// See: https://github.com/expo/expo/pull/27935
const INDEX_PATH = '/index';
if (route.page.endsWith(INDEX_PATH) && route.page.length > INDEX_PATH.length) {
const page = route.page.slice(0, -INDEX_PATH.length);
if ((html = await input.readText(page + '.html')) != null) {
return html;
}
}
return null;
},
async getApiRoute(route) {
return input.loadModule(route.file);
},
async getMiddleware(middleware) {
const mod = (await input.loadModule(middleware.file));
if (typeof mod?.default !== 'function') {
return null;
}
return mod;
},
async getLoaderData(request, route) {
const params = (0, matchers_1.parseParams)(request, route);
const result = await executeLoader(request, route, params);
if ((0, matchers_1.isResponse)(result)) {
return result;
}
return Response.json(result ?? null);
},
async preload() {
if (input.isDevelopment) {
return;
}
const manifest = await getRoutesManifest();
if (manifest) {
const requests = [];
if (manifest.middleware)
requests.push(manifest.middleware.file);
if (manifest.rendering)
requests.push(manifest.rendering.file);
for (const apiRoute of manifest.apiRoutes)
requests.push(apiRoute.file);
for (const htmlRoute of manifest.htmlRoutes) {
if (htmlRoute.loader)
requests.push(htmlRoute.loader);
}
await Promise.all(requests.map((request) => input.loadModule(request)));
}
},
};
}
/**
* Merges top-level assets with per-route async chunk assets. Top-level assets come first
*/
function mergeAssets(topLevel, routeLevel) {
return {
css: [...(topLevel?.css ?? []), ...(routeLevel?.css ?? [])],
js: [...(topLevel?.js ?? []), ...(routeLevel?.js ?? [])],
};
}
//# sourceMappingURL=common.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
import { type CommonEnvironment } from './common';
import type { ScopeDefinition } from '../../runtime/scope';
interface NodeEnvParams {
build: string;
environment?: string | null;
isDevelopment?: boolean;
}
export declare function createNodeEnv(params: NodeEnvParams): CommonEnvironment;
export declare function createNodeRequestScope(scopeDefinition: ScopeDefinition, params: NodeEnvParams): (fn: (request: Request) => Promise<Response>, request: Request) => Promise<Response>;
export {};

View File

@@ -0,0 +1,66 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createNodeEnv = createNodeEnv;
exports.createNodeRequestScope = createNodeRequestScope;
const node_fs_1 = __importDefault(require("node:fs"));
const node_path_1 = __importDefault(require("node:path"));
const common_1 = require("./common");
const ImmutableRequest_1 = require("../../ImmutableRequest");
const runtime_1 = require("../../runtime");
function createNodeEnv(params) {
(0, ImmutableRequest_1.assertRuntimeFetchAPISupport)();
async function readText(request) {
const filePath = node_path_1.default.join(params.build, request);
if (!node_fs_1.default.existsSync(filePath)) {
return null;
}
try {
return await node_fs_1.default.promises.readFile(filePath, 'utf-8');
}
catch {
return null;
}
}
async function readJson(request) {
const json = await readText(request);
return json != null ? JSON.parse(json) : null;
}
async function loadModule(request) {
const filePath = node_path_1.default.join(params.build, request);
if (!node_fs_1.default.existsSync(filePath)) {
return null;
}
else if (/\.c?js$/.test(filePath)) {
return require(filePath);
}
else {
return await import(filePath);
}
}
return (0, common_1.createEnvironment)({
readText,
readJson,
loadModule,
isDevelopment: params.isDevelopment ?? false,
});
}
const getRequestURLOrigin = (request) => {
try {
// NOTE: We don't trust any headers on incoming requests in "raw" environments
return new URL(request.url).origin || null;
}
catch {
return null;
}
};
function createNodeRequestScope(scopeDefinition, params) {
return (0, runtime_1.createRequestScope)(scopeDefinition, (request) => ({
requestHeaders: request.headers,
origin: getRequestURLOrigin(request),
environment: params.environment ?? process.env.NODE_ENV,
}));
}
//# sourceMappingURL=node.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../src/vendor/environment/node.ts"],"names":[],"mappings":";;;;;AAcA,sCAqCC;AAWD,wDAMC;AApED,sDAAyB;AACzB,0DAA6B;AAE7B,qCAAqE;AACrE,6DAAsE;AACtE,2CAAmD;AASnD,SAAgB,aAAa,CAAC,MAAqB;IACjD,IAAA,+CAA4B,GAAE,CAAC;IAE/B,KAAK,UAAU,QAAQ,CAAC,OAAe;QACrC,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,UAAU,QAAQ,CAAC,OAAe;QACrC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,OAAe;QACvC,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,IAAA,0BAAiB,EAAC;QACvB,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,KAAK;KAC7C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC/C,IAAI,CAAC;QACH,8EAA8E;QAC9E,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,SAAgB,sBAAsB,CAAC,eAAgC,EAAE,MAAqB;IAC5F,OAAO,IAAA,4BAAkB,EAAC,eAAe,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,CAAC;QAChE,cAAc,EAAE,OAAO,CAAC,OAAO;QAC/B,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC;QACpC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;KACxD,CAAC,CAAC,CAAC;AACN,CAAC"}

View File

@@ -0,0 +1,14 @@
import { type CommonEnvironment } from './common';
import type { ScopeDefinition } from '../../runtime/scope';
interface WorkerdEnvParams {
build?: string;
environment?: string | null;
isDevelopment?: boolean;
}
export declare function createWorkerdEnv(params: WorkerdEnvParams): CommonEnvironment;
export interface ExecutionContext {
waitUntil?(promise: Promise<any>): void;
props?: any;
}
export declare function createWorkerdRequestScope<Env = unknown>(scopeDefinition: ScopeDefinition, params: WorkerdEnvParams): (fn: (request: Request, _env: Env, ctx: ExecutionContext) => Promise<Response>, request: Request, _env: Env, ctx: ExecutionContext) => Promise<Response>;
export {};

View File

@@ -0,0 +1,83 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createWorkerdEnv = createWorkerdEnv;
exports.createWorkerdRequestScope = createWorkerdRequestScope;
const common_1 = require("./common");
const runtime_1 = require("../../runtime");
const createCachedImport = () => {
const importCache = new Map();
return async function importCached(request) {
let result = importCache.get(request);
if (!result) {
try {
result = { type: 'success', value: await import(request) };
}
catch (error) {
result = { type: 'error', value: error };
}
importCache.set(request, result);
}
if (result.type === 'success') {
return result.value;
}
else {
throw result.value;
}
};
};
function createWorkerdEnv(params) {
const build = params.build || '.';
const importCached = createCachedImport();
async function readText(request) {
try {
const mod = await importCached(`${build}/${request}`);
return mod.default;
}
catch {
return null;
}
}
async function readJson(request) {
try {
const mod = await importCached(`${build}/${request}`);
if (typeof mod.default === 'string' && mod.default[0] === '{') {
return JSON.parse(mod.default);
}
else {
return mod.default;
}
}
catch {
return null;
}
}
async function loadModule(request) {
const target = `${build}/${request}`;
return (await import(target)).default;
}
return (0, common_1.createEnvironment)({
readText,
readJson,
loadModule,
isDevelopment: params.isDevelopment ?? false,
});
}
const getRequestURLOrigin = (request) => {
try {
// NOTE: We don't trust any headers on incoming requests in "raw" environments
return new URL(request.url).origin || null;
}
catch {
return null;
}
};
function createWorkerdRequestScope(scopeDefinition, params) {
const makeRequestAPISetup = (request, _env, ctx) => ({
requestHeaders: request.headers,
origin: getRequestURLOrigin(request),
environment: params.environment ?? null,
waitUntil: ctx.waitUntil?.bind(ctx),
});
return (0, runtime_1.createRequestScope)(scopeDefinition, makeRequestAPISetup);
}
//# sourceMappingURL=workerd.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"workerd.js","sourceRoot":"","sources":["../../../../src/vendor/environment/workerd.ts"],"names":[],"mappings":"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"}