From 418cec5e21f4a76986a9f1b4faa67d0ca83f832e Mon Sep 17 00:00:00 2001
From: Christoph Reiter <reiter.christoph@gmail.com>
Date: Mon, 21 Dec 2020 12:54:07 +0100
Subject: [PATCH] Add a global eslint command and run in CI

---
 .gitlab-ci.yml                                |  8 ++++
 package.json                                  |  1 +
 packages/check-in-place-select/.eslintignore  |  3 ++
 packages/check-in-place-select/.eslintrc.json | 25 +++++++++++
 packages/check-in-place-select/package.json   |  7 ++-
 .../src/check-in-place-select.js              |  6 ++-
 .../src/dbp-check-in-place-select-demo.js     |  1 +
 .../src/i18n/de/select2.js                    |  2 +-
 .../src/i18n/en/select2.js                    |  2 +-
 packages/common/styles.js                     |  2 +-
 packages/common/utils.js                      | 22 +++++-----
 packages/data-table-view/.eslintignore        |  4 ++
 packages/data-table-view/.eslintrc.json       | 25 +++++++++++
 packages/data-table-view/package.json         |  7 ++-
 .../data-table-view/src/data-table-view.js    |  4 +-
 packages/language-select/.eslintignore        |  3 ++
 packages/language-select/.eslintrc.json       | 25 +++++++++++
 packages/language-select/package.json         |  7 ++-
 .../language-select/src/language-select.js    |  2 +-
 packages/matomo/.eslintignore                 |  3 ++
 packages/matomo/.eslintrc.json                | 25 +++++++++++
 packages/matomo/package.json                  |  7 ++-
 packages/matomo/src/matomo.js                 | 43 ++++++++++---------
 23 files changed, 186 insertions(+), 48 deletions(-)
 create mode 100644 packages/check-in-place-select/.eslintignore
 create mode 100644 packages/check-in-place-select/.eslintrc.json
 create mode 100644 packages/data-table-view/.eslintignore
 create mode 100644 packages/data-table-view/.eslintrc.json
 create mode 100644 packages/language-select/.eslintignore
 create mode 100644 packages/language-select/.eslintrc.json
 create mode 100644 packages/matomo/.eslintignore
 create mode 100644 packages/matomo/.eslintrc.json

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 38df26d8..29402570 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -16,6 +16,14 @@ test:
     - yarn install
     - yarn run test
 
+linting:
+  stage: test
+  allow_failure: true
+  script:
+    - yarn config set cache-folder "$CI_PROJECT_DIR/_yarn_cache"
+    - yarn install
+    - yarn run lint
+
 publish:
   stage: deploy
   only:
diff --git a/package.json b/package.json
index 45f7a036..ce4dbed6 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
   "scripts": {
     "test": "lerna run test",
     "build": "lerna run build",
+    "lint": "lerna run lint",
     "publish": "lerna publish from-package --yes"
   },
   "author": "",
