react-scaffolder-core
Version:
Core APIs for react-scaffolder
216 lines (200 loc) • 7.32 kB
JavaScript
const fs = require('fs.extra');
const path = require('path');
/**
* create component file with fs
* @param {string} re - regular expresssion
* @param {string} componentName - component name
* @param {string} answersInner - options provided when creating component
*/
const generate = function() {};
generate.prototype.createComponentFile = function(re, componentName, answersInner) {
const _modFile = file.replace(re, componentName);
const __modFile = this.createModFile(_modFile, answersInner, componentName);
console.log(__modFile);
fs.writeFileSync(path.join(process.cwd(), 'src/components', module, componentName + '.react.js'), __modFile, 'utf-8');
}
/**
* createComponentFacade
* @param {string} module - module name to create a component
* @param {string} componentName - component name
* @param {string} asnwers - options provided when creating component
* @param {string} answersInner - options provided when creating component
* @param {function} cb - callback for status return
*/
generate.prototype.generateComponent = function(type, module, componentName, answers, answersInner, sourceDirectory, cb) {
try {
if(componentName !== undefined) {
const exists = fs.accessSync(path.join(process.cwd(), sourceDirectory, 'components', module, componentName), fs.F_OK);
cb(`${componentName}.react.js already exists`);
return;
}
else {
const exists = fs.accessSync(path.join(process.cwd(), sourceDirectory, 'components', module + '.react.js'), fs.F_OK);
cb(`${componentName}.react.js already exists`);
return;
}
}
catch(e) {
const file = fs.readFileSync(path.join(__dirname, '..', `templates/components/${type}-component.react.js`), 'utf-8');
const re = /<name>/gi;
if(componentName !== undefined) {
try {
if(answers.propTypes === 'no') {
fs.mkdirSync(path.join(process.cwd(), sourceDirectory, 'components', module), 0755);
const _modFile = file.replace(re, componentName);
fs.writeFileSync(path.join(process.cwd(), sourceDirectory, 'components', module, componentName + '.react.js'), _modFile, 'utf-8');
cb(true);
}
else {
fs.mkdirSync(path.join(process.cwd(), sourceDirectory, 'components', module), 0755);
const _modFile = file.replace(re, componentName);
const __modFile = this.createModFile(_modFile, answersInner, componentName);
fs.writeFileSync(path.join(process.cwd(), sourceDirectory, 'components', module, componentName + '.react.js'), __modFile, 'utf-8');
cb(true);
}
}
catch(ex) {
if(ex.syscall == 'open') {
cb('module doesn\'t exist');
}
else {
const _modFile = file.replace(re, componentName);
const __modFile = this.createModFile(_modFile, answersInner, componentName);
fs.writeFileSync(path.join(process.cwd(), sourceDirectory, 'components', module, componentName + '.react.js'), __modFile, 'utf-8');
cb(true);
}
}
}
else {
try {
const _modFile = file.replace(re, module);
const __modFile = this.createModFile(_modFile, answersInner, module);
fs.writeFileSync(path.join(process.cwd(), sourceDirectory, 'components', module + '.react.js'), __modFile, 'utf-8');
cb(true);
}
catch(ex) {
cb('error');
}
}
}
}
/**
* create modifiled file
* @param {string} _modFile - modified file
* @param {string} answersInner - options provided when creating component
* @param {string} componentName - component name
*/
generate.prototype.createModFile = function(_modFile, answersInner, componentName) {
return _modFile.slice(0, Number(_modFile.indexOf('export'))-1) + this.generatePropTypesSet(answersInner, componentName) + _modFile.slice(Number(_modFile.indexOf('export'))-1);
}
/**
* generate propType set
* @param {string} answersInner
* @param {string} componentName - component name
*/
generate.prototype.generatePropTypesSet = function(answersInner, componentName) {
let __propTypes = {};
for(let propName in answersInner) {
__propTypes[propName] = `React.PropTypes.${answersInner[propName]}`;
}
const _answersInner = JSON.stringify(__propTypes, null, 2);
const propTypes = `\n${componentName}.propTypes = ${_answersInner};\n`;
//converting "" => non quotes
const dynamicPropTypes = propTypes.replace(/"/g, '');
return dynamicPropTypes;
}
/**
* createComponentFacade
* @param {string} module - module name to create a component
* @param {string} componentName - component name
* @param {string} asnwers - options provided when creating component
* @param {string} answersInner - options provided when creating component
* @param {function} cb - callback for status return
*/
generate.prototype.createComponent = function(module, componentName, answers, answersInner, cb) {
this.generateComponent(answers.componentType, module, componentName, answers, answersInner, cb);
}
/**
* creat test file
* @param {string} module - module name to create a component
* @param {string} testName - test file name
* @param {function} cb - callback for status return
*/
generate.prototype.createTest = function(module, testName, sourceDirectory, cb) {
try {
if(testName !== undefined) {
const existsModule = fs.accessSync(path.join(process.cwd(), sourceDirectory, '__tests__', module, testName), fs.F_OK);
cb(`${componentName}.js test file already exists`);
return;
}
else {
const exists = fs.accessSync(path.join(process.cwd(), sourceDirectory, '__tests__', module + '.js'), fs.F_OK);
cb(`${componentName}.js test file already exists`);
return;
}
}
catch(e) {
const file = fs.readFileSync(path.join(__dirname, '..', `templates/src/__tests__/app.js`), 'utf-8');
if(testName !== undefined) {
try {
fs.mkdirSync(path.join(process.cwd(), sourceDirectory, '__tests__', module), 0755);
fs.writeFileSync(path.join(process.cwd(), sourceDirectory, '__tests__', module, testName + '.js'), file, 'utf-8');
cb(true);
}
catch(ex) {
if(ex.syscall == 'open') {
cb('module doesn\'t exist');
}
else {
fs.writeFileSync(path.join(process.cwd(), sourceDirectory, '__tests__', module, testName + '.js'), file, 'utf-8');
cb(true);
}
}
}
else {
try {
fs.writeFileSync(path.join(process.cwd(), sourceDirectory, '__tests__', module + '.js'), file, 'utf-8');
cb(true);
}
catch(ex) {
if(ex.syscall == 'open') {
cb('file doesn\'t exist');
}
else {
cb(ex);
}
}
}
}
}
generate.prototype.generateTemplate = function(template, destination) {
try {
if(template !== undefined) {
const exists = fs.accessSync(path.join(process.cwd(), template), fs.F_OK);
cb('template already exists');
return;
}
else {
cb('provide template name');
}
}
catch(e) {
const file = fs.readFileSync(path.join(__dirname, template), 'utf-8');
try {
fs.writeFileSync(path.join(process.cwd(), destination), _modFile, 'utf-8');
cb(true);
}
catch(ex) {
if(ex.syscall == 'open') {
cb('module doesn\'t exist');
}
else {
const _modFile = file.replace(re, componentName);
const __modFile = this.createModFile(_modFile, answersInner, componentName);
fs.writeFileSync(path.join(process.cwd(), sourceDirectory, 'components', module, componentName + '.react.js'), __modFile, 'utf-8');
cb(true);
}
}
}
}
module.exports = generate;