diff --git a/rules/prefer-dom-node-dataset.js b/rules/prefer-dom-node-dataset.js index 520cc9f392..152b74cd48 100644 --- a/rules/prefer-dom-node-dataset.js +++ b/rules/prefer-dom-node-dataset.js @@ -22,9 +22,15 @@ const dashToCamelCase = string => string.replace(/-[a-z]/g, s => s[1].toUpperCas const create = context => ({ [selector](node) { const [nameNode] = node.arguments; - const attributeName = nameNode.value; + let attributeName = nameNode.value; - if (typeof attributeName !== 'string' || !attributeName.startsWith('data-') || attributeName === 'data-') { + if (typeof attributeName !== 'string') { + return; + } + + attributeName = attributeName.toLowerCase(); + + if (!attributeName.startsWith('data-')) { return; } diff --git a/test/prefer-dom-node-dataset.mjs b/test/prefer-dom-node-dataset.mjs index a8a3662cec..5cf390dc45 100644 --- a/test/prefer-dom-node-dataset.mjs +++ b/test/prefer-dom-node-dataset.mjs @@ -28,8 +28,7 @@ test.snapshot({ 'element.setAttribute(0, \'🦄\');', // First Argument is not startsWith `data-` 'element.setAttribute(\'foo-unicorn\', \'🦄\');', - // First Argument is `data-` - 'element.setAttribute(\'data-\', \'🦄\');', + 'element.setAttribute(\'data\', \'🦄\');', ], invalid: [ outdent` @@ -47,6 +46,11 @@ test.snapshot({ 'element.setAttribute(\'data-foo-bar\', \'zaz\');', 'element.setAttribute(\'data-foo\', /* comment */ \'bar\');', 'element.querySelector(\'#selector\').setAttribute(\'data-AllowAccess\', true);', + 'element.setAttribute("data-", "🦄");', + 'element.setAttribute("data--foo", "🦄");', + 'element.setAttribute("DATA--FOO", "🦄");', + 'element.setAttribute("DATA- ", "🦄");', + 'element.setAttribute("DATA-Foo-bar", "🦄");', ], }); @@ -75,8 +79,7 @@ test.snapshot({ 'element.removeAttribute(0);', // First Argument is not startsWith `data-` 'element.removeAttribute("foo-unicorn");', - // First Argument is `data-` - 'element.removeAttribute("data-");', + 'element.removeAttribute("data");', ], invalid: [ outdent` @@ -95,6 +98,7 @@ test.snapshot({ 'element.removeAttribute("data-foo-bar");', 'element.removeAttribute("data-foo");', 'element.querySelector("#selector").removeAttribute("data-AllowAccess");', + 'element.removeAttribute("data-");', ], }); @@ -126,8 +130,7 @@ test.snapshot({ 'element.hasAttribute(0);', // First Argument is not startsWith `data-` 'element.hasAttribute("foo-unicorn");', - // First Argument is `data-` - 'element.hasAttribute("data-");', + 'element.hasAttribute("data");', ], invalid: [ outdent` @@ -173,8 +176,7 @@ test.snapshot({ 'element.getAttribute(0);', // First Argument is not startsWith `data-` 'element.getAttribute("foo-unicorn");', - // First Argument is `data-` - 'element.getAttribute("data-");', + 'element.getAttribute("data");', ], invalid: [ outdent` diff --git a/test/snapshots/prefer-dom-node-dataset.mjs.md b/test/snapshots/prefer-dom-node-dataset.mjs.md index f95faaf01e..f60e04ebf7 100644 --- a/test/snapshots/prefer-dom-node-dataset.mjs.md +++ b/test/snapshots/prefer-dom-node-dataset.mjs.md @@ -163,7 +163,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | element.querySelector('#selector').dataset.AllowAccess = true;␊ + 1 | element.querySelector('#selector').dataset.allowaccess = true;␊ ` > Error 1/1 @@ -173,6 +173,86 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.dataset\` over \`setAttribute(…)\`.␊ ` +## Invalid #11 + 1 | element.setAttribute("data-", "🦄"); + +> Output + + `␊ + 1 | element.dataset[""] = "🦄";␊ + ` + +> Error 1/1 + + `␊ + > 1 | element.setAttribute("data-", "🦄");␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.dataset\` over \`setAttribute(…)\`.␊ + ` + +## Invalid #12 + 1 | element.setAttribute("data--foo", "🦄"); + +> Output + + `␊ + 1 | element.dataset.Foo = "🦄";␊ + ` + +> Error 1/1 + + `␊ + > 1 | element.setAttribute("data--foo", "🦄");␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.dataset\` over \`setAttribute(…)\`.␊ + ` + +## Invalid #13 + 1 | element.setAttribute("DATA--FOO", "🦄"); + +> Output + + `␊ + 1 | element.dataset.Foo = "🦄";␊ + ` + +> Error 1/1 + + `␊ + > 1 | element.setAttribute("DATA--FOO", "🦄");␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.dataset\` over \`setAttribute(…)\`.␊ + ` + +## Invalid #14 + 1 | element.setAttribute("DATA- ", "🦄"); + +> Output + + `␊ + 1 | element.dataset[" "] = "🦄";␊ + ` + +> Error 1/1 + + `␊ + > 1 | element.setAttribute("DATA- ", "🦄");␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.dataset\` over \`setAttribute(…)\`.␊ + ` + +## Invalid #15 + 1 | element.setAttribute("DATA-Foo-bar", "🦄"); + +> Output + + `␊ + 1 | element.dataset.fooBar = "🦄";␊ + ` + +> Error 1/1 + + `␊ + > 1 | element.setAttribute("DATA-Foo-bar", "🦄");␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.dataset\` over \`setAttribute(…)\`.␊ + ` + ## Invalid #1 1 | element.removeAttribute( 2 | "data-foo", // comment @@ -361,7 +441,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | delete element.querySelector("#selector").dataset.AllowAccess;␊ + 1 | delete element.querySelector("#selector").dataset.allowaccess;␊ ` > Error 1/1 @@ -371,6 +451,22 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.dataset\` over \`removeAttribute(…)\`.␊ ` +## Invalid #13 + 1 | element.removeAttribute("data-"); + +> Output + + `␊ + 1 | delete element.dataset[""];␊ + ` + +> Error 1/1 + + `␊ + > 1 | element.removeAttribute("data-");␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.dataset\` over \`removeAttribute(…)\`.␊ + ` + ## Invalid #1 1 | element.hasAttribute( 2 | "data-foo", // comment @@ -559,7 +655,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | Object.hasOwn(element.querySelector("#selector").dataset, "AllowAccess");␊ + 1 | Object.hasOwn(element.querySelector("#selector").dataset, "allowaccess");␊ ` > Error 1/1 @@ -757,7 +853,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | element.querySelector("#selector").dataset.AllowAccess;␊ + 1 | element.querySelector("#selector").dataset.allowaccess;␊ ` > Error 1/1 diff --git a/test/snapshots/prefer-dom-node-dataset.mjs.snap b/test/snapshots/prefer-dom-node-dataset.mjs.snap index 10995f8619..e7ad80f47d 100644 Binary files a/test/snapshots/prefer-dom-node-dataset.mjs.snap and b/test/snapshots/prefer-dom-node-dataset.mjs.snap differ