one
Version:
One is a new React Framework that makes Vite serve both native and web.
247 lines (244 loc) • 13.3 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf, __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: !0 });
}, __copyProps = (to, from, except, desc) => {
if (from && typeof from == "object" || typeof from == "function")
for (let key of __getOwnPropNames(from))
!__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: !0 }) : target,
mod
)), __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod);
var oneServe_exports = {};
__export(oneServe_exports, {
oneServe: () => oneServe
});
module.exports = __toCommonJS(oneServe_exports);
var import_fs_extra = __toESM(require("fs-extra"), 1), import_node_path = require("node:path"), import_serve = require("vxrn/serve"), import_constants = require("../constants"), import_createHandleRequest = require("../createHandleRequest"), import_cleanUrl = require("../utils/cleanUrl"), import_toAbsolute = require("../utils/toAbsolute"), import_vxrn = require("vxrn"), import_isRolldown = require("../utils/isRolldown");
async function oneServe(oneOptions, buildInfo, app) {
var _oneOptions_web, _oneOptions_build_api, _oneOptions_build, { resolveAPIRoute, resolveLoaderRoute, resolvePageRoute } = await import("../createHandleRequest"), { isResponse } = await import("../utils/isResponse"), { isStatusRedirect } = await import("../utils/isStatus"), isAPIRequest = /* @__PURE__ */ new WeakMap(), redirects = (_oneOptions_web = oneOptions.web) === null || _oneOptions_web === void 0 ? void 0 : _oneOptions_web.redirects;
if (redirects) {
var _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0;
try {
for (var _loop = function() {
var redirect = _step.value;
app.get(redirect.source, function(context) {
var destinationUrl = redirect.destination.replace(/:\w+/g, function(param) {
var paramName = param.substring(1);
return context.req.param(paramName) || "";
});
return context.redirect(destinationUrl, redirect.permanent ? 301 : 302);
});
}, _iterator = redirects[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) _loop();
} catch (err) {
_didIteratorError = !0, _iteratorError = err;
} finally {
try {
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
} finally {
if (_didIteratorError)
throw _iteratorError;
}
}
}
if (!buildInfo)
throw new Error("No build info found, have you run build?");
var { routeToBuildInfo, routeMap } = buildInfo, serverOptions = {
...oneOptions,
root: "."
}, entryServer = (0, import_serve.getServerEntry)(serverOptions), entry = await import(entryServer), render = entry.default.render, apiCJS = ((_oneOptions_build = oneOptions.build) === null || _oneOptions_build === void 0 || (_oneOptions_build_api = _oneOptions_build.api) === null || _oneOptions_build_api === void 0 ? void 0 : _oneOptions_build_api.outputFormat) === "cjs", useRolldown = await (0, import_isRolldown.isRolldown)(), requestHandlers = {
async handleAPI(param) {
var { route: route2 } = param, fileName = useRolldown ? route2.page.slice(1) : (
// rolldown doesn't replace brackets
route2.page.slice(1).replace(/\[/g, "_").replace(/\]/g, "_")
), apiFile = (0, import_node_path.join)(process.cwd(), "dist", "api", fileName + (apiCJS ? ".cjs" : ".js"));
return await import(apiFile);
},
async loadMiddleware(route2) {
return await import((0, import_toAbsolute.toAbsolute)(route2.contextKey));
},
async handleLoader(param) {
var { request, route: route2, url, loaderProps } = param, exports2 = await import((0, import_toAbsolute.toAbsolute)((0, import_node_path.join)("./", "dist/server", route2.file))), { loader } = exports2;
if (!loader)
return console.warn("No loader found in exports", route2.file), null;
var json = await loader(loaderProps);
return `export function loader() { return ${JSON.stringify(json)} }`;
},
async handlePage(param) {
var { route: route2, url, loaderProps } = param, _$buildInfo = routeToBuildInfo[route2.file];
if (route2.type === "ssr") {
if (!_$buildInfo)
throw console.error("Error in route", route2), new Error(`No buildinfo found for ${url}, route: ${route2.file}, in keys:
${Object.keys(routeToBuildInfo).join(`
`)}`);
try {
var _exported_loader, exported = await import((0, import_toAbsolute.toAbsolute)(_$buildInfo.serverJsPath)), loaderData = await ((_exported_loader = exported.loader) === null || _exported_loader === void 0 ? void 0 : _exported_loader.call(exported, loaderProps)), preloads2 = _$buildInfo.preloads, headers = new Headers();
headers.set("content-type", "text/html");
var rendered = await render({
mode: route2.type,
loaderData,
loaderProps,
path: (loaderProps == null ? void 0 : loaderProps.path) || "/",
preloads: preloads2,
css: _$buildInfo.css
});
return new Response(rendered, {
headers,
status: route2.isNotFound ? 404 : 200
});
} catch (err) {
var _err_stack;
console.error(`[one] Error rendering SSR route ${route2.file}
${(_err_stack = err == null ? void 0 : err.stack) !== null && _err_stack !== void 0 ? _err_stack : err}
url: ${url}`);
}
} else {
var htmlPath = routeMap[url.pathname] || routeMap[_$buildInfo == null ? void 0 : _$buildInfo.cleanPath];
if (htmlPath) {
var html = await import_fs_extra.default.readFile((0, import_node_path.join)("dist/client", htmlPath), "utf-8"), headers1 = new Headers();
return headers1.set("content-type", "text/html"), new Response(html, {
headers: headers1,
status: route2.isNotFound ? 404 : 200
});
}
}
}
};
function createHonoHandler(route2) {
return async function(context, next) {
try {
var request = context.req.raw;
if (route2.page.endsWith("/+not-found") || Reflect.ownKeys(route2.routeKeys).length > 0) {
var staticAssetResponse = await (0, import_vxrn.serveStaticAssets)({
context
});
if (staticAssetResponse)
return await (0, import_createHandleRequest.runMiddlewares)(requestHandlers, request, route2, async function() {
return staticAssetResponse;
});
}
if ((0, import_node_path.extname)(request.url) === ".js" || (0, import_node_path.extname)(request.url) === ".css")
return next();
var url = (0, import_createHandleRequest.getURLfromRequestURL)(request), response = await function() {
if (url.pathname.endsWith(import_constants.LOADER_JS_POSTFIX_UNCACHED)) {
var originalUrl = (0, import_cleanUrl.getPathFromLoaderPath)(url.pathname), finalUrl = new URL(originalUrl, url.origin);
return resolveLoaderRoute(requestHandlers, request, finalUrl, route2);
}
switch (route2.type) {
case "api":
return resolveAPIRoute(requestHandlers, request, url, route2);
case "ssg":
case "spa":
case "ssr":
return resolvePageRoute(requestHandlers, request, url, route2);
}
}();
if (response) {
if (isResponse(response)) {
if (isStatusRedirect(response.status)) {
var location = `${response.headers.get("location") || ""}`;
return response.headers.forEach(function(value, key) {
context.header(key, value);
}), context.redirect(location, response.status);
}
if (isAPIRequest.get(request))
try {
return !response.headers.has("cache-control") && !response.headers.has("Cache-Control") && response.headers.set("cache-control", "no-store"), response;
} catch (err) {
console.info(`Error updating cache header on api route "${context.req.path}" to no-store, it is ${response.headers.get("cache-control")}, continue`, err);
}
return response;
}
return next();
}
} catch (err) {
console.error(` [one] Error handling request: ${err.stack}`);
}
return next();
};
}
var compiledManifest = (0, import_createHandleRequest.compileManifest)(buildInfo.manifest), _iteratorNormalCompletion1 = !0, _didIteratorError1 = !1, _iteratorError1 = void 0;
try {
for (var _iterator1 = compiledManifest.apiRoutes[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) {
var route = _step1.value;
app.get(route.urlPath, createHonoHandler(route)), app.put(route.urlPath, createHonoHandler(route)), app.post(route.urlPath, createHonoHandler(route)), app.delete(route.urlPath, createHonoHandler(route)), app.patch(route.urlPath, createHonoHandler(route)), route.urlPath !== route.urlCleanPath && (app.get(route.urlCleanPath, createHonoHandler(route)), app.put(route.urlCleanPath, createHonoHandler(route)), app.post(route.urlCleanPath, createHonoHandler(route)), app.delete(route.urlCleanPath, createHonoHandler(route)), app.patch(route.urlCleanPath, createHonoHandler(route)));
}
} catch (err) {
_didIteratorError1 = !0, _iteratorError1 = err;
} finally {
try {
!_iteratorNormalCompletion1 && _iterator1.return != null && _iterator1.return();
} finally {
if (_didIteratorError1)
throw _iteratorError1;
}
}
var _iteratorNormalCompletion2 = !0, _didIteratorError2 = !1, _iteratorError2 = void 0;
try {
for (var _iterator2 = compiledManifest.pageRoutes[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) {
var route1 = _step2.value;
app.get(route1.urlPath, createHonoHandler(route1)), route1.urlPath !== route1.urlCleanPath && app.get(route1.urlCleanPath, createHonoHandler(route1));
}
} catch (err) {
_didIteratorError2 = !0, _iteratorError2 = err;
} finally {
try {
!_iteratorNormalCompletion2 && _iterator2.return != null && _iterator2.return();
} finally {
if (_didIteratorError2)
throw _iteratorError2;
}
}
var { preloads } = buildInfo;
app.get("*", async function(c, next) {
if (c.req.path.endsWith(import_constants.PRELOAD_JS_POSTFIX) && !preloads[c.req.path])
return c.header("Content-Type", "text/javascript"), c.status(200), c.body("");
if (c.req.path.endsWith(import_constants.LOADER_JS_POSTFIX_UNCACHED)) {
var request = c.req.raw, url = (0, import_createHandleRequest.getURLfromRequestURL)(request), originalUrl = (0, import_cleanUrl.getPathFromLoaderPath)(c.req.path), _iteratorNormalCompletion3 = !0, _didIteratorError3 = !1, _iteratorError3 = void 0;
try {
for (var _iterator3 = compiledManifest.pageRoutes[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = !0) {
var route2 = _step3.value;
if (route2.file !== "" && route2.compiledRegex.test(originalUrl)) {
var loaderRoute = {
...route2,
file: route2.loaderServerPath || c.req.path
}, finalUrl = new URL(originalUrl, url.origin);
try {
var resolved = await resolveLoaderRoute(requestHandlers, request, finalUrl, loaderRoute);
return resolved;
} catch (err) {
return console.error(`Error running loader: ${err}`), next();
}
}
}
} catch (err) {
_didIteratorError3 = !0, _iteratorError3 = err;
} finally {
try {
!_iteratorNormalCompletion3 && _iterator3.return != null && _iterator3.return();
} finally {
if (_didIteratorError3)
throw _iteratorError3;
}
}
}
return next();
});
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
oneServe
});
//# sourceMappingURL=oneServe.js.map