UNPKG

cpoo

Version:
108 lines (103 loc) 4.76 kB
"use strict"; 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' }, ];