@expo/cli
Version:
137 lines (136 loc) • 5.17 kB
JavaScript
/**
* Copyright © 2022 650 Industries.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "createRouteHandlerMiddleware", {
enumerable: true,
get: ()=>createRouteHandlerMiddleware
});
function _resolve() {
const data = /*#__PURE__*/ _interopRequireDefault(require("resolve"));
_resolve = function() {
return data;
};
return data;
}
function _resolveFrom() {
const data = /*#__PURE__*/ _interopRequireDefault(require("resolve-from"));
_resolveFrom = function() {
return data;
};
return data;
}
function _util() {
const data = require("util");
_util = function() {
return data;
};
return data;
}
const _fetchRouterManifest = require("./fetchRouterManifest");
const _metroErrorInterface = require("./metroErrorInterface");
const _router = require("./router");
const _errors = require("../../../utils/errors");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debug = require("debug")("expo:start:server:metro");
const resolveAsync = (0, _util().promisify)(_resolve().default);
function createRouteHandlerMiddleware(projectRoot, options) {
if (!_resolveFrom().default.silent(projectRoot, "expo-router")) {
throw new _errors.CommandError("static and server rendering requires the expo-router package to be installed in your project.");
}
const { createRequestHandler } = require("@expo/server/build/vendor/http");
return createRequestHandler({
build: ""
}, {
async getRoutesManifest () {
const manifest = await (0, _fetchRouterManifest.fetchManifest)(projectRoot, options);
debug("manifest", manifest);
// NOTE: no app dir if null
// TODO: Redirect to 404 page
return manifest != null ? manifest : {
// Support the onboarding screen if there's no manifest
htmlRoutes: [
{
file: "index.js",
page: "/index",
routeKeys: {},
namedRegex: /^\/(?:index)?\/?$/i
},
],
apiRoutes: [],
notFoundRoutes: []
};
},
async getHtml (request) {
try {
const { content } = await options.getStaticPageAsync(request.url);
return content;
} catch (error) {
// Forward the Metro server response as-is. It won't be pretty, but at least it will be accurate.
try {
return new Response(await (0, _metroErrorInterface.getErrorOverlayHtmlAsync)({
error,
projectRoot,
routerRoot: options.routerRoot
}), {
status: 500,
headers: {
"Content-Type": "text/html"
}
});
} catch (staticError) {
debug("Failed to render static error overlay:", staticError);
// Fallback error for when Expo Router is misconfigured in the project.
return new Response("<span><h3>Internal Error:</h3><b>Project is not setup correctly for static rendering (check terminal for more info):</b><br/>" + error.message + "<br/><br/>" + staticError.message + "</span>", {
status: 500,
headers: {
"Content-Type": "text/html"
}
});
}
}
},
logApiRouteExecutionError (error) {
(0, _metroErrorInterface.logMetroError)(projectRoot, {
error
});
},
async getApiRoute (route) {
var ref;
const { exp } = options.config;
if (((ref = exp.web) == null ? void 0 : ref.output) !== "server") {
(0, _router.warnInvalidWebOutput)();
}
const resolvedFunctionPath = await resolveAsync(route.file, {
extensions: [
".js",
".jsx",
".ts",
".tsx"
],
basedir: options.appDir
});
try {
debug(`Bundling middleware at: ${resolvedFunctionPath}`);
return await options.bundleApiRoute(resolvedFunctionPath);
} catch (error) {
return new Response("Failed to load API Route: " + resolvedFunctionPath + "\n\n" + error.message, {
status: 500,
headers: {
"Content-Type": "text/html"
}
});
}
}
});
}
//# sourceMappingURL=createServerRouteMiddleware.js.map