From 832ae0c9cc97dfdab6fff3d4dc445e5839e23e05 Mon Sep 17 00:00:00 2001 From: utarwyn Date: Wed, 19 Jul 2023 00:26:53 +0200 Subject: [PATCH 1/3] Use ecocode-rules-specifications --- sonar-plugin/pom.xml | 8 +++ .../io/ecocode/rules/javascript/EC11.html | 19 ------ .../io/ecocode/rules/javascript/EC11.json | 19 ------ .../io/ecocode/rules/javascript/EC12.html | 32 ---------- .../io/ecocode/rules/javascript/EC12.json | 19 ------ .../io/ecocode/rules/javascript/EC13.html | 31 --------- .../io/ecocode/rules/javascript/EC13.json | 19 ------ .../io/ecocode/rules/javascript/EC8.html | 41 ------------ .../io/ecocode/rules/javascript/EC8.json | 19 ------ .../io/ecocode/rules/javascript/EC9.html | 63 ------------------- .../io/ecocode/rules/javascript/EC9.json | 19 ------ 11 files changed, 8 insertions(+), 281 deletions(-) delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC11.html delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC11.json delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC12.html delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC12.json delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC13.html delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC13.json delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC8.html delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC8.json delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC9.html delete mode 100644 sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC9.json diff --git a/sonar-plugin/pom.xml b/sonar-plugin/pom.xml index 66cce1c..dee86e0 100644 --- a/sonar-plugin/pom.xml +++ b/sonar-plugin/pom.xml @@ -49,6 +49,7 @@ ${encoding} ${encoding} + 0.0.1 9.4.0.54424 9.13.0.20537 1.21.0.505 @@ -64,6 +65,13 @@ + + io.ecocode + ecocode-rules-specifications + ${ecocode-rules-specifications.version} + javascript + + org.sonarsource.sonarqube sonar-plugin-api diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC11.html b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC11.html deleted file mode 100644 index accfc0d..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC11.html +++ /dev/null @@ -1,19 +0,0 @@ -

Rule details

-

- This rule aims to reduce DOM access assigning its object to variable when - access multiple time. It saves CPU cycles. -

- -

Examples

-

Examples of incorrect code for this rule:

- -
var el1 = document.getElementById("block1").test1;
-var el2 = document.getElementById("block1").test2;
-
- -

Examples of correct code for this rule:

- -
var blockElement = document.getElementById("block1");
-var el1 = blockElement.test1;
-var el2 = blockElement.test2;
-
diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC11.json b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC11.json deleted file mode 100644 index 878a346..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC11.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Disallow multiple access of same DOM element.", - "type": "CODE_SMELL", - "status": "ready", - "remediation": { - "func": "Constant\/Issue", - "constantCost": "5min" - }, - "tags": [ - "eco-design", - "performance", - "ecocode" - ], - "defaultSeverity": "Major", - "compatibleLanguages": [ - "JAVASCRIPT", - "TYPESCRIPT" - ] -} diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC12.html b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC12.html deleted file mode 100644 index 139dd6d..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC12.html +++ /dev/null @@ -1,32 +0,0 @@ -

Rule Details

-

This rule aims to disallow batching multiple style changes at once.

- -

- To limit the number of repaint/reflow, it is advised to batch style - modifications by adding a class containing all style changes that will - generate a unique reflow. -

- -

Examples

-

Examples of non-compliant code for this rule:

- -
<script>
-  element.style.height = "800px";
-  element.style.width = "600px";
-  element.style.color = "red";
-</script>
-
- -

Examples of compliant code for this rule:

-
<style>
-  .in-error {
-    color: red;
-    height: 800px;
-    width: 800px;
-  }
-</style>
-
-<script>
-  element.addClass("in-error");
-</script>
-
diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC12.json b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC12.json deleted file mode 100644 index 67c6010..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC12.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Disallow multiple style changes at once.", - "type": "CODE_SMELL", - "status": "ready", - "remediation": { - "func": "Constant\/Issue", - "constantCost": "10min" - }, - "tags": [ - "eco-design", - "performance", - "ecocode" - ], - "defaultSeverity": "Major", - "compatibleLanguages": [ - "JAVASCRIPT", - "TYPESCRIPT" - ] -} diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC13.html b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC13.html deleted file mode 100644 index af193e8..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC13.html +++ /dev/null @@ -1,31 +0,0 @@ -

