From 5a34c45731d190fa8eb304b4aa97205afaedf017 Mon Sep 17 00:00:00 2001 From: Eugene Kashida Date: Fri, 12 Mar 2021 04:42:00 -0800 Subject: [PATCH 1/3] chore: update @lwc/eslint-plugin-lwc --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 093b916..d31a5b0 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "test": "mocha" }, "dependencies": { - "@lwc/eslint-plugin-lwc": "~0.11.0", + "@lwc/eslint-plugin-lwc": "~0.12.0", "babel-eslint": "~10.1.0", "eslint-plugin-import": "~2.22.1", "eslint-plugin-jest": "~23.8.2", diff --git a/yarn.lock b/yarn.lock index 22efa59..93ad58f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -146,10 +146,10 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@lwc/eslint-plugin-lwc@~0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@lwc/eslint-plugin-lwc/-/eslint-plugin-lwc-0.11.0.tgz#1c69cc673b9798e04e87ececb8529b93eb2215b1" - integrity sha512-wJOD4XWOH91GaZfypMSKfEeMXqMfvKdsb2gSJ/9FEwJVlziKg1aagtRYJh2ln3DyEZV33tBC/p/dWzIeiwa1tg== +"@lwc/eslint-plugin-lwc@~0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@lwc/eslint-plugin-lwc/-/eslint-plugin-lwc-0.12.0.tgz#4065c2e9c72f4133f2e6dca5a87ca613b35a4e1d" + integrity sha512-p8PacTcCNg+Txgu7P+sDaLKAs1S/LyKWvbBiE3lZByGkahveISX7VARt8W+bCxUTERoXzoOPDxa7uGmawEfmXQ== dependencies: minimatch "^3.0.4" From 2849145d39d18200f81709558c93ebf2321016b1 Mon Sep 17 00:00:00 2001 From: Eugene Kashida Date: Fri, 12 Mar 2021 04:42:29 -0800 Subject: [PATCH 2/3] chore: equal => strictEqual --- test/recommended.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/recommended.js b/test/recommended.js index ac7cb3b..a201f4d 100644 --- a/test/recommended.js +++ b/test/recommended.js @@ -35,8 +35,8 @@ describe('recommended config', () => { const report = cli.executeOnText('document.querySelectorAll("a")'); const { messages } = report.results[0]; - assert.equal(messages.length, 1); - assert.equal(messages[0].ruleId, '@lwc/lwc/no-document-query'); + assert.strictEqual(messages.length, 1); + assert.strictEqual(messages[0].ruleId, '@lwc/lwc/no-document-query'); }); it('should forbid mixing uppercase and underscore characters in public properties', () => { @@ -50,8 +50,8 @@ describe('recommended config', () => { `); const { messages } = report.results[0]; - assert.equal(messages.length, 1); - assert.equal(messages[0].ruleId, '@lwc/lwc/valid-api'); + assert.strictEqual(messages.length, 1); + assert.strictEqual(messages[0].ruleId, '@lwc/lwc/valid-api'); }); it('should suggest usage of CustomEvent over Event constructor', () => { @@ -60,8 +60,8 @@ describe('recommended config', () => { const report = cli.executeOnText(`dispatchEvent(new Event('test'));`); const { messages } = report.results[0]; - assert.equal(messages.length, 1); - assert.equal(messages[0].ruleId, '@lwc/lwc/prefer-custom-event'); + assert.strictEqual(messages.length, 1); + assert.strictEqual(messages[0].ruleId, '@lwc/lwc/prefer-custom-event'); }); it('should forbid duplicate class members', () => { @@ -72,15 +72,15 @@ describe('recommended config', () => { export default class App extends LightningElement { @api foo = 1; - + set foo(value) { this._foo = value } get foo() { return this._foo; } } `); const { messages } = report.results[0]; - assert.equal(messages.length, 2); - assert.equal(messages[0].ruleId, '@lwc/lwc/no-dupe-class-members'); - assert.equal(messages[1].ruleId, '@lwc/lwc/no-dupe-class-members'); + assert.strictEqual(messages.length, 2); + assert.strictEqual(messages[0].ruleId, '@lwc/lwc/no-dupe-class-members'); + assert.strictEqual(messages[1].ruleId, '@lwc/lwc/no-dupe-class-members'); }); }); From 9f83b38bb66e8bb5a2576f4b0df4763f3a9bc5f9 Mon Sep 17 00:00:00 2001 From: Eugene Kashida Date: Fri, 12 Mar 2021 04:47:14 -0800 Subject: [PATCH 3/3] chore: enable no-attributes-during-construction rule --- recommended.js | 1 + test/recommended.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/recommended.js b/recommended.js index b960eea..b905415 100644 --- a/recommended.js +++ b/recommended.js @@ -104,6 +104,7 @@ module.exports = { // LWC specific rules '@lwc/lwc/no-api-reassignments': 'error', '@lwc/lwc/no-async-operation': 'error', + '@lwc/lwc/no-attributes-during-construction': 'error', '@lwc/lwc/no-document-query': 'error', '@lwc/lwc/no-dupe-class-members': 'error', '@lwc/lwc/no-inner-html': 'error', diff --git a/test/recommended.js b/test/recommended.js index a201f4d..671ac2e 100644 --- a/test/recommended.js +++ b/test/recommended.js @@ -83,4 +83,23 @@ describe('recommended config', () => { assert.strictEqual(messages[0].ruleId, '@lwc/lwc/no-dupe-class-members'); assert.strictEqual(messages[1].ruleId, '@lwc/lwc/no-dupe-class-members'); }); + + it('should prevent attributes set during construction', () => { + const cli = getCliEngineWithRecommendedRules(); + + const report = cli.executeOnText(` + import { LightningElement } from 'lwc'; + + export default class App extends LightningElement { + constructor() { + super(); + this.tabIndex = '-1'; + } + } + `); + + const { messages } = report.results[0]; + assert.strictEqual(messages.length, 1); + assert.strictEqual(messages[0].ruleId, '@lwc/lwc/no-attributes-during-construction'); + }); });