everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
234 lines (232 loc) • 10.2 kB
JavaScript
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