From 5bf0648f50213fa30e9b623a8db376f41a3af411 Mon Sep 17 00:00:00 2001 From: Bryan Mishkin <698306+bmish@users.noreply.github.com> Date: Wed, 3 Aug 2022 23:40:43 -0400 Subject: [PATCH 1/5] fix: allow additional schema types in require-meta-schema (#277) --- lib/rules/require-meta-schema.js | 5 ++- tests/lib/rules/require-meta-schema.js | 59 ++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/lib/rules/require-meta-schema.js b/lib/rules/require-meta-schema.js index 0789bc6a..2d0d3000 100644 --- a/lib/rules/require-meta-schema.js +++ b/lib/rules/require-meta-schema.js @@ -104,7 +104,10 @@ module.exports = { hasEmptySchema = true; } - if (!['ArrayExpression', 'ObjectExpression'].includes(value.type)) { + if ( + value.type === 'Literal' || + (value.type === 'Identifier' && value.name === 'undefined') + ) { context.report({ node: value, messageId: 'wrongType' }); } }, diff --git a/tests/lib/rules/require-meta-schema.js b/tests/lib/rules/require-meta-schema.js index a0c2a4d0..8558c7d7 100644 --- a/tests/lib/rules/require-meta-schema.js +++ b/tests/lib/rules/require-meta-schema.js @@ -63,6 +63,7 @@ ruleTester.run('require-meta-schema', rule, { `, parserOptions: { sourceType: 'module' }, }, + // Variable schema with array value. ` const schema = []; module.exports = { @@ -70,6 +71,7 @@ ruleTester.run('require-meta-schema', rule, { create(context) {} }; `, + // Variable schema with object value. ` const foo = {}; module.exports = { @@ -77,6 +79,41 @@ ruleTester.run('require-meta-schema', rule, { create(context) {} }; `, + // Variable schema with no static value. + ` + module.exports = { + meta: { schema }, + create(context) {} + }; + `, + // Variable schema pointing to unknown variable chain. + ` + module.exports = { + meta: { schema: baseRule.meta.schema }, + create(context) {} + }; + `, + // Schema with function call as value. + ` + module.exports = { + meta: { schema: getSchema() }, + create(context) {} + }; + `, + // Schema with ternary (conditional) expression. + ` + module.exports = { + meta: { schema: foo ? [] : {} }, + create(context) {} + }; + `, + // Schema with logical expression. + ` + module.exports = { + meta: { schema: foo || {} }, + create(context) {} + }; + `, ` let schema; schema = foo ? [] : {}; @@ -296,6 +333,28 @@ schema: [] }, output: null, errors: [{ messageId: 'wrongType', type: 'Identifier', suggestions: [] }], }, + { + // Schema with number literal value. + code: ` + module.exports = { + meta: { schema: 123 }, + create(context) {} + }; + `, + output: null, + errors: [{ messageId: 'wrongType', type: 'Literal', suggestions: [] }], + }, + { + // Schema with string literal value. + code: ` + module.exports = { + meta: { schema: 'hello world' }, + create(context) {} + }; + `, + output: null, + errors: [{ messageId: 'wrongType', type: 'Literal', suggestions: [] }], + }, { code: ` const schema = null; From f5a5c2458e79c405f5a47c802dbca111301f635c Mon Sep 17 00:00:00 2001 From: Bryan Mishkin <698306+bmish@users.noreply.github.com> Date: Wed, 3 Aug 2022 23:42:37 -0400 Subject: [PATCH 2/5] fix: clarify report messages for no-missing-placeholders and no-unused-placeholders (#278) --- lib/rules/no-missing-placeholders.js | 2 +- lib/rules/no-unused-placeholders.js | 3 ++- tests/lib/rules/no-missing-placeholders.js | 5 ++++- tests/lib/rules/no-unused-placeholders.js | 5 ++++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/rules/no-missing-placeholders.js b/lib/rules/no-missing-placeholders.js index 6523d2a8..8a651873 100644 --- a/lib/rules/no-missing-placeholders.js +++ b/lib/rules/no-missing-placeholders.js @@ -26,7 +26,7 @@ module.exports = { schema: [], messages: { placeholderDoesNotExist: - 'The placeholder {{{{missingKey}}}} does not exist.', + "The placeholder {{{{missingKey}}}} is missing (must provide it in the report's `data` object).", }, }, diff --git a/lib/rules/no-unused-placeholders.js b/lib/rules/no-unused-placeholders.js index 61f17adb..e877eb9d 100644 --- a/lib/rules/no-unused-placeholders.js +++ b/lib/rules/no-unused-placeholders.js @@ -25,7 +25,8 @@ module.exports = { fixable: null, schema: [], messages: { - placeholderUnused: 'The placeholder {{{{unusedKey}}}} is unused.', + placeholderUnused: + 'The placeholder {{{{unusedKey}}}} is unused (does not exist in the actual message).', }, }, diff --git a/tests/lib/rules/no-missing-placeholders.js b/tests/lib/rules/no-missing-placeholders.js index fb2aafb6..cf346b37 100644 --- a/tests/lib/rules/no-missing-placeholders.js +++ b/tests/lib/rules/no-missing-placeholders.js @@ -18,7 +18,10 @@ const RuleTester = require('eslint').RuleTester; * @returns {object} An expected error */ function error(missingKey, type = 'Literal') { - return { type, message: `The placeholder {{${missingKey}}} does not exist.` }; + return { + type, + message: `The placeholder {{${missingKey}}} is missing (must provide it in the report's \`data\` object).`, + }; } // ------------------------------------------------------------------------------ diff --git a/tests/lib/rules/no-unused-placeholders.js b/tests/lib/rules/no-unused-placeholders.js index 8679d0c4..aad9d35b 100644 --- a/tests/lib/rules/no-unused-placeholders.js +++ b/tests/lib/rules/no-unused-placeholders.js @@ -18,7 +18,10 @@ const RuleTester = require('eslint').RuleTester; * @returns {object} An expected error */ function error(unusedKey, type = 'Literal') { - return { type, message: `The placeholder {{${unusedKey}}} is unused.` }; + return { + type, + message: `The placeholder {{${unusedKey}}} is unused (does not exist in the actual message).`, + }; } // ------------------------------------------------------------------------------ From 31ff45c8840b90f575800ccbb7a35d1ba09c2ba8 Mon Sep 17 00:00:00 2001 From: Bryan Mishkin <698306+bmish@users.noreply.github.com> Date: Wed, 3 Aug 2022 23:46:29 -0400 Subject: [PATCH 3/5] fix: reporting location in no-missing-placeholders (#280) --- lib/rules/no-missing-placeholders.js | 10 +++-- tests/lib/rules/no-missing-placeholders.js | 49 ++++++++++++++++------ 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/lib/rules/no-missing-placeholders.js b/lib/rules/no-missing-placeholders.js index 8a651873..78b40491 100644 --- a/lib/rules/no-missing-placeholders.js +++ b/lib/rules/no-missing-placeholders.js @@ -80,9 +80,11 @@ module.exports = { }); } - for (const { message, data } of reportMessagesAndDataArray.filter( - (obj) => obj.message - )) { + for (const { + message, + messageId, + data, + } of reportMessagesAndDataArray.filter((obj) => obj.message)) { const messageStaticValue = getStaticValue( message, context.getScope() @@ -112,7 +114,7 @@ module.exports = { if (!matchingProperty) { context.report({ - node: message, + node: data || messageId || message, messageId: 'placeholderDoesNotExist', data: { missingKey: match[1] }, }); diff --git a/tests/lib/rules/no-missing-placeholders.js b/tests/lib/rules/no-missing-placeholders.js index cf346b37..3390c75f 100644 --- a/tests/lib/rules/no-missing-placeholders.js +++ b/tests/lib/rules/no-missing-placeholders.js @@ -17,10 +17,11 @@ const RuleTester = require('eslint').RuleTester; * @param {string} missingKey The placeholder that is missing * @returns {object} An expected error */ -function error(missingKey, type = 'Literal') { +function error(missingKey, type, extra) { return { type, message: `The placeholder {{${missingKey}}} is missing (must provide it in the report's \`data\` object).`, + ...extra, }; } @@ -235,7 +236,7 @@ ruleTester.run('no-missing-placeholders', rule, { } }; `, - errors: [error('bar')], + errors: [error('bar', 'Literal')], }, { code: ` @@ -249,7 +250,7 @@ ruleTester.run('no-missing-placeholders', rule, { } }; `, - errors: [error('bar')], + errors: [error('bar', 'ObjectExpression')], }, { code: ` @@ -263,7 +264,7 @@ ruleTester.run('no-missing-placeholders', rule, { } }; `, - errors: [error('hasOwnProperty')], + errors: [error('hasOwnProperty', 'ObjectExpression')], }, { code: ` @@ -271,7 +272,7 @@ ruleTester.run('no-missing-placeholders', rule, { context.report(node, 'foo {{bar}}', { baz: 'qux' }); return {}; }; `, - errors: [error('bar')], + errors: [error('bar', 'ObjectExpression')], }, { // Message in variable. @@ -281,7 +282,7 @@ ruleTester.run('no-missing-placeholders', rule, { context.report(node, MESSAGE, { baz: 'qux' }); return {}; }; `, - errors: [error('bar', 'Identifier')], + errors: [error('bar', 'ObjectExpression')], }, { code: ` @@ -289,7 +290,7 @@ ruleTester.run('no-missing-placeholders', rule, { context.report(node, { line: 1, column: 3 }, 'foo {{bar}}', { baz: 'baz' }); return {}; }; `, - errors: [error('bar')], + errors: [error('bar', 'ObjectExpression')], }, { code: ` @@ -303,7 +304,19 @@ ruleTester.run('no-missing-placeholders', rule, { } }; `, - errors: [error('bar')], + errors: [ + error( + 'bar', + 'ObjectExpression', + // report on data + { + line: 7, + endLine: 7, + column: 21, + endColumn: 39, + } + ), + ], }, { @@ -343,7 +356,7 @@ ruleTester.run('no-missing-placeholders', rule, { } }; `, - errors: [error('bar')], + errors: [error('bar', 'ObjectExpression')], }, { // Suggestion and messageId @@ -362,7 +375,7 @@ ruleTester.run('no-missing-placeholders', rule, { } }; `, - errors: [error('bar')], + errors: [error('bar', 'Literal')], }, { // `create` in variable. @@ -376,7 +389,7 @@ ruleTester.run('no-missing-placeholders', rule, { } module.exports = { create }; `, - errors: [error('hasOwnProperty')], + errors: [error('hasOwnProperty', 'ObjectExpression')], }, { // messageId. @@ -391,7 +404,19 @@ ruleTester.run('no-missing-placeholders', rule, { } }; `, - errors: [error('bar')], + errors: [ + error( + 'bar', + 'Literal', + // report on the messageId + { + line: 7, + endLine: 7, + column: 26, + endColumn: 39, + } + ), + ], }, ], }); From 27c0b6558a9531c3b87a2776b1553adf29834e87 Mon Sep 17 00:00:00 2001 From: Bryan Mishkin <698306+bmish@users.noreply.github.com> Date: Wed, 3 Aug 2022 23:49:32 -0400 Subject: [PATCH 4/5] fix: Improve violation reporting location for `no-unused-placeholders` (#279) * fix: reporting location for no-unused-placeholders * improve test --- lib/rules/no-unused-placeholders.js | 2 +- tests/lib/rules/no-missing-placeholders.js | 14 +++++++++++++- tests/lib/rules/no-unused-placeholders.js | 20 ++++++++++++++++---- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/rules/no-unused-placeholders.js b/lib/rules/no-unused-placeholders.js index e877eb9d..97a66312 100644 --- a/lib/rules/no-unused-placeholders.js +++ b/lib/rules/no-unused-placeholders.js @@ -108,7 +108,7 @@ module.exports = { const key = utils.getKeyName(prop); if (!placeholdersInMessage.has(key)) { context.report({ - node: message, + node: prop, messageId: 'placeholderUnused', data: { unusedKey: key }, }); diff --git a/tests/lib/rules/no-missing-placeholders.js b/tests/lib/rules/no-missing-placeholders.js index 3390c75f..4a42b5ab 100644 --- a/tests/lib/rules/no-missing-placeholders.js +++ b/tests/lib/rules/no-missing-placeholders.js @@ -236,7 +236,19 @@ ruleTester.run('no-missing-placeholders', rule, { } }; `, - errors: [error('bar', 'Literal')], + errors: [ + error( + 'bar', + 'Literal', + // report on `message` + { + line: 6, + endLine: 6, + column: 24, + endColumn: 37, + } + ), + ], }, { code: ` diff --git a/tests/lib/rules/no-unused-placeholders.js b/tests/lib/rules/no-unused-placeholders.js index aad9d35b..a3c0f6c5 100644 --- a/tests/lib/rules/no-unused-placeholders.js +++ b/tests/lib/rules/no-unused-placeholders.js @@ -17,10 +17,11 @@ const RuleTester = require('eslint').RuleTester; * @param {string} unusedKey The placeholder that is unused * @returns {object} An expected error */ -function error(unusedKey, type = 'Literal') { +function error(unusedKey, extra) { return { - type, + type: 'Property', // The property in the report's `data` object for the unused placeholder. message: `The placeholder {{${unusedKey}}} is unused (does not exist in the actual message).`, + ...extra, }; } @@ -211,7 +212,18 @@ ruleTester.run('no-unused-placeholders', rule, { } }; `, - errors: [error('bar')], + errors: [ + error( + 'bar', + // report on property in data object + { + line: 7, + endLine: 7, + column: 23, + endColumn: 26, + } + ), + ], }, { // With `create` as variable. @@ -241,7 +253,7 @@ ruleTester.run('no-unused-placeholders', rule, { } }; `, - errors: [error('bar', 'Identifier')], + errors: [error('bar')], }, { code: ` From 85b47979d60b4740eb343333fcdc46bf53462655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Thu, 4 Aug 2022 11:56:52 +0800 Subject: [PATCH 5/5] chore: release v5.0.2 --- CHANGELOG.md | 10 ++++++++++ package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3e3919f..9dfb6926 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ +### [5.0.2](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/compare/v5.0.1...v5.0.2) (2022-08-04) + + +### Bug Fixes + +* allow additional schema types in require-meta-schema ([#277](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/issues/277)) ([5bf0648](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/commit/5bf0648f50213fa30e9b623a8db376f41a3af411)) +* clarify report messages for no-missing-placeholders and no-unused-placeholders ([#278](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/issues/278)) ([f5a5c24](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/commit/f5a5c2458e79c405f5a47c802dbca111301f635c)) +* Improve violation reporting location for `no-unused-placeholders` ([#279](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/issues/279)) ([27c0b65](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/commit/27c0b6558a9531c3b87a2776b1553adf29834e87)) +* reporting location in no-missing-placeholders ([#280](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/issues/280)) ([31ff45c](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/commit/31ff45c8840b90f575800ccbb7a35d1ba09c2ba8)) + ### [5.0.1](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/compare/v5.0.0...v5.0.1) (2022-07-18) diff --git a/package.json b/package.json index 2ae93985..65bff0f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-eslint-plugin", - "version": "5.0.1", + "version": "5.0.2", "description": "An ESLint plugin for linting ESLint plugins", "author": "Teddy Katz", "main": "./lib/index.js",