UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

151 lines (147 loc) 6.79 kB
import { join, resolve } from "node:path"; import FSExtra from "fs-extra"; import { isMatching, P } from "ts-pattern"; import { createApiServerlessFunction } from "./generate/createApiServerlessFunction.native.js"; import { createSsrServerlessFunction } from "./generate/createSsrServerlessFunction.native.js"; import { serverlessVercelPackageJson } from "./config/vc-package-base.native.js"; import { vercelBuildOutputConfigBase } from "./config/vc-build-output-config-base.native.js"; import { getPathFromRoute } from "./getPathFromRoute.native.js"; var { copy, ensureDir, existsSync, writeJSON } = FSExtra; async function moveAllFiles(src, dest) { try { await copy(src, dest, { overwrite: !0, errorOnExist: !1 }); } catch (err) { console.error("Error moving files:", err); } } var buildVercelOutputDirectory = async function (param) { var { apiOutput, buildInfoForWriting, clientDir, oneOptionsRoot, postBuildLogs } = param, { routeToBuildInfo } = buildInfoForWriting; if (apiOutput) { var _apiOutput_output, compiltedApiRoutes = ((_apiOutput_output = apiOutput?.output) !== null && _apiOutput_output !== void 0 ? _apiOutput_output : []).filter(function (o) { return isMatching({ code: P.string, facadeModuleId: P.string }, o); }), _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0; try { for (var _loop = async function () { var route2 = _step.value, compiledRoute = compiltedApiRoutes.find(function (compiled) { var flag = compiled.facadeModuleId.includes(route2.file.replace("./", "")); return flag; }); compiledRoute ? (postBuildLogs.push(`[one.build][vercel] generating serverless function for apiRoute ${route2.page}`), await createApiServerlessFunction(route2, compiledRoute.code, oneOptionsRoot, postBuildLogs)) : console.warn(` \u{1F528}[one.build][vercel] apiRoute missing code compilation for`, route2.file); }, _iterator = buildInfoForWriting.manifest.apiRoutes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) await _loop(); } catch (err) { _didIteratorError = !0, _iteratorError = err; } finally { try { !_iteratorNormalCompletion && _iterator.return != null && _iterator.return(); } finally { if (_didIteratorError) throw _iteratorError; } } } var vercelOutputFunctionsDir = join(oneOptionsRoot, ".vercel/output/functions"); await ensureDir(vercelOutputFunctionsDir); var _iteratorNormalCompletion1 = !0, _didIteratorError1 = !1, _iteratorError1 = void 0; try { for (var _iterator1 = buildInfoForWriting.manifest.pageRoutes[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) { var route = _step1.value; switch (route.type) { case "ssr": { var builtPageRoute = routeToBuildInfo[route.file]; builtPageRoute && (postBuildLogs.push(`[one.build][vercel] generate serverless function for ${route.page} with ${route.type}`), await createSsrServerlessFunction(route, buildInfoForWriting, oneOptionsRoot, postBuildLogs)); break; } default: break; } } } catch (err) { _didIteratorError1 = !0, _iteratorError1 = err; } finally { try { !_iteratorNormalCompletion1 && _iterator1.return != null && _iterator1.return(); } finally { if (_didIteratorError1) throw _iteratorError1; } } var distMiddlewareDir = resolve(join(oneOptionsRoot, "dist", "middlewares")); if (existsSync(distMiddlewareDir)) { var vercelMiddlewareDir = resolve(join(oneOptionsRoot, ".vercel/output/functions/_middleware.func")); await ensureDir(vercelMiddlewareDir), postBuildLogs.push(`[one.build][vercel] copying middlewares from ${distMiddlewareDir} to ${vercelMiddlewareDir}`), await moveAllFiles(resolve(join(oneOptionsRoot, "dist", "middlewares")), vercelMiddlewareDir); var vercelMiddlewarePackageJsonFilePath = resolve(join(vercelMiddlewareDir, "index.js")); postBuildLogs.push(`[one.build][vercel] writing package.json to ${vercelMiddlewarePackageJsonFilePath}`), await writeJSON(vercelMiddlewarePackageJsonFilePath, serverlessVercelPackageJson); var wrappedMiddlewareEntryPointFilename = "_wrapped_middleware.js", wrappedMiddlewareEntryPointPath = resolve(join(vercelMiddlewareDir, wrappedMiddlewareEntryPointFilename)); await FSExtra.writeFile(wrappedMiddlewareEntryPointPath, ` import middlewareFunction from './_middleware.js' const next = (e) => { const t = new Headers(null == e ? void 0 : e.headers) t.set('x-middleware-next', '1') return new Response(null, { ...e, headers: t }) } const wrappedMiddlewareFunction = (request, event) => { return middlewareFunction({ request, event, next }) } export { wrappedMiddlewareFunction as default } `); var middlewareVercelConfigFilePath = resolve(join(vercelMiddlewareDir, ".vc-config.json")); postBuildLogs.push(`[one.build][vercel] writing .vc-config.json to ${middlewareVercelConfigFilePath}`), await writeJSON(middlewareVercelConfigFilePath, { runtime: "edge", // Seems that middlewares only work with edge runtime entrypoint: wrappedMiddlewareEntryPointFilename }); } var vercelOutputStaticDir = resolve(join(oneOptionsRoot, ".vercel/output/static")); await ensureDir(vercelOutputStaticDir), postBuildLogs.push(`[one.build][vercel] copying static files from ${clientDir} to ${vercelOutputStaticDir}`), await moveAllFiles(clientDir, vercelOutputStaticDir); var vercelConfigFilePath = resolve(join(oneOptionsRoot, ".vercel/output", "config.json")); await writeJSON(vercelConfigFilePath, { ...vercelBuildOutputConfigBase, routes: [...vercelBuildOutputConfigBase.routes, ...(existsSync(distMiddlewareDir) ? [{ src: "/(.*)", middlewarePath: "_middleware", continue: !0 }] : []), { handle: "rewrite" }, ...buildInfoForWriting.manifest.allRoutes.filter(function (r) { return r.routeKeys && Object.keys(r.routeKeys).length > 0; }).map(function (r) { return { src: r.namedRegex, dest: `${getPathFromRoute(r)}?${Object.entries(r.routeKeys).map(function (param2) { var [k, v] = param2; return `${k}=$${v}`; }).join("&")}` }; })] }), postBuildLogs.push(`[one.build] wrote vercel config to: ${vercelConfigFilePath}`); }; export { buildVercelOutputDirectory }; //# sourceMappingURL=buildVercelOutputDirectory.native.js.map