UNPKG

cr-react-cli

Version:

Create react files with a single command

222 lines (221 loc) 6.61 kB
var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); // Libs const inquirer_1 = __importDefault(require("inquirer")); const clear_1 = __importDefault(require("clear")); // Constants const constants_1 = require("../constants"); // Configuration const configuration_1 = require("../configuration"); // Helpers const base_action_1 = __importDefault(require("./base.action")); class InitAction extends base_action_1.default { async handle() { (0, clear_1.default)(); const config = {}; const parts = [ { name: 'project', prompt: project }, { name: 'component', prompt: component }, { name: 'style', prompt: style }, ]; const scope = await this.getScope(); for (const part of parts) { config[part.name] = await part.prompt(scope); } this.createConfig(config, scope); } getScope() { return inquirer_1.default .prompt([ { type: 'list', name: 'scope', message: 'For what scope you want to make configuration?', choices: [ { name: 'Global', value: 'global' }, { name: 'Project', value: 'project' }, ], }, ]) .then((res) => res.scope); } createConfig(config, scope) { (0, configuration_1.createConfigurationFile)(config, scope); } } const project = (scope) => inquirer_1.default .prompt([ { type: 'confirm', name: 'path', message: 'Project source path ./src ?', }, { type: 'input', name: 'manualPath', message: 'Input project source folder path', when: (res) => !res.path, }, { type: 'confirm', name: 'typescript', message: 'Using typescript?', }, { type: 'list', name: 'casing', message: 'Global file name casing', choices: [ { name: 'Kebab', value: 'kebab' }, { name: 'Snake', value: 'snake' }, { name: 'Camel', value: 'camel' }, { name: 'Pascal', value: 'pascal' }, ], }, ]) .then((result) => { if (result.path) { result.path = './src'; } else { result.path = result.manualPath; delete result.manualPath; } result.fileNaming = { casing: result.casing, }; delete result.casing; return result; }); const component = (scope) => inquirer_1.default .prompt([ { type: 'confirm', name: 'style', message: 'Create style file?' }, { type: 'confirm', name: 'story', message: 'Create story file?' }, { type: 'confirm', name: 'test', message: 'Create test file?' }, { type: 'confirm', name: 'proptypes', message: 'Use proptypes?' }, { type: 'list', name: 'naming', message: 'File naming', choices: [ { name: 'Component name', value: '{name}' }, { name: 'index', value: 'index' }, ], }, { type: 'input', name: 'fileNamePostfix', message: 'File name postfix (eg .component) *optional', }, { type: 'confirm', name: 'index', message: 'Create index export file?', when: (result) => result.naming !== 'index', }, { type: 'confirm', name: 'inFolder', message: 'Create folder for component?', }, { type: 'list', name: 'casing', message: 'Component file name casing', choices: [ { name: 'Kebab', value: 'kebab' }, { name: 'Snake', value: 'snake' }, { name: 'Camel', value: 'camel' }, { name: 'Pascal', value: 'pascal' }, ], }, { type: 'confirm', name: 'open', message: 'Open component file in default editor after creating?', }, { type: 'checkbox', name: 'components', message: 'Select types of components you will be using', choices: [ { name: 'Component', value: 'default', checked: true }, { name: 'Page', value: 'page' }, { name: 'Container', value: 'container' }, { name: 'View', value: 'view' }, { name: 'Layout', value: 'layout' }, ], }, ]) .then((result) => { var _a, _b; if (((_a = result.fileNamePostfix) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'n' || ((_b = result.fileNamePostfix) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'no') { delete result.fileNamePostfix; } const components = [...result.components]; const defaultComponent = { ...result }; const config = {}; defaultComponent.fileNaming = { name: defaultComponent.naming, postfix: defaultComponent.fileNamePostfix || '', casing: defaultComponent.casing, }; delete defaultComponent.components; delete defaultComponent.naming; delete defaultComponent.fileNamePostfix; delete defaultComponent.casing; components.forEach((type) => { const directoryName = type === 'default' ? 'component' : type; config[type] = { ...defaultComponent, path: `/${directoryName}s`, }; }); return config; }); const style = (scope) => inquirer_1.default .prompt([ { type: 'list', name: 'type', message: 'Styling type', choices: constants_1.styleTypes, }, { type: 'confirm', name: 'modules', message: 'Use modules', when: (result) => constants_1.cssStyleTypes.some((type) => result.type === type), }, { type: 'list', name: 'naming', message: 'Style file naming', choices: [ { name: 'Component name', value: '{name}' }, { name: 'Style', value: 'style' }, { name: 'Other', value: 'other' }, ], }, { type: 'input', name: 'customStyleNaming', message: 'Input style file name', when: (result) => result.naming === 'other', }, ]) .then((result) => { if (result.customStyleNaming) { result.naming = result.customStyleNaming; delete result.customStyleNaming; } result.fileNaming = { name: result.naming, }; delete result.naming; return result; }); exports.default = InitAction;