UNPKG

everything-dev

Version:

A consolidated product package for building Module Federation apps with oRPC APIs.

130 lines (128 loc) • 5.18 kB
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