diff --git a/docs/generated/packages/angular.json b/docs/generated/packages/angular.json index 1946fcc4e30fa..52ac21b4bfef1 100644 --- a/docs/generated/packages/angular.json +++ b/docs/generated/packages/angular.json @@ -661,6 +661,11 @@ "description": "Skip formatting files.", "type": "boolean", "default": false + }, + "skipPackageJson": { + "description": "Skip updating package.json.", + "type": "boolean", + "default": false } }, "additionalProperties": false, diff --git a/packages/angular/src/generators/karma-project/karma-project.spec.ts b/packages/angular/src/generators/karma-project/karma-project.spec.ts index 3f7999aa3fee4..868bab41a8623 100644 --- a/packages/angular/src/generators/karma-project/karma-project.spec.ts +++ b/packages/angular/src/generators/karma-project/karma-project.spec.ts @@ -41,11 +41,13 @@ describe('karmaProject', () => { }); it('should generate files', async () => { + expect(tree.exists('karma.conf.js')).toBeFalsy(); await karmaProjectGenerator(tree, { project: 'lib1' }); expect(tree.exists('/libs/lib1/karma.conf.js')).toBeTruthy(); expect(tree.exists('/libs/lib1/tsconfig.spec.json')).toBeTruthy(); expect(tree.exists('/libs/lib1/src/test.ts')).toBeTruthy(); + expect(tree.exists('karma.conf.js')).toBeTruthy(); }); it('should create a karma.conf.js', async () => { diff --git a/packages/angular/src/generators/karma-project/karma-project.ts b/packages/angular/src/generators/karma-project/karma-project.ts index dfa9857644503..d8a4f1feca93b 100644 --- a/packages/angular/src/generators/karma-project/karma-project.ts +++ b/packages/angular/src/generators/karma-project/karma-project.ts @@ -5,11 +5,13 @@ import { generateKarmaProjectFiles } from './lib/generate-karma-project-files'; import { updateTsConfigs } from './lib/update-tsconfig'; import { updateWorkspaceConfig } from './lib/update-workspace-config'; import type { KarmaProjectOptions } from './schema'; +import { karmaGenerator } from '../karma/karma'; export async function karmaProjectGenerator( tree: Tree, options: KarmaProjectOptions ) { + karmaGenerator(tree, options); checkProjectTestTarget(tree, options.project); generateKarmaProjectFiles(tree, options.project); updateTsConfigs(tree, options.project); diff --git a/packages/angular/src/generators/karma-project/schema.d.ts b/packages/angular/src/generators/karma-project/schema.d.ts index c9a5f5e818f29..07328c45c3085 100644 --- a/packages/angular/src/generators/karma-project/schema.d.ts +++ b/packages/angular/src/generators/karma-project/schema.d.ts @@ -1,4 +1,5 @@ export interface KarmaProjectOptions { project: string; skipFormat?: boolean; + skipPackageJson?: boolean; } diff --git a/packages/angular/src/generators/karma-project/schema.json b/packages/angular/src/generators/karma-project/schema.json index 0f67c5ea73321..2f233af093ede 100644 --- a/packages/angular/src/generators/karma-project/schema.json +++ b/packages/angular/src/generators/karma-project/schema.json @@ -17,6 +17,11 @@ "description": "Skip formatting files.", "type": "boolean", "default": false + }, + "skipPackageJson": { + "description": "Skip updating package.json.", + "type": "boolean", + "default": false } }, "additionalProperties": false, diff --git a/packages/angular/src/generators/karma/karma.spec.ts b/packages/angular/src/generators/karma/karma.spec.ts index 599558a991bac..d652f1b1cc711 100644 --- a/packages/angular/src/generators/karma/karma.spec.ts +++ b/packages/angular/src/generators/karma/karma.spec.ts @@ -9,20 +9,34 @@ describe('karma', () => { tree = createTreeWithEmptyWorkspace(); }); - it('should do nothing when karma is already installed', () => { + it('should do nothing when karma is already installed and karma.conf.js exists', () => { jest.spyOn(devkit, 'generateFiles'); jest.spyOn(devkit, 'addDependenciesToPackageJson'); devkit.updateJson(tree, 'package.json', (json) => { json.devDependencies = { karma: '~5.0.0' }; return json; }); - + tree.write('karma.conf.js', ''); karmaGenerator(tree, {}); expect(devkit.generateFiles).not.toHaveBeenCalled(); expect(devkit.addDependenciesToPackageJson).not.toHaveBeenCalled(); }); + it('should create karma.conf.js when karma is installed', () => { + jest.spyOn(devkit, 'generateFiles'); + jest.spyOn(devkit, 'addDependenciesToPackageJson'); + devkit.updateJson(tree, 'package.json', (json) => { + json.devDependencies = { karma: '~5.0.0' }; + return json; + }); + + karmaGenerator(tree, {}); + + expect(devkit.generateFiles).toHaveBeenCalled(); + expect(devkit.addDependenciesToPackageJson).not.toHaveBeenCalled(); + }); + it('should add karma dependencies', () => { karmaGenerator(tree, {}); diff --git a/packages/angular/src/generators/karma/karma.ts b/packages/angular/src/generators/karma/karma.ts index b7176fd91f808..e54790f439451 100644 --- a/packages/angular/src/generators/karma/karma.ts +++ b/packages/angular/src/generators/karma/karma.ts @@ -9,28 +9,30 @@ import { GeneratorOptions } from './schema'; export function karmaGenerator(tree: Tree, options: GeneratorOptions) { const packageJson = readJson(tree, 'package.json'); - if (packageJson.devDependencies['karma']) { - return; - } - generateFiles(tree, joinPathFragments(__dirname, 'files'), '.', { tmpl: '' }); + if (!tree.exists('karma.conf.js')) { + generateFiles(tree, joinPathFragments(__dirname, 'files'), '.', { + tmpl: '', + }); + } - return !options.skipPackageJson - ? addDependenciesToPackageJson( - tree, - {}, - { - karma: '~6.3.0', - 'karma-chrome-launcher': '~3.1.0', - 'karma-coverage': '~2.2.0', - 'karma-jasmine': '~4.0.0', - 'karma-jasmine-html-reporter': '~1.7.0', - 'jasmine-core': '~3.10.0', - 'jasmine-spec-reporter': '~5.0.0', - '@types/jasmine': '~3.5.0', - } - ) - : () => {}; + if (options.skipPackageJson || packageJson.devDependencies['karma']) { + return () => {}; + } + return addDependenciesToPackageJson( + tree, + {}, + { + karma: '~6.3.0', + 'karma-chrome-launcher': '~3.1.0', + 'karma-coverage': '~2.2.0', + 'karma-jasmine': '~4.0.0', + 'karma-jasmine-html-reporter': '~1.7.0', + 'jasmine-core': '~3.10.0', + 'jasmine-spec-reporter': '~5.0.0', + '@types/jasmine': '~3.5.0', + } + ); } export default karmaGenerator;