From 5bd2121a7d38d44250d18daf648c199009d26aad Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Tue, 1 Oct 2019 08:31:57 +0700 Subject: [PATCH] Add commands help in rondo command --- packages/scripts/src/index.ts | 13 ++++++++++-- packages/scripts/src/scripts/add.ts | 4 +++- packages/scripts/src/scripts/build.ts | 21 +++++++++++++------ packages/scripts/src/scripts/clean.ts | 3 ++- packages/scripts/src/scripts/exportDir.ts | 4 +++- packages/scripts/src/scripts/imports.ts | 7 +++++-- packages/scripts/src/scripts/intergen.ts | 3 ++- packages/scripts/src/scripts/syncEsmConfig.ts | 4 +++- packages/scripts/src/scripts/unpack.ts | 19 +++++++---------- packages/scripts/src/scripts/update.ts | 1 + packages/scripts/src/util/getHelp.ts | 10 +++++++++ packages/scripts/src/util/index.ts | 1 + packages/scripts/src/util/pad.ts | 13 ++++++++++++ 13 files changed, 77 insertions(+), 26 deletions(-) create mode 100644 packages/scripts/src/util/getHelp.ts create mode 100644 packages/scripts/src/util/index.ts create mode 100644 packages/scripts/src/util/pad.ts diff --git a/packages/scripts/src/index.ts b/packages/scripts/src/index.ts index 53152b7..1806dd2 100644 --- a/packages/scripts/src/index.ts +++ b/packages/scripts/src/index.ts @@ -3,6 +3,7 @@ import { arg, argparse } from '@rondo.dev/argparse' import { Command } from './Command' import * as log from './log' import { resolve } from './resolve' +import { getHelp } from './util/getHelp' async function run( commandName: string, @@ -25,19 +26,27 @@ async function start( exit = (code: number) => process.exit(code), ) { const commands = await resolve() + const choices = Object.keys(commands) + .filter(c => !c.startsWith('_') && typeof commands[c] === 'function') + + const desc = 'Commands:\n ' + choices + .filter(choice => typeof commands[choice] === 'function') + .map(choice => getHelp(commands[choice])) + .join('\n ') + const {parse} = argparse({ help: arg('boolean', {alias: 'h'}), debug: arg('boolean'), command: arg('string', { required: true, positional: true, - choices: Object.keys(commands).filter(c => !c.startsWith('_')), + choices, }), args: arg('string[]', { n: '*', positional: true, }), - }) + }, desc) let args: ReturnType | null = null try { diff --git a/packages/scripts/src/scripts/add.ts b/packages/scripts/src/scripts/add.ts index d2d77f8..2fb3431 100644 --- a/packages/scripts/src/scripts/add.ts +++ b/packages/scripts/src/scripts/add.ts @@ -31,7 +31,7 @@ export async function add(...argv: string[]) { description: 'Print help message', }), // frontend: arg('boolean', {alias: 'f'}), - }, 'Create a new library from template') + }, add.help) const args = parse(argv) const destDir = path.join('./packages', args.name) @@ -63,3 +63,5 @@ export async function add(...argv: string[]) { pkg.dependencies[libraryName] = `file:packages/${args.name}` fs.writeFileSync(pkgFile, JSON.stringify(pkg, null, ' ')) } +add.help = 'Create a new package from template. ' + + 'Update root package.json with its definition' diff --git a/packages/scripts/src/scripts/build.ts b/packages/scripts/src/scripts/build.ts index 5e5c509..1142eca 100644 --- a/packages/scripts/src/scripts/build.ts +++ b/packages/scripts/src/scripts/build.ts @@ -23,12 +23,13 @@ export async function build(...argv: string[]) { description: 'Watch for changes', }), help: arg('boolean', {alias: 'h'}), - }) + }, build.help) const args = parse(argv) const path = args.esm ? join(args.project, 'tsconfig.esm.json') : args.project const watchArgs = args.watch ? ['--watch', '--preserveWatchOutput'] : [] await run(tsc, ['--build', path, ...watchArgs]) } +build.help = 'Build or watch TypeScript project' export async function test(...argv: string[]) { const {args} = argparse({ @@ -37,10 +38,11 @@ export async function test(...argv: string[]) { positional: true, }), help: arg('boolean', {alias: 'h'}), - }) + }, test.help) .parse(argv) await run('jest', args) } +test.help = 'Run jest tests' export async function exec(...argv: string[]) { const {parse} = argparse({ @@ -53,7 +55,7 @@ export async function exec(...argv: string[]) { positional: true, }), help: arg('boolean', {alias: 'h'}), - }) + }, exec.help) const args = parse(argv) const {file} = args const command = file.endsWith('.ts') ? 'ts-node' : 'node' @@ -65,13 +67,14 @@ export async function exec(...argv: string[]) { ] : [] await run(command, [...nodeArgs, file, ...args.args]) } +exec.help = 'Execute a js or ts file using node or ts-node' export async function createMigration(...argv: string[]) { const args = argparse({ name: arg('string', {required: true, positional: true}), project: arg('string', {alias: 'p', default: '.'}), help: arg('boolean', {alias: 'h'}), - }) + }, createMigration.help) .parse(argv) const {name, project} = args @@ -84,6 +87,7 @@ export async function createMigration(...argv: string[]) { } await run('ts-node', [typeorm, 'migration:generate', '--name', name], project) } +createMigration.help = 'Generate a new TypeORM migration' function findTsConfig(file: string): string { let lastPath = '' @@ -110,6 +114,7 @@ async function browserify(path = '.', ...extraArgs: string[]) { ...extraArgs, ]) } +browserify.help = 'Build a client-side bundle using browserify' async function uglify(path = '.') { await run('uglifyjs', [ @@ -121,18 +126,20 @@ async function uglify(path = '.') { join(path, 'build', 'client.prod.js'), ]) } +uglify.help = 'Uglify bundle' export async function js(...argv: string[]) { const args = argparse({ path: arg('string', {positional: true, default: '.'}), watch: arg('boolean', {alias: 'w'}), help: arg('boolean', {alias: 'h'}), - }) + }, js.help) .parse(argv) const {path, watch} = args return watch ? watchJs(path) : buildJs(path) } +js.help = 'Build or watch client-side js files' async function buildJs(path: string) { await build(...['-p', path, '--esm']) @@ -158,7 +165,7 @@ export async function css(...argv: string[]) { path: arg('string', {positional: true, default: '.'}), watch: arg('boolean', {alias: 'w'}), help: arg('boolean', {alias: 'h'}), - }) + }, css.help) .parse(argv) const {path, watch} = args @@ -173,6 +180,7 @@ export async function css(...argv: string[]) { join(path, 'scss'), ]) } +css.help = 'Build or watch sass files' async function watchCss(path = '.') { await run('node-sass', [ @@ -212,3 +220,4 @@ export async function frontend(...argv: string[]) { ] await Promise.all(promises) } +frontend.help = 'Build all frontend files' diff --git a/packages/scripts/src/scripts/clean.ts b/packages/scripts/src/scripts/clean.ts index e39f879..bdf8da5 100644 --- a/packages/scripts/src/scripts/clean.ts +++ b/packages/scripts/src/scripts/clean.ts @@ -15,7 +15,7 @@ export async function clean(...argv: string[]) { positional: true, }), help: arg('boolean', {alias: 'h'}), - }) + }, clean.help) const args = parse(argv) @@ -30,3 +30,4 @@ export async function clean(...argv: string[]) { await rimrafAsync(path) } } +clean.help = 'Remove *.tsbuildinfo, lib/ and esm/ folders' diff --git a/packages/scripts/src/scripts/exportDir.ts b/packages/scripts/src/scripts/exportDir.ts index 5bcde0b..230827a 100644 --- a/packages/scripts/src/scripts/exportDir.ts +++ b/packages/scripts/src/scripts/exportDir.ts @@ -9,7 +9,7 @@ export async function exportDir(...argv: string[]) { dir: arg('string', {default: 'src/migrations'}), out: arg('string', {default: 'src/migrations/index.ts'}), help: arg('boolean', {alias: 'h'}), - }) + }, exportDir.help) .parse(argv) const dir = join(args.project, args.dir) @@ -26,3 +26,5 @@ export async function exportDir(...argv: string[]) { info('Writing to %s', out) fs.writeFileSync(join(dir, 'index.ts'), index) } +exportDir.help = 'Create index.ts and generate import statements for files ' + + 'in the same directory' diff --git a/packages/scripts/src/scripts/imports.ts b/packages/scripts/src/scripts/imports.ts index 4544ee0..52f984e 100644 --- a/packages/scripts/src/scripts/imports.ts +++ b/packages/scripts/src/scripts/imports.ts @@ -40,12 +40,12 @@ export function imports(...argv: string[]): string[] { readDirectory: ts.sys.readDirectory, useCaseSensitiveFileNames: true, } - const configFile = ts.readConfigFile(configPath, ts.sys.readFile); + const configFile = ts.readConfigFile(configPath, ts.sys.readFile) const parsedCommandLine = ts.parseJsonConfigFileContent( configFile.config, parseConfigHost, projectDir, - ); + ) const program = ts.createProgram( parsedCommandLine.fileNames, @@ -116,3 +116,6 @@ export function imports(...argv: string[]): string[] { return [] } +imports.help = 'Find used module in a package, use root package.json to ' + + 'find dependency versions and update local package.json. Useful when using ' + + 'hoisting in lerna' diff --git a/packages/scripts/src/scripts/intergen.ts b/packages/scripts/src/scripts/intergen.ts index 130b438..5763e6d 100644 --- a/packages/scripts/src/scripts/intergen.ts +++ b/packages/scripts/src/scripts/intergen.ts @@ -62,7 +62,7 @@ export function intergen(...argv: string[]): string { debug: arg('boolean'), help: arg('boolean', {alias: 'h'}), output: arg('string', {alias: 'o', default: '-'}), - }).parse(argv) + }, intergen.help).parse(argv) function debug(m: string, ...meta: Array) { if (args.debug) { @@ -379,3 +379,4 @@ export function intergen(...argv: string[]): string { } return value } +intergen.help = 'Generate TypeScript interfaces from all found classes' diff --git a/packages/scripts/src/scripts/syncEsmConfig.ts b/packages/scripts/src/scripts/syncEsmConfig.ts index 650cc43..209b7a8 100644 --- a/packages/scripts/src/scripts/syncEsmConfig.ts +++ b/packages/scripts/src/scripts/syncEsmConfig.ts @@ -15,7 +15,7 @@ export async function syncEsmConfig(...argv: string[]) { const args = argparse({ packages: arg('string', {default: 'packages/', positional: true}), help: arg('boolean', {alias: 'h'}), - }, `Synchronizes ${TSCONFIG_ESM_FILENAME} files with ${TSCONFIG_FILENAME}`) + }, syncEsmConfig.help) .parse(argv) const pkgDir = args.packages @@ -53,3 +53,5 @@ export async function syncEsmConfig(...argv: string[]) { fs.writeFileSync(pkgFile, JSON.stringify(pkg, null, ' ')) }) } +syncEsmConfig.help = + `Synchronizes ${TSCONFIG_ESM_FILENAME} files with ${TSCONFIG_FILENAME}` diff --git a/packages/scripts/src/scripts/unpack.ts b/packages/scripts/src/scripts/unpack.ts index 952c543..b5ed350 100644 --- a/packages/scripts/src/scripts/unpack.ts +++ b/packages/scripts/src/scripts/unpack.ts @@ -1,13 +1,14 @@ -import * as fs from 'fs' +import { arg, argparse } from '@rondo.dev/argparse' import _unpack from 'browser-unpack' +import * as fs from 'fs' import * as path from 'path' -import { argparse, arg } from '@rondo.dev/argparse' +import { padLeft } from '../util' export async function unpack(...argv: string[]) { const args = argparse({ filename: arg('string', {positional: true, required: true}), help: arg('boolean'), - }).parse(argv) + }, unpack.help).parse(argv) const file = fs.readFileSync(args.filename, 'utf8') const result = _unpack(file) @@ -38,13 +39,6 @@ export async function unpack(...argv: string[]) { return text } - function padLeft(text: string, size: number) { - while (text.length < size) { - text = ' ' + text - } - return text - } - sizes .forEach(item => { console.log( @@ -58,12 +52,13 @@ export async function unpack(...argv: string[]) { padLeft((totalSize / 1024).toFixed(3) + ' kb', maxSizeLength), ) } +unpack.help = 'Show name and size of each module in browserify bundle' export async function unpackInverseDeps(...argv: string[]) { const args = argparse({ filename: arg('string', {positional: true, required: true}), help: arg('boolean'), - }).parse(argv) + }, unpackInverseDeps.help).parse(argv) const file = fs.readFileSync(args.filename, 'utf8') const result = _unpack(file) @@ -90,3 +85,5 @@ export async function unpackInverseDeps(...argv: string[]) { console.log('') }) } +unpackInverseDeps.help = + 'List inversed dependencies in a browserify bundle' diff --git a/packages/scripts/src/scripts/update.ts b/packages/scripts/src/scripts/update.ts index 3fc45d8..5bc2e56 100644 --- a/packages/scripts/src/scripts/update.ts +++ b/packages/scripts/src/scripts/update.ts @@ -85,3 +85,4 @@ export async function update(...argv: string[]) { info('Done! Do not forget to run npm install!') } } +update.help = 'Update all dependencies to the latest versions' diff --git a/packages/scripts/src/util/getHelp.ts b/packages/scripts/src/util/getHelp.ts new file mode 100644 index 0000000..0c0b2e2 --- /dev/null +++ b/packages/scripts/src/util/getHelp.ts @@ -0,0 +1,10 @@ +import { padRight } from './pad' + +export function getHelp(fn: (...args: string[]) => unknown): string { + const name = fn.name + const fn2 = fn as {help?: string} + if (typeof fn2.help === 'string') { + return padRight(name, 17) + ' ' + fn2.help + } + return name +} diff --git a/packages/scripts/src/util/index.ts b/packages/scripts/src/util/index.ts new file mode 100644 index 0000000..94fdf61 --- /dev/null +++ b/packages/scripts/src/util/index.ts @@ -0,0 +1 @@ +export * from './pad' diff --git a/packages/scripts/src/util/pad.ts b/packages/scripts/src/util/pad.ts new file mode 100644 index 0000000..393569d --- /dev/null +++ b/packages/scripts/src/util/pad.ts @@ -0,0 +1,13 @@ +export function padLeft(text: string, size: number) { + while (text.length < size) { + text = ' ' + text + } + return text +} + +export function padRight(text: string, size: number) { + while (text.length < size) { + text = text + ' ' + } + return text +}