55 * Use of this source code is governed by an MIT-style license that can be
66 * found in the LICENSE file at https://angular.io/license
77 */
8- import { strings , tags } from '@angular-devkit/core' ;
8+ import { normalize , relative , strings , tags } from '@angular-devkit/core' ;
99import { experimental } from '@angular-devkit/core' ;
1010import {
1111 MergeStrategy ,
@@ -96,7 +96,16 @@ function addAppToWorkspaceFile(options: ApplicationOptions, workspace: Workspace
9696 // if (workspaceJson.value === null) {
9797 // throw new SchematicsException(`Unable to parse configuration file (${workspacePath}).`);
9898 // }
99- const projectRoot = `${ workspace . newProjectRoot } /${ options . name } ` ;
99+ let projectRoot = options . projectRoot !== undefined
100+ ? options . projectRoot
101+ : `${ workspace . newProjectRoot } /${ options . name } ` ;
102+ if ( projectRoot !== '' && ! projectRoot . endsWith ( '/' ) ) {
103+ projectRoot += '/' ;
104+ }
105+ const rootFilesRoot = options . projectRoot === undefined
106+ ? projectRoot
107+ : projectRoot + 'src/' ;
108+
100109 // tslint:disable-next-line:no-any
101110 const project : any = {
102111 root : projectRoot ,
@@ -106,34 +115,34 @@ function addAppToWorkspaceFile(options: ApplicationOptions, workspace: Workspace
106115 builder : '@angular-devkit/build-angular:browser' ,
107116 options : {
108117 outputPath : `dist/${ options . name } ` ,
109- index : `${ projectRoot } / src/index.html` ,
110- main : `${ projectRoot } / src/main.ts` ,
111- polyfills : `${ projectRoot } / src/polyfills.ts` ,
112- tsConfig : `${ projectRoot } / tsconfig.app.json` ,
118+ index : `${ projectRoot } src/index.html` ,
119+ main : `${ projectRoot } src/main.ts` ,
120+ polyfills : `${ projectRoot } src/polyfills.ts` ,
121+ tsConfig : `${ rootFilesRoot } tsconfig.app.json` ,
113122 assets : [
114123 {
115124 glob : 'favicon.ico' ,
116- input : `${ projectRoot } / src` ,
125+ input : `${ projectRoot } src` ,
117126 output : '/' ,
118127 } ,
119128 {
120129 glob : '**/*' ,
121- input : `${ projectRoot } / src/assets` ,
130+ input : `${ projectRoot } src/assets` ,
122131 output : '/assets' ,
123132 } ,
124133 ] ,
125134 styles : [
126135 {
127- input : `${ projectRoot } / src/styles.${ options . style } ` ,
136+ input : `${ projectRoot } src/styles.${ options . style } ` ,
128137 } ,
129138 ] ,
130139 scripts : [ ] ,
131140 } ,
132141 configurations : {
133142 production : {
134143 fileReplacements : [ {
135- src : `${ projectRoot } / src/environments/environment.ts` ,
136- replaceWith : `${ projectRoot } / src/environments/environment.prod.ts` ,
144+ src : `${ projectRoot } src/environments/environment.ts` ,
145+ replaceWith : `${ projectRoot } src/environments/environment.prod.ts` ,
137146 } ] ,
138147 optimization : true ,
139148 outputHashing : 'all' ,
@@ -167,25 +176,25 @@ function addAppToWorkspaceFile(options: ApplicationOptions, workspace: Workspace
167176 test : {
168177 builder : '@angular-devkit/build-angular:karma' ,
169178 options : {
170- main : `${ projectRoot } / src/test.ts` ,
171- polyfills : `${ projectRoot } / src/polyfills.ts` ,
172- tsConfig : `${ projectRoot } / tsconfig.spec.json` ,
173- karmaConfig : `${ projectRoot } / karma.conf.js` ,
179+ main : `${ projectRoot } src/test.ts` ,
180+ polyfills : `${ projectRoot } src/polyfills.ts` ,
181+ tsConfig : `${ rootFilesRoot } tsconfig.spec.json` ,
182+ karmaConfig : `${ rootFilesRoot } karma.conf.js` ,
174183 styles : [
175184 {
176- input : `${ projectRoot } / styles.${ options . style } ` ,
185+ input : `${ projectRoot } styles.${ options . style } ` ,
177186 } ,
178187 ] ,
179188 scripts : [ ] ,
180189 assets : [
181190 {
182191 glob : 'favicon.ico' ,
183- input : `${ projectRoot } / src/` ,
192+ input : `${ projectRoot } src/` ,
184193 output : '/' ,
185194 } ,
186195 {
187196 glob : '**/*' ,
188- input : `${ projectRoot } / src/assets` ,
197+ input : `${ projectRoot } src/assets` ,
189198 output : '/assets' ,
190199 } ,
191200 ] ,
@@ -195,8 +204,8 @@ function addAppToWorkspaceFile(options: ApplicationOptions, workspace: Workspace
195204 builder : '@angular-devkit/build-angular:tslint' ,
196205 options : {
197206 tsConfig : [
198- `${ projectRoot } / tsconfig.app.json` ,
199- `${ projectRoot } / tsconfig.spec.json` ,
207+ `${ projectRoot } tsconfig.app.json` ,
208+ `${ projectRoot } tsconfig.spec.json` ,
200209 ] ,
201210 exclude : [
202211 '**/node_modules/**' ,
@@ -267,29 +276,57 @@ export default function (options: ApplicationOptions): Rule {
267276 inlineTemplate : options . inlineTemplate ,
268277 spec : ! options . skipTests ,
269278 styleext : options . style ,
279+ viewEncapsulation : options . viewEncapsulation ,
270280 } ;
271281
272282 const workspace = getWorkspace ( host ) ;
273- const newProjectRoot = workspace . newProjectRoot ;
274- const appDir = `${ newProjectRoot } /${ options . name } ` ;
275- const sourceDir = `${ appDir } /src/app` ;
283+ let newProjectRoot = workspace . newProjectRoot ;
284+ let appDir = `${ newProjectRoot } /${ options . name } ` ;
285+ let sourceRoot = `${ appDir } /src` ;
286+ let sourceDir = `${ sourceRoot } /app` ;
287+ let relativeTsConfigPath = appDir . split ( '/' ) . map ( x => '..' ) . join ( '/' ) ;
288+ const rootInSrc = options . projectRoot !== undefined ;
289+ if ( options . projectRoot !== undefined ) {
290+ newProjectRoot = options . projectRoot ;
291+ appDir = `${ newProjectRoot } /src` ;
292+ sourceRoot = appDir ;
293+ sourceDir = `${ sourceRoot } /app` ;
294+ relativeTsConfigPath = relative ( normalize ( '/' + sourceRoot ) , normalize ( '/' ) ) ;
295+ if ( relativeTsConfigPath === '' ) {
296+ relativeTsConfigPath = '.' ;
297+ }
298+ }
276299
277300 const e2eOptions : E2eOptions = {
278301 name : `${ options . name } -e2e` ,
279302 relatedAppName : options . name ,
280303 rootSelector : appRootSelector ,
281304 } ;
305+ if ( options . projectRoot !== undefined ) {
306+ e2eOptions . projectRoot = 'e2e' ;
307+ }
282308
283309 return chain ( [
284310 addAppToWorkspaceFile ( options , workspace ) ,
285311 options . skipPackageJson ? noop ( ) : addDependenciesToPackageJson ( ) ,
286312 mergeWith (
287- apply ( url ( './files' ) , [
313+ apply ( url ( './files/src' ) , [
314+ template ( {
315+ utils : strings ,
316+ ...options ,
317+ 'dot' : '.' ,
318+ relativeTsConfigPath,
319+ } ) ,
320+ move ( sourceRoot ) ,
321+ ] ) ) ,
322+ mergeWith (
323+ apply ( url ( './files/root' ) , [
288324 template ( {
289325 utils : strings ,
290326 ...options ,
291327 'dot' : '.' ,
292- appDir,
328+ relativeTsConfigPath,
329+ rootInSrc,
293330 } ) ,
294331 move ( appDir ) ,
295332 ] ) ) ,
0 commit comments