From 660d3cb2c7a56a4037de52dd914eeaee535a1360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Wed, 16 Mar 2022 12:06:43 +0000 Subject: [PATCH 1/2] Allow define checks to have logical expressions in if statements --- lib/rules/no-unchecked-define.js | 4 +++- test/no-unchecked-define.js | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/rules/no-unchecked-define.js b/lib/rules/no-unchecked-define.js index 807f189..3282a98 100644 --- a/lib/rules/no-unchecked-define.js +++ b/lib/rules/no-unchecked-define.js @@ -11,7 +11,9 @@ module.exports = { create(context) { definedCustomElements = new Map() return { - [`IfStatement:matches([test.type=UnaryExpression],[test.type=BinaryExpression]) ${s.customElements.get}`](node) { + [`IfStatement:matches([test.type=UnaryExpression],[test.type=BinaryExpression],[test.type=LogicalExpression]) ${s.customElements.get}`]( + node + ) { if (node.parent.type === 'UnaryExpression') { let unaryCounter = 0 let parent = node.parent diff --git a/test/no-unchecked-define.js b/test/no-unchecked-define.js index 1735001..61c132c 100644 --- a/test/no-unchecked-define.js +++ b/test/no-unchecked-define.js @@ -7,6 +7,9 @@ ruleTester.run('no-unchecked-define', rule, { { code: 'if (!window.customElements.get("foo-bar")) { window.customElements.define("foo-bar", class extends HTMLElement {}) } ' }, + { + code: 'if (window.customElements && !window.customElements.get("foo-bar")) { window.customElements.define("foo-bar", class extends HTMLElement {}) } ' + }, { code: 'if (!customElements.get("foo-bar")) { window.customElements.define("foo-bar", class extends HTMLElement {}) } ' }, From aefc045b1c6f91c6383b719d50d2d55fda7ae58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Mon, 21 Mar 2022 11:44:47 +0000 Subject: [PATCH 2/2] Cover LogicalExpressions in `no-unchecked-define` --- lib/rules/no-unchecked-define.js | 4 ++++ test/no-unchecked-define.js | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/rules/no-unchecked-define.js b/lib/rules/no-unchecked-define.js index 3282a98..9e1252f 100644 --- a/lib/rules/no-unchecked-define.js +++ b/lib/rules/no-unchecked-define.js @@ -24,6 +24,10 @@ module.exports = { if (unaryCounter % 2 !== 0) { definedCustomElements.set(node.arguments[0].value, node) } + } else if (node.parent.type === 'LogicalExpression') { + // Don't do anything. If the parent is a logical expression, we are + // checking for truthiness and we only care about if the element is + // _not_ defined. } else { definedCustomElements.set(node.arguments[0].value, node) } diff --git a/test/no-unchecked-define.js b/test/no-unchecked-define.js index 61c132c..8df7cf6 100644 --- a/test/no-unchecked-define.js +++ b/test/no-unchecked-define.js @@ -44,6 +44,16 @@ ruleTester.run('no-unchecked-define', rule, { } ] }, + { + code: 'if (window.customElements && customElements.get("foo-bar")) { window.customElements.define("foo-bar", class extends HTMLElement {}) } ', + errors: [ + { + message: + 'Make sure to wrap customElements.define calls in checks to see if the element has already been defined', + type: 'CallExpression' + } + ] + }, { code: 'if (!customElements.get("bar-foo")) { window.customElements.define("foo-bar", class extends HTMLElement {}) } ', errors: [