everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
132 lines (130 loc) • 5.71 kB
JavaScript
const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
const require_theme = require('../../utils/theme.cjs');
const require_docker = require('../../infra/docker.cjs');
const require_progress = require('../../services/dev/progress.cjs');
const require_init_flow = require('../../services/scaffold/init-flow.cjs');
const require_exit_codes = require('../exit-codes.cjs');
const require_dev = require('../render/dev.cjs');
const require_prompts = require('../prompts.cjs');
let _clack_prompts = require("@clack/prompts");
_clack_prompts = require_runtime.__toESM(_clack_prompts, 1);
//#region src/cli/commands/init.ts
const runInit = async (ctx) => {
const client = ctx.client;
let initInput = { ...ctx.input };
if (!initInput.noInteractive) {
const basic = await require_prompts.promptInitBasic({
extends: initInput.extends,
account: initInput.account,
domain: initInput.domain
});
let parentPluginKeys = [];
let parentConfig = null;
const fetchSpinner = _clack_prompts.spinner();
fetchSpinner.start("Fetching parent config");
try {
const parent = await require_init_flow.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 _clack_prompts.confirm({
message: `You will be extending ${parentConfig.title} - ${parentConfig.description}. Continue?`,
initialValue: true
});
if (_clack_prompts.isCancel(shouldContinue) || !shouldContinue) process.exit(0);
}
const overrides = await require_prompts.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 = _clack_prompts.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);
};
require_progress.pluginEvents.on("progress", onProgress);
let result;
try {
result = await client.init(initInput);
} finally {
require_progress.pluginEvents.off("progress", onProgress);
}
if (require_exit_codes.exitCodeFor(result) === 1) {
initSpinner.stop("Failed");
console.error(`[CLI] ${result.error || "Unknown error"}`);
process.exit(1);
}
initSpinner.stop("Project initialized");
console.log(` ${require_theme.colors.dim("Extends:")} ${result.extends}`);
console.log(` ${require_theme.colors.dim("Directory:")} ${result.directory}`);
if (result.account) console.log(` ${require_theme.colors.dim("Account:")} ${result.account}`);
if (result.domain) console.log(` ${require_theme.colors.dim("Domain:")} ${result.domain}`);
if (result.overrides && result.overrides.length > 0) console.log(` ${require_theme.colors.dim("Overrides:")} ${result.overrides.join(", ")}`);
if (result.plugins && result.plugins.length > 0) console.log(` ${require_theme.colors.dim("Plugins:")} ${result.plugins.join(", ")}`);
console.log(` ${require_theme.colors.dim("Files copied:")} ${result.filesCopied}`);
require_dev.printTimingSummary(result.timings);
console.log();
console.log(require_theme.colors.dim(" Next steps:"));
console.log(require_theme.colors.dim(` cd ${result.directory}`));
if (!initInput.noInstall) console.log(require_theme.colors.dim(" pnpm run dev"));
else {
console.log(require_theme.colors.dim(" pnpm install"));
console.log(require_theme.colors.dim(" pnpm run dev"));
}
console.log();
if (initInput.noInteractive !== true && !initInput.noInstall && result.targetDir) {
if (await _clack_prompts.confirm({
message: "Run docker compose up -d --wait?",
initialValue: true
}) === true) {
const dockerSpinner = _clack_prompts.spinner();
dockerSpinner.start("Starting Docker services");
const compose = await require_docker.runDockerComposeUp(result.targetDir);
if (compose.ok) dockerSpinner.stop("Docker services ready");
else {
dockerSpinner.stop("Docker services not started");
_clack_prompts.log.warn(`docker compose up -d --wait failed${compose.tail ? `:\n${compose.tail}` : ""}`);
}
}
}
};
//#endregion
exports.runInit = runInit;
//# sourceMappingURL=init.cjs.map