From a64bba9980cf8f37a2febf54aa52015adb7cff3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Thu, 7 Apr 2022 15:49:44 +0100 Subject: [PATCH] feat(linter): add cacheStrategy, rulesdir and resolvePluginsRelativeTo flags to eslint executor (#9709) --- docs/generated/packages/linter.json | 16 +++++ .../src/executors/eslint/lint.impl.spec.ts | 6 ++ .../linter/src/executors/eslint/schema.d.ts | 3 + .../linter/src/executors/eslint/schema.json | 18 ++++++ .../eslint/utility/eslint-utils.spec.ts | 62 +++++++++++++++++++ .../executors/eslint/utility/eslint-utils.ts | 3 + 6 files changed, 108 insertions(+) diff --git a/docs/generated/packages/linter.json b/docs/generated/packages/linter.json index 0435918098c83..fdb34ff05a54b 100644 --- a/docs/generated/packages/linter.json +++ b/docs/generated/packages/linter.json @@ -282,6 +282,22 @@ "hasTypeAwareRules": { "type": "boolean", "description": "When set to `true`, the linter will invalidate its cache when any of its dependencies changes." + }, + "cacheStrategy": { + "type": "string", + "description": "Strategy to use for detecting changed files in the cache.", + "default": "metadata", + "enum": ["metadata", "content"] + }, + "rulesdir": { + "type": "array", + "description": "The equivalent of the `--rulesdir` flag on the ESLint CLI.", + "default": [], + "items": { "type": "string" } + }, + "resolvePluginsRelativeTo": { + "type": "string", + "description": "The equivalent of the `--resolve-plugins-relative-to` flag on the ESLint CLI." } }, "additionalProperties": false, diff --git a/packages/linter/src/executors/eslint/lint.impl.spec.ts b/packages/linter/src/executors/eslint/lint.impl.spec.ts index 903b5f362b0e5..1e60b7f57312a 100644 --- a/packages/linter/src/executors/eslint/lint.impl.spec.ts +++ b/packages/linter/src/executors/eslint/lint.impl.spec.ts @@ -45,6 +45,7 @@ function createValidRunBuilderOptions( fix: true, cache: true, cacheLocation: 'cacheLocation1', + cacheStrategy: 'content', format: 'stylish', force: false, silent: false, @@ -54,6 +55,8 @@ function createValidRunBuilderOptions( noEslintrc: false, quiet: false, hasTypeAwareRules: false, + rulesdir: [], + resolvePluginsRelativeTo: null, ...additionalOptions, }; } @@ -137,6 +140,7 @@ describe('Linter Builder', () => { fix: true, cache: true, cacheLocation: 'cacheLocation1', + cacheStrategy: 'content', format: 'stylish', force: false, silent: false, @@ -145,6 +149,8 @@ describe('Linter Builder', () => { outputFile: null, quiet: false, noEslintrc: false, + rulesdir: [], + resolvePluginsRelativeTo: null, }); }); diff --git a/packages/linter/src/executors/eslint/schema.d.ts b/packages/linter/src/executors/eslint/schema.d.ts index 3b8357c8a0a68..afdbc5da1d304 100644 --- a/packages/linter/src/executors/eslint/schema.d.ts +++ b/packages/linter/src/executors/eslint/schema.d.ts @@ -15,6 +15,9 @@ export interface Schema extends JsonObject { quiet: boolean; ignorePath: string | null; hasTypeAwareRules: boolean; + cacheStrategy: 'content' | 'metadata' | null; + rulesdir: string[]; + resolvePluginsRelativeTo: string | null; } type Formatter = diff --git a/packages/linter/src/executors/eslint/schema.json b/packages/linter/src/executors/eslint/schema.json index fe6c2e1e3ce05..fa648e30c9cf9 100644 --- a/packages/linter/src/executors/eslint/schema.json +++ b/packages/linter/src/executors/eslint/schema.json @@ -94,6 +94,24 @@ "hasTypeAwareRules": { "type": "boolean", "description": "When set to `true`, the linter will invalidate its cache when any of its dependencies changes." + }, + "cacheStrategy": { + "type": "string", + "description": "Strategy to use for detecting changed files in the cache.", + "default": "metadata", + "enum": ["metadata", "content"] + }, + "rulesdir": { + "type": "array", + "description": "The equivalent of the `--rulesdir` flag on the ESLint CLI.", + "default": [], + "items": { + "type": "string" + } + }, + "resolvePluginsRelativeTo": { + "type": "string", + "description": "The equivalent of the `--resolve-plugins-relative-to` flag on the ESLint CLI." } }, "additionalProperties": false, diff --git a/packages/linter/src/executors/eslint/utility/eslint-utils.spec.ts b/packages/linter/src/executors/eslint/utility/eslint-utils.spec.ts index 5886fdf441cf0..3f256e3b33fa2 100644 --- a/packages/linter/src/executors/eslint/utility/eslint-utils.spec.ts +++ b/packages/linter/src/executors/eslint/utility/eslint-utils.spec.ts @@ -22,6 +22,7 @@ describe('eslint-utils', () => { fix: true, cache: true, cacheLocation: '/root/cache', + cacheStrategy: 'content', }).catch(() => {}); expect(ESLint).toHaveBeenCalledWith({ @@ -29,8 +30,11 @@ describe('eslint-utils', () => { fix: true, cache: true, cacheLocation: '/root/cache', + cacheStrategy: 'content', ignorePath: undefined, useEslintrc: true, + resolvePluginsRelativeTo: undefined, + rulePaths: [], errorOnUnmatchedPattern: false, }); }); @@ -40,6 +44,7 @@ describe('eslint-utils', () => { fix: true, cache: true, cacheLocation: '/root/cache', + cacheStrategy: 'content', }).catch(() => {}); expect(ESLint).toHaveBeenCalledWith({ @@ -47,8 +52,11 @@ describe('eslint-utils', () => { fix: true, cache: true, cacheLocation: '/root/cache', + cacheStrategy: 'content', ignorePath: undefined, useEslintrc: true, + resolvePluginsRelativeTo: undefined, + rulePaths: [], errorOnUnmatchedPattern: false, }); }); @@ -67,8 +75,62 @@ describe('eslint-utils', () => { fix: true, cache: true, cacheLocation: '/root/cache', + cacheStrategy: undefined, ignorePath: undefined, useEslintrc: false, + resolvePluginsRelativeTo: undefined, + rulePaths: [], + errorOnUnmatchedPattern: false, + }); + }); + }); + + describe('rulesdir', () => { + it('should create the ESLint instance with "rulePaths" set to the given value for rulesdir', async () => { + const extraRuleDirectories = ['./some-rules', '../some-more-rules']; + await lint(undefined, { + fix: true, + cache: true, + cacheLocation: '/root/cache', + cacheStrategy: 'content', + rulesdir: extraRuleDirectories, + }).catch(() => {}); + + expect(ESLint).toHaveBeenCalledWith({ + overrideConfigFile: undefined, + fix: true, + cache: true, + cacheLocation: '/root/cache', + cacheStrategy: 'content', + ignorePath: undefined, + useEslintrc: true, + resolvePluginsRelativeTo: undefined, + rulePaths: extraRuleDirectories, + errorOnUnmatchedPattern: false, + }); + }); + }); + + describe('resolvePluginsRelativeTo', () => { + it('should create the ESLint instance with "resolvePluginsRelativeTo" set to the given value for resolvePluginsRelativeTo', async () => { + await lint(undefined, { + fix: true, + cache: true, + cacheLocation: '/root/cache', + cacheStrategy: 'content', + resolvePluginsRelativeTo: './some-path', + }).catch(() => {}); + + expect(ESLint).toHaveBeenCalledWith({ + overrideConfigFile: undefined, + fix: true, + cache: true, + cacheLocation: '/root/cache', + cacheStrategy: 'content', + ignorePath: undefined, + useEslintrc: true, + resolvePluginsRelativeTo: './some-path', + rulePaths: [], errorOnUnmatchedPattern: false, }); }); diff --git a/packages/linter/src/executors/eslint/utility/eslint-utils.ts b/packages/linter/src/executors/eslint/utility/eslint-utils.ts index d4e02377eadf6..1fec55b78d1ab 100644 --- a/packages/linter/src/executors/eslint/utility/eslint-utils.ts +++ b/packages/linter/src/executors/eslint/utility/eslint-utils.ts @@ -28,6 +28,9 @@ export async function lint( fix: !!options.fix, cache: !!options.cache, cacheLocation: options.cacheLocation || undefined, + cacheStrategy: options.cacheStrategy || undefined, + resolvePluginsRelativeTo: options.resolvePluginsRelativeTo || undefined, + rulePaths: options.rulesdir || [], /** * Default is `true` and if not overridden the eslint.lintFiles() method will throw an error * when no target files are found.