UNPKG

5.15 kBJavaScriptView Raw
1var program = require('commander');
2var appRoot = require('app-root-path');
3var fs = require('fs');
4
5var componentTemplate = require('./templates/component');
6var specComponentTemplate = require('./templates/spec-component');
7var classComponentTemplate = require('./templates/class-component');
8var containerTemplate = require('./templates/container');
9var storeTemplate = require('./templates/store');
10var specStoreTemplate = require('./templates/spec-store');
11var componentMobxTemplate = require('./templates/component-mobx');
12var specComponentMobxTemplate = require('./templates/spec-component-mobx');
13var classComponentMobxTemplate = require('./templates/class-component-mobx');
14var containerMobxTemplate = require('./templates/container-mobx');
15
16var utils = require('./utils');
17
18/**
19 * Grab type and name, also provide --help functionality
20 */
21program
22 .option('-g, --generate <type>, generate a new application element')
23 .option('-n, --name <name>, name for new file')
24 .option('-m, --mock <mock>, random shit')
25 .parse(process.argv)
26
27const LOWER = utils.snakeToCamelCase(program.name.toLowerCase());
28const CAPITAL = utils.toCapitalCase(LOWER);
29
30switch (program.generate) {
31 case 'component':
32 createAsset('components', CAPITAL, componentTemplate, specComponentTemplate);
33 break;
34 case 'component:mobx':
35 createAsset('components', CAPITAL, componentMobxTemplate, specComponentMobxTemplate);
36 break;
37 case 'class-component':
38 createAsset('components', CAPITAL, classComponentTemplate, specComponentTemplate);
39 break;
40 case 'class-component:mobx':
41 createAsset('components', CAPITAL, classComponentMobxTemplate, specComponentMobxTemplate);
42 break;
43 case 'container':
44 createAsset('containers', CAPITAL, containerTemplate, specComponentTemplate);
45 break;
46 case 'container:mobx':
47 createAsset('containers', CAPITAL, containerMobxTemplate, specComponentMobxTemplate);
48 break;
49 case 'store':
50 createAsset('stores', LOWER + 'Store', storeTemplate, specStoreTemplate);
51 break;
52 case 'test':
53 var typeOptions = {
54 container: 'containers',
55 store: 'stores',
56 component: 'components'
57 };
58 console.log('program', program);
59 console.log('type', program.mock);
60 var invalidType = !program.mock && !Object.hasOwnProperty(program.mock.toLowerCase());
61
62 if(invalidType){
63 console.error('Please enter a valid type. Store, Container, or Component');
64 return null;
65 }
66
67 createTest(typeOptions[program.mock.toLowerCase()], CAPITAL);
68 break;
69 default:
70 console.error(program.generate + ' is not a valid element that can be created');
71 break;
72}
73
74/**
75 * @param { string } type type of asset being created
76 * @param { string } fileName formatted file name for asset
77 * @param { function } fileTemplate template for asset that returns a string template
78 * @param { function } specTemplate spec template for asset that returns a string template
79 */
80function createAsset(type, fileName, fileTemplate, specTemplate){
81 const assetPath = appRoot + '/src/' + type + '/' + fileName + '/';
82
83 // Only writes to pre-existing
84 try {
85 if(!fs.existsSync(appRoot + '/src/')) {
86 fs.mkdirSync(appRoot + '/src/');
87 };
88
89 if(!fs.existsSync(appRoot + '/src/' + type + '/')){
90 fs.mkdirSync(appRoot + '/src/' + type + '/');
91 }
92
93 if(fs.existsSync(assetPath)){
94 throw `${type.toUpperCase()} PATH COLLISION`;
95 } else {
96 fs.mkdirSync(assetPath);
97 console.info(fileName + ' was successfully created!');
98 }
99 } catch(err){
100 console.error(err);
101 console.error(`That ${type} already exists. Delete existing file or choose another name.`);
102 return null;
103 }
104
105 fs.writeFile(assetPath + fileName + '.js', fileTemplate(LOWER, CAPITAL), function(err){
106 if(err){
107 console.error(err);
108 }
109
110 console.info(`${fileName}.js was successfully created!`)
111 });
112
113 fs.writeFile(assetPath + 'spec.js', specTemplate(LOWER, CAPITAL), function(err){
114 if(err){
115 console.error(err);
116 }
117
118 console.info(`${CAPITAL} test file was successfully created!`);
119 });
120
121
122}
123
124/**
125 *
126 * @param {string} type // type of test to create
127 * @param {string} directoryName // name of folder to put test
128 */
129function createTest(type, directoryName){
130 const assetPath = appRoot + '/src/' + type + '/' + directoryName + '/' + 'spec.js';
131 let template = specComponentTemplate;
132
133 if(type === 'stores'){
134 template = specStoreTemplate;
135 }
136
137 try {
138 if(fs.existsSync(assetPath)){
139 throw `${type.toUpperCase()} PATH COLLISION`;
140 }
141 } catch(err){
142 console.error(err);
143 return null;
144 }
145
146 fs.writeFile(assetPath, template(LOWER, CAPITAL), function(err){
147 if(err){
148 console.error(err);
149 }
150
151 console.info(`${CAPITAL} test file was successfully created!`);
152 });
153}
\No newline at end of file