From 578b8909b6e8ad21362057bf9f8c2e3ce2018ee8 Mon Sep 17 00:00:00 2001 From: Dimitri POSTOLOV Date: Sun, 31 Oct 2021 16:45:20 +0100 Subject: [PATCH] fix error report for `require-deprecation-date` rule (#740) --- .changeset/late-otters-add.md | 5 +++++ .../src/rules/require-deprecation-date.ts | 20 +++++++++++-------- .../require-deprecation-date.spec.ts.snap | 13 ++++++++---- .../tests/require-deprecation-date.spec.ts | 12 +++++++---- 4 files changed, 34 insertions(+), 16 deletions(-) create mode 100644 .changeset/late-otters-add.md diff --git a/.changeset/late-otters-add.md b/.changeset/late-otters-add.md new file mode 100644 index 00000000000..0a798a90c13 --- /dev/null +++ b/.changeset/late-otters-add.md @@ -0,0 +1,5 @@ +--- +'@graphql-eslint/eslint-plugin': patch +--- + +fix error report for `require-deprecation-date` rule diff --git a/packages/plugin/src/rules/require-deprecation-date.ts b/packages/plugin/src/rules/require-deprecation-date.ts index eb1ed3b26fc..7ec60e6e4dd 100644 --- a/packages/plugin/src/rules/require-deprecation-date.ts +++ b/packages/plugin/src/rules/require-deprecation-date.ts @@ -1,5 +1,6 @@ import { GraphQLESLintRule } from '../types'; import { valueFromNode } from '../estree-parser/utils'; +import { getLocation } from '../utils'; const DATE_REGEX = /^\d{2}\/\d{2}\/\d{4}$/; @@ -47,10 +48,10 @@ const rule: GraphQLESLintRule<[{ argumentName?: string }]> = { ], }, messages: { - [MESSAGE_REQUIRE_DATE]: 'Directive "@deprecated" must have a deletion date.', - [MESSAGE_INVALID_FORMAT]: 'Deletion date must be in format "DD/MM/YYYY".', - [MESSAGE_INVALID_DATE]: 'Invalid "{{ deletionDate }}" deletion date.', - [MESSAGE_CAN_BE_REMOVED]: '"{{ nodeName }}" сan be removed.', + [MESSAGE_REQUIRE_DATE]: 'Directive "@deprecated" must have a deletion date', + [MESSAGE_INVALID_FORMAT]: 'Deletion date must be in format "DD/MM/YYYY"', + [MESSAGE_INVALID_DATE]: 'Invalid "{{ deletionDate }}" deletion date', + [MESSAGE_CAN_BE_REMOVED]: '"{{ nodeName }}" сan be removed', }, schema: [ { @@ -71,14 +72,17 @@ const rule: GraphQLESLintRule<[{ argumentName?: string }]> = { const deletionDateNode = node.arguments.find(arg => arg.name.value === argName); if (!deletionDateNode) { - context.report({ node: node.name, messageId: MESSAGE_REQUIRE_DATE }); + context.report({ + loc: getLocation(node.loc, node.name.value, { offsetEnd: 0 }), + messageId: MESSAGE_REQUIRE_DATE, + }); return; } const deletionDate = valueFromNode(deletionDateNode.value); const isValidDate = DATE_REGEX.test(deletionDate); if (!isValidDate) { - context.report({ node: node.name, messageId: MESSAGE_INVALID_FORMAT }); + context.report({ node: deletionDateNode.value, messageId: MESSAGE_INVALID_FORMAT }); return; } let [day, month, year] = deletionDate.split('/'); @@ -88,7 +92,7 @@ const rule: GraphQLESLintRule<[{ argumentName?: string }]> = { if (Number.isNaN(deletionDateInMS)) { context.report({ - node: node.name, + node: deletionDateNode.value, messageId: MESSAGE_INVALID_DATE, data: { deletionDate, @@ -101,7 +105,7 @@ const rule: GraphQLESLintRule<[{ argumentName?: string }]> = { if (canRemove) { context.report({ - node: node.name, + node, messageId: MESSAGE_CAN_BE_REMOVED, data: { nodeName: node.parent.name.value, diff --git a/packages/plugin/tests/__snapshots__/require-deprecation-date.spec.ts.snap b/packages/plugin/tests/__snapshots__/require-deprecation-date.spec.ts.snap index c573fc70b32..7d2563ebc4a 100644 --- a/packages/plugin/tests/__snapshots__/require-deprecation-date.spec.ts.snap +++ b/packages/plugin/tests/__snapshots__/require-deprecation-date.spec.ts.snap @@ -2,20 +2,25 @@ exports[` 1`] = ` > 1 | scalar Old @deprecated(deletionDate: "22/08/2021") - | ^ "Old" сan be removed. + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ "Old" сan be removed `; exports[` 2`] = ` > 1 | scalar Old @deprecated(untilDate: "22/08/2021") - | ^ "Old" сan be removed. + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ "Old" сan be removed `; exports[` 3`] = ` > 1 | scalar Old @deprecated(deletionDate: "bad") - | ^ Deletion date must be in format "DD/MM/YYYY". + | ^ Deletion date must be in format "DD/MM/YYYY" `; exports[` 4`] = ` > 1 | scalar Old @deprecated(deletionDate: "32/08/2021") - | ^ Invalid "32/08/2021" deletion date. + | ^ Invalid "32/08/2021" deletion date +`; + +exports[` 5`] = ` +> 1 | type Old { oldField: ID @deprecated } + | ^^^^^^^^^^^ Directive "@deprecated" must have a deletion date `; diff --git a/packages/plugin/tests/require-deprecation-date.spec.ts b/packages/plugin/tests/require-deprecation-date.spec.ts index e93b3f197ea..28c81dcaf85 100644 --- a/packages/plugin/tests/require-deprecation-date.spec.ts +++ b/packages/plugin/tests/require-deprecation-date.spec.ts @@ -30,20 +30,24 @@ ruleTester.runGraphQLTests('require-deprecation-date', rule, { invalid: [ { code: 'scalar Old @deprecated(deletionDate: "22/08/2021")', - errors: [{ message: '"Old" сan be removed.' }], + errors: [{ message: '"Old" сan be removed' }], }, { code: 'scalar Old @deprecated(untilDate: "22/08/2021")', options: [{ argumentName: 'untilDate' }], - errors: [{ message: '"Old" сan be removed.' }], + errors: [{ message: '"Old" сan be removed' }], }, { code: 'scalar Old @deprecated(deletionDate: "bad")', - errors: [{ message: 'Deletion date must be in format "DD/MM/YYYY".' }], + errors: [{ message: 'Deletion date must be in format "DD/MM/YYYY"' }], }, { code: 'scalar Old @deprecated(deletionDate: "32/08/2021")', - errors: [{ message: 'Invalid "32/08/2021" deletion date.' }], + errors: [{ message: 'Invalid "32/08/2021" deletion date' }], }, + { + code: 'type Old { oldField: ID @deprecated }', + errors: [{ message: 'Directive "@deprecated" must have a deletion date' }], + } ], });