@bpanel/bpanel-cli
Version:
CLI tool for building bpanel plugins
157 lines (145 loc) • 4.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _semver = require('semver');
var _semver2 = _interopRequireDefault(_semver);
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _validateNpmPackageName = require('validate-npm-package-name');
var _validateNpmPackageName2 = _interopRequireDefault(_validateNpmPackageName);
var _helpers = require('./helpers');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = config => [{
type: 'input',
name: 'name',
message: 'Name of your plugin: ',
// npm name validation so plugin names conform to npm rules
validate: input => {
const { errors = [], warnings = [], validForNewPackages } = (0, _validateNpmPackageName2.default)(input);
if (errors.length || warnings.length) return errors.concat(warnings).join(' & ');
return validForNewPackages;
}
}, {
type: 'input',
name: 'display',
message: 'Display name (defaults to package name if blank):'
}, {
type: 'input',
name: 'version',
message: 'Version (0.0.1): ',
default: '0.0.1',
validate: version => _semver2.default.valid(version) ? true : 'Please enter valid semver'
}, {
type: 'input',
name: 'author',
message: 'Author: '
}, {
type: 'input',
name: 'description',
message: 'Description: '
}, {
type: 'input',
name: 'keywords',
message: 'Keywords (separated by comma): '
}, {
type: 'input',
name: 'license',
message: 'License: ',
default: 'MIT'
}, {
type: 'confirm',
name: 'dependencyCheck',
message: 'Will your plugin depend on any other published bPanel plugins?',
default: false
}, {
type: 'input',
name: 'dependencies',
message: 'List your dependencies (separated by commas and only valid bPanel plugins):',
when: answers => answers.dependencyCheck,
validate: plugins => {
const pluginsArr = plugins.split(',');
for (let plugin of pluginsArr) {
if (plugin.indexOf('bpanel-ui') > -1 || plugin.indexOf('bpanel-utils') > -1) {
return `${plugin} is not a valid bPanel plugin but a utility library ` + `and is already included in peerDependencies by default. ` + `Plugins must expose metadata and at least one of the API ` + `extensions (e.g. decoratePanel or middleware)`;
} else if (plugin.indexOf('bpanel-cli') > -1) {
return `${plugin} is not a plugin`;
}
};
return true;
}
}, {
type: 'confirm',
name: 'theme',
message: 'Will you be making a theme?',
default: false
}, {
type: 'confirm',
name: 'nav',
message: 'Would you like to add your plugin to the app\'s navigation?',
default: false
}, {
type: 'autocomplete',
name: 'icon',
message: 'What icon would you like to use for your nav item? (supports font awesome icon names: https://fontawesome.com) ',
when: answers => answers.nav,
validate: icon => {
if (/fa-/.test(icon)) return `Exclude 'fa-' prefix`;else if (/\s/.test(icon)) return 'Must not include white space';
return true;
}
}, {
type: 'confirm',
name: 'additionalModules',
message: 'Would you like to add any additional module templates (e.g. mapComponentState, decoratePanel, reduceNode, etc.)?',
default: false
}, {
type: 'checkbox',
name: 'modules',
message: 'Select additional modules (choose none to build yourself), use space bar to toggle.',
choices: [{
name: 'decorateComponent'
}, {
name: 'decoratePanel'
}, {
name: 'getRouteProps'
}, {
name: 'mapComponentDispatch'
}, {
name: 'mapComponentState'
}, {
name: 'middleware'
}, {
name: 'reduceNode'
}, {
name: 'reduceChain'
}, {
name: 'reduceWallets'
}, {
name: 'reducePlugins'
}, {
name: 'socketListeners'
}],
when: answers => answers.additionalModules
}, {
type: 'list',
name: 'targetComponent',
message: 'Pick target component for decoration or mapping:',
choices: ['Footer', 'Header', 'Sidebar', 'Panel'],
when: answers => {
const { modules } = answers;
if (!modules) return false;
return _helpers.modulesWithTarget.some(name => modules.indexOf(name) > -1);
}
}, {
type: 'confirm',
name: 'localPlugins',
message: `Install your plugin in bPanel's local_plugins directory? (${config.prefix})`,
default: true
}, {
type: 'input',
name: 'destination',
message: 'Pick a target destination for your plugin directory',
default: process.cwd,
when: answers => !answers.localPlugins,
validate: dest => _fsExtra2.default.existsSync(dest) ? true : 'Please enter valid path. Must be absolute path'
}];