@royli/hygen
Version:
The scalable code generator that saves you time.
61 lines (49 loc) • 1.83 kB
text/typescript
import fs from 'fs-extra'
import type { ActionResult, RunnerConfig } from './types'
import params from './params'
class ShowHelpError extends Error {
constructor(message: string) {
super(message)
Object.setPrototypeOf(this, ShowHelpError.prototype)
}
}
const engine = async (
argv: string[],
config: RunnerConfig,
): Promise<ActionResult[]> => {
const { cwd, templates, logger } = config
const args = Object.assign(await params(config, argv), { cwd })
const { generator, action, actionfolder } = args
if (['-h', '--help'].includes(argv[0])) {
logger.log(`
Usage:
hygen [option] GENERATOR ACTION [--name NAME] [data-options]
Options:
-h, --help # Show this message and quit
--dry # Perform a dry run. Files will be generated but not saved.`)
process.exit(0)
}
logger.log(args.dry ? '(dry mode)' : '')
if (!generator) {
throw new ShowHelpError('please specify a generator.')
}
if (!action) {
throw new ShowHelpError(`please specify an action for ${generator}.`)
}
logger.log(`Loaded templates: ${templates.replace(`${cwd}/`, '')}`)
if (!(await fs.exists(actionfolder))) {
throw new ShowHelpError(`I can't find action '${action}' for generator '${generator}'.
You can try:
1. 'hygen init self' to initialize your project, and
2. 'hygen generator new --name ${generator}' to build the generator you wanted.
Check out the quickstart for more: http://www.hygen.io/quick-start
`)
}
// lazy loading these dependencies gives a better feel once
// a user is exploring hygen (not specifying what to execute)
const execute = (await import('./execute')).default
const render = (await import('./render')).default
return execute(await render(args, config), args, config)
}
export { ShowHelpError }
export default engine