UNPKG

astro

Version:

Astro is a modern site builder with web best practices, performance, and DX front-of-mind.

247 lines (246 loc) • 7.88 kB
import yargs from "yargs-parser"; import { apply as applyPolyfill } from "../core/polyfill.js"; function resolveCommand(flags) { const cmd = flags._[2]; if (flags.version) return "version"; const supportedCommands = /* @__PURE__ */ new Set([ "add", "sync", "telemetry", "preferences", "dev", "build", "preview", "check", "create-key", "docs", "db", "info", "login", "logout", "link", "init" ]); if (supportedCommands.has(cmd)) { return cmd; } return "help"; } async function runCommand(cmd, flags) { applyPolyfill(); const [ { createLoggerFromFlags }, { piccoloreTextStyler: textStyler }, { BuildTimeAstroVersionProvider }, { LoggerHelpDisplay }, { CliCommandRunner } ] = await Promise.all([ import("./flags.js"), import("./infra/piccolore-text-styler.js"), import("./infra/build-time-astro-version-provider.js"), import("./infra/logger-help-display.js"), import("./infra/cli-command-runner.js") ]); const logger = createLoggerFromFlags(flags); const astroVersionProvider = new BuildTimeAstroVersionProvider(); const helpDisplay = new LoggerHelpDisplay({ logger, flags, textStyler, astroVersionProvider }); const runner = new CliCommandRunner({ helpDisplay }); switch (cmd) { /** Display --help flag */ case "help": { const { DEFAULT_HELP_PAYLOAD } = await import("./help/index.js"); helpDisplay.show(DEFAULT_HELP_PAYLOAD); return; } /** Display --version flag */ case "version": { const { formatVersion } = await import("./utils/format-version.js"); logger.info( "SKIP_FORMAT", formatVersion({ name: "astro", textStyler, astroVersionProvider }) ); return; } case "info": { const [ { ProcessOperatingSystemProvider }, { CliAstroConfigResolver }, { ProcessPackageManagerUserAgentProvider }, { ProcessNodeVersionProvider }, { CliDebugInfoProvider }, { TinyexecCommandExecutor }, { getPackageManager }, { StyledDebugInfoFormatter }, { PromptsPrompt }, { CliClipboard }, { PassthroughTextStyler }, { infoCommand } ] = await Promise.all([ import("./infra/process-operating-system-provider.js"), import("./info/infra/cli-astro-config-resolver.js"), import("./info/infra/process-package-manager-user-agent-provider.js"), import("./info/infra/process-node-version-provider.js"), import("./info/infra/cli-debug-info-provider.js"), import("./infra/tinyexec-command-executor.js"), import("./info/core/get-package-manager.js"), import("./info/infra/styled-debug-info-formatter.js"), import("./info/infra/prompts-prompt.js"), import("./info/infra/cli-clipboard.js"), import("./infra/passthrough-text-styler.js"), import("./info/core/info.js") ]); const operatingSystemProvider = new ProcessOperatingSystemProvider(); const astroConfigResolver = new CliAstroConfigResolver({ flags }); const commandExecutor = new TinyexecCommandExecutor(); const packageManagerUserAgentProvider = new ProcessPackageManagerUserAgentProvider(); const nodeVersionProvider = new ProcessNodeVersionProvider(); const debugInfoProvider = new CliDebugInfoProvider({ config: await astroConfigResolver.resolve(), astroVersionProvider, operatingSystemProvider, packageManager: await getPackageManager({ packageManagerUserAgentProvider, commandExecutor }), nodeVersionProvider }); const prompt = new PromptsPrompt({ force: flags.copy }); const clipboard = new CliClipboard({ commandExecutor, logger, operatingSystemProvider, prompt }); return await runner.run(infoCommand, { logger, debugInfoProvider, getDebugInfoFormatter: ({ pretty }) => new StyledDebugInfoFormatter({ textStyler: pretty ? textStyler : new PassthroughTextStyler() }), clipboard }); } case "create-key": { const [{ CryptoKeyGenerator }, { createKeyCommand }] = await Promise.all([ import("./create-key/infra/crypto-key-generator.js"), import("./create-key/core/create-key.js") ]); const keyGenerator = new CryptoKeyGenerator(); return await runner.run(createKeyCommand, { logger, keyGenerator }); } case "docs": { const [ { TinyexecCommandExecutor }, { ProcessOperatingSystemProvider }, { ProcessCloudIdeProvider }, { openDocsCommand } ] = await Promise.all([ import("./infra/tinyexec-command-executor.js"), import("./infra/process-operating-system-provider.js"), import("./docs/infra/process-cloud-ide-provider.js"), import("./docs/core/open-docs.js") ]); const commandExecutor = new TinyexecCommandExecutor(); const operatingSystemProvider = new ProcessOperatingSystemProvider(); const cloudIdeProvider = new ProcessCloudIdeProvider(); return await runner.run(openDocsCommand, { url: "https://docs.astro.build/", logger, commandExecutor, operatingSystemProvider, cloudIdeProvider }); } case "telemetry": { const { update } = await import("./telemetry/index.js"); const subcommand = flags._[3]?.toString(); await update(subcommand, { flags }); return; } case "sync": { const { sync } = await import("./sync/index.js"); await sync({ flags }); return; } case "preferences": { const { preferences } = await import("./preferences/index.js"); const [subcommand, key, value] = flags._.slice(3).map((v) => v.toString()); const exitCode = await preferences(subcommand, key, value, { flags }); return process.exit(exitCode); } } if (flags.verbose) { const { enableVerboseLogging } = await import("../core/logger/node.js"); enableVerboseLogging(); } const { notify } = await import("./telemetry/index.js"); await notify(); switch (cmd) { case "add": { const { add } = await import("./add/index.js"); const packages = flags._.slice(3); await add(packages, { flags }); return; } case "db": case "login": case "logout": case "link": case "init": { const { db } = await import("./db/index.js"); await db({ flags }); return; } case "dev": { const { dev } = await import("./dev/index.js"); const server = await dev({ flags }); if (server) { return await new Promise(() => { }); } return; } case "build": { const { build } = await import("./build/index.js"); await build({ flags }); return; } case "preview": { const { preview } = await import("./preview/index.js"); const server = await preview({ flags }); if (server) { return await server.closed(); } return; } case "check": { const { check } = await import("./check/index.js"); const checkServer = await check(flags); if (flags.watch) { return await new Promise(() => { }); } else { return process.exit(typeof checkServer === "boolean" && checkServer ? 1 : 0); } } } throw new Error(`Error running ${cmd} -- no command found.`); } async function cli(argv) { const flags = yargs(argv, { boolean: ["global"], alias: { g: "global" } }); const cmd = resolveCommand(flags); try { await runCommand(cmd, flags); } catch (err) { const { throwAndExit } = await import("./throw-and-exit.js"); await throwAndExit(cmd, err); } } export { cli };