everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
74 lines (72 loc) • 2.97 kB
JavaScript
import { BosConfigSchema } from "../types.mjs";
import { fetchBosConfigFromFastKv } from "../services/registry/fastkv.mjs";
import { loadAppDescriptorConfig, localConfigEntryPath, readAuthoredConfigInput, readLocalAuthoredConfigInput, resolveConfigComposableEntries } from "../services/resolution/load.mjs";
import { ResolutionSessionService, walkExtendsChain } from "../services/resolution/session.mjs";
import { applyRegistrySections } from "../services/registry/use.mjs";
import { saveBosConfig } from "../utils/save-config.mjs";
import { readFileSync } from "node:fs";
import { join } from "node:path";
import { Effect } from "effect";
import process from "node:process";
//#region src/handlers/config.ts
function registerConfig(builder) {
return {
config: builder.config.effect(function* (_opts, input) {
const session = yield* ResolutionSessionService;
if (input.full) return buildConfigResult(session?.config ?? null, true);
return buildConfigResult(yield* Effect.promise(() => readAuthoredConfigInput(session?.root)), false);
}),
registryUse: builder.registryUse.effect(function* (_opts, input) {
const root = (yield* ResolutionSessionService)?.root ?? process.cwd();
const configPath = localConfigEntryPath(root) ?? join(root, "bos.config.json");
const normalizedFrom = input.from.startsWith("bos://") ? input.from : `bos://${input.from}`;
return yield* Effect.tryPromise({
try: async () => {
const remote = await fetchBosConfigFromFastKv(normalizedFrom);
const local = await readLocalAuthoredConfigInput(root) ?? (configPath.endsWith(".json") ? JSON.parse(readFileSync(configPath, "utf-8")) : await loadAppDescriptorConfig(configPath));
const { config: merged, applied } = applyRegistrySections(local, remote, input.sections);
if (input.dryRun) return {
status: "dry-run",
from: normalizedFrom,
applied,
configPath
};
await saveBosConfig(root, merged);
return {
status: "updated",
from: normalizedFrom,
applied,
configPath
};
},
catch: (error) => ({
status: "error",
from: normalizedFrom,
applied: [],
error: error instanceof Error ? error.message : String(error)
})
});
})
};
}
function buildConfigResult(bosConfig, full = false) {
const packages = bosConfig?.app && typeof bosConfig.app === "object" ? Object.keys(bosConfig.app) : [];
const remotes = packages.filter((name) => name !== "host");
return {
config: bosConfig ?? null,
packages,
remotes,
full
};
}
async function resolveRemoteConfigChain(accountId, gatewayId, registry) {
const { config: merged } = await walkExtendsChain(`bos://${accountId}/${gatewayId}`, {
env: "production",
registry,
visit: async () => {}
});
return resolveConfigComposableEntries(BosConfigSchema.parse(merged), process.cwd(), "production");
}
//#endregion
export { registerConfig, resolveRemoteConfigChain };
//# sourceMappingURL=config.mjs.map