UNPKG

cra-template-rb

Version:

The official React Boilerplate template for Create React App

107 lines (94 loc) 2.71 kB
/** * Container Generator */ import { Actions, PlopGeneratorConfig } from 'node-plop'; import path from 'path'; import inquirer from 'inquirer'; import { pathExists } from '../utils'; import { baseGeneratorPath } from '../paths'; inquirer.registerPrompt('directory', require('inquirer-directory')); export const enum SliceProptNames { 'sliceName' = 'sliceName', 'path' = 'path', 'wantSaga' = 'wantSaga', } type Answers = { [P in SliceProptNames]: string }; export const rootStatePath = path.join( __dirname, '../../../src/types/RootState.ts', ); export const sliceGenerator: PlopGeneratorConfig = { description: 'Add a redux toolkit slice', prompts: [ { type: 'input', name: SliceProptNames.sliceName, message: 'What should it be called (automatically adds ...Slice postfix)', }, { type: 'directory', name: SliceProptNames.path, message: 'Where do you want it to be created?', basePath: `${baseGeneratorPath}`, } as any, { type: 'confirm', name: SliceProptNames.wantSaga, default: true, message: 'Do you want sagas for asynchronous flows? (e.g. fetching data)', }, ], actions: data => { const answers = data as Answers; const slicePath = `${baseGeneratorPath}/${answers.path}/slice`; if (pathExists(slicePath)) { throw new Error(`Slice '${answers.sliceName}' already exists`); } const actions: Actions = []; actions.push({ type: 'add', path: `${slicePath}/index.ts`, templateFile: './slice/index.ts.hbs', abortOnFail: true, }); actions.push({ type: 'add', path: `${slicePath}/selectors.ts`, templateFile: './slice/selectors.ts.hbs', abortOnFail: true, }); actions.push({ type: 'add', path: `${slicePath}/types.ts`, templateFile: './slice/types.ts.hbs', abortOnFail: true, }); actions.push({ type: 'modify', path: `${rootStatePath}`, pattern: new RegExp(/.*\/\/.*\[IMPORT NEW CONTAINERSTATE ABOVE\].+\n/), templateFile: './slice/importContainerState.hbs', abortOnFail: true, }); actions.push({ type: 'modify', path: `${rootStatePath}`, pattern: new RegExp(/.*\/\/.*\[INSERT NEW REDUCER KEY ABOVE\].+\n/), templateFile: './slice/appendRootState.hbs', abortOnFail: true, }); if (answers.wantSaga) { actions.push({ type: 'add', path: `${slicePath}/saga.ts`, templateFile: './slice/saga.ts.hbs', abortOnFail: true, }); } actions.push({ type: 'prettify', data: { path: `${slicePath}/**` }, }); return actions; }, };