From 86786f8ce34700d0701391949708ab2d667ef29a Mon Sep 17 00:00:00 2001 From: NikolayAlipiev Date: Fri, 1 Nov 2019 12:11:07 +0200 Subject: [PATCH 1/6] fix(schematics): check polyfill in default project #6017 --- projects/igniteui-angular/schematics/ng-add/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/igniteui-angular/schematics/ng-add/index.ts b/projects/igniteui-angular/schematics/ng-add/index.ts index 8b1d8aabdc3..60637e58636 100644 --- a/projects/igniteui-angular/schematics/ng-add/index.ts +++ b/projects/igniteui-angular/schematics/ng-add/index.ts @@ -50,7 +50,7 @@ function readInput(options: Options): Rule { if (options.polyfills) { const workspace = getWorkspace(tree); const targetProperty = 'es5BrowserSupport'; - const polyfillsFile = 'src/polyfills.ts'; + const polyfillsFile = workspace.projects[workspace.defaultProject].sourceRoot + '/polyfills.ts'; const propertyExists = propertyExistsInWorkspace(targetProperty, workspace); let polyfillsData = tree.read(polyfillsFile).toString(); if (propertyExists) { From 92d9c2912978d3838665950dd28ea2e74c6a9ef1 Mon Sep 17 00:00:00 2001 From: NikolayAlipiev Date: Mon, 4 Nov 2019 09:45:56 +0200 Subject: [PATCH 2/6] fix(schematics): use path.join #6017 --- projects/igniteui-angular/schematics/ng-add/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/projects/igniteui-angular/schematics/ng-add/index.ts b/projects/igniteui-angular/schematics/ng-add/index.ts index 60637e58636..5c7f69e8237 100644 --- a/projects/igniteui-angular/schematics/ng-add/index.ts +++ b/projects/igniteui-angular/schematics/ng-add/index.ts @@ -6,6 +6,7 @@ import { logSuccess, addDependencies, overwriteJsonFile, getPropertyFromWorkspac import { addResetCss } from './add-normalize'; import { getWorkspace } from '@schematics/angular/utility/config'; import { WorkspaceSchema } from '@schematics/angular/utility/workspace-models'; +import * as path from 'path'; /** @@ -17,7 +18,8 @@ function propertyExistsInWorkspace(targetProp: string, workspace: WorkspaceSchem } function enablePolyfills(tree: Tree, context: SchematicContext): string { - const targetFile = 'src/polyfills.ts'; + const workspace = getWorkspace(tree); + const targetFile = path.join(workspace.projects[workspace.defaultProject].sourceRoot, 'polyfills.ts'); if (!tree.exists(targetFile)) { context.logger.warn(`${targetFile} not found. You may need to update polyfills.ts manually.`); return; @@ -50,7 +52,7 @@ function readInput(options: Options): Rule { if (options.polyfills) { const workspace = getWorkspace(tree); const targetProperty = 'es5BrowserSupport'; - const polyfillsFile = workspace.projects[workspace.defaultProject].sourceRoot + '/polyfills.ts'; + const polyfillsFile = path.join(workspace.projects[workspace.defaultProject].sourceRoot, 'polyfills.ts'); const propertyExists = propertyExistsInWorkspace(targetProperty, workspace); let polyfillsData = tree.read(polyfillsFile).toString(); if (propertyExists) { From 4296e4444b09355e02afc06d3499b01e9337ac1c Mon Sep 17 00:00:00 2001 From: NikolayAlipiev Date: Thu, 7 Nov 2019 18:36:20 +0200 Subject: [PATCH 3/6] fix(schematics): use existing logic #6017 --- projects/igniteui-angular/schematics/ng-add/index.ts | 6 ++++-- .../igniteui-angular/schematics/utils/dependency-handler.ts | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/projects/igniteui-angular/schematics/ng-add/index.ts b/projects/igniteui-angular/schematics/ng-add/index.ts index 5c7f69e8237..09adde6badd 100644 --- a/projects/igniteui-angular/schematics/ng-add/index.ts +++ b/projects/igniteui-angular/schematics/ng-add/index.ts @@ -1,7 +1,8 @@ import { chain, Rule, SchematicContext, Tree } from '@angular-devkit/schematics'; import { Options } from '../interfaces/options'; import { installPackageJsonDependencies } from '../utils/package-handler'; -import { logSuccess, addDependencies, overwriteJsonFile, getPropertyFromWorkspace } from '../utils/dependency-handler'; +import { logSuccess, addDependencies, overwriteJsonFile, + getPropertyFromWorkspace, getDefaultProjectBuildOptions } from '../utils/dependency-handler'; import { addResetCss } from './add-normalize'; import { getWorkspace } from '@schematics/angular/utility/config'; @@ -19,7 +20,8 @@ function propertyExistsInWorkspace(targetProp: string, workspace: WorkspaceSchem function enablePolyfills(tree: Tree, context: SchematicContext): string { const workspace = getWorkspace(tree); - const targetFile = path.join(workspace.projects[workspace.defaultProject].sourceRoot, 'polyfills.ts'); + const targetFile = getDefaultProjectBuildOptions(tree)['polyfills'] || + path.join(workspace.projects[workspace.defaultProject].sourceRoot, 'polyfills.ts'); if (!tree.exists(targetFile)) { context.logger.warn(`${targetFile} not found. You may need to update polyfills.ts manually.`); return; diff --git a/projects/igniteui-angular/schematics/utils/dependency-handler.ts b/projects/igniteui-angular/schematics/utils/dependency-handler.ts index 7eb7d69ba80..4f18ca05554 100644 --- a/projects/igniteui-angular/schematics/utils/dependency-handler.ts +++ b/projects/igniteui-angular/schematics/utils/dependency-handler.ts @@ -24,6 +24,12 @@ function getTargetedProjectOptions(project: WorkspaceProject, targe throw new SchematicsException(`Cannot determine the project's configuration for: ${target}`); } +export function getDefaultProjectBuildOptions(tree: Tree) { + const workspace = getWorkspace(tree); + const project = workspace.projects[workspace.defaultProject]; + return getTargetedProjectOptions(project, 'build'); +} + function getMainFile(project: WorkspaceProject): string { const buildOptions = getTargetedProjectOptions(project, 'build'); if (!buildOptions.main) { From 1b75514ca420da2aa0504ef6fe2fd81321afd9e4 Mon Sep 17 00:00:00 2001 From: NikolayAlipiev Date: Mon, 11 Nov 2019 14:58:05 +0200 Subject: [PATCH 4/6] fix(schematics): remove additional check #6017 --- projects/igniteui-angular/schematics/ng-add/index.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/projects/igniteui-angular/schematics/ng-add/index.ts b/projects/igniteui-angular/schematics/ng-add/index.ts index 09adde6badd..79680940bfb 100644 --- a/projects/igniteui-angular/schematics/ng-add/index.ts +++ b/projects/igniteui-angular/schematics/ng-add/index.ts @@ -7,7 +7,6 @@ import { logSuccess, addDependencies, overwriteJsonFile, import { addResetCss } from './add-normalize'; import { getWorkspace } from '@schematics/angular/utility/config'; import { WorkspaceSchema } from '@schematics/angular/utility/workspace-models'; -import * as path from 'path'; /** @@ -19,9 +18,7 @@ function propertyExistsInWorkspace(targetProp: string, workspace: WorkspaceSchem } function enablePolyfills(tree: Tree, context: SchematicContext): string { - const workspace = getWorkspace(tree); - const targetFile = getDefaultProjectBuildOptions(tree)['polyfills'] || - path.join(workspace.projects[workspace.defaultProject].sourceRoot, 'polyfills.ts'); + const targetFile = getDefaultProjectBuildOptions(tree)['polyfills']; if (!tree.exists(targetFile)) { context.logger.warn(`${targetFile} not found. You may need to update polyfills.ts manually.`); return; @@ -54,7 +51,7 @@ function readInput(options: Options): Rule { if (options.polyfills) { const workspace = getWorkspace(tree); const targetProperty = 'es5BrowserSupport'; - const polyfillsFile = path.join(workspace.projects[workspace.defaultProject].sourceRoot, 'polyfills.ts'); + const polyfillsFile = getDefaultProjectBuildOptions(tree)['polyfills']; const propertyExists = propertyExistsInWorkspace(targetProperty, workspace); let polyfillsData = tree.read(polyfillsFile).toString(); if (propertyExists) { From 1d35428f9a1bcfcc255d94df7f7d95d0a32c9ca4 Mon Sep 17 00:00:00 2001 From: NikolayAlipiev Date: Mon, 11 Nov 2019 15:44:58 +0200 Subject: [PATCH 5/6] fix(schematics): refactor; test #6017 --- .../schematics/ng-add/index.spec.ts | 54 ++++++++++--------- .../schematics/ng-add/index.ts | 11 ++-- .../schematics/utils/dependency-handler.ts | 16 ++---- 3 files changed, 40 insertions(+), 41 deletions(-) diff --git a/projects/igniteui-angular/schematics/ng-add/index.spec.ts b/projects/igniteui-angular/schematics/ng-add/index.spec.ts index ebdc37c1514..c6f67eb3307 100644 --- a/projects/igniteui-angular/schematics/ng-add/index.spec.ts +++ b/projects/igniteui-angular/schematics/ng-add/index.spec.ts @@ -9,17 +9,19 @@ describe('ng-add schematics', () => { const collectionPath = path.join(__dirname, '../collection.json'); const runner: SchematicTestRunner = new SchematicTestRunner('cli-schematics', collectionPath); let tree: UnitTestTree; + const sourceRoot = 'testSrc'; const ngJsonConfig = { defaultProject: 'testProj', projects: { testProj: { - sourceRoot: 'src', + sourceRoot: sourceRoot, projectType: ProjectType.Application, architect: { serve: {}, build: { options: { - main: 'src/main.ts', + main: `${sourceRoot}/main.ts`, + polyfills: `${sourceRoot}/polyfills.ts`, scripts: [] } } @@ -42,7 +44,7 @@ describe('ng-add schematics', () => { tree = new UnitTestTree(new EmptyTree()); tree.create('/angular.json', JSON.stringify(ngJsonConfig)); tree.create('/package.json', JSON.stringify(pkgJsonConfig)); - tree.create('src/main.ts', '// test comment'); + tree.create(`${sourceRoot}/main.ts`, '// test comment'); }); it('should create the needed files correctly', () => { @@ -71,7 +73,7 @@ describe('ng-add schematics', () => { it('should add hammer.js to the main.ts file', () => { runner.runSchematic('ng-add', { normalizeCss: false }, tree); - const mainTs = tree.read('src/main.ts').toString(); + const mainTs = tree.read(`${sourceRoot}/main.ts`).toString(); expect(mainTs).toContain('import \'hammerjs\';'); }); @@ -82,12 +84,12 @@ describe('ng-add schematics', () => { tree.overwrite('angular.json', JSON.stringify(workspace)); runner.runSchematic('ng-add', { normalizeCss: false }, tree); - const newContent = tree.read('src/main.ts').toString(); + const newContent = tree.read(`${sourceRoot}/main.ts`).toString(); expect(newContent.split('import \'hammerjs\';\n// test comment').length).toEqual(1); }); it('should not add hammer.js if it exists in main.ts', () => { - const mainTsPath = 'src/main.ts'; + const mainTsPath = `${sourceRoot}/main.ts`; const content = tree.read(mainTsPath).toString(); tree.overwrite(mainTsPath, 'import \'hammerjs\';\n' + content); runner.runSchematic('ng-add', { normalizeCss: false }, tree); @@ -138,54 +140,54 @@ import 'core-js/es6/set'; import 'web-animations-js'; // Run \`npm install --save web-animations-js\`. `; - tree.create('src/polyfills.ts', polyfills); + tree.create('testSrc/polyfills.ts', polyfills); runner.runSchematic('ng-add', { polyfills: true, normalizeCss: false }, tree); - expect(tree.readContent('src/polyfills.ts').replace(/\r\n/g, '\n')).toEqual(result.replace(/\r\n/g, '\n')); + expect(tree.readContent('testSrc/polyfills.ts').replace(/\r\n/g, '\n')).toEqual(result.replace(/\r\n/g, '\n')); }); it('should properly add css reset', () => { - tree.create('src/styles.scss', ''); + tree.create(`${sourceRoot}/styles.scss`, ''); runner.runSchematic('ng-add', { normalizeCss: true }, tree); let pkgJsonData = JSON.parse(tree.readContent('/package.json')); - expect(tree.readContent('src/styles.scss')).toEqual(scssImport); + expect(tree.readContent(`${sourceRoot}/styles.scss`)).toEqual(scssImport); expect(pkgJsonData.dependencies['minireset.css']).toBeTruthy(); resetJsonConfigs(tree); - tree.delete('src/styles.scss'); + tree.delete(`${sourceRoot}/styles.scss`); - tree.create('src/styles.sass', ''); + tree.create(`${sourceRoot}/styles.sass`, ''); runner.runSchematic('ng-add', { normalizeCss: true }, tree); pkgJsonData = JSON.parse(tree.readContent('/package.json')); - expect(tree.readContent('src/styles.sass')).toEqual(scssImport); + expect(tree.readContent(`${sourceRoot}/styles.sass`)).toEqual(scssImport); expect(pkgJsonData.dependencies['minireset.css']).toBeTruthy(); resetJsonConfigs(tree); - tree.delete('src/styles.sass'); + tree.delete(`${sourceRoot}/styles.sass`); - tree.create('src/styles.css', ''); + tree.create(`${sourceRoot}/styles.css`, ''); runner.runSchematic('ng-add', { normalizeCss: true }, tree); pkgJsonData = JSON.parse(tree.readContent('/package.json')); - expect(tree.readContent('src/styles.css')).toBe(''); + expect(tree.readContent(`${sourceRoot}/styles.css`)).toBe(''); expect(pkgJsonData.dependencies['minireset.css']).toBeTruthy(); expect(JSON.parse(tree.readContent('/angular.json')).projects['testProj'].architect.build.options.styles).toContain(cssImport); resetJsonConfigs(tree); - tree.delete('src/styles.css'); + tree.delete(`${sourceRoot}/styles.css`); - tree.create('src/styles.less', ''); + tree.create(`${sourceRoot}/styles.less`, ''); runner.runSchematic('ng-add', { normalizeCss: true }, tree); pkgJsonData = JSON.parse(tree.readContent('/package.json')); - expect(tree.readContent('src/styles.less')).toBe(''); + expect(tree.readContent(`${sourceRoot}/styles.less`)).toBe(''); expect(pkgJsonData.dependencies['minireset.css']).toBeTruthy(); expect(JSON.parse(tree.readContent('/angular.json')).projects['testProj'].architect.build.options.styles).toContain(cssImport); resetJsonConfigs(tree); - tree.delete('src/styles.less'); + tree.delete(`${sourceRoot}/styles.less`); - tree.create('src/styles.styl', ''); + tree.create(`${sourceRoot}/styles.styl`, ''); runner.runSchematic('ng-add', { normalizeCss: true }, tree); pkgJsonData = JSON.parse(tree.readContent('/package.json')); - expect(tree.readContent('src/styles.styl')).toBe(''); + expect(tree.readContent(`${sourceRoot}/styles.styl`)).toBe(''); expect(pkgJsonData.dependencies['minireset.css']).toBeTruthy(); expect(JSON.parse(tree.readContent('/angular.json')).projects['testProj'].architect.build.options.styles).toContain(cssImport); resetJsonConfigs(tree); - tree.delete('src/styles.styl'); + tree.delete(`${sourceRoot}/styles.styl`); }); it('should properly add web animations', () => { @@ -202,7 +204,7 @@ import 'web-animations-js'; // Run \`npm install --save web-animations-js\`. * that is built with AngularCLI v7.3 or above. All else are considered below v7.3. */ it('should enable es5BrowserSupport on projects with ng cli version >= 7.3', () => { - tree.create('src/polyfills.ts', ''); + tree.create('testSrc/polyfills.ts', ''); const newJson: any = JSON.parse(tree.read('/angular.json').toString()); newJson.projects['testProj'].architect.build.options['es5BrowserSupport'] = false; tree.overwrite('/angular.json', JSON.stringify(newJson)); @@ -226,11 +228,11 @@ import 'web-animations-js'; // Run \`npm install --save web-animations-js\`. import 'web-animations-js'; // Run \`npm install --save web-animations-js\`. `; - tree.create('src/polyfills.ts', polyfills); + tree.create('testSrc/polyfills.ts', polyfills); const newJson: any = JSON.parse(tree.read('/angular.json').toString()); newJson.projects['testProj'].architect.build.options['es5BrowserSupport'] = false; tree.overwrite('/angular.json', JSON.stringify(newJson)); runner.runSchematic('ng-add', { polyfills: true }, tree); - expect(tree.readContent('src/polyfills.ts').replace(/\r\n/g, '\n')).toEqual(result.replace(/\r\n/g, '\n')); + expect(tree.readContent('testSrc/polyfills.ts').replace(/\r\n/g, '\n')).toEqual(result.replace(/\r\n/g, '\n')); }); }); diff --git a/projects/igniteui-angular/schematics/ng-add/index.ts b/projects/igniteui-angular/schematics/ng-add/index.ts index 79680940bfb..1c98738aa59 100644 --- a/projects/igniteui-angular/schematics/ng-add/index.ts +++ b/projects/igniteui-angular/schematics/ng-add/index.ts @@ -2,10 +2,10 @@ import { chain, Rule, SchematicContext, Tree } from '@angular-devkit/schematics' import { Options } from '../interfaces/options'; import { installPackageJsonDependencies } from '../utils/package-handler'; import { logSuccess, addDependencies, overwriteJsonFile, - getPropertyFromWorkspace, getDefaultProjectBuildOptions } from '../utils/dependency-handler'; + getPropertyFromWorkspace, getConfigFile } from '../utils/dependency-handler'; import { addResetCss } from './add-normalize'; -import { getWorkspace } from '@schematics/angular/utility/config'; +import { getWorkspace, getConfig } from '@schematics/angular/utility/config'; import { WorkspaceSchema } from '@schematics/angular/utility/workspace-models'; @@ -18,7 +18,9 @@ function propertyExistsInWorkspace(targetProp: string, workspace: WorkspaceSchem } function enablePolyfills(tree: Tree, context: SchematicContext): string { - const targetFile = getDefaultProjectBuildOptions(tree)['polyfills']; + const workspace = getWorkspace(tree); + const project = workspace.projects[workspace.defaultProject]; + const targetFile = getConfigFile(project, 'polyfills'); if (!tree.exists(targetFile)) { context.logger.warn(`${targetFile} not found. You may need to update polyfills.ts manually.`); return; @@ -51,7 +53,8 @@ function readInput(options: Options): Rule { if (options.polyfills) { const workspace = getWorkspace(tree); const targetProperty = 'es5BrowserSupport'; - const polyfillsFile = getDefaultProjectBuildOptions(tree)['polyfills']; + const project = workspace.projects[workspace.defaultProject]; + const polyfillsFile = getConfigFile(project, 'polyfills'); const propertyExists = propertyExistsInWorkspace(targetProperty, workspace); let polyfillsData = tree.read(polyfillsFile).toString(); if (propertyExists) { diff --git a/projects/igniteui-angular/schematics/utils/dependency-handler.ts b/projects/igniteui-angular/schematics/utils/dependency-handler.ts index 4f18ca05554..a75e84238a4 100644 --- a/projects/igniteui-angular/schematics/utils/dependency-handler.ts +++ b/projects/igniteui-angular/schematics/utils/dependency-handler.ts @@ -24,20 +24,14 @@ function getTargetedProjectOptions(project: WorkspaceProject, targe throw new SchematicsException(`Cannot determine the project's configuration for: ${target}`); } -export function getDefaultProjectBuildOptions(tree: Tree) { - const workspace = getWorkspace(tree); - const project = workspace.projects[workspace.defaultProject]; - return getTargetedProjectOptions(project, 'build'); -} - -function getMainFile(project: WorkspaceProject): string { +export function getConfigFile(project: WorkspaceProject, option: string): string { const buildOptions = getTargetedProjectOptions(project, 'build'); - if (!buildOptions.main) { - throw new SchematicsException(`Could not find the project main file inside of the ` + + if (!buildOptions[option]) { + throw new SchematicsException(`Could not find the project ${option} file inside of the ` + `workspace config (${project.sourceRoot})`); } - return buildOptions.main; + return buildOptions[option]; } export function overwriteJsonFile(tree: Tree, targetFile: string, data: any) { @@ -117,7 +111,7 @@ function includeDependencies(pkgJson: any, context: SchematicContext, tree: Tree const workspace = getWorkspace(tree); const project = workspace.projects[workspace.defaultProject]; const projectOptions = getTargetedProjectOptions(project, 'build'); - const mainTsPath = getMainFile(project); + const mainTsPath = getConfigFile(project, 'main'); const hammerImport = 'import \'hammerjs\';\n'; const mainTsContent = tree.read(mainTsPath).toString(); // if there are no elements in the architect.build.options.scripts array that contain hammerjs From 71fb8fe6a1a68cae15e422975d52fa5f43e56a31 Mon Sep 17 00:00:00 2001 From: Damyan Petev Date: Mon, 11 Nov 2019 16:43:52 +0200 Subject: [PATCH 6/6] chore(schatics): test path variables --- .../igniteui-angular/schematics/ng-add/index.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/projects/igniteui-angular/schematics/ng-add/index.spec.ts b/projects/igniteui-angular/schematics/ng-add/index.spec.ts index c6f67eb3307..a8c0736becd 100644 --- a/projects/igniteui-angular/schematics/ng-add/index.spec.ts +++ b/projects/igniteui-angular/schematics/ng-add/index.spec.ts @@ -140,9 +140,9 @@ import 'core-js/es6/set'; import 'web-animations-js'; // Run \`npm install --save web-animations-js\`. `; - tree.create('testSrc/polyfills.ts', polyfills); + tree.create(`${sourceRoot}/polyfills.ts`, polyfills); runner.runSchematic('ng-add', { polyfills: true, normalizeCss: false }, tree); - expect(tree.readContent('testSrc/polyfills.ts').replace(/\r\n/g, '\n')).toEqual(result.replace(/\r\n/g, '\n')); + expect(tree.readContent(`${sourceRoot}/polyfills.ts`).replace(/\r\n/g, '\n')).toEqual(result.replace(/\r\n/g, '\n')); }); it('should properly add css reset', () => { @@ -204,7 +204,7 @@ import 'web-animations-js'; // Run \`npm install --save web-animations-js\`. * that is built with AngularCLI v7.3 or above. All else are considered below v7.3. */ it('should enable es5BrowserSupport on projects with ng cli version >= 7.3', () => { - tree.create('testSrc/polyfills.ts', ''); + tree.create(`${sourceRoot}/polyfills.ts`, ''); const newJson: any = JSON.parse(tree.read('/angular.json').toString()); newJson.projects['testProj'].architect.build.options['es5BrowserSupport'] = false; tree.overwrite('/angular.json', JSON.stringify(newJson)); @@ -228,11 +228,11 @@ import 'web-animations-js'; // Run \`npm install --save web-animations-js\`. import 'web-animations-js'; // Run \`npm install --save web-animations-js\`. `; - tree.create('testSrc/polyfills.ts', polyfills); + tree.create(`${sourceRoot}/polyfills.ts`, polyfills); const newJson: any = JSON.parse(tree.read('/angular.json').toString()); newJson.projects['testProj'].architect.build.options['es5BrowserSupport'] = false; tree.overwrite('/angular.json', JSON.stringify(newJson)); runner.runSchematic('ng-add', { polyfills: true }, tree); - expect(tree.readContent('testSrc/polyfills.ts').replace(/\r\n/g, '\n')).toEqual(result.replace(/\r\n/g, '\n')); + expect(tree.readContent(`${sourceRoot}/polyfills.ts`).replace(/\r\n/g, '\n')).toEqual(result.replace(/\r\n/g, '\n')); }); });