everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
68 lines (66 loc) • 2.59 kB
JavaScript
import { isPlainObject, rebuildOrderedConfig } from "./merge.mjs";
import { BosConfigSchema } from "../../types.mjs";
import { readLocalAuthoredConfigInput } from "./load.mjs";
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
//#region src/services/resolution/serialize.ts
const RESOLVED_CONFIG_FILENAME = "bos.resolved-config.json";
function getResolvedConfigPath(configDir) {
return join(configDir, ".bos", RESOLVED_CONFIG_FILENAME);
}
function loadGeneratedResolvedConfig(configDir) {
const resolvedPath = getResolvedConfigPath(configDir);
if (!existsSync(resolvedPath)) return null;
try {
const raw = JSON.parse(readFileSync(resolvedPath, "utf-8"));
if (!isPlainObject(raw)) return null;
const { _resolved, ...configData } = raw;
return BosConfigSchema.parse(configData);
} catch {
return null;
}
}
function writeResolvedConfig(configDir, config, env, extendsChain, source) {
const resolvedPath = getResolvedConfigPath(configDir);
const resolvedDir = dirname(resolvedPath);
if (!existsSync(resolvedDir)) mkdirSync(resolvedDir, { recursive: true });
const ordered = rebuildOrderedConfig(config);
const output = {
_resolved: {
env,
resolvedAt: (/* @__PURE__ */ new Date()).toISOString(),
extendsChain: extendsChain ?? [],
...source ? { source } : {}
},
...ordered
};
const content = `${JSON.stringify(output, null, 2)}\n`;
try {
if (readFileSync(resolvedPath, "utf-8") === content) return;
} catch {}
writeFileSync(resolvedPath, content);
}
function resolveBosConfigPath(configDir) {
const resolvedPath = getResolvedConfigPath(configDir);
if (existsSync(resolvedPath)) return resolvedPath;
return join(configDir, "bos.config.json");
}
async function readBosConfigForBuild(configDir) {
const resolvedPath = getResolvedConfigPath(configDir);
if (existsSync(resolvedPath)) try {
const raw = JSON.parse(readFileSync(resolvedPath, "utf-8"));
if (isPlainObject(raw)) {
const { _resolved, ...configData } = raw;
return configData;
}
} catch (e) {
console.warn(`[Config] Failed to parse _resolved.json, falling back to the authored config: ${String(e)}`);
}
const authored = await readLocalAuthoredConfigInput(configDir);
if (authored) return authored;
const bosConfigPath = join(configDir, "bos.config.json");
return JSON.parse(readFileSync(bosConfigPath, "utf-8"));
}
//#endregion
export { getResolvedConfigPath, loadGeneratedResolvedConfig, readBosConfigForBuild, resolveBosConfigPath, writeResolvedConfig };
//# sourceMappingURL=serialize.mjs.map