cpoo
Version:
simple react component generator
108 lines (103 loc) • 4.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@oclif/core");
const handlebars_1 = require("handlebars");
const promises_1 = require("fs/promises");
const path_1 = require("path");
const prefix_1 = require("../../utils/prefix");
const string_1 = require("../../utils/string");
class Generate extends core_1.Command {
async run() {
const { args, flags } = await this.parse(Generate);
const { excludeTest, excludeStory } = flags;
const { componentName, path } = args;
const pathToComponent = (0, path_1.join)(process.cwd(), `${path}/${componentName}/`);
await this.makeDir(pathToComponent);
const config = await this.readConfig();
await this.generate(componentName, path, config, excludeTest, excludeStory);
this.log('\n', (0, prefix_1.info)(), ': completed to generate component :)');
}
async makeDir(pathToComponent) {
try {
await (0, promises_1.access)(pathToComponent);
this.log((0, prefix_1.info)(), ': existed such directory.\n');
}
catch {
this.log((0, prefix_1.info)(), ': No such directory, so make dir.\n');
await (0, promises_1.mkdir)(pathToComponent, { recursive: true });
this.log((0, prefix_1.success)(), ': completed to make directory :3\n');
}
}
async generate(name, path, config, excludeTest, excludeStory) {
const templates = await (0, promises_1.readdir)((0, path_1.join)(__dirname, '/templates/'));
const pathToComponent = (0, path_1.join)(process.cwd(), `${path}/${name}/`);
return Promise.all(templates
.filter(t => this.isGenerate(t, config.types, excludeTest, excludeStory))
.map(async (template) => {
var _a;
try {
const buffer = await (0, promises_1.readFile)((0, path_1.join)(__dirname, `/templates/${template}`));
const compiled = (0, handlebars_1.compile)(buffer.toString());
const ext = template.includes('index') ? config.extension.replace('x', '') : config.extension;
const fileName = template
.slice(template.indexOf('.') + 1)
.replace('{name}', name)
.replace('{testMatch}', (_a = config.testMatch) !== null && _a !== void 0 ? _a : 'test')
.replace('{ext}', ext !== null && ext !== void 0 ? ext : 'js')
.slice(0, -4);
await (0, promises_1.writeFile)((0, path_1.join)(pathToComponent, fileName), compiled({ name, directry: (0, string_1.getLastDirectry)(path) }));
this.log(`${(0, prefix_1.success)()} created: ${pathToComponent}${fileName}`);
}
catch (error_) {
this.log((0, prefix_1.error)(), ': generate component :(\n', error_);
}
}));
}
async readConfig() {
try {
const config = await (0, promises_1.readFile)((0, path_1.join)(process.cwd(), '.cpoorc'), 'utf-8');
return Promise.resolve(JSON.parse(config));
}
catch {
return Promise.resolve({
extension: '',
types: [],
testMatch: '',
});
}
}
isGenerate(templateName, fileTypes, excludeTest, excludeStory) {
if (templateName.includes('component')) {
return true;
}
if (templateName.includes('test') && excludeTest) {
return false;
}
if (templateName.includes('storybook') && excludeStory) {
return false;
}
return fileTypes.some(t => templateName.includes(t));
}
}
exports.default = Generate;
Generate.description = 'generate React Component';
Generate.examples = [
`$ cpoo generate Button src/components/atoms
info : No such directory, so make dir.
success : completed to make directory :3
success created: /your/project/src/components/atoms/Button/Button.stories.tsx
success created: /your/project/src/components/atoms/Button/Button.test.tsx
success created: /your/project/src/components/atoms/Button/Button.tsx
success created: /your/project/src/components/atoms/Button/Button.ts
info : completed to generate component :)
`,
];
Generate.flags = {
help: core_1.Flags.help({ char: 'h' }),
excludeTest: core_1.Flags.boolean({ default: false, description: 'exclude generating test file.' }),
excludeStory: core_1.Flags.boolean({ default: false, description: 'exclude generating storybook file.' }),
};
Generate.args = [
{ name: 'componentName', description: 'component name', required: true },
{ name: 'path', description: 'path to component' },
];