238 lines
8.8 KiB
JavaScript
238 lines
8.8 KiB
JavaScript
'use strict';
|
|
|
|
var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard");
|
|
|
|
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
|
|
|
var _Object$defineProperty2 = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
|
|
|
_Object$defineProperty2(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
exports.default = _default;
|
|
|
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
|
|
|
|
var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-properties"));
|
|
|
|
var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"));
|
|
|
|
var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"));
|
|
|
|
var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"));
|
|
|
|
var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
|
|
|
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));
|
|
|
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
|
|
|
|
var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
|
|
|
|
var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
|
|
|
|
var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
|
|
|
|
var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
|
|
|
var _entries = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/entries"));
|
|
|
|
var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
|
|
|
|
var _promptBypass = _interopRequireDefault(require("./prompt-bypass"));
|
|
|
|
var buildInActions = _interopRequireWildcard(require("./actions"));
|
|
|
|
function ownKeys(object, enumerableOnly) { var keys = (0, _keys.default)(object); if (_getOwnPropertySymbols.default) { var symbols = (0, _getOwnPropertySymbols.default)(object); if (enumerableOnly) symbols = (0, _filter.default)(symbols).call(symbols, function (sym) { return (0, _getOwnPropertyDescriptor.default)(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
|
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context3; (0, _forEach.default)(_context3 = ownKeys(source, true)).call(_context3, function (key) { (0, _defineProperty3.default)(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors.default) { (0, _defineProperties.default)(target, (0, _getOwnPropertyDescriptors.default)(source)); } else { var _context4; (0, _forEach.default)(_context4 = ownKeys(source)).call(_context4, function (key) { (0, _defineProperty2.default)(target, key, (0, _getOwnPropertyDescriptor.default)(source, key)); }); } } return target; }
|
|
|
|
function _default(plopfileApi, flags) {
|
|
let abort; // triggers inquirer with the correct prompts for this generator
|
|
// returns a promise that resolves with the user's answers
|
|
|
|
const runGeneratorPrompts = async function (genObject, bypassArr = []) {
|
|
const {
|
|
prompts
|
|
} = genObject;
|
|
|
|
if (prompts == null) {
|
|
throw Error(`${genObject.name} has no prompts`);
|
|
}
|
|
|
|
if (typeof prompts === 'function') {
|
|
return await prompts(plopfileApi.inquirer);
|
|
} // handle bypass data when provided
|
|
|
|
|
|
const [promptsAfterBypass, bypassAnswers] = (0, _promptBypass.default)(prompts, bypassArr, plopfileApi);
|
|
return await plopfileApi.inquirer.prompt(promptsAfterBypass).then(answers => (0, _assign.default)(answers, bypassAnswers));
|
|
}; // Run the actions for this generator
|
|
|
|
|
|
const runGeneratorActions = async function (genObject, data = {}, hooks = {}) {
|
|
const noop = () => {};
|
|
|
|
const {
|
|
onSuccess = noop,
|
|
// runs after each successful action
|
|
onFailure = noop,
|
|
// runs after each failed action
|
|
onComment = noop // runs for each comment line in the actions array
|
|
|
|
} = hooks;
|
|
const changes = []; // array of changed made by the actions
|
|
|
|
const failures = []; // array of actions that failed
|
|
|
|
let {
|
|
actions
|
|
} = genObject; // the list of actions to execute
|
|
|
|
const customActionTypes = getCustomActionTypes();
|
|
const actionTypes = (0, _assign.default)({}, customActionTypes, buildInActions);
|
|
abort = false; // if action is a function, run it to get our array of actions
|
|
|
|
if (typeof actions === 'function') {
|
|
actions = actions(data);
|
|
} // if actions are not defined... we cannot proceed.
|
|
|
|
|
|
if (actions == null) {
|
|
throw Error(`${genObject.name} has no actions`);
|
|
} // if actions are not an array, invalid!
|
|
|
|
|
|
if (!(actions instanceof Array)) {
|
|
throw Error(`${genObject.name} has invalid actions`);
|
|
}
|
|
|
|
for (let [actionIdx, action] of (0, _entries.default)(actions).call(actions)) {
|
|
// including strings in the actions array is used for commenting
|
|
if (typeof action === 'string' && abort) {
|
|
continue;
|
|
}
|
|
|
|
if (typeof action === 'string') {
|
|
onComment(action);
|
|
continue;
|
|
}
|
|
|
|
const actionIsFunction = typeof action === 'function';
|
|
const actionCfg = actionIsFunction ? {
|
|
type: 'function'
|
|
} : action;
|
|
const actionLogic = actionIsFunction ? action : actionTypes[actionCfg.type]; // bail out if a previous action aborted
|
|
|
|
if (abort) {
|
|
const failure = {
|
|
type: actionCfg.type || '',
|
|
path: actionCfg.path || '',
|
|
error: 'Aborted due to previous action failure'
|
|
};
|
|
onFailure(failure);
|
|
failures.push(failure);
|
|
continue;
|
|
}
|
|
|
|
actionCfg.force = flags.force === true || actionCfg.force === true;
|
|
|
|
if (typeof actionLogic !== 'function') {
|
|
if (actionCfg.abortOnFail !== false) {
|
|
abort = true;
|
|
}
|
|
|
|
const failure = {
|
|
type: actionCfg.type || '',
|
|
path: actionCfg.path || '',
|
|
error: `Invalid action (#${actionIdx + 1})`
|
|
};
|
|
onFailure(failure);
|
|
failures.push(failure);
|
|
continue;
|
|
}
|
|
|
|
try {
|
|
const actionResult = await executeActionLogic(actionLogic, actionCfg, data);
|
|
onSuccess(actionResult);
|
|
changes.push(actionResult);
|
|
} catch (failure) {
|
|
if (actionCfg.abortOnFail !== false) {
|
|
abort = true;
|
|
}
|
|
|
|
onFailure(failure);
|
|
failures.push(failure);
|
|
}
|
|
}
|
|
|
|
return {
|
|
changes,
|
|
failures
|
|
};
|
|
}; // handle action logic
|
|
|
|
|
|
const executeActionLogic = async function (action, cfg, data) {
|
|
var _context;
|
|
|
|
const type = cfg.type || '';
|
|
let cfgData = cfg.data || {}; // data can also be a function that returns a data object
|
|
|
|
if (typeof cfgData === 'function') {
|
|
cfgData = await cfgData();
|
|
} // check if action should run
|
|
|
|
|
|
if (typeof cfg.skip === 'function') {
|
|
// Merge main data and config data in new object
|
|
const reasonToSkip = await cfg.skip(_objectSpread({}, data, {}, cfgData));
|
|
|
|
if (typeof reasonToSkip === 'string') {
|
|
// Return actionResult instead of string
|
|
return {
|
|
type: 'skip',
|
|
path: reasonToSkip
|
|
};
|
|
}
|
|
} // track keys that can be applied to the main data scope
|
|
|
|
|
|
const cfgDataKeys = (0, _filter.default)(_context = (0, _keys.default)(cfgData)).call(_context, k => typeof data[k] === 'undefined'); // copy config data into main data scope so it's available for templates
|
|
|
|
(0, _forEach.default)(cfgDataKeys).call(cfgDataKeys, k => {
|
|
data[k] = cfgData[k];
|
|
});
|
|
return await _promise.default.resolve(action(data, cfg, plopfileApi)).then( // show the resolved value in the console
|
|
result => ({
|
|
type,
|
|
path: typeof result === 'string' ? result : (0, _stringify.default)(result)
|
|
}), // a rejected promise is treated as a failure
|
|
err => {
|
|
throw {
|
|
type,
|
|
path: '',
|
|
error: err.message || err.toString()
|
|
};
|
|
}) // cleanup main data scope so config data doesn't leak
|
|
.finally(() => (0, _forEach.default)(cfgDataKeys).call(cfgDataKeys, k => {
|
|
delete data[k];
|
|
}));
|
|
}; // request the list of custom actions from the plopfile
|
|
|
|
|
|
function getCustomActionTypes() {
|
|
var _context2;
|
|
|
|
return (0, _reduce.default)(_context2 = plopfileApi.getActionTypeList()).call(_context2, function (types, name) {
|
|
types[name] = plopfileApi.getActionType(name);
|
|
return types;
|
|
}, {});
|
|
}
|
|
|
|
return {
|
|
runGeneratorActions,
|
|
runGeneratorPrompts
|
|
};
|
|
} |