diff --git a/packages/angular_devkit/build_angular/test/browser/errors_spec_large.ts b/packages/angular_devkit/build_angular/test/browser/errors_spec_large.ts index 95e49b132dbd..1e8ef05309e5 100644 --- a/packages/angular_devkit/build_angular/test/browser/errors_spec_large.ts +++ b/packages/angular_devkit/build_angular/test/browser/errors_spec_large.ts @@ -23,11 +23,13 @@ describe('Browser Builder errors', () => { it('shows error when files are not part of the compilation', async () => { host.replaceInFile( 'src/tsconfig.app.json', - '"compilerOptions": {', - ` - "files": ["main.ts"], - "compilerOptions": { - `, + /,\r?\n?\s*"polyfills\.ts"/, + '', + ); + host.replaceInFile( + 'src/tsconfig.app.json', + '"**/*.ts"', + '"**/*.d.ts"', ); const logger = new logging.Logger(''); const logs: string[] = []; diff --git a/packages/angular_devkit/build_angular/test/browser/lazy-module_spec_large.ts b/packages/angular_devkit/build_angular/test/browser/lazy-module_spec_large.ts index 56ddfa2521c0..d8c82d76691b 100644 --- a/packages/angular_devkit/build_angular/test/browser/lazy-module_spec_large.ts +++ b/packages/angular_devkit/build_angular/test/browser/lazy-module_spec_large.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { TestLogger } from '@angular-devkit/architect/testing'; +import { TestLogger, TestProjectHost } from '@angular-devkit/architect/testing'; import { take, tap, timeout } from 'rxjs/operators'; import { browserBuild, @@ -30,6 +30,21 @@ describe('Browser Builder lazy modules', () => { }); afterEach(async () => host.restore().toPromise()); + function addLazyLoadedModulesInTsConfig(host: TestProjectHost, lazyModuleFiles: Record) { + const files = [ + ...Object.keys(lazyModuleFiles), + 'main.ts', + ] + .map(f => '"' + f.replace('src/', '') + '"') + .join(', '); + + host.replaceInFile( + 'src/tsconfig.app.json', + '"main.ts"', + `${files}`, + ); + } + const cases: [string, Record][] = [ ['string', lazyModuleStringImport], ['function', lazyModuleFnImport], @@ -40,6 +55,10 @@ describe('Browser Builder lazy modules', () => { host.writeMultipleFiles(lazyModuleFiles); host.writeMultipleFiles(imports); + if (name === 'string') { + addLazyLoadedModulesInTsConfig(host, lazyModuleFiles); + } + const { files } = await browserBuild(architect, host, target); expect('lazy-lazy-module.js' in files).toBe(true); }); @@ -91,6 +110,7 @@ describe('Browser Builder lazy modules', () => { it('supports lazy bundle for lazy routes with AOT', async () => { host.writeMultipleFiles(lazyModuleFiles); host.writeMultipleFiles(imports); + addLazyLoadedModulesInTsConfig(host, lazyModuleFiles); const { files } = await browserBuild(architect, host, target, { aot: true }); if (ivyEnabled) { @@ -131,10 +151,13 @@ describe('Browser Builder lazy modules', () => { }); it(`supports lazy bundle for System.import() calls`, async () => { - host.writeMultipleFiles({ + const lazyfiles = { 'src/lazy-module.ts': 'export const value = 42;', 'src/main.ts': `declare var System: any; System.import('./lazy-module');`, - }); + }; + + host.writeMultipleFiles(lazyfiles); + addLazyLoadedModulesInTsConfig(host, lazyfiles); const { files } = await browserBuild(architect, host, target); expect(files['lazy-module.js']).not.toBeUndefined(); @@ -199,6 +222,7 @@ describe('Browser Builder lazy modules', () => { }`, }); host.replaceInFile('src/tsconfig.app.json', `"module": "es2015"`, `"module": "esnext"`); + addLazyLoadedModulesInTsConfig(host, lazyModuleFiles); const { files } = await browserBuild(architect, host, target, { lazyModules: ['src/app/lazy/lazy.module'], @@ -227,6 +251,7 @@ describe('Browser Builder lazy modules', () => { }`, }); host.replaceInFile('src/tsconfig.app.json', `"module": "es2015"`, `"module": "esnext"`); + addLazyLoadedModulesInTsConfig(host, lazyModuleFiles); const { files } = await browserBuild(architect, host, target, { lazyModules: ['src/app/lazy/lazy.module'], aot: true, diff --git a/packages/angular_devkit/build_angular/test/browser/output-hashing_spec_large.ts b/packages/angular_devkit/build_angular/test/browser/output-hashing_spec_large.ts index c99cad5b62bf..d81ef71eeda5 100644 --- a/packages/angular_devkit/build_angular/test/browser/output-hashing_spec_large.ts +++ b/packages/angular_devkit/build_angular/test/browser/output-hashing_spec_large.ts @@ -13,7 +13,7 @@ import { createArchitect, host, lazyModuleFiles, - lazyModuleStringImport, + lazyModuleFnImport, } from '../utils'; describe('Browser Builder output hashing', () => { @@ -68,7 +68,7 @@ describe('Browser Builder output hashing', () => { let newHashes: Map; host.writeMultipleFiles(lazyModuleFiles); - host.writeMultipleFiles(lazyModuleStringImport); + host.writeMultipleFiles(lazyModuleFnImport); const overrides = { outputHashing: 'all', extractCss: true }; @@ -79,7 +79,7 @@ describe('Browser Builder output hashing', () => { // Save the current hashes. oldHashes = generateFileHashMap(); host.writeMultipleFiles(lazyModuleFiles); - host.writeMultipleFiles(lazyModuleStringImport); + host.writeMultipleFiles(lazyModuleFnImport); await browserBuild(architect, host, target, overrides); newHashes = generateFileHashMap(); @@ -117,7 +117,7 @@ describe('Browser Builder output hashing', () => { it('supports options', async () => { host.writeMultipleFiles({ 'src/styles.css': `h1 { background: url('./spectrum.png')}` }); host.writeMultipleFiles(lazyModuleFiles); - host.writeMultipleFiles(lazyModuleStringImport); + host.writeMultipleFiles(lazyModuleFnImport); // We must do several builds instead of a single one in watch mode, so that the output // path is deleted on each run and only contains the most recent files. diff --git a/packages/angular_devkit/build_angular/test/browser/rebuild_spec_large.ts b/packages/angular_devkit/build_angular/test/browser/rebuild_spec_large.ts index 50b4ed03381e..2119c017c9c9 100644 --- a/packages/angular_devkit/build_angular/test/browser/rebuild_spec_large.ts +++ b/packages/angular_devkit/build_angular/test/browser/rebuild_spec_large.ts @@ -15,7 +15,7 @@ import { host, ivyEnabled, lazyModuleFiles, - lazyModuleStringImport, + lazyModuleFnImport, } from '../utils'; describe('Browser Builder rebuilds', () => { @@ -84,7 +84,7 @@ describe('Browser Builder rebuilds', () => { // No lazy chunk should exist. if (!hasLazyChunk) { phase = 2; - host.writeMultipleFiles({ ...lazyModuleFiles, ...lazyModuleStringImport }); + host.writeMultipleFiles({ ...lazyModuleFiles, ...lazyModuleFnImport }); } break; diff --git a/packages/schematics/angular/application/files/tsconfig.app.json.template b/packages/schematics/angular/application/files/tsconfig.app.json.template index d24bbb988f70..7f38e6593828 100644 --- a/packages/schematics/angular/application/files/tsconfig.app.json.template +++ b/packages/schematics/angular/application/files/tsconfig.app.json.template @@ -4,13 +4,20 @@ "outDir": "<%= relativePathToWorkspaceRoot %>/out-tsc/app", "types": [] }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ],<% if (!enableIvy) { %> "include": [ "src/**/*.ts" ], "exclude": [ "src/test.ts", "src/**/*.spec.ts" - ]<% if (enableIvy) { %>, + ]<% } %><% if (enableIvy) { %> + "include": [ + "src/**/*.d.ts" + ], "angularCompilerOptions": { "enableIvy": true }<% } %> diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts index 21cfed8d4752..8ddc4d016062 100644 --- a/packages/schematics/angular/application/index_spec.ts +++ b/packages/schematics/angular/application/index_spec.ts @@ -232,6 +232,27 @@ describe('Application Schematic', () => { expect(workspace.projects.foo.architect.build.options.aot).toEqual(true); }); + it('should set the right files, exclude, include in the tsconfig for VE projects', async () => { + const tree = await schematicRunner.runSchematicAsync('application', defaultOptions, workspaceTree) + .toPromise(); + const path = '/projects/foo/tsconfig.app.json'; + const tsConfig = JSON.parse(tree.readContent(path)); + expect(tsConfig.files).toEqual(['src/main.ts', 'src/polyfills.ts']); + expect(tsConfig.exclude).toEqual(['src/test.ts', 'src/**/*.spec.ts']); + expect(tsConfig.include).toEqual(['src/**/*.ts']); + }); + + it('should set the right files, exclude, include in the tsconfig for Ivy projects', async () => { + const options = { ...defaultOptions, enableIvy: true }; + const tree = await schematicRunner.runSchematicAsync('application', options, workspaceTree) + .toPromise(); + const path = '/projects/foo/tsconfig.app.json'; + const tsConfig = JSON.parse(tree.readContent(path)); + expect(tsConfig.files).toEqual(['src/main.ts', 'src/polyfills.ts']); + expect(tsConfig.exclude).toBeUndefined(); + expect(tsConfig.include).toEqual(['src/**/*.d.ts']); + }); + describe(`update package.json`, () => { it(`should add build-angular to devDependencies`, async () => { const tree = await schematicRunner.runSchematicAsync('application', defaultOptions, workspaceTree) diff --git a/packages/schematics/angular/universal/files/root/__tsconfigFileName__.json.template b/packages/schematics/angular/universal/files/root/__tsconfigFileName__.json.template index f11e5fa48259..7652105df41c 100644 --- a/packages/schematics/angular/universal/files/root/__tsconfigFileName__.json.template +++ b/packages/schematics/angular/universal/files/root/__tsconfigFileName__.json.template @@ -3,6 +3,9 @@ "compilerOptions": { "outDir": "<%= outDir %>-server" }, + "files": [ + "src/main.server.ts" + ], "angularCompilerOptions": { "entryModule": "./<%= rootInSrc ? '' : 'src/' %><%= appDir %>/<%= stripTsExtension(rootModuleFileName) %>#<%= rootModuleClassName %>" } diff --git a/packages/schematics/angular/universal/index_spec.ts b/packages/schematics/angular/universal/index_spec.ts index ec9f7a77cb29..0e4356732b69 100644 --- a/packages/schematics/angular/universal/index_spec.ts +++ b/packages/schematics/angular/universal/index_spec.ts @@ -91,6 +91,9 @@ describe('Universal Schematic', () => { compilerOptions: { outDir: './out-tsc/app-server', }, + files: [ + "src/main.server.ts" + ], angularCompilerOptions: { entryModule: './src/app/app.server.module#AppServerModule', }, @@ -111,6 +114,9 @@ describe('Universal Schematic', () => { compilerOptions: { outDir: '../../out-tsc/app-server', }, + files: [ + "src/main.server.ts" + ], angularCompilerOptions: { entryModule: './src/app/app.server.module#AppServerModule', }, diff --git a/tests/angular_devkit/build_angular/hello-world-app-ivy/src/tsconfig.app.json b/tests/angular_devkit/build_angular/hello-world-app-ivy/src/tsconfig.app.json index 27c32c624e5a..572dee5c7f13 100644 --- a/tests/angular_devkit/build_angular/hello-world-app-ivy/src/tsconfig.app.json +++ b/tests/angular_devkit/build_angular/hello-world-app-ivy/src/tsconfig.app.json @@ -4,9 +4,12 @@ "outDir": "../out-tsc/app", "types": [] }, - "exclude": [ - "test.ts", - "**/*.spec.ts" + "files": [ + "main.ts", + "polyfills.ts" + ], + "include": [ + "**/*.d.ts" ], "angularCompilerOptions": { "enableIvy": true diff --git a/tests/angular_devkit/build_angular/hello-world-app-ivy/src/tsconfig.server.json b/tests/angular_devkit/build_angular/hello-world-app-ivy/src/tsconfig.server.json index 01b7878504a2..8d960ce360c1 100644 --- a/tests/angular_devkit/build_angular/hello-world-app-ivy/src/tsconfig.server.json +++ b/tests/angular_devkit/build_angular/hello-world-app-ivy/src/tsconfig.server.json @@ -1,14 +1,13 @@ { - "extends": "../tsconfig.json", + "extends": "./tsconfig.app.json", "compilerOptions": { "outDir": "../dist-server", "baseUrl": "./", "module": "commonjs", "types": [] }, - "exclude": [ - "test.ts", - "**/*.spec.ts" + "files": [ + "main.server.ts" ], "angularCompilerOptions": { "entryModule": "app/app.server.module#AppServerModule", diff --git a/tests/angular_devkit/build_angular/hello-world-app/src/tsconfig.app.json b/tests/angular_devkit/build_angular/hello-world-app/src/tsconfig.app.json index 190fd300b601..5e0a2836e21e 100644 --- a/tests/angular_devkit/build_angular/hello-world-app/src/tsconfig.app.json +++ b/tests/angular_devkit/build_angular/hello-world-app/src/tsconfig.app.json @@ -4,6 +4,13 @@ "outDir": "../out-tsc/app", "types": [] }, + "files": [ + "main.ts", + "polyfills.ts" + ], + "include": [ + "**/*.ts" + ], "exclude": [ "test.ts", "**/*.spec.ts" diff --git a/tests/angular_devkit/build_angular/hello-world-app/src/tsconfig.server.json b/tests/angular_devkit/build_angular/hello-world-app/src/tsconfig.server.json index 36fa0af8d3d3..ca19d0259199 100644 --- a/tests/angular_devkit/build_angular/hello-world-app/src/tsconfig.server.json +++ b/tests/angular_devkit/build_angular/hello-world-app/src/tsconfig.server.json @@ -1,14 +1,12 @@ { - "extends": "../tsconfig.json", + "extends": "./tsconfig.app.json", "compilerOptions": { "outDir": "../dist-server", - "baseUrl": "./", "module": "commonjs", "types": [] }, - "exclude": [ - "test.ts", - "**/*.spec.ts" + "files": [ + "main.server.ts" ], "angularCompilerOptions": { "entryModule": "app/app.server.module#AppServerModule" diff --git a/tests/legacy-cli/e2e/tests/basic/rebuild.ts b/tests/legacy-cli/e2e/tests/basic/rebuild.ts index 82991e9ed890..30410249760b 100644 --- a/tests/legacy-cli/e2e/tests/basic/rebuild.ts +++ b/tests/legacy-cli/e2e/tests/basic/rebuild.ts @@ -37,7 +37,7 @@ export default function() { FormsModule, HttpClientModule, RouterModule.forRoot([ - { path: 'lazy', loadChildren: './lazy/lazy.module#LazyModule' } + { path: 'lazy', loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) } ]) ], providers: [], diff --git a/tests/legacy-cli/e2e/tests/build/build-app-shell.ts b/tests/legacy-cli/e2e/tests/build/build-app-shell.ts index d98f7433556f..d12350b13f08 100644 --- a/tests/legacy-cli/e2e/tests/build/build-app-shell.ts +++ b/tests/legacy-cli/e2e/tests/build/build-app-shell.ts @@ -52,6 +52,12 @@ export default function() { "module": "commonjs", "types": [] }, + "files": [ + "src/main.server.ts" + ], + "include": [ + "src/**/*.d.ts" + ], "angularCompilerOptions": { "entryModule": "src/app/app.server.module#AppServerModule" } diff --git a/tests/legacy-cli/e2e/tests/build/build-errors.ts b/tests/legacy-cli/e2e/tests/build/build-errors.ts index ccfe80b7c117..b11c2c94053b 100644 --- a/tests/legacy-cli/e2e/tests/build/build-errors.ts +++ b/tests/legacy-cli/e2e/tests/build/build-errors.ts @@ -50,6 +50,7 @@ export default function() { .then(() => updateJsonFile('./tsconfig.app.json', configJson => { configJson.include = ['src/**/*.ts']; + configJson.exclude = ['**/**.spec.ts']; configJson.files = undefined; }), ) diff --git a/tests/legacy-cli/e2e/tests/build/dynamic-import.ts b/tests/legacy-cli/e2e/tests/build/dynamic-import.ts index e999cf107138..ff0d29a5cc9c 100644 --- a/tests/legacy-cli/e2e/tests/build/dynamic-import.ts +++ b/tests/legacy-cli/e2e/tests/build/dynamic-import.ts @@ -14,6 +14,10 @@ export default async function() { ]; }); + await updateJsonFile('tsconfig.app.json', tsConfig => { + tsConfig.files.push('src/app/lazy/lazy.module.ts'); + }); + // Update the app component to use the lazy module await writeFile('src/app/app.component.ts', ` import { Component, SystemJsNgModuleLoader } from '@angular/core'; diff --git a/tests/legacy-cli/e2e/tests/build/lazy-load-syntax.ts b/tests/legacy-cli/e2e/tests/build/lazy-load-syntax.ts index 2a38e84cc83a..ffed461c4f7f 100644 --- a/tests/legacy-cli/e2e/tests/build/lazy-load-syntax.ts +++ b/tests/legacy-cli/e2e/tests/build/lazy-load-syntax.ts @@ -82,19 +82,19 @@ export default async function () { buildTarget['configurations']['production'] = { aot: true }; }); - // Test string import. - // Both Ivy and View Engine should support it. - await replaceLoadChildren(`'./lazy/lazy.module#LazyModule'`); - await ng('e2e'); - await ng('e2e', '--prod'); - // Test `import()` style lazy load. // Both Ivy and View Engine should support it. await replaceLoadChildren(`() => import('./lazy/lazy.module').then(m => m.LazyModule)`); - // TODO: remove cast after https://github.com/angular/angular/pull/29832 is released. - await replaceInFile(appRoutingModulePath, '];', '] as Routes;'); + await ng('e2e'); + await ng('e2e', '--prod'); + // Test string import. + // Both Ivy and View Engine should support it. + await updateJsonFile('tsconfig.app.json', tsConfig => { + tsConfig.files.push('src/app/lazy/lazy.module.ts'); + }); + await replaceLoadChildren(`'./lazy/lazy.module#LazyModule'`); await ng('e2e'); await ng('e2e', '--prod'); } diff --git a/tests/legacy-cli/e2e/tests/build/platform-server.ts b/tests/legacy-cli/e2e/tests/build/platform-server.ts index 43653ed88029..534884ea10c1 100644 --- a/tests/legacy-cli/e2e/tests/build/platform-server.ts +++ b/tests/legacy-cli/e2e/tests/build/platform-server.ts @@ -50,6 +50,12 @@ export default function() { "module": "commonjs", "types": [] }, + "files": [ + "src/main.server.ts" + ], + "include": [ + "src/**/*.d.ts" + ], "angularCompilerOptions": { "entryModule": "src/app/app.server.module#AppServerModule" } diff --git a/tests/legacy-cli/e2e/tests/misc/lazy-module.ts b/tests/legacy-cli/e2e/tests/misc/lazy-module.ts index ee35bebba9b1..0256d2a82081 100644 --- a/tests/legacy-cli/e2e/tests/misc/lazy-module.ts +++ b/tests/legacy-cli/e2e/tests/misc/lazy-module.ts @@ -15,9 +15,9 @@ export default function() { import { RouterModule } from '@angular/router'; `)) .then(() => replaceInFile('src/app/app.module.ts', 'imports: [', `imports: [ - RouterModule.forRoot([{ path: "lazy", loadChildren: 'src/app/lazy/lazy.module#LazyModule' }]), - RouterModule.forRoot([{ path: "lazy1", loadChildren: './lazy/lazy.module#LazyModule' }]), - RouterModule.forRoot([{ path: "lazy2", loadChildren: './too/lazy/lazy.module#LazyModule' }]), + RouterModule.forRoot([{ path: "lazy", loadChildren: () => import('src/app/lazy/lazy.module').then(m => m.LazyModule) }]), + RouterModule.forRoot([{ path: "lazy1", loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) }]), + RouterModule.forRoot([{ path: "lazy2", loadChildren: () => import('./too/lazy/lazy.module').then(m => m.LazyModule) }]), `)) .then(() => ng('build', '--named-chunks')) .then(() => readdirSync('dist/test-project'))