Rule details

-

- This rule aims to reduce the size and thus the network weight of API returns - that may contain many elements. This rule is built for the - NestJS framework but can work with a - controller @Controller() and a decorated method @Get(). -

- -

Examples

-

Examples of non-compliant code for this rule:

- -
@Controller()
-class Test {
-  @Get()
-  public find(): Promise<string[]> {}
-}
-
- -

Examples of compliant code for this rule:

-
interface Pagination {
-  items: string[];
-  currentPage: number;
-  totalPages: number;
-}
-
-@Controller()
-class Test {
-  @Get()
-  public find(): Promise<Pagination> {}
-}
-
diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC13.json b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC13.json deleted file mode 100644 index 6ff60b4..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC13.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Prefer API collections with pagination.", - "type": "CODE_SMELL", - "status": "ready", - "remediation": { - "func": "Constant\/Issue", - "constantCost": "30min" - }, - "tags": [ - "eco-design", - "performance", - "ecocode" - ], - "defaultSeverity": "Minor", - "compatibleLanguages": [ - "JAVASCRIPT", - "TYPESCRIPT" - ] -} diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC8.html b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC8.html deleted file mode 100644 index d879ec4..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC8.html +++ /dev/null @@ -1,41 +0,0 @@ -

Rule details

-

- This rule aims at reducing CPU consumption by telling the device to use a less - accurate yet more eco friendly geolocation, when geolocation API is used. -

- -

Examples

- -

Examples of non compliant code for this rule:

- -
var options = { enableHighAccuracy: true, timeout: 5000, maximumAge: 0 };
-function success(pos) {
-  console.log(pos.coords);
-}
-
-function error(err) {
-  console.warn(err);
-}
-
-navigator.geolocation.getCurrentPosition(success, error, options);
-
- -

Examples of compliant code for this rule:

- -
// enableHighAccuracy is false by default, so not declaring it is correct
-function success(pos) {
-  console.log(pos);
-}
-navigator.geolocation.getCurrentPosition(success);
-
-
var options = { enableHighAccuracy: false, timeout: 5000, maximumAge: 0 };
-function success(pos) {
-  console.log(pos.coords);
-}
-
-function error(err) {
-  console.warn(err);
-}
-
-navigator.geolocation.getCurrentPosition(success, error, options);
-
diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC8.json b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC8.json deleted file mode 100644 index 232f1ce..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC8.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Avoid using high accuracy geolocation in web applications.", - "type": "CODE_SMELL", - "status": "ready", - "remediation": { - "func": "Constant\/Issue", - "constantCost": "5min" - }, - "tags": [ - "eco-design", - "performance", - "ecocode" - ], - "defaultSeverity": "Major", - "compatibleLanguages": [ - "JAVASCRIPT", - "TYPESCRIPT" - ] -} diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC9.html b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC9.html deleted file mode 100644 index 8642cf1..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC9.html +++ /dev/null @@ -1,63 +0,0 @@ -

Rule details

-

- This rule aims to reduce weight of programs by using only needed modules. Many - libraries export only one module by default, but some of them are exporting ES - modules or submodules. We should use them to select more precisly needed - modules and avoid unnecessarily overloading files weight. -

- -Example with lodash - -

- Example with the well-known - lodash library, if you only need - "isEmpty" method. -

- -

Options

-

- You can externally add your own libraries to be checked. To add your own - libraries you need to modify your .eslintrc.js by adding the following rule - configuration: -

- -
module.exports = {
-  ...yourConf,
-  rules: {
-    "no-import-all-from-library": [
-      "warn",
-      {
-        notAllowedLibraries: ["some-lib"], // will check for -> import someLib from "some-lib"
-        importByNamespaceNotAllowedLibraries: ["some-other-lib"], // will check for -> import * as someOtherLib from "some-other-lib"
-      },
-    ],
-  },
-};
-
- -

Examples

-

Examples of non-compliant code for this rule:

