diff --git a/packages/schematics/angular/utility/latest-versions/package.json b/packages/schematics/angular/utility/latest-versions/package.json index 29ef3658f23b..ec8e917dfd85 100644 --- a/packages/schematics/angular/utility/latest-versions/package.json +++ b/packages/schematics/angular/utility/latest-versions/package.json @@ -18,6 +18,7 @@ "jsdom": "^27.1.0", "less": "^4.2.0", "postcss": "^8.5.3", + "prettier": "^3.7.4", "protractor": "~7.0.0", "rxjs": "~7.8.0", "tailwindcss": "^4.1.12", diff --git a/packages/schematics/angular/workspace/files/package.json.template b/packages/schematics/angular/workspace/files/package.json.template index 790f65acf407..6e450025dbfd 100644 --- a/packages/schematics/angular/workspace/files/package.json.template +++ b/packages/schematics/angular/workspace/files/package.json.template @@ -7,7 +7,7 @@ "build": "ng build", "watch": "ng build --watch --configuration development"<% if (!minimal) { %>, "test": "ng test"<% } %> - }, + },<% if (!skipPrettier) { %> "prettier": { "printWidth": 100, "singleQuote": true, @@ -19,7 +19,7 @@ } } ] - }, + },<% } %> "private": true, <% if (packageManagerWithVersion) { %>"packageManager": "<%= packageManagerWithVersion %>",<% } %> "dependencies": { @@ -34,7 +34,8 @@ }, "devDependencies": { "@angular/cli": "<%= '^' + version %>", - "@angular/compiler-cli": "<%= latestVersions.Angular %>", + "@angular/compiler-cli": "<%= latestVersions.Angular %>",<% if (!skipPrettier) { %> + "prettier": "<%= latestVersions['prettier'] %>",<% } %> "typescript": "<%= latestVersions['typescript'] %>" } } diff --git a/packages/schematics/angular/workspace/index_spec.ts b/packages/schematics/angular/workspace/index_spec.ts index 65dd7987aa41..943fbe04fdfd 100644 --- a/packages/schematics/angular/workspace/index_spec.ts +++ b/packages/schematics/angular/workspace/index_spec.ts @@ -135,9 +135,24 @@ describe('Workspace Schematic', () => { expect(tasks).not.toContain(jasmine.objectContaining({ type: 'npm', script: 'test' })); }); - it('should include prettier config overrides for Angular templates', async () => { + it('should include prettier config and dependency by default', async () => { const tree = await schematicRunner.runSchematic('workspace', defaultOptions); const pkg = JSON.parse(tree.readContent('/package.json')); expect(pkg.prettier).withContext('package.json#prettier is present').toBeTruthy(); + expect(pkg.devDependencies['prettier']) + .withContext('prettier is in devDependencies') + .toEqual(latestVersions['prettier']); + }); + + it('should not include prettier config and dependency when skipPrettier is true', async () => { + const tree = await schematicRunner.runSchematic('workspace', { + ...defaultOptions, + skipPrettier: true, + }); + const pkg = JSON.parse(tree.readContent('/package.json')); + expect(pkg.prettier).withContext('package.json#prettier should not be present').toBeUndefined(); + expect(pkg.devDependencies['prettier']) + .withContext('prettier should not be in devDependencies') + .toBeUndefined(); }); }); diff --git a/packages/schematics/angular/workspace/schema.json b/packages/schematics/angular/workspace/schema.json index 51ec1a22e889..e54689c197a9 100644 --- a/packages/schematics/angular/workspace/schema.json +++ b/packages/schematics/angular/workspace/schema.json @@ -44,6 +44,11 @@ "$default": { "$source": "packageManager" } + }, + "skipPrettier": { + "description": "Skip adding Prettier configuration and dependency to the workspace.", + "type": "boolean", + "default": false } }, "required": ["name", "version"]