UNPKG

@bpanel/bpanel-cli

Version:

CLI tool for building bpanel plugins

157 lines (145 loc) 4.6 kB
'use strict'; 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' }];