diff --git a/packages/check-in-place-select/.eslintignore b/packages/check-in-place-select/.eslintignore
new file mode 100644
index 00000000..7b596da7
--- /dev/null
+++ b/packages/check-in-place-select/.eslintignore
@@ -0,0 +1,3 @@
+/vendor/**
+/dist/**
+/*.js
\ No newline at end of file
diff --git a/packages/check-in-place-select/.eslintrc.json b/packages/check-in-place-select/.eslintrc.json
new file mode 100644
index 00000000..1ccd30a3
--- /dev/null
+++ b/packages/check-in-place-select/.eslintrc.json
@@ -0,0 +1,25 @@
+{
+    "env": {
+        "browser": true,
+        "es6": true,
+        "mocha": true
+    },
+    "extends": ["eslint:recommended", "plugin:jsdoc/recommended"],
+    "globals": {
+        "Atomics": "readonly",
+        "SharedArrayBuffer": "readonly"
+    },
+    "parser": "babel-eslint",
+    "parserOptions": {
+        "ecmaVersion": 2018,
+        "sourceType": "module"
+    },
+    "rules": {
+        "no-unused-vars": ["error", { "args": "none" }],
+        "semi": [2, "always"],
+        "jsdoc/require-jsdoc": 0,
+        "jsdoc/require-param-description": 0,
+        "jsdoc/require-returns": 0,
+        "jsdoc/require-param-type": 0
+    }
+}
\ No newline at end of file
diff --git a/packages/check-in-place-select/package.json b/packages/check-in-place-select/package.json
index 97cf65a7..78374980 100644
--- a/packages/check-in-place-select/package.json
+++ b/packages/check-in-place-select/package.json
@@ -31,7 +31,9 @@
     "rollup-plugin-copy": "^3.1.0",
     "rollup-plugin-delete": "^2.0.0",
     "rollup-plugin-serve": "^1.0.1",
-    "rollup-plugin-terser": "^7.0.2"
+    "rollup-plugin-terser": "^7.0.2",
+    "eslint": "^7.3.1",
+    "eslint-plugin-jsdoc": "^30.6.4"
   },
   "dependencies": {
     "@dbp-toolkit/auth": "^0.1.0",
@@ -53,6 +55,7 @@
     "watch": "npm run watch-local",
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
-    "test": "npm run build-test && karma start --singleRun"
+    "test": "npm run build-test && karma start --singleRun",
+    "lint": "eslint ."
   }
 }
diff --git a/packages/check-in-place-select/src/check-in-place-select.js b/packages/check-in-place-select/src/check-in-place-select.js
index d2a25948..ae3d9eea 100644
--- a/packages/check-in-place-select/src/check-in-place-select.js
+++ b/packages/check-in-place-select/src/check-in-place-select.js
@@ -1,6 +1,6 @@
 import {findObjectInApiResults} from './utils.js';
-import select2LangDe from './i18n/de/select2'
-import select2LangEn from './i18n/en/select2'
+import select2LangDe from './i18n/de/select2';
+import select2LangEn from './i18n/en/select2';
 import JSONLD from '@dbp-toolkit/common/jsonld';
 import {css, html, LitElement} from 'lit-element';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
@@ -124,6 +124,8 @@ export class CheckInPlaceSelect extends ScopedElementsMixin(LitElement) {
 
     /**
      * Initializes the Select2 selector
+     *
+     * @param ignorePreset
      */
     initSelect2(ignorePreset = false) {
         const that = this;
diff --git a/packages/check-in-place-select/src/dbp-check-in-place-select-demo.js b/packages/check-in-place-select/src/dbp-check-in-place-select-demo.js
index abcf3330..539baa50 100644
--- a/packages/check-in-place-select/src/dbp-check-in-place-select-demo.js
+++ b/packages/check-in-place-select/src/dbp-check-in-place-select-demo.js
@@ -17,6 +17,7 @@ export class CheckInPlaceSelectDemo extends ScopedElementsMixin(LitElement) {
         return {
           'dbp-login-button': LoginButton,
           'dbp-check-in-place-select': CheckInPlaceSelect,
+          'dbp-auth-keycloak': AuthKeycloak,
         };
     }
 
diff --git a/packages/check-in-place-select/src/i18n/de/select2.js b/packages/check-in-place-select/src/i18n/de/select2.js
index 487734d3..bef156f0 100644
--- a/packages/check-in-place-select/src/i18n/de/select2.js
+++ b/packages/check-in-place-select/src/i18n/de/select2.js
@@ -43,4 +43,4 @@ export default function () {
             return 'Entferne alle Gegenstände';
         }
     };
-};
+}
diff --git a/packages/check-in-place-select/src/i18n/en/select2.js b/packages/check-in-place-select/src/i18n/en/select2.js
index 12ba14cc..d172d72e 100644
--- a/packages/check-in-place-select/src/i18n/en/select2.js
+++ b/packages/check-in-place-select/src/i18n/en/select2.js
@@ -47,4 +47,4 @@ export default function () {
             return 'Remove all items';
         }
     };
