create-yo
Version:
Use Yeoman generators via "npm init"
92 lines (82 loc) • 2.16 kB
JavaScript
;
const path = require('path');
const globalDirs = require('global-dirs');
const importFrom = require('import-from');
const npx = importFrom(path.join(globalDirs.npm.packages, 'npm'), 'libnpx');
const symbols = require('log-symbols');
const bold = require('ansi-bold');
/**
* Invokes `npx` with `--package yo --package generator-generatorName -- yo generatorName`
*
* @public
* @param {string[]} [argv] - Args to use, or copy of `process.argv` by default
* @param {string} [npmPath] - Absolute path to `npm-cli.js`
* @returns {Promise<void>} When finished
*/
async function create(
argv = process.argv.slice(),
npmPath = path.join(globalDirs.npm.binaries, 'npm')
) {
if (argv.length < 3) {
throw new Error(
`specify a generator to run via ${bold(
'npm init yo <generator>'
)}. See list: http://yeoman.io/generators/`
);
}
const [generator, subgenerator] = argv.pop().split(':');
const generatorPackage = packageName(generator);
const generatorName = [
generatorPackage.replace(/generator-/, ''),
subgenerator
]
.filter(Boolean)
.join(':');
return npx(
npx.parseArgs(
[
...argv,
'--package',
'yo',
'--package',
generatorPackage,
'--',
'yo',
generatorName
],
npmPath
)
);
}
(async function() {
if (require.main === module) {
try {
await create();
console.error(`${symbols.success} create-yo ok!`);
} catch (err) {
console.error(`${symbols.error} create-yo errored:\n\n${err}`);
process.exit(1);
}
}
})();
exports.create = create;
/**
* Get package name for given generator.
*
* @private
* @param {string} generator
* @returns {string} package name
*
* @example
* ```js
* generatorName(`license`) // => `generator-license`
* generatorName(`@dizmo/dizmo`) // => `@dizmo/generator-dizmo`
* ```
*/
function packageName(generator) {
if (/^@[^/]+\//.test(generator)) {
return generator.replace(/^@([^/]+)\/(generator-)?/, '@$1/generator-');
}
return generator.replace(/^(generator-)?/, 'generator-');
}