UNPKG

everything-dev

Version:

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

234 lines (232 loc) • 10.2 kB
const require_runtime = require('../_virtual/_rolldown/runtime.cjs'); const require_fastkv = require('../fastkv.cjs'); const require_save_config = require('../utils/save-config.cjs'); const require_cli_init = require('../cli/init.cjs'); const require_resolution_session = require('../resolution/session.cjs'); const require_shared_deps = require('../shared-deps.cjs'); const require_code_artifacts = require('../code-artifacts.cjs'); const require_project_env = require('../env/project-env.cjs'); const require_materializer = require('../infra/materializer.cjs'); const require_progress = require('../progress.cjs'); const require_prune = require('../cli/prune.cjs'); let node_fs = require("node:fs"); let node_path = require("node:path"); let effect = require("effect"); let node_process = require("node:process"); node_process = require_runtime.__toESM(node_process, 1); //#region src/commands/init.ts async function fetchInitParent(extendsAccount, extendsGateway) { const parentConfig = await require_cli_init.fetchParentConfig(extendsAccount, extendsGateway); return { parentConfig, parentPluginKeys: parentConfig?.plugins && typeof parentConfig.plugins === "object" ? Object.keys(parentConfig.plugins) : [] }; } function normalizeExtendsRef(extendsInput, fallback) { if (!extendsInput) return fallback; return extendsInput.startsWith("bos://") ? extendsInput : `bos://${extendsInput}`; } function registerInit(builder) { return { init: builder.init.handler(async ({ input }) => { try { const timings = []; let extendsAccount = ""; let extendsGateway = ""; let directory = input.directory; const account = input.account; const domain = input.domain; let overrides = input.overrides; let plugins = input.plugins; if (input.extends) try { const { accountId, gatewayId } = require_fastkv.parseBosUrl(normalizeExtendsRef(input.extends, "")); extendsAccount = accountId; extendsGateway = gatewayId; } catch { extendsAccount = ""; extendsGateway = ""; } extendsAccount = extendsAccount || "dev.everything.near"; extendsGateway = extendsGateway || "everything.dev"; directory = directory || domain || extendsGateway; const targetDir = (0, node_path.resolve)(directory); const extendsRef = `bos://${extendsAccount}/${extendsGateway}`; let parentPluginKeys = []; let parentConfig = null; try { const parent = await require_progress.timePhase(timings, "parent config", () => fetchInitParent(extendsAccount, extendsGateway)); parentConfig = parent.parentConfig; parentPluginKeys = parent.parentPluginKeys; } catch (e) { console.warn(`[init] Failed to fetch parent config from ${extendsAccount}/${extendsGateway}: ${e instanceof Error ? e.message : String(e)}`); return { status: "error", directory, extendsRef, account, domain, extends: extendsRef, plugins, overrides, filesCopied: 0, timings, error: `No config found at ${extendsRef} — are you sure this is the right parent?` }; } overrides = overrides?.length ? overrides : ["ui", "api"]; const level = input.level ?? "simple"; if (overrides.includes("plugins") && plugins === void 0) plugins = parentPluginKeys; plugins = plugins ?? []; const pluginDirMap = {}; if (parentConfig?.plugins) for (const plugin of plugins) { const entry = parentConfig.plugins?.[plugin]; if (entry && typeof entry === "object") { const dev = entry.development; if (typeof dev === "string") { const match = dev.match(/^local:plugins\/(.+)$/); if (match?.[1] && match[1] !== plugin) pluginDirMap[plugin] = match[1]; } } } const repository = await require_cli_init.detectGitRemoteUrl(node_process.default.cwd()).catch(() => void 0) ?? parentConfig?.repository; const { sourceDir, parentConfig: resolvedParentConfig, cleanup } = await require_progress.timePhase(timings, "template source", () => require_cli_init.resolveSourceDir({ extendsAccount, extendsGateway, source: input.source })); parentConfig = resolvedParentConfig; const isMinimalScaffold = sourceDir === ""; try { let filesCopied; let childBosConfig = null; if (isMinimalScaffold) { filesCopied = await require_progress.timePhase(timings, "scaffold project", () => require_cli_init.scaffoldMinimalProject(targetDir, parentConfig, { extendsAccount, extendsGateway, account: account || extendsAccount, domain, plugins, overrides, repository, title: parentConfig?.title, description: parentConfig?.description, starter: level })); await require_progress.timePhase(timings, "personalize config", () => require_cli_init.personalizeConfig(targetDir, { extendsAccount, extendsGateway, account: account || extendsAccount, domain: domain || extendsGateway, plugins, overrides, mode: "init", repository, title: parentConfig?.title, description: parentConfig?.description, testnet: parentConfig?.testnet, staging: parentConfig?.staging, starter: level })); childBosConfig = await require_progress.timePhase(timings, "authored config form", () => require_cli_init.convertChildConfigToAppForm(targetDir)); require_cli_init.writeDevOverlayTemplate(targetDir, { extendsRef: `bos://${extendsAccount}/${extendsGateway}` }); } else { const patterns = require_cli_init.buildInitPatterns(overrides, plugins, pluginDirMap); const routeExclusions = overrides.includes("ui") ? require_cli_init.buildPluginRouteExclusions(parentConfig, plugins) : []; const starterExclusions = overrides.includes("ui") ? require_cli_init.buildStarterRouteExclusions(level, parentConfig) : []; const copyIgnore = [...routeExclusions, ...starterExclusions]; filesCopied = await require_progress.timePhase(timings, "copy files", () => require_cli_init.copyFilteredFiles(sourceDir, targetDir, patterns, { overrides, plugins, ignore: copyIgnore })); if (!(0, node_fs.existsSync)((0, node_path.join)(targetDir, "bos.config.json"))) await require_save_config.saveBosConfig(targetDir, parentConfig); await require_progress.timePhase(timings, "personalize config", () => require_cli_init.personalizeConfig(targetDir, { extendsAccount, extendsGateway, account: account || extendsAccount, domain: domain || extendsGateway, plugins, overrides, workspaceOpts: { sourceDir }, repository, title: parentConfig?.title, description: parentConfig?.description, testnet: parentConfig?.testnet, staging: parentConfig?.staging, starter: level })); childBosConfig = await require_progress.timePhase(timings, "authored config form", () => require_cli_init.convertChildConfigToAppForm(targetDir)); require_cli_init.writeDevOverlayTemplate(targetDir, { extendsRef: `bos://${extendsAccount}/${extendsGateway}` }); if (overrides.includes("ui")) await require_progress.timePhase(timings, "prune unused ui files", async () => require_prune.pruneUnusedUiFiles(targetDir, { log: console.log })); await require_progress.timePhase(timings, "write snapshot", () => require_cli_init.writeInitSnapshot(targetDir, extendsAccount, extendsGateway, sourceDir, patterns, { overrides, plugins, ignore: copyIgnore, starter: level })); await require_progress.timePhase(timings, "personalize agents", () => require_cli_init.personalizeAgentsMd(targetDir, { overrides, plugins })); } await require_progress.timePhase(timings, "sync shared deps", () => require_shared_deps.syncResolvedSharedDeps({ configDir: targetDir, hostMode: "local", bosConfig: childBosConfig ? childBosConfig : void 0 })); require_cli_init.removeStrayLockfiles(targetDir); const initConfig = await require_progress.timePhase(timings, "resolve config", () => require_resolution_session.openResolution({ cwd: targetDir }).catch((error) => { console.warn("[init] Skipping config resolution — the child has no node_modules yet; `bos dev` resolves after `pnpm install`.", error instanceof Error ? error.message : error); return null; })); const initRuntime = initConfig?.runtime; if (initRuntime) await require_progress.timePhase(timings, "generate env/docker", async () => { await require_materializer.materializeViaLayer(targetDir, initRuntime); }); await require_progress.timePhase(timings, "create env file", async () => { await effect.Effect.runPromise(require_project_env.makeProjectEnv().ensureFile(targetDir)); }); if (!input.noInstall) { await require_progress.timePhase(timings, "install dependencies", () => require_cli_init.runPnpmInstall(targetDir)); await require_progress.timePhase(timings, "generate types", () => require_cli_init.runTypesGen(targetDir)); await require_progress.timePhase(timings, "generate migrations", () => require_cli_init.generateDatabaseMigrations(targetDir)); } const initArtifactsConfig = initConfig?.config; if (input.noInstall && initArtifactsConfig) await require_progress.timePhase(timings, "generate code artifacts", () => require_code_artifacts.generateCodeArtifacts(targetDir, initArtifactsConfig)); return { status: "initialized", directory, extendsRef, account, domain, extends: extendsRef, plugins, overrides, filesCopied, timings, targetDir }; } finally { await cleanup(); } } catch (error) { const extendsRef = normalizeExtendsRef(input.extends, "bos://dev.everything.near/everything.dev"); return { status: "error", directory: input.directory ?? "", extendsRef, account: input.account, domain: input.domain, extends: extendsRef, plugins: input.plugins ?? [], overrides: input.overrides, filesCopied: 0, timings: [], error: error instanceof Error ? error.message : "Unknown error" }; } }) }; } //#endregion exports.fetchInitParent = fetchInitParent; exports.registerInit = registerInit; //# sourceMappingURL=init.cjs.map