@@ -28,6 +28,7 @@ import {
2828 getWorkspace ,
2929} from '../utility/config' ;
3030import { latestVersions } from '../utility/latest-versions' ;
31+ import { validateProjectName } from '../utility/validation' ;
3132import { Schema as LibraryOptions } from './schema' ;
3233
3334
@@ -125,7 +126,7 @@ function addDependenciesToPackageJson() {
125126}
126127
127128function addAppToWorkspaceFile ( options : LibraryOptions , workspace : WorkspaceSchema ,
128- projectRoot : string ) : Rule {
129+ projectRoot : string , packageName : string ) : Rule {
129130
130131 const project : WorkspaceProject = {
131132 root : `${ projectRoot } ` ,
@@ -166,27 +167,43 @@ function addAppToWorkspaceFile(options: LibraryOptions, workspace: WorkspaceSche
166167 } ,
167168 } ;
168169
169- return addProjectToWorkspace ( workspace , options . name , project ) ;
170+ return addProjectToWorkspace ( workspace , packageName , project ) ;
170171}
171172
172173export default function ( options : LibraryOptions ) : Rule {
173174 return ( host : Tree , context : SchematicContext ) => {
174175 if ( ! options . name ) {
175176 throw new SchematicsException ( `Invalid options, "name" is required.` ) ;
176177 }
177- const name = options . name ;
178178 const prefix = options . prefix || 'lib' ;
179179
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+
180191 const workspace = getWorkspace ( host ) ;
181192 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+
183199 const sourceDir = `${ projectRoot } /src/lib` ;
184200 const relativeTsLintPath = projectRoot . split ( '/' ) . map ( x => '..' ) . join ( '/' ) ;
185201
186202 const templateSource = apply ( url ( './files' ) , [
187203 template ( {
188204 ...strings ,
189205 ...options ,
206+ packageName,
190207 projectRoot,
191208 relativeTsLintPath,
192209 prefix,
@@ -198,27 +215,27 @@ export default function (options: LibraryOptions): Rule {
198215
199216 return chain ( [
200217 branchAndMerge ( mergeWith ( templateSource ) ) ,
201- addAppToWorkspaceFile ( options , workspace , projectRoot ) ,
218+ addAppToWorkspaceFile ( options , workspace , projectRoot , packageName ) ,
202219 options . skipPackageJson ? noop ( ) : addDependenciesToPackageJson ( ) ,
203- options . skipTsConfig ? noop ( ) : updateTsConfig ( name ) ,
220+ options . skipTsConfig ? noop ( ) : updateTsConfig ( options . name ) ,
204221 schematic ( 'module' , {
205- name : name ,
222+ name : options . name ,
206223 commonModule : false ,
207224 flat : true ,
208225 path : sourceDir ,
209226 spec : false ,
210227 } ) ,
211228 schematic ( 'component' , {
212- name : name ,
213- selector : `${ prefix } -${ name } ` ,
229+ name : options . name ,
230+ selector : `${ prefix } -${ options . name } ` ,
214231 inlineStyle : true ,
215232 inlineTemplate : true ,
216233 flat : true ,
217234 path : sourceDir ,
218235 export : true ,
219236 } ) ,
220237 schematic ( 'service' , {
221- name : name ,
238+ name : options . name ,
222239 flat : true ,
223240 path : sourceDir ,
224241 } ) ,
0 commit comments