@@ -2,7 +2,7 @@ import { basename, dirname, join, relative } from 'path';
2
2
import { readdirSync } from 'fs' ;
3
3
import { Logger } from '../logger/logger' ;
4
4
5
- import { paramCase , pascalCase , upperCaseFirst } from 'change-case' ;
5
+ import { camelCase , paramCase , pascalCase , sentenceCase , upperCaseFirst } from 'change-case' ;
6
6
7
7
import * as Constants from '../util/constants' ;
8
8
import * as GeneratorConstants from './constants' ;
@@ -14,8 +14,10 @@ import { appendNgModuleDeclaration, insertNamedImportIfNeeded } from '../util/ty
14
14
15
15
export function hydrateRequest ( context : BuildContext , request : GeneratorRequest ) {
16
16
const hydrated = Object . assign ( { includeNgModule : true } , request ) as HydratedGeneratorRequest ;
17
- hydrated . className = ensureSuffix ( pascalCase ( request . name ) , upperCaseFirst ( request . type ) ) ;
18
- hydrated . fileName = removeSuffix ( paramCase ( request . name ) , `-${ request . type } ` ) ;
17
+ const suffix = getSuffixFromGeneratorType ( context , request . type ) ;
18
+
19
+ hydrated . className = ensureSuffix ( pascalCase ( request . name ) , upperCaseFirst ( suffix ) ) ;
20
+ hydrated . fileName = removeSuffix ( paramCase ( request . name ) , `-${ paramCase ( suffix ) } ` ) ;
19
21
20
22
hydrated . dirToRead = join ( getPropertyValue ( Constants . ENV_VAR_IONIC_ANGULAR_TEMPLATE_DIR ) , request . type ) ;
21
23
@@ -25,6 +27,30 @@ export function hydrateRequest(context: BuildContext, request: GeneratorRequest)
25
27
return hydrated ;
26
28
}
27
29
30
+ export function hydrateTabRequest ( context : BuildContext , request : GeneratorTabRequest ) {
31
+ const h = hydrateRequest ( context , request ) ;
32
+ const hydrated = Object . assign ( {
33
+ tabs : request . tabs ,
34
+ tabContent : '' ,
35
+ tabVariables : ''
36
+ } , h ) as HydratedGeneratorRequest ;
37
+
38
+ for ( let i = 0 ; i < request . tabs . length ; i ++ ) {
39
+ const tabVar = `${ camelCase ( request . tabs [ i ] . name ) } Root` ;
40
+ hydrated . tabVariables += ` ${ tabVar } = '${ request . tabs [ i ] . className } '\n` ;
41
+
42
+ // If this is the last ion-tab to insert
43
+ // then we do not want a new line
44
+ if ( i === request . tabs . length - 1 ) {
45
+ hydrated . tabContent += ` <ion-tab [root]="${ tabVar } " tabTitle="${ sentenceCase ( request . tabs [ i ] . name ) } " tabIcon="information-circle"></ion-tab>` ;
46
+ } else {
47
+ hydrated . tabContent += ` <ion-tab [root]="${ tabVar } " tabTitle="${ sentenceCase ( request . tabs [ i ] . name ) } " tabIcon="information-circle"></ion-tab>\n` ;
48
+ }
49
+ }
50
+
51
+ return hydrated ;
52
+ }
53
+
28
54
export function readTemplates ( pathToRead : string ) : Promise < Map < string , string > > {
29
55
const fileNames = readdirSync ( pathToRead ) ;
30
56
const absolutePaths = fileNames . map ( fileName => {
@@ -58,10 +84,12 @@ export function filterOutTemplates(request: HydratedGeneratorRequest, templates:
58
84
export function applyTemplates ( request : HydratedGeneratorRequest , templates : Map < string , string > ) {
59
85
const appliedTemplateMap = new Map < string , string > ( ) ;
60
86
templates . forEach ( ( fileContent : string , filePath : string ) => {
61
- const classnameRemovedContent = replaceAll ( fileContent , GeneratorConstants . CLASSNAME_VARIABLE , request . className ) ;
62
- const fileNameRemovedContent = replaceAll ( classnameRemovedContent , GeneratorConstants . FILENAME_VARIABLE , request . fileName ) ;
63
- const suppliedNameRemovedContent = replaceAll ( fileNameRemovedContent , GeneratorConstants . SUPPLIEDNAME_VARIABLE , request . name ) ;
64
- appliedTemplateMap . set ( filePath , suppliedNameRemovedContent ) ;
87
+ fileContent = replaceAll ( fileContent , GeneratorConstants . CLASSNAME_VARIABLE , request . className ) ;
88
+ fileContent = replaceAll ( fileContent , GeneratorConstants . FILENAME_VARIABLE , request . fileName ) ;
89
+ fileContent = replaceAll ( fileContent , GeneratorConstants . SUPPLIEDNAME_VARIABLE , request . name ) ;
90
+ fileContent = replaceAll ( fileContent , GeneratorConstants . TAB_CONTENT_VARIABLE , request . tabContent ) ;
91
+ fileContent = replaceAll ( fileContent , GeneratorConstants . TAB_VARIABLES_VARIABLE , request . tabVariables ) ;
92
+ appliedTemplateMap . set ( filePath , fileContent ) ;
65
93
} ) ;
66
94
return appliedTemplateMap ;
67
95
}
@@ -94,12 +122,27 @@ export function getNgModules(context: BuildContext, types: string[]): Promise<Gl
94
122
return globAll ( patterns ) ;
95
123
}
96
124
125
+ function getSuffixFromGeneratorType ( context : BuildContext , type : string ) {
126
+ if ( type === Constants . COMPONENT ) {
127
+ return 'Component' ;
128
+ } else if ( type === Constants . DIRECTIVE ) {
129
+ return 'Directive' ;
130
+ } else if ( type === Constants . PAGE || type === Constants . TABS ) {
131
+ return 'Page' ;
132
+ } else if ( type === Constants . PIPE ) {
133
+ return 'Pipe' ;
134
+ } else if ( type === Constants . PROVIDER ) {
135
+ return 'Provider' ;
136
+ }
137
+ throw new Error ( `Unknown Generator Type: ${ type } ` ) ;
138
+ }
139
+
97
140
export function getDirToWriteToByType ( context : BuildContext , type : string ) {
98
141
if ( type === Constants . COMPONENT ) {
99
142
return context . componentsDir ;
100
143
} else if ( type === Constants . DIRECTIVE ) {
101
144
return context . directivesDir ;
102
- } else if ( type === Constants . PAGE ) {
145
+ } else if ( type === Constants . PAGE || type === Constants . TABS ) {
103
146
return context . pagesDir ;
104
147
} else if ( type === Constants . PIPE ) {
105
148
return context . pipesDir ;
@@ -110,30 +153,43 @@ export function getDirToWriteToByType(context: BuildContext, type: string) {
110
153
}
111
154
112
155
export function nonPageFileManipulation ( context : BuildContext , name : string , ngModulePath : string , type : string ) {
113
- const hydratedRequest = hydrateRequest ( context , { type : type , name } ) ;
114
- return readFileAsync ( ngModulePath ) . then ( ( fileContent : string ) => {
156
+ const hydratedRequest = hydrateRequest ( context , { type, name } ) ;
157
+ let fileContent : string ;
158
+ return readFileAsync ( ngModulePath ) . then ( ( content ) => {
159
+ fileContent = content ;
160
+ return generateTemplates ( context , hydratedRequest ) ;
161
+ } ) . then ( ( ) => {
115
162
fileContent = insertNamedImportIfNeeded ( ngModulePath , fileContent , hydratedRequest . className , relative ( dirname ( ngModulePath ) , hydratedRequest . dirToWrite ) ) ;
116
163
fileContent = appendNgModuleDeclaration ( ngModulePath , fileContent , hydratedRequest . className ) ;
117
164
return writeFileAsync ( ngModulePath , fileContent ) ;
118
- } ) . then ( ( ) => {
119
- return processNonTabRequest ( context , hydratedRequest ) ;
120
- } ) . then ( ( ) => {
121
- // TODO
122
165
} ) ;
123
166
}
124
167
125
- export function processNonTabRequest ( context : BuildContext , request : GeneratorRequest ) : Promise < string [ ] > {
126
- Logger . debug ( '[Generators] processNonTabRequest: Hydrating the request with project data ...' ) ;
127
- const hydratedRequest = hydrateRequest ( context , request ) ;
128
- Logger . debug ( '[Generators] processNonTabRequest: Reading templates ...' ) ;
129
- return readTemplates ( hydratedRequest . dirToRead ) . then ( ( map : Map < string , string > ) => {
130
- Logger . debug ( '[Generators] processNonTabRequest: Filtering out NgModule and Specs if needed ...' ) ;
131
- return filterOutTemplates ( hydratedRequest , map ) ;
168
+ export function tabsModuleManipulation ( tabs : string [ ] [ ] , hydratedRequest : HydratedGeneratorRequest , tabHydratedRequests : HydratedGeneratorRequest [ ] ) : Promise < any > {
169
+ const ngModulePath = tabs [ 0 ] . find ( ( element : any ) : boolean => {
170
+ return element . indexOf ( 'module' ) !== - 1 ;
171
+ } ) ;
172
+ const tabsNgModulePath = `${ hydratedRequest . dirToWrite } /${ hydratedRequest . fileName } .module.ts` ;
173
+
174
+ return readFileAsync ( tabsNgModulePath ) . then ( ( content ) => {
175
+ let fileContent = content ;
176
+ fileContent = insertNamedImportIfNeeded ( tabsNgModulePath , fileContent , tabHydratedRequests [ 0 ] . className , relative ( dirname ( tabsNgModulePath ) , ngModulePath . replace ( '.module.ts' , '' ) ) ) ;
177
+ fileContent = appendNgModuleDeclaration ( tabsNgModulePath , fileContent , tabHydratedRequests [ 0 ] . className ) ;
178
+
179
+ return writeFileAsync ( tabsNgModulePath , fileContent ) ;
180
+ } ) ;
181
+ }
182
+
183
+ export function generateTemplates ( context : BuildContext , request : HydratedGeneratorRequest ) : Promise < string [ ] > {
184
+ Logger . debug ( '[Generators] generateTemplates: Reading templates ...' ) ;
185
+ return readTemplates ( request . dirToRead ) . then ( ( map : Map < string , string > ) => {
186
+ Logger . debug ( '[Generators] generateTemplates: Filtering out NgModule and Specs if needed ...' ) ;
187
+ return filterOutTemplates ( request , map ) ;
132
188
} ) . then ( ( filteredMap : Map < string , string > ) => {
133
- Logger . debug ( '[Generators] processNonTabRequest : Applying tempaltes ...' ) ;
134
- const appliedTemplateMap = applyTemplates ( hydratedRequest , filteredMap ) ;
135
- Logger . debug ( '[Generators] processNonTabRequest : Writing generated files to disk ...' ) ;
136
- return writeGeneratedFiles ( hydratedRequest , appliedTemplateMap ) ;
189
+ Logger . debug ( '[Generators] generateTemplates : Applying templates ...' ) ;
190
+ const appliedTemplateMap = applyTemplates ( request , filteredMap ) ;
191
+ Logger . debug ( '[Generators] generateTemplates : Writing generated files to disk ...' ) ;
192
+ return writeGeneratedFiles ( request , appliedTemplateMap ) ;
137
193
} ) ;
138
194
}
139
195
@@ -149,9 +205,15 @@ export interface GeneratorRequest {
149
205
includeNgModule ?: boolean ;
150
206
} ;
151
207
208
+ export interface GeneratorTabRequest extends GeneratorRequest {
209
+ tabs ?: HydratedGeneratorRequest [ ] ;
210
+ }
211
+
152
212
export interface HydratedGeneratorRequest extends GeneratorRequest {
153
213
fileName ?: string ;
154
214
className ?: string ;
215
+ tabContent ?: string ;
216
+ tabVariables ?: string ;
155
217
dirToRead ?: string ;
156
218
dirToWrite ?: string ;
157
219
} ;
0 commit comments