- -
// Example with lodash
-import lodash from "lodash";
-import { isEmpty } from "lodash";
-import * as lodash from "lodash";
-
-// Example with underscore
-import _ from "underscore";
-
- -

Examples of compliant code for this rule:

- -
// Example with lodash (uses submodules)
-import isEmpty from "lodash/isEmpty";
-import intersect from "lodash/intersect";
-
-// Example with underscore (uses esm modules)
-import map from "underscore/modules/map.js";
-
diff --git a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC9.json b/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC9.json deleted file mode 100644 index 99e524b..0000000 --- a/sonar-plugin/src/main/resources/io/ecocode/rules/javascript/EC9.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Should not import all from library", - "type": "CODE_SMELL", - "status": "ready", - "remediation": { - "func": "Constant\/Issue", - "constantCost": "15min" - }, - "tags": [ - "eco-design", - "performance", - "ecocode" - ], - "defaultSeverity": "Major", - "compatibleLanguages": [ - "JAVASCRIPT", - "TYPESCRIPT" - ] -} From 36f0ba915850f9966c941a98162dee1cf8c0f3ca Mon Sep 17 00:00:00 2001 From: utarwyn Date: Wed, 19 Jul 2023 00:41:38 +0200 Subject: [PATCH 2/3] Remove external image in no-import-all-from-library doc --- .../images/no-import-all-from-library.jpg | Bin 51198 -> 0 bytes .../docs/rules/no-import-all-from-library.md | 23 +++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) delete mode 100644 eslint-plugin/docs/images/no-import-all-from-library.jpg diff --git a/eslint-plugin/docs/images/no-import-all-from-library.jpg b/eslint-plugin/docs/images/no-import-all-from-library.jpg deleted file mode 100644 index ee3f39dfd4df29f36c7dfb2df803383379c269d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51198 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⪼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 diff --git a/eslint-plugin/docs/rules/no-import-all-from-library.md b/eslint-plugin/docs/rules/no-import-all-from-library.md index 58219bf..c7930ba 100644 --- a/eslint-plugin/docs/rules/no-import-all-from-library.md +++ b/eslint-plugin/docs/rules/no-import-all-from-library.md @@ -10,10 +10,6 @@ This rule aims to reduce weight of programs by using only needed modules. Many l default, but some of them are exporting ES modules or submodules. We should use them to select more precisly needed modules and avoid unnecessarily overloading files weight. -![Example with lodash](https://raw.githubusercontent.com/green-code-initiative/ecoCode-linter/main/eslint-plugin/docs/images/no-import-all-from-library.jpg) - -*Example with the well-known [lodash](https://lodash.com/) library, if you only need "isEmpty" method.* - ## Options You can externally add your own libraries to be checked. @@ -48,6 +44,15 @@ import * as lodash from "lodash"; import _ from "underscore"; ``` +**Size of your bundle, if you use the whole lodash library:** + +* **index.js - 531.46 KB** + * node_modules/lodash - 531.35 KB + * lodash.js - 531.35 KB + * index.js - 112 B + +--- + Examples of **compliant** code for this rule: ```js @@ -58,3 +63,13 @@ import intersect from "lodash/intersect"; // Example with underscore (uses esm modules) import map from "underscore/modules/map.js"; ``` + +Size of your bundle, if you use only the "isEmpty" method: + +* **index.js - 24.42 KB** + * node_modules/lodash - 24.31 KB + * isEmpty - 1.95 KB + * _nodeUtil.js - 995 B + * isArrayLike.js - 830 B + * ... + * index.js - 110 B From f553404df4886f5db6d142d2fba9e0653b5b2617 Mon Sep 17 00:00:00 2001 From: utarwyn Date: Wed, 19 Jul 2023 00:45:09 +0200 Subject: [PATCH 3/3] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a139f8f..a1c512a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#14](https://github.com/green-code-initiative/ecoCode-javascript/pull/14) Create SonarQube plugin - [#12](https://github.com/green-code-initiative/ecoCode-javascript/issues/12) Pack ESLint plugin into SonarQube plugin +- [#16](https://github.com/green-code-initiative/ecoCode-javascript/pull/16) Use centralized rules specifications - Backport all existing rules into SonarQube plugin ### Changed