@@ -28,6 +28,7 @@ import {
28
28
getWorkspace ,
29
29
} from '../utility/config' ;
30
30
import { latestVersions } from '../utility/latest-versions' ;
31
+ import { validateProjectName } from '../utility/validation' ;
31
32
import { Schema as LibraryOptions } from './schema' ;
32
33
33
34
@@ -125,7 +126,7 @@ function addDependenciesToPackageJson() {
125
126
}
126
127
127
128
function addAppToWorkspaceFile ( options : LibraryOptions , workspace : WorkspaceSchema ,
128
- projectRoot : string ) : Rule {
129
+ projectRoot : string , packageName : string ) : Rule {
129
130
130
131
const project : WorkspaceProject = {
131
132
root : `${ projectRoot } ` ,
@@ -166,27 +167,43 @@ function addAppToWorkspaceFile(options: LibraryOptions, workspace: WorkspaceSche
166
167
} ,
167
168
} ;
168
169
169
- return addProjectToWorkspace ( workspace , options . name , project ) ;
170
+ return addProjectToWorkspace ( workspace , packageName , project ) ;
170
171
}
171
172
172
173
export default function ( options : LibraryOptions ) : Rule {
173
174
return ( host : Tree , context : SchematicContext ) => {
174
175
if ( ! options . name ) {
175
176
throw new SchematicsException ( `Invalid options, "name" is required.` ) ;
176
177
}
177
- const name = options . name ;
178
178
const prefix = options . prefix || 'lib' ;
179
179
180
+ validateProjectName ( options . name ) ;
181
+
182
+ // If scoped project (i.e. "@foo/bar"), convert projectDir to "foo/bar".
183
+ const packageName = options . name ;
184
+ let scopeName = '' ;
185
+ if ( / ^ @ .* \/ .* / . test ( options . name ) ) {
186
+ const [ scope , name ] = options . name . split ( '/' ) ;
187
+ scopeName = scope . replace ( / ^ @ / , '' ) ;
188
+ options . name = name ;
189
+ }
190
+
180
191
const workspace = getWorkspace ( host ) ;
181
192
const newProjectRoot = workspace . newProjectRoot ;
182
- const projectRoot = `${ newProjectRoot } /${ strings . dasherize ( options . name ) } ` ;
193
+ let projectRoot = `${ newProjectRoot } /${ strings . dasherize ( options . name ) } ` ;
194
+ if ( scopeName ) {
195
+ projectRoot =
196
+ `${ newProjectRoot } /${ strings . dasherize ( scopeName ) } /${ strings . dasherize ( options . name ) } ` ;
197
+ }
198
+
183
199
const sourceDir = `${ projectRoot } /src/lib` ;
184
200
const relativeTsLintPath = projectRoot . split ( '/' ) . map ( x => '..' ) . join ( '/' ) ;
185
201
186
202
const templateSource = apply ( url ( './files' ) , [
187
203
template ( {
188
204
...strings ,
189
205
...options ,
206
+ packageName,
190
207
projectRoot,
191
208
relativeTsLintPath,
192
209
prefix,
@@ -198,27 +215,27 @@ export default function (options: LibraryOptions): Rule {
198
215
199
216
return chain ( [
200
217
branchAndMerge ( mergeWith ( templateSource ) ) ,
201
- addAppToWorkspaceFile ( options , workspace , projectRoot ) ,
218
+ addAppToWorkspaceFile ( options , workspace , projectRoot , packageName ) ,
202
219
options . skipPackageJson ? noop ( ) : addDependenciesToPackageJson ( ) ,
203
- options . skipTsConfig ? noop ( ) : updateTsConfig ( name ) ,
220
+ options . skipTsConfig ? noop ( ) : updateTsConfig ( options . name ) ,
204
221
schematic ( 'module' , {
205
- name : name ,
222
+ name : options . name ,
206
223
commonModule : false ,
207
224
flat : true ,
208
225
path : sourceDir ,
209
226
spec : false ,
210
227
} ) ,
211
228
schematic ( 'component' , {
212
- name : name ,
213
- selector : `${ prefix } -${ name } ` ,
229
+ name : options . name ,
230
+ selector : `${ prefix } -${ options . name } ` ,
214
231
inlineStyle : true ,
215
232
inlineTemplate : true ,
216
233
flat : true ,
217
234
path : sourceDir ,
218
235
export : true ,
219
236
} ) ,
220
237
schematic ( 'service' , {
221
- name : name ,
238
+ name : options . name ,
222
239
flat : true ,
223
240
path : sourceDir ,
224
241
} ) ,
0 commit comments