'use strict'; const { join } = require('path'); const { flow, camelCase, upperFirst, lowerCase } = require('lodash'); const fileExistsInPackages = require('../utils/fileExistsInPackages'); const getPluginList = require('../utils/getPluginList'); const packagesFolder = require('../utils/packagesFolder'); const pascalCase = flow(camelCase, upperFirst); const prompts = [ { type: 'list', name: 'plugin', message: 'Which plugin should be targeted?', choices: getPluginList, }, { type: 'input', name: 'name', message: 'What should be the name of the component?', async validate(name, answers) { if (!name) { return 'The name cannot be empty.'; } return (await fileExistsInPackages(`${answers.plugin}/admin/src/components/${name}`)) ? 'This component already exists.' : true; }, filter: pascalCase, }, { type: 'confirm', name: 'styled', message: 'Is this a styled component?', }, { type: 'input', name: 'htmlTag', message: 'Which HTML tag should be used as a base?', when: answers => answers.styled, validate: htmlTag => (!htmlTag ? 'The HTML tag cannot be empty.' : true), filter: lowerCase, }, { type: 'confirm', name: 'useI18n', message: 'Will it use i18n?', when: answers => !answers.styled, }, { type: 'confirm', name: 'useRedux', message: 'Will it use Redux?', when: answers => !answers.styled, }, ]; const actions = answers => { const { useRedux } = answers; const [pluginFolder, plugin] = answers.plugin.split('/'); answers.plugin = plugin; const templatesFolder = 'component/templates'; const pattern = useRedux ? '**/**.hbs' : '**/index.*.hbs'; const path = join(packagesFolder, pluginFolder, '{{plugin}}/admin/src/components/{{name}}'); return [ { type: 'addMany', destination: path, templateFiles: [`${templatesFolder}/${pattern}`], base: templatesFolder, }, // TODO: If redux will be used then 'append' created reducer inside 'reducers.js' { type: 'lint', files: [path], }, ]; }; module.exports = { prompts, actions };