feat(cli): add help flags to various commands (#6394)
Co-authored-by: Happydev <81974850+MoustaphaDev@users.noreply.github.com>
This commit is contained in:
parent
b087b83fe2
commit
a4a74ab70c
8 changed files with 128 additions and 19 deletions
5
.changeset/old-rivers-remember.md
Normal file
5
.changeset/old-rivers-remember.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'astro': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Add `--help` to various commands: `check`, `sync`, `dev`, `preview`, and `build`
|
|
@ -2,7 +2,6 @@
|
||||||
import { AstroCheck, DiagnosticSeverity } from '@astrojs/language-server';
|
import { AstroCheck, DiagnosticSeverity } from '@astrojs/language-server';
|
||||||
import type { AstroSettings } from '../../@types/astro';
|
import type { AstroSettings } from '../../@types/astro';
|
||||||
import type { LogOptions } from '../../core/logger/core.js';
|
import type { LogOptions } from '../../core/logger/core.js';
|
||||||
|
|
||||||
import glob from 'fast-glob';
|
import glob from 'fast-glob';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import { bold, dim, red, yellow } from 'kleur/colors';
|
import { bold, dim, red, yellow } from 'kleur/colors';
|
||||||
|
@ -10,6 +9,8 @@ import { createRequire } from 'module';
|
||||||
import ora from 'ora';
|
import ora from 'ora';
|
||||||
import { fileURLToPath, pathToFileURL } from 'url';
|
import { fileURLToPath, pathToFileURL } from 'url';
|
||||||
import { printDiagnostic } from './print.js';
|
import { printDiagnostic } from './print.js';
|
||||||
|
import { Arguments } from 'yargs-parser';
|
||||||
|
import { printHelp } from '../../core/messages.js';
|
||||||
|
|
||||||
interface Result {
|
interface Result {
|
||||||
errors: number;
|
errors: number;
|
||||||
|
@ -18,11 +19,25 @@ interface Result {
|
||||||
hints: number;
|
hints: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function check(settings: AstroSettings, { logging }: { logging: LogOptions }) {
|
export async function check(
|
||||||
|
settings: AstroSettings,
|
||||||
|
{ logging, flags }: { logging: LogOptions; flags: Arguments }
|
||||||
|
) {
|
||||||
|
if (flags.help || flags.h) {
|
||||||
|
printHelp({
|
||||||
|
commandName: 'astro check',
|
||||||
|
usage: '[...flags]',
|
||||||
|
tables: {
|
||||||
|
Flags: [['--help (-h)', 'See all available flags.']],
|
||||||
|
},
|
||||||
|
description: `Runs diagnostics against your project and reports errors to the console.`,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
console.log(bold('astro check'));
|
console.log(bold('astro check'));
|
||||||
|
|
||||||
const { syncCli } = await import('../../core/sync/index.js');
|
const { syncCli } = await import('../../core/sync/index.js');
|
||||||
const syncRet = await syncCli(settings, { logging, fs });
|
const syncRet = await syncCli(settings, { logging, fs, flags });
|
||||||
// early exit on sync failure
|
// early exit on sync failure
|
||||||
if (syncRet === 1) return syncRet;
|
if (syncRet === 1) return syncRet;
|
||||||
|
|
||||||
|
|
|
@ -75,13 +75,18 @@ async function printVersion() {
|
||||||
/** Determine which command the user requested */
|
/** Determine which command the user requested */
|
||||||
function resolveCommand(flags: Arguments): CLICommand {
|
function resolveCommand(flags: Arguments): CLICommand {
|
||||||
const cmd = flags._[2] as string;
|
const cmd = flags._[2] as string;
|
||||||
if (cmd === 'add') return 'add';
|
|
||||||
if (cmd === 'sync') return 'sync';
|
|
||||||
if (cmd === 'telemetry') return 'telemetry';
|
|
||||||
if (flags.version) return 'version';
|
if (flags.version) return 'version';
|
||||||
else if (flags.help) return 'help';
|
|
||||||
|
|
||||||
const supportedCommands = new Set(['dev', 'build', 'preview', 'check', 'docs']);
|
const supportedCommands = new Set([
|
||||||
|
'add',
|
||||||
|
'sync',
|
||||||
|
'telemetry',
|
||||||
|
'dev',
|
||||||
|
'build',
|
||||||
|
'preview',
|
||||||
|
'check',
|
||||||
|
'docs',
|
||||||
|
]);
|
||||||
if (supportedCommands.has(cmd)) {
|
if (supportedCommands.has(cmd)) {
|
||||||
return cmd as CLICommand;
|
return cmd as CLICommand;
|
||||||
}
|
}
|
||||||
|
@ -144,6 +149,16 @@ async function runCommand(cmd: string, flags: yargs.Arguments) {
|
||||||
}
|
}
|
||||||
case 'docs': {
|
case 'docs': {
|
||||||
telemetry.record(event.eventCliSession(cmd));
|
telemetry.record(event.eventCliSession(cmd));
|
||||||
|
if (flags.help || flags.h) {
|
||||||
|
printHelp({
|
||||||
|
commandName: 'astro docs',
|
||||||
|
tables: {
|
||||||
|
Flags: [['--help (-h)', 'See all available flags.']],
|
||||||
|
},
|
||||||
|
description: `Launches the Astro Docs website directly from the terminal.`,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
return await openInBrowser('https://docs.astro.build/');
|
return await openInBrowser('https://docs.astro.build/');
|
||||||
}
|
}
|
||||||
case 'telemetry': {
|
case 'telemetry': {
|
||||||
|
@ -203,27 +218,30 @@ async function runCommand(cmd: string, flags: yargs.Arguments) {
|
||||||
case 'build': {
|
case 'build': {
|
||||||
const { default: build } = await import('../core/build/index.js');
|
const { default: build } = await import('../core/build/index.js');
|
||||||
|
|
||||||
return await build(settings, { ...flags, logging, telemetry, teardownCompiler: true });
|
return await build(settings, { flags, logging, telemetry, teardownCompiler: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'check': {
|
case 'check': {
|
||||||
const ret = await check(settings, { logging });
|
const ret = await check(settings, { logging, flags });
|
||||||
return process.exit(ret);
|
return process.exit(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'sync': {
|
case 'sync': {
|
||||||
const { syncCli } = await import('../core/sync/index.js');
|
const { syncCli } = await import('../core/sync/index.js');
|
||||||
|
|
||||||
const ret = await syncCli(settings, { logging, fs });
|
const ret = await syncCli(settings, { logging, fs, flags });
|
||||||
return process.exit(ret);
|
return process.exit(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'preview': {
|
case 'preview': {
|
||||||
const { default: preview } = await import('../core/preview/index.js');
|
const { default: preview } = await import('../core/preview/index.js');
|
||||||
|
|
||||||
const server = await preview(settings, { logging, telemetry });
|
const server = await preview(settings, { logging, telemetry, flags });
|
||||||
|
if (server) {
|
||||||
return await server.closed(); // keep alive until the server is closed
|
return await server.closed(); // keep alive until the server is closed
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// No command handler matched! This is unexpected.
|
// No command handler matched! This is unexpected.
|
||||||
|
|
|
@ -10,7 +10,7 @@ export interface TelemetryOptions {
|
||||||
export async function update(subcommand: string, { flags, telemetry }: TelemetryOptions) {
|
export async function update(subcommand: string, { flags, telemetry }: TelemetryOptions) {
|
||||||
const isValid = ['enable', 'disable', 'reset'].includes(subcommand);
|
const isValid = ['enable', 'disable', 'reset'].includes(subcommand);
|
||||||
|
|
||||||
if (flags.help || !isValid) {
|
if (flags.help || flags.h || !isValid) {
|
||||||
msg.printHelp({
|
msg.printHelp({
|
||||||
commandName: 'astro telemetry',
|
commandName: 'astro telemetry',
|
||||||
usage: '[command]',
|
usage: '[command]',
|
||||||
|
|
|
@ -21,6 +21,8 @@ import { collectPagesData } from './page-data.js';
|
||||||
import { staticBuild, viteBuild } from './static-build.js';
|
import { staticBuild, viteBuild } from './static-build.js';
|
||||||
import { StaticBuildOptions } from './types.js';
|
import { StaticBuildOptions } from './types.js';
|
||||||
import { getTimeStat } from './util.js';
|
import { getTimeStat } from './util.js';
|
||||||
|
import { printHelp } from '../messages.js';
|
||||||
|
import yargs from 'yargs-parser';
|
||||||
|
|
||||||
export interface BuildOptions {
|
export interface BuildOptions {
|
||||||
mode?: RuntimeMode;
|
mode?: RuntimeMode;
|
||||||
|
@ -31,11 +33,27 @@ export interface BuildOptions {
|
||||||
* building once, but may cause a performance hit if building multiple times in a row.
|
* building once, but may cause a performance hit if building multiple times in a row.
|
||||||
*/
|
*/
|
||||||
teardownCompiler?: boolean;
|
teardownCompiler?: boolean;
|
||||||
|
flags?: yargs.Arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** `astro build` */
|
/** `astro build` */
|
||||||
export default async function build(settings: AstroSettings, options: BuildOptions): Promise<void> {
|
export default async function build(settings: AstroSettings, options: BuildOptions): Promise<void> {
|
||||||
applyPolyfill();
|
applyPolyfill();
|
||||||
|
if (options.flags?.help || options.flags?.h) {
|
||||||
|
printHelp({
|
||||||
|
commandName: 'astro build',
|
||||||
|
usage: '[...flags]',
|
||||||
|
tables: {
|
||||||
|
Flags: [
|
||||||
|
['--drafts', `Include Markdown draft pages in the build.`],
|
||||||
|
['--help (-h)', 'See all available flags.'],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
description: `Builds your site for deployment.`,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const builder = new AstroBuilder(settings, options);
|
const builder = new AstroBuilder(settings, options);
|
||||||
await builder.run();
|
await builder.run();
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,11 +10,13 @@ import { info, LogOptions, warn } from '../logger/core.js';
|
||||||
import * as msg from '../messages.js';
|
import * as msg from '../messages.js';
|
||||||
import { startContainer } from './container.js';
|
import { startContainer } from './container.js';
|
||||||
import { createContainerWithAutomaticRestart } from './restart.js';
|
import { createContainerWithAutomaticRestart } from './restart.js';
|
||||||
|
import { printHelp } from '../messages.js';
|
||||||
|
import { cyan } from 'kleur/colors';
|
||||||
|
|
||||||
export interface DevOptions {
|
export interface DevOptions {
|
||||||
configFlag: string | undefined;
|
configFlag: string | undefined;
|
||||||
configFlagPath: string | undefined;
|
configFlagPath: string | undefined;
|
||||||
flags: yargs.Arguments | undefined;
|
flags?: yargs.Arguments;
|
||||||
logging: LogOptions;
|
logging: LogOptions;
|
||||||
telemetry: AstroTelemetry;
|
telemetry: AstroTelemetry;
|
||||||
handleConfigError: (error: Error) => void;
|
handleConfigError: (error: Error) => void;
|
||||||
|
@ -32,7 +34,26 @@ export interface DevServer {
|
||||||
export default async function dev(
|
export default async function dev(
|
||||||
settings: AstroSettings,
|
settings: AstroSettings,
|
||||||
options: DevOptions
|
options: DevOptions
|
||||||
): Promise<DevServer> {
|
): Promise<DevServer | undefined> {
|
||||||
|
if (options.flags?.help || options.flags?.h) {
|
||||||
|
printHelp({
|
||||||
|
commandName: 'astro dev',
|
||||||
|
usage: '[...flags]',
|
||||||
|
tables: {
|
||||||
|
Flags: [
|
||||||
|
['--port', `Specify which port to run on. Defaults to 3000.`],
|
||||||
|
['--host', `Listen on all addresses, including LAN and public addresses.`],
|
||||||
|
['--host <custom-address>', `Expose on a network IP address at <custom-address>`],
|
||||||
|
['--help (-h)', 'See all available flags.'],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
description: `Check ${cyan(
|
||||||
|
'https://docs.astro.build/en/reference/cli-reference/#astro-dev'
|
||||||
|
)} for more information.`,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const devStart = performance.now();
|
const devStart = performance.now();
|
||||||
await options.telemetry.record([]);
|
await options.telemetry.record([]);
|
||||||
|
|
||||||
|
|
|
@ -6,17 +6,35 @@ import { runHookConfigDone, runHookConfigSetup } from '../../integrations/index.
|
||||||
import type { LogOptions } from '../logger/core';
|
import type { LogOptions } from '../logger/core';
|
||||||
import createStaticPreviewServer from './static-preview-server.js';
|
import createStaticPreviewServer from './static-preview-server.js';
|
||||||
import { getResolvedHostForHttpServer } from './util.js';
|
import { getResolvedHostForHttpServer } from './util.js';
|
||||||
|
import type { Arguments } from 'yargs-parser';
|
||||||
|
import { printHelp } from '../messages.js';
|
||||||
|
import { cyan } from 'kleur/colors';
|
||||||
|
|
||||||
interface PreviewOptions {
|
interface PreviewOptions {
|
||||||
logging: LogOptions;
|
logging: LogOptions;
|
||||||
telemetry: AstroTelemetry;
|
telemetry: AstroTelemetry;
|
||||||
|
flags?: Arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The primary dev action */
|
/** The primary dev action */
|
||||||
export default async function preview(
|
export default async function preview(
|
||||||
_settings: AstroSettings,
|
_settings: AstroSettings,
|
||||||
{ logging }: PreviewOptions
|
{ logging, flags }: PreviewOptions
|
||||||
): Promise<PreviewServer> {
|
): Promise<PreviewServer | undefined> {
|
||||||
|
if (flags?.help || flags?.h) {
|
||||||
|
printHelp({
|
||||||
|
commandName: 'astro preview',
|
||||||
|
usage: '[...flags]',
|
||||||
|
tables: {
|
||||||
|
Flags: [['--help (-h)', 'See all available flags.']],
|
||||||
|
},
|
||||||
|
description: `Starts a local server to serve your static dist/ directory. Check ${cyan(
|
||||||
|
'https://docs.astro.build/en/reference/cli-reference/#astro-preview'
|
||||||
|
)} for more information.`,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const settings = await runHookConfigSetup({
|
const settings = await runHookConfigSetup({
|
||||||
settings: _settings,
|
settings: _settings,
|
||||||
command: 'preview',
|
command: 'preview',
|
||||||
|
|
|
@ -11,13 +11,27 @@ import { getTimeStat } from '../build/util.js';
|
||||||
import { createVite } from '../create-vite.js';
|
import { createVite } from '../create-vite.js';
|
||||||
import { AstroError, AstroErrorData } from '../errors/index.js';
|
import { AstroError, AstroErrorData } from '../errors/index.js';
|
||||||
import { info, LogOptions } from '../logger/core.js';
|
import { info, LogOptions } from '../logger/core.js';
|
||||||
|
import { printHelp } from '../messages.js';
|
||||||
|
import { Arguments } from 'yargs-parser';
|
||||||
|
|
||||||
type ProcessExit = 0 | 1;
|
type ProcessExit = 0 | 1;
|
||||||
|
|
||||||
export async function syncCli(
|
export async function syncCli(
|
||||||
settings: AstroSettings,
|
settings: AstroSettings,
|
||||||
{ logging, fs }: { logging: LogOptions; fs: typeof fsMod }
|
{ logging, fs, flags }: { logging: LogOptions; fs: typeof fsMod; flags?: Arguments }
|
||||||
): Promise<ProcessExit> {
|
): Promise<ProcessExit> {
|
||||||
|
if (flags?.help || flags?.h) {
|
||||||
|
printHelp({
|
||||||
|
commandName: 'astro sync',
|
||||||
|
usage: '[...flags]',
|
||||||
|
tables: {
|
||||||
|
Flags: [['--help (-h)', 'See all available flags.']],
|
||||||
|
},
|
||||||
|
description: `Generates TypeScript types for all Astro modules.`,
|
||||||
|
});
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
const resolvedSettings = await runHookConfigSetup({
|
const resolvedSettings = await runHookConfigSetup({
|
||||||
settings,
|
settings,
|
||||||
logging,
|
logging,
|
||||||
|
|
Loading…
Reference in a new issue