everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
130 lines (128 loc) • 5.18 kB
JavaScript
import { colors } from "../../utils/theme.mjs";
import { runDockerComposeUp } from "../../infra/docker.mjs";
import { pluginEvents } from "../../services/dev/progress.mjs";
import { fetchInitParent } from "../../services/scaffold/init-flow.mjs";
import { exitCodeFor } from "../exit-codes.mjs";
import { printTimingSummary } from "../render/dev.mjs";
import { promptInitBasic, promptInitOverrides } from "../prompts.mjs";
import * as p from "@clack/prompts";
//#region src/cli/commands/init.ts
const runInit = async (ctx) => {
const client = ctx.client;
let initInput = { ...ctx.input };
if (!initInput.noInteractive) {
const basic = await promptInitBasic({
extends: initInput.extends,
account: initInput.account,
domain: initInput.domain
});
let parentPluginKeys = [];
let parentConfig = null;
const fetchSpinner = p.spinner();
fetchSpinner.start("Fetching parent config");
try {
const parent = await fetchInitParent(basic.extendsAccount, basic.extendsGateway);
parentConfig = parent.parentConfig;
parentPluginKeys = parent.parentPluginKeys;
} catch {
fetchSpinner.stop("Config not found");
console.error(`[CLI] No config found at bos://${basic.extendsAccount}/${basic.extendsGateway}`);
process.exit(1);
}
fetchSpinner.stop("Config fetched");
if (typeof parentConfig?.title === "string" && parentConfig.title.trim() && typeof parentConfig?.description === "string" && parentConfig.description.trim()) {
const shouldContinue = await p.confirm({
message: `You will be extending ${parentConfig.title} - ${parentConfig.description}. Continue?`,
initialValue: true
});
if (p.isCancel(shouldContinue) || !shouldContinue) process.exit(0);
}
const overrides = await promptInitOverrides({
parentPluginKeys,
plugins: initInput.plugins,
overrides: initInput.overrides,
level: initInput.level
});
const directory = initInput.directory || basic.domain || basic.extendsGateway;
initInput = {
...initInput,
extends: `bos://${basic.extendsAccount}/${basic.extendsGateway}`,
directory,
account: basic.account,
domain: basic.domain || void 0,
plugins: overrides.plugins,
overrides: overrides.overrides,
level: overrides.level ?? initInput.level,
noInteractive: true
};
}
const initSpinner = p.spinner();
initSpinner.start("Initializing project");
const phaseLabels = {
"parent config": "Fetching parent config...",
"template source": "Resolving template source...",
"scaffold project": "Creating project scaffold...",
"copy files": "Copying template files...",
"personalize config": "Personalizing config...",
"write snapshot": "Writing snapshot...",
"resolve config": "Resolving config...",
"generate env/docker": "Generating environment config...",
"create env file": "Creating .env file...",
"install dependencies": "Installing dependencies...",
"generate types": "Generating types...",
"generate migrations": "Generating database migrations...",
"generate code artifacts": "Generating code artifacts..."
};
const onProgress = (event) => {
const label = phaseLabels[event.phase] ?? event.phase;
if (event.status === "running") initSpinner.message(label);
};
pluginEvents.on("progress", onProgress);
let result;
try {
result = await client.init(initInput);
} finally {
pluginEvents.off("progress", onProgress);
}
if (exitCodeFor(result) === 1) {
initSpinner.stop("Failed");
console.error(`[CLI] ${result.error || "Unknown error"}`);
process.exit(1);
}
initSpinner.stop("Project initialized");
console.log(` ${colors.dim("Extends:")} ${result.extends}`);
console.log(` ${colors.dim("Directory:")} ${result.directory}`);
if (result.account) console.log(` ${colors.dim("Account:")} ${result.account}`);
if (result.domain) console.log(` ${colors.dim("Domain:")} ${result.domain}`);
if (result.overrides && result.overrides.length > 0) console.log(` ${colors.dim("Overrides:")} ${result.overrides.join(", ")}`);
if (result.plugins && result.plugins.length > 0) console.log(` ${colors.dim("Plugins:")} ${result.plugins.join(", ")}`);
console.log(` ${colors.dim("Files copied:")} ${result.filesCopied}`);
printTimingSummary(result.timings);
console.log();
console.log(colors.dim(" Next steps:"));
console.log(colors.dim(` cd ${result.directory}`));
if (!initInput.noInstall) console.log(colors.dim(" pnpm run dev"));
else {
console.log(colors.dim(" pnpm install"));
console.log(colors.dim(" pnpm run dev"));
}
console.log();
if (initInput.noInteractive !== true && !initInput.noInstall && result.targetDir) {
if (await p.confirm({
message: "Run docker compose up -d --wait?",
initialValue: true
}) === true) {
const dockerSpinner = p.spinner();
dockerSpinner.start("Starting Docker services");
const compose = await runDockerComposeUp(result.targetDir);
if (compose.ok) dockerSpinner.stop("Docker services ready");
else {
dockerSpinner.stop("Docker services not started");
p.log.warn(`docker compose up -d --wait failed${compose.tail ? `:\n${compose.tail}` : ""}`);
}
}
}
};
//#endregion
export { runInit };
//# sourceMappingURL=init.mjs.map