-};
+}
diff --git a/packages/common/styles.js b/packages/common/styles.js
index 31248cd3..3c9748c9 100644
--- a/packages/common/styles.js
+++ b/packages/common/styles.js
@@ -1,4 +1,4 @@
-import {css, unsafeCSS, CSSResult} from 'lit-element';
+import {css, unsafeCSS} from 'lit-element';
 import {getIconSVGURL} from './src/icon.js';
 
 /**
diff --git a/packages/common/utils.js b/packages/common/utils.js
index fb31adb9..88cd1c53 100644
--- a/packages/common/utils.js
+++ b/packages/common/utils.js
@@ -212,7 +212,7 @@ export const getAssetURL = (pkg, path) => {
         // assume it is a full path
         fullPath = pkg;
     } else {
-        fullPath = 'local/' + pkg + '/' + path
+        fullPath = 'local/' + pkg + '/' + path;
     }
     return new URL(fullPath, new URL('..', import.meta.url).href).href;
 };
@@ -298,21 +298,21 @@ export async function getMimeTypeOfFile(file) {
     const getMimeType = (signature) => {
         switch (signature) {
             case '89504E47':
-                return 'image/png'
+                return 'image/png';
             case '47494638':
-                return 'image/gif'
+                return 'image/gif';
             case '25504446':
-                return 'application/pdf'
+                return 'application/pdf';
             case 'FFD8FFDB':
             case 'FFD8FFE0':
             case 'FFD8FFE1':
-                return 'image/jpeg'
+                return 'image/jpeg';
             case '504B0304':
-                return 'application/zip'
+                return 'application/zip';
             default:
-                return 'Unknown filetype'
+                return 'Unknown filetype';
         }
-    }
+    };
 
     return await new Promise((resolve) => {
         let fileReader = new FileReader();
@@ -323,15 +323,15 @@ export async function getMimeTypeOfFile(file) {
                 let bytes = [];
 
                 uint.forEach((byte) => {
-                    bytes.push(byte.toString(16))
-                })
+                    bytes.push(byte.toString(16));
+                });
 
                 const hex = bytes.join('').toUpperCase();
                 const mimeType = getMimeType(hex);
 
                 resolve(mimeType);
             }
-        }
+        };
 
         fileReader.readAsArrayBuffer(file.slice(0, 4));
     });
diff --git a/packages/data-table-view/.eslintignore b/packages/data-table-view/.eslintignore
new file mode 100644
index 00000000..c139ed4c
--- /dev/null
+++ b/packages/data-table-view/.eslintignore
@@ -0,0 +1,4 @@
+/vendor/**
+/dist/**
+*.conf.js
+*.config.js
\ No newline at end of file
diff --git a/packages/data-table-view/.eslintrc.json b/packages/data-table-view/.eslintrc.json
new file mode 100644
index 00000000..dcb3daa3
--- /dev/null
+++ b/packages/data-table-view/.eslintrc.json
@@ -0,0 +1,25 @@
+{
+    "env": {
+        "browser": true,
+        "es6": true,
+        "mocha": true
+    },
+    "globals": {
+        "Atomics": "readonly",
+        "SharedArrayBuffer": "readonly"
+    },
+    "parser": "babel-eslint",
+    "parserOptions": {
+        "ecmaVersion": 2018,
+        "sourceType": "module"
+    },
+    "rules": {
+        "no-unused-vars": ["error", { "args": "none" }],
+        "semi": [2, "always"],
+        "jsdoc/require-jsdoc": 0,
+        "jsdoc/require-param-description": 0,
+        "jsdoc/require-returns": 0,
+        "jsdoc/require-returns-description": 0,
+        "jsdoc/require-param-type": 0
+    }
+}
\ No newline at end of file
diff --git a/packages/data-table-view/package.json b/packages/data-table-view/package.json
index ae907ff5..40d518d6 100644
--- a/packages/data-table-view/package.json
+++ b/packages/data-table-view/package.json
@@ -30,7 +30,9 @@
     "rollup-plugin-copy": "^3.1.0",
     "rollup-plugin-delete": "^2.0.0",
     "rollup-plugin-serve": "^1.0.1",
-    "rollup-plugin-terser": "^7.0.2"
+    "rollup-plugin-terser": "^7.0.2",
+    "eslint": "^7.3.1",
+    "eslint-plugin-jsdoc": "^30.6.4"
   },
   "dependencies": {
     "@dbp-toolkit/auth": "^0.1.0",
@@ -59,6 +61,7 @@
     "watch": "npm run watch-local",
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
-    "test": "npm run build-test && karma start --singleRun"
+    "test": "npm run build-test && karma start --singleRun",
+    "lint": "eslint ."
   }
 }
diff --git a/packages/data-table-view/src/data-table-view.js b/packages/data-table-view/src/data-table-view.js
index 565c38b8..834a211e 100644
--- a/packages/data-table-view/src/data-table-view.js
+++ b/packages/data-table-view/src/data-table-view.js
@@ -227,12 +227,12 @@ export class DataTableView extends LitElement {
 
         changedProperties.forEach((oldValue, propName) => {
             if (propName === "lang") {
-                i18n.changeLanguage(this.lang).catch(e => { console.log(e)});
+                i18n.changeLanguage(this.lang).catch(e => { console.log(e);});
                 languageChange = true;
             }
         });
 
-        this.updateComplete.then(this.set_datatable(this.data, languageChange)).catch(e => { console.log(e)});
+        this.updateComplete.then(this.set_datatable(this.data, languageChange)).catch(e => { console.log(e);});
         super.update(changedProperties);
     }
 
diff --git a/packages/language-select/.eslintignore b/packages/language-select/.eslintignore
new file mode 100644
index 00000000..7b596da7
--- /dev/null
+++ b/packages/language-select/.eslintignore
@@ -0,0 +1,3 @@
+/vendor/**
+/dist/**
+/*.js
\ No newline at end of file
diff --git a/packages/language-select/.eslintrc.json b/packages/language-select/.eslintrc.json
new file mode 100644
index 00000000..1ccd30a3
--- /dev/null
+++ b/packages/language-select/.eslintrc.json
@@ -0,0 +1,25 @@
+{
+    "env": {
+        "browser": true,
+        "es6": true,
+        "mocha": true
+    },
+    "extends": ["eslint:recommended", "plugin:jsdoc/recommended"],
+    "globals": {
+        "Atomics": "readonly",
+        "SharedArrayBuffer": "readonly"
+    },
+    "parser": "babel-eslint",
+    "parserOptions": {
+        "ecmaVersion": 2018,
+        "sourceType": "module"
+    },
+    "rules": {
+        "no-unused-vars": ["error", { "args": "none" }],
+        "semi": [2, "always"],
+        "jsdoc/require-jsdoc": 0,
+        "jsdoc/require-param-description": 0,
+        "jsdoc/require-returns": 0,
+        "jsdoc/require-param-type": 0
+    }
+}
\ No newline at end of file
diff --git a/packages/language-select/package.json b/packages/language-select/package.json
index 157c4bed..19509f3c 100644
--- a/packages/language-select/package.json
+++ b/packages/language-select/package.json
@@ -29,7 +29,9 @@
     "rollup-plugin-copy": "^3.1.0",
     "rollup-plugin-delete": "^2.0.0",
     "rollup-plugin-serve": "^1.0.1",
-    "rollup-plugin-terser": "^7.0.2"
+    "rollup-plugin-terser": "^7.0.2",
+    "eslint": "^7.3.1",
+    "eslint-plugin-jsdoc": "^30.6.4"
   },
   "dependencies": {
     "@dbp-toolkit/common": "^0.1.0",
@@ -48,6 +50,7 @@
     "watch": "npm run watch-local",
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
-    "test": "npm run build-test && karma start --singleRun"
+    "test": "npm run build-test && karma start --singleRun",
+    "lint": "eslint ."
   }
 }
diff --git a/packages/language-select/src/language-select.js b/packages/language-select/src/language-select.js
index f337483f..661e6031 100644
--- a/packages/language-select/src/language-select.js
+++ b/packages/language-select/src/language-select.js
@@ -106,7 +106,7 @@ export class LanguageSelect extends LitElement {
     }
 
     onExternalChange(e) {
-        this.lang = e.detail.lang
+        this.lang = e.detail.lang;
     }
 
     connectedCallback() {
diff --git a/packages/matomo/.eslintignore b/packages/matomo/.eslintignore
new file mode 100644
index 00000000..7b596da7
--- /dev/null
+++ b/packages/matomo/.eslintignore
@@ -0,0 +1,3 @@
+/vendor/**
+/dist/**
+/*.js
\ No newline at end of file
diff --git a/packages/matomo/.eslintrc.json b/packages/matomo/.eslintrc.json
new file mode 100644
index 00000000..1ccd30a3
--- /dev/null
+++ b/packages/matomo/.eslintrc.json
@@ -0,0 +1,25 @@
+{
+    "env": {
+        "browser": true,
+        "es6": true,
+        "mocha": true
+    },
+    "extends": ["eslint:recommended", "plugin:jsdoc/recommended"],
+    "globals": {
+        "Atomics": "readonly",
+        "SharedArrayBuffer": "readonly"
+    },
+    "parser": "babel-eslint",
+    "parserOptions": {
+        "ecmaVersion": 2018,
+        "sourceType": "module"
+    },
+    "rules": {
+        "no-unused-vars": ["error", { "args": "none" }],
+        "semi": [2, "always"],
+        "jsdoc/require-jsdoc": 0,
+        "jsdoc/require-param-description": 0,
+        "jsdoc/require-returns": 0,
+        "jsdoc/require-param-type": 0
+    }
+}
\ No newline at end of file
diff --git a/packages/matomo/package.json b/packages/matomo/package.json
index ced97981..a95d83e9 100644
--- a/packages/matomo/package.json
+++ b/packages/matomo/package.json
@@ -30,7 +30,9 @@
     "rollup-plugin-copy": "^3.1.0",
     "rollup-plugin-delete": "^2.0.0",
     "rollup-plugin-serve": "^1.0.1",
-    "rollup-plugin-terser": "^7.0.2"
+    "rollup-plugin-terser": "^7.0.2",
+    "eslint": "^7.3.1",
+    "eslint-plugin-jsdoc": "^30.6.4"
   },
   "dependencies": {
     "@dbp-toolkit/auth": "^0.1.0",
@@ -49,6 +51,7 @@
     "watch": "rollup -c --watch",
     "watch-local": "yarn run watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
-    "test": "rollup -c --environment BUILD:test && karma start --singleRun"
+    "test": "rollup -c --environment BUILD:test && karma start --singleRun",
+    "lint": "eslint ."
   }
 }
diff --git a/packages/matomo/src/matomo.js b/packages/matomo/src/matomo.js
index 68fc5290..8e189c72 100644
--- a/packages/matomo/src/matomo.js
+++ b/packages/matomo/src/matomo.js
@@ -1,9 +1,11 @@
-import {i18n} from './i18n.js';
-import {LitElement} from "lit-element";
 import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element';
 import {EventBus} from '@dbp-toolkit/common';
 import buildInfo from 'consts:buildinfo';
 
+function pushEvent(event) {
+    window._paq = window._paq || [];
+    window._paq.push(event);
+}
 
 export class MatomoElement extends DBPLitElement {
 
@@ -53,16 +55,15 @@ export class MatomoElement extends DBPLitElement {
             }
             console.log('add matomo...');
 
-            window._paq = window._paq || [];
-            _paq.push(['setCustomVariable', 1, "GitCommit", buildInfo.info, "visit"]);
-            _paq.push(['enableHeartBeatTimer']);
-            _paq.push(['disableCookies']);
-            _paq.push(['trackPageView']);
-            _paq.push(['enableLinkTracking']);
+            pushEvent(['setCustomVariable', 1, "GitCommit", buildInfo.info, "visit"]);
+            pushEvent(['enableHeartBeatTimer']);
+            pushEvent(['disableCookies']);
+            pushEvent(['trackPageView']);
+            pushEvent(['enableLinkTracking']);
 
             (function (endpoint, siteId) {
-                _paq.push(['setTrackerUrl', endpoint+'matomo.php']);
-                _paq.push(['setSiteId', siteId]);
+                pushEvent(['setTrackerUrl', endpoint+'matomo.php']);
+                pushEvent(['setSiteId', siteId]);
 
                 var g = document.createElement('script');
                 var s = document.getElementsByTagName('script')[0];
@@ -75,31 +76,31 @@ export class MatomoElement extends DBPLitElement {
 
             // track changed locations
             window.addEventListener('locationchanged', function(e) {
-                _paq.push(['setReferrerUrl', e.detail.referrerUrl]);
-                _paq.push(['setCustomUrl', location.href]);
-                // _paq.push(['setDocumentTitle', '']);
-                _paq.push(['trackPageView']);
+                pushEvent(['setReferrerUrl', e.detail.referrerUrl]);
+                pushEvent(['setCustomUrl', location.href]);
+                // pushEvent(['setDocumentTitle', '']);
+                pushEvent(['trackPageView']);
 
                 // make Matomo aware of newly added content
                 var content = document.getElementById('content');
-                _paq.push(['MediaAnalytics::scanForMedia', content]);
-                _paq.push(['FormAnalytics::scanForForms', content]);
-                _paq.push(['trackContentImpressionsWithinNode', content]);
+                pushEvent(['MediaAnalytics::scanForMedia', content]);
+                pushEvent(['FormAnalytics::scanForForms', content]);
+                pushEvent(['trackContentImpressionsWithinNode', content]);
             });
 
             // track errors
             window.addEventListener('error', function(e) {
-                _paq.push(['trackEvent', 'Error', e.error.message + '\n' + e.error.stack]);
+                pushEvent(['trackEvent', 'Error', e.error.message + '\n' + e.error.stack]);
             });
 
             window.addEventListener('unhandledrejection', function(e) {
-                _paq.push(['trackEvent', 'UnhandledRejection', e.reason]);
+                pushEvent(['trackEvent', 'UnhandledRejection', e.reason]);
             });
 
             this.isRunning = true;
             if (this.lastEvent.length > 0) {
                 console.log('MatomoElement* (' + this.isRunning + '): ' + this.lastEvent[1] + ', ' + this.lastEvent[2]);
-                _paq.push(this.lastEvent);
+                pushEvent(this.lastEvent);
                 this.lastEvent = [];
             }
             return;
@@ -115,7 +116,7 @@ export class MatomoElement extends DBPLitElement {
         console.log('MatomoElement  (' + this.isRunning + '): ' + action + ', ' + message);
         const event = ['trackEvent', action, message];
         if (this.isRunning) {
-            _paq.push(event);
+            pushEvent(event);
         } else {
             this.lastEvent = event;
         }
-- 
GitLab