You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
3.2 KiB
74 lines
3.2 KiB
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const fs_1 = __importDefault(require("fs"));
|
|
const path_1 = __importDefault(require("path"));
|
|
const yeoman_generator_1 = __importDefault(require("yeoman-generator"));
|
|
const copy_utils_1 = require("./utils/copy-utils");
|
|
const webpack_cli_1 = require("webpack-cli");
|
|
const { logger, getPackageManager } = webpack_cli_1.utils;
|
|
/**
|
|
* Creates a Yeoman Generator that generates a project conforming
|
|
* to webpack-defaults.
|
|
*
|
|
* @param {Generator.Questions} prompts An array of Yeoman prompt objects
|
|
*
|
|
* @param {string} templateDir Absolute path to template directory
|
|
*
|
|
* @param {string[]} copyFiles An array of file paths (relative to `./templates`)
|
|
* of files to be copied to the generated project. File paths should be of the
|
|
* form `path/to/file.js.tpl`.
|
|
*
|
|
* @param {string[]} copyTemplateFiles An array of file paths (relative to
|
|
* `./templates`) of files to be copied to the generated project. Template
|
|
* file paths should be of the form `path/to/_file.js.tpl`.
|
|
*
|
|
* @param {Function} templateFn A function that is passed a generator instance and
|
|
* returns an object containing data to be supplied to the template files.
|
|
*
|
|
* @returns {Generator} A class extending Generator
|
|
*/
|
|
const addonGenerator = (prompts, templateDir, copyFiles, copyTemplateFiles, templateFn) => {
|
|
return class extends yeoman_generator_1.default {
|
|
prompting() {
|
|
return this.prompt(prompts).then((props) => {
|
|
this.props = props;
|
|
});
|
|
}
|
|
default() {
|
|
const currentDirName = path_1.default.basename(this.destinationPath());
|
|
if (currentDirName !== this.props.name) {
|
|
this.log(`
|
|
Your project must be inside a folder named ${this.props.name}
|
|
I will create this folder for you.
|
|
`);
|
|
const pathToProjectDir = this.destinationPath(this.props.name);
|
|
try {
|
|
fs_1.default.mkdirSync(pathToProjectDir, { recursive: true });
|
|
}
|
|
catch (error) {
|
|
logger.error('Failed to create directory');
|
|
logger.error(error);
|
|
}
|
|
this.destinationRoot(pathToProjectDir);
|
|
}
|
|
}
|
|
writing() {
|
|
const packageJsonTemplatePath = '../addon-template/package.json.js';
|
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
this.fs.extendJSON(this.destinationPath('package.json'), require(packageJsonTemplatePath)(this.props.name));
|
|
this.copy = copy_utils_1.generatorCopy(this, templateDir);
|
|
this.copyTpl = copy_utils_1.generatorCopyTpl(this, templateDir, templateFn(this));
|
|
copyFiles.forEach(this.copy);
|
|
copyTemplateFiles.forEach(this.copyTpl);
|
|
}
|
|
install() {
|
|
const packager = getPackageManager();
|
|
const opts = packager === 'yarn' ? { dev: true } : { 'save-dev': true };
|
|
this.scheduleInstallTask(packager, ['webpack-defaults', 'bluebird'], opts);
|
|
}
|
|
};
|
|
};
|
|
exports.default = addonGenerator;
|
|
|