one
Version:
One is a new React Framework that makes Vite serve both native and web.
151 lines (147 loc) • 6.79 kB
JavaScript
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