3
3
4
4
const fs = require ( 'fs-extra' ) ;
5
5
const path = require ( 'path' ) ;
6
+ const logger = require ( '@blackbaud/skyux-logger' ) ;
6
7
7
- function resolveFilePath ( pathParts , fileName ) {
8
- fs . ensureDirSync ( path . resolve ( 'src' , 'app' , ...pathParts ) ) ;
8
+ function safeFileWrite ( pathParts , fileName , fileContent , force ) {
9
+ const resolvedFileName = path . resolve ( 'src' , 'app' , ...pathParts , fileName ) ;
10
+ const resolvedFileExists = fs . existsSync ( resolvedFileName ) ;
11
+
12
+ if ( resolvedFileExists && ! force ) {
13
+ logger . warn ( `${ resolvedFileName } already exists. Use --force to overwrite.` ) ;
14
+ return ;
15
+ }
16
+
17
+ if ( resolvedFileExists ) {
18
+ logger . warn ( `${ resolvedFileName } already exists. Forcefully overwriting.` ) ;
19
+ }
9
20
10
- return path . resolve ( 'src' , 'app' , ...pathParts , fileName ) ;
21
+ fs . ensureDirSync ( path . resolve ( 'src' , 'app' , ...pathParts ) ) ;
22
+ fs . writeFileSync ( resolvedFileName , fileContent ) ;
23
+ logger . info ( `Successfully created ${ resolvedFileName } .` ) ;
11
24
}
12
25
13
26
function properCase ( name ) {
@@ -45,9 +58,8 @@ function snakeCase(name) {
45
58
return nameSnake ;
46
59
}
47
60
48
- function generateComponentTs ( pathParts , fileName , name , nameSnakeCase ) {
49
- fs . writeFileSync (
50
- resolveFilePath ( pathParts , fileName + '.ts' ) ,
61
+ function generateComponentTs ( pathParts , fileName , name , nameSnakeCase , force ) {
62
+ const fileContent =
51
63
`import {
52
64
Component
53
65
} from '@angular/core';
@@ -60,15 +72,14 @@ function generateComponentTs(pathParts, fileName, name, nameSnakeCase) {
60
72
export class ${ name } {
61
73
62
74
}
63
- `
64
- ) ;
65
- }
75
+ ` ;
66
76
67
- function generateComponentSpec ( pathParts , fileName , name , nameSnakeCase ) {
68
- let nameWithSpaces = properCase ( nameSnakeCase . replace ( / \- / g , ' ' ) ) ;
77
+ safeFileWrite ( pathParts , ` ${ fileName } .ts` , fileContent , force ) ;
78
+ }
69
79
70
- fs . writeFileSync (
71
- resolveFilePath ( pathParts , fileName + '.spec.ts' ) ,
80
+ function generateComponentSpec ( pathParts , fileName , name , nameSnakeCase , force ) {
81
+ const nameWithSpaces = properCase ( nameSnakeCase . replace ( / \- / g, ' ' ) ) ;
82
+ const fileContent =
72
83
`import {
73
84
TestBed
74
85
} from '@angular/core/testing';
@@ -105,29 +116,24 @@ describe('${nameWithSpaces} component', () => {
105
116
});
106
117
107
118
});
108
- `
109
- ) ;
119
+ ` ;
120
+
121
+ safeFileWrite ( pathParts , `${ fileName } .spec.ts` , fileContent , force ) ;
110
122
}
111
123
112
- function generateComponentHtml ( pathParts , fileName ) {
113
- fs . writeFileSync (
114
- resolveFilePath ( pathParts , fileName + '.html' ) ,
115
- ''
116
- ) ;
124
+ function generateComponentHtml ( pathParts , fileName , force ) {
125
+ safeFileWrite ( pathParts , `${ fileName } .html` , '' , force ) ;
117
126
}
118
127
119
- function generateComponentScss ( pathParts , fileName ) {
120
- fs . writeFileSync (
121
- resolveFilePath ( pathParts , fileName + '.scss' ) ,
122
- ''
123
- ) ;
128
+ function generateComponentScss ( pathParts , fileName , force ) {
129
+ safeFileWrite ( pathParts , `${ fileName } .scss` , '' , force ) ;
124
130
}
125
131
126
132
function getPathParts ( name ) {
127
133
return name . replace ( / \\ / g, '/' ) . split ( '/' ) ;
128
134
}
129
135
130
- function generateComponent ( name ) {
136
+ function generateComponent ( name , force ) {
131
137
const pathParts = getPathParts ( name ) ;
132
138
133
139
const classNameWithoutComponent = properCase ( pathParts . pop ( ) ) ;
@@ -138,21 +144,22 @@ function generateComponent(name) {
138
144
139
145
const fileName = `${ nameSnakeCase } .component` ;
140
146
141
- generateComponentTs ( pathParts , fileName , className , nameSnakeCase ) ;
142
- generateComponentSpec ( pathParts , fileName , className , nameSnakeCase ) ;
143
- generateComponentHtml ( pathParts , fileName ) ;
144
- generateComponentScss ( pathParts , fileName ) ;
147
+ generateComponentTs ( pathParts , fileName , className , nameSnakeCase , force ) ;
148
+ generateComponentSpec ( pathParts , fileName , className , nameSnakeCase , force ) ;
149
+ generateComponentHtml ( pathParts , fileName , force ) ;
150
+ generateComponentScss ( pathParts , fileName , force ) ;
145
151
}
146
152
147
153
function generate ( argv ) {
148
154
try {
149
- let type = argv . _ [ 1 ] ;
150
- let name = argv . _ [ 2 ] ;
155
+ const type = argv . _ [ 1 ] ;
156
+ const name = argv . _ [ 2 ] ;
157
+ const force = argv . force ;
151
158
152
159
switch ( type ) {
153
160
case 'component' :
154
161
case 'c' :
155
- generateComponent ( name ) ;
162
+ generateComponent ( name , force ) ;
156
163
break ;
157
164
}
158
165
} catch ( err ) {
0 commit comments