astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
184 lines (183 loc) • 5.42 kB
JavaScript
import * as colors from "kleur/colors";
import yargs from "yargs-parser";
import { ASTRO_VERSION } from "../core/constants.js";
async function printAstroHelp() {
const { printHelp } = await import("../core/messages.js");
printHelp({
commandName: "astro",
usage: "[command] [...flags]",
headline: "Build faster websites.",
tables: {
Commands: [
["add", "Add an integration."],
["build", "Build your project and write it to disk."],
["check", "Check your project for errors."],
["create-key", "Create a cryptography key"],
["db", "Manage your Astro database."],
["dev", "Start the development server."],
["docs", "Open documentation in your web browser."],
["info", "List info about your current Astro setup."],
["preview", "Preview your build locally."],
["sync", "Generate content collection types."],
["preferences", "Configure user preferences."],
["telemetry", "Configure telemetry settings."]
],
"Studio Commands": [
["login", "Authenticate your machine with Astro Studio."],
["logout", "End your authenticated session with Astro Studio."],
["link", "Link this project directory to an Astro Studio project."]
],
"Global Flags": [
["--config <path>", "Specify your config file."],
["--root <path>", "Specify your project root folder."],
["--site <url>", "Specify your project site."],
["--base <pathname>", "Specify your project base."],
["--verbose", "Enable verbose logging."],
["--silent", "Disable all logging."],
["--version", "Show the version number and exit."],
["--help", "Show this help message."]
]
}
});
}
function printVersion() {
console.log();
console.log(` ${colors.bgGreen(colors.black(` astro `))} ${colors.green(`v${ASTRO_VERSION}`)}`);
}
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) {
switch (cmd) {
case "help":
await printAstroHelp();
return;
case "version":
printVersion();
return;
case "info": {
const { printInfo } = await import("./info/index.js");
await printInfo({ flags });
return;
}
case "create-key": {
const { createKey } = await import("./create-key/index.js");
const exitCode = await createKey({ flags });
return process.exit(exitCode);
}
case "docs": {
const { docs } = await import("./docs/index.js");
await docs({ flags });
return;
}
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(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
};