cra-template-rb
Version:
The official React Boilerplate template for Create React App
107 lines (94 loc) • 2.71 kB
text/typescript
/**
* 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;
},
};