diff --git a/packages/linter/migrations.json b/packages/linter/migrations.json index 1eab1f8e5f4601..fb850af3f90845 100644 --- a/packages/linter/migrations.json +++ b/packages/linter/migrations.json @@ -46,6 +46,12 @@ "version": "12.4.0-beta.0", "description": "Remove ESLint parserOptions.project config if no rules requiring type-checking are in use", "factory": "./src/migrations/update-12-4-0/remove-eslint-project-config-if-no-type-checking-rules" + }, + "add-outputs": { + "cli": "nx", + "version": "12.9.0-beta.0", + "description": "Add outputs for caching", + "factory": "./src/migrations/update-12-9-0/add-outputs" } }, "packageJsonUpdates": { diff --git a/packages/linter/src/generators/lint-project/lint-project.spec.ts b/packages/linter/src/generators/lint-project/lint-project.spec.ts index 9f41e70ba8d5d0..c49373877b6059 100644 --- a/packages/linter/src/generators/lint-project/lint-project.spec.ts +++ b/packages/linter/src/generators/lint-project/lint-project.spec.ts @@ -57,6 +57,9 @@ describe('@nrwl/linter:lint-project', () => { "**/*.ts", ], }, + "outputs": Array [ + "{options.outputFile}", + ], } `); }); diff --git a/packages/linter/src/generators/lint-project/lint-project.ts b/packages/linter/src/generators/lint-project/lint-project.ts index 543843e7f0f982..2a540253f339f4 100644 --- a/packages/linter/src/generators/lint-project/lint-project.ts +++ b/packages/linter/src/generators/lint-project/lint-project.ts @@ -93,6 +93,7 @@ export async function lintProjectGenerator( if (options.linter === Linter.EsLint) { projectConfig.targets['lint'] = { executor: '@nrwl/linter:eslint', + outputs: ['{options.outputFile}'], options: { lintFilePatterns: options.eslintFilePatterns, }, diff --git a/packages/linter/src/migrations/update-12-9-0/add-outputs.spec.ts b/packages/linter/src/migrations/update-12-9-0/add-outputs.spec.ts new file mode 100644 index 00000000000000..d67a97dfcbd54a --- /dev/null +++ b/packages/linter/src/migrations/update-12-9-0/add-outputs.spec.ts @@ -0,0 +1,69 @@ +import { + addProjectConfiguration, + readProjectConfiguration, + TargetConfiguration, + Tree, +} from '@nrwl/devkit'; +import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; +import addOutputs from './add-outputs'; + +describe('addOutputs', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + + const lintWithoutOutputs: TargetConfiguration = { + executor: '@nrwl/linter:eslint', + options: {}, + }; + const lintWithOutputs: TargetConfiguration = { + executor: '@nrwl/linter:eslint', + outputs: ['dist'], + options: {}, + }; + const notLint: TargetConfiguration = { + executor: '@nrwl/node:build', + options: {}, + }; + + addProjectConfiguration(tree, 'proj', { + root: 'proj', + targets: { + lintWithoutOutputs, + lintWithOutputs, + notLint, + }, + }); + }); + + it('should add outputs to targets that do not have outputs', async () => { + await addOutputs(tree); + + expect(readProjectConfiguration(tree, 'proj')).toMatchInlineSnapshot(` +Object { + "root": "proj", + "targets": Object { + "lintWithOutputs": Object { + "executor": "@nrwl/linter:eslint", + "options": Object {}, + "outputs": Array [ + "dist", + ], + }, + "lintWithoutOutputs": Object { + "executor": "@nrwl/linter:eslint", + "options": Object {}, + "outputs": Array [ + "{options.outputFile}", + ], + }, + "notLint": Object { + "executor": "@nrwl/node:build", + "options": Object {}, + }, + }, +} +`); + }); +}); diff --git a/packages/linter/src/migrations/update-12-9-0/add-outputs.ts b/packages/linter/src/migrations/update-12-9-0/add-outputs.ts new file mode 100644 index 00000000000000..7ec85927a0283b --- /dev/null +++ b/packages/linter/src/migrations/update-12-9-0/add-outputs.ts @@ -0,0 +1,26 @@ +import { + formatFiles, + getProjects, + Tree, + updateProjectConfiguration, +} from '@nrwl/devkit'; + +export default async function addOutputs(tree: Tree) { + for (const [projectName, project] of getProjects(tree)) { + if (!project.targets) { + continue; + } + + for (const target of Object.values(project.targets)) { + if (target.executor !== '@nrwl/linter:eslint' || target.outputs) { + continue; + } + + target.outputs = ['{options.outputFile}']; + + updateProjectConfiguration(tree, projectName, project); + } + } + + await formatFiles(tree); +}