From 7556b994db65bf933d6c13e695cc8573412d3b9e Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Thu, 26 Jan 2023 01:44:47 +0100
Subject: [PATCH] feat: add rome and do linting

---
 .../source/constraints/abstractoperator.mjs   |  2 +-
 application/source/constraints/oroperator.mjs |  3 +-
 application/source/data/buildmap.mjs          |  3 +-
 application/source/data/datasource.mjs        |  2 +-
 application/source/data/datasource/server.mjs |  4 +-
 .../source/data/datasource/server/restapi.mjs | 10 +--
 application/source/data/extend.mjs            | 18 ++++--
 application/source/data/pathfinder.mjs        |  8 +--
 application/source/data/transformer.mjs       | 14 ++--
 application/source/dom/attributes.mjs         |  8 +--
 application/source/dom/constants.mjs          | 30 ++++-----
 application/source/dom/customelement.mjs      | 23 +++----
 application/source/dom/resource.mjs           |  2 +-
 application/source/dom/resourcemanager.mjs    |  4 +-
 application/source/dom/template.mjs           |  6 +-
 application/source/dom/updater.mjs            | 34 +++++-----
 application/source/i18n/formatter.mjs         |  4 +-
 application/source/i18n/locale.mjs            | 38 ++++++-----
 application/source/i18n/translations.mjs      |  2 +-
 application/source/logging/logger.mjs         | 54 ++++++++++++----
 application/source/text/formatter.mjs         |  1 -
 application/source/types/dataurl.mjs          |  6 +-
 application/source/types/global.mjs           |  4 +-
 application/source/types/mediatype.mjs        |  4 +-
 application/source/types/node.mjs             |  4 +-
 application/source/types/nodelist.mjs         |  1 -
 application/source/types/observerlist.mjs     |  9 ++-
 application/source/types/proxyobserver.mjs    |  3 +-
 application/source/types/uuid.mjs             |  4 +-
 application/source/types/validate.mjs         |  4 +-
 application/source/types/version.mjs          |  2 +-
 application/source/util/clone.mjs             |  6 +-
 application/source/util/processing.mjs        |  8 ++-
 application/source/util/trimspaces.mjs        |  4 +-
 development/package.json                      |  1 +
 development/pnpm-lock.yaml                    | 64 +++++++++++++++++++
 development/rome.json                         | 12 ++++
 37 files changed, 267 insertions(+), 139 deletions(-)
 create mode 100644 development/rome.json

diff --git a/application/source/constraints/abstractoperator.mjs b/application/source/constraints/abstractoperator.mjs
index 87527a969..cb6bcd817 100644
--- a/application/source/constraints/abstractoperator.mjs
+++ b/application/source/constraints/abstractoperator.mjs
@@ -34,7 +34,7 @@ class AbstractOperator extends AbstractConstraint {
     constructor(operantA, operantB) {
         super();
 
-        if (!(operantA instanceof AbstractConstraint) || !(operantB instanceof AbstractConstraint)) {
+        if (!((operantA instanceof AbstractConstraint) && (operantB instanceof AbstractConstraint))) {
             throw new TypeError("parameters must be from type AbstractConstraint")
         }
 
diff --git a/application/source/constraints/oroperator.mjs b/application/source/constraints/oroperator.mjs
index 25e86c447..d09ffa6eb 100644
--- a/application/source/constraints/oroperator.mjs
+++ b/application/source/constraints/oroperator.mjs
@@ -35,7 +35,8 @@ class OrOperator extends AbstractOperator {
         var self = this;
 
         return new Promise(function (resolve, reject) {
-            let a, b;
+            let a;
+            let b;
 
             self.operantA.isValid(value)
                 .then(function () {
diff --git a/application/source/data/buildmap.mjs b/application/source/data/buildmap.mjs
index 08f10a4f9..94fd01c2f 100644
--- a/application/source/data/buildmap.mjs
+++ b/application/source/data/buildmap.mjs
@@ -111,7 +111,8 @@ function buildFlatMap(subject, selector, key, parentMap) {
     if (key === undefined) key = [];
 
     let parts = selector.split(DELIMITER);
-    let current = "", currentPath = [];
+    let current = "";
+    let currentPath = [];
     do {
 
         current = parts.shift();
diff --git a/application/source/data/datasource.mjs b/application/source/data/datasource.mjs
index 3c8f43b0a..89b743265 100644
--- a/application/source/data/datasource.mjs
+++ b/application/source/data/datasource.mjs
@@ -232,7 +232,7 @@ function parseOptionsJSON(data) {
             validateObject(obj);
             return obj;
         } catch (e) {
-            throw new Error('the options does not contain a valid json definition (actual: ' + data + ').');
+            throw new Error(`the options does not contain a valid json definition (actual: ${data}).`);
         }
     }
 
diff --git a/application/source/data/datasource/server.mjs b/application/source/data/datasource/server.mjs
index b3cf3ea84..53378fc94 100644
--- a/application/source/data/datasource/server.mjs
+++ b/application/source/data/datasource/server.mjs
@@ -88,10 +88,10 @@ class Server extends Datasource {
  */
 function doTransform(type, obj) {
     const self = this;
-    let transformation = self.getOption(type + '.mapping.transformer');
+    let transformation = self.getOption(`${type}.mapping.transformer`);
     if (transformation !== undefined) {
         const pipe = new Pipe(transformation);
-        const callbacks = self.getOption(type + '.mapping.callbacks')
+        const callbacks = self.getOption(`${type}.mapping.callbacks`)
 
         if (isObject(callbacks)) {
             for (const key in callbacks) {
diff --git a/application/source/data/datasource/server/restapi.mjs b/application/source/data/datasource/server/restapi.mjs
index 191a29f14..2264dde58 100644
--- a/application/source/data/datasource/server/restapi.mjs
+++ b/application/source/data/datasource/server/restapi.mjs
@@ -168,13 +168,13 @@ function fetchData(init, key, callback) {
     let response;
 
 
-    return fetch(self.getOption(key + '.url'), init).then(resp => {
+    return fetch(self.getOption(`${key}.url`), init).then(resp => {
         response = resp;
 
-        const acceptedStatus = self.getOption(key + '.acceptedStatus', [200]);
+        const acceptedStatus = self.getOption(`${key}.acceptedStatus`, [200]);
 
         if (acceptedStatus.indexOf(resp.status) === -1) {
-            throw Error('the data cannot be ' + key + ' (response ' + resp.status + ')')
+            throw Error(`the data cannot be ${key} (response ${resp.status})`)
         }
 
         return resp.text()
@@ -188,10 +188,10 @@ function fetchData(init, key, callback) {
         } catch (e) {
 
             if (body.length > 100) {
-                body = body.substring(0, 97) + '...';
+                body = `${body.substring(0, 97)}...`;
             }
 
-            throw new Error('the response does not contain a valid json (actual: ' + body + ').');
+            throw new Error(`the response does not contain a valid json (actual: ${body}).`);
         }
 
         if (callback && isFunction(callback)) {
diff --git a/application/source/data/extend.mjs b/application/source/data/extend.mjs
index 4824f1bef..873b0e452 100644
--- a/application/source/data/extend.mjs
+++ b/application/source/data/extend.mjs
@@ -23,15 +23,21 @@ export {extend}
  * @memberOf Monster.Data
  * @throws {Error} unsupported argument
  * @throws {Error} type mismatch
+ * @throws {Error} unsupported argument
  */
-function extend() {
-    let o, i;
+function extend(...args) {
+    let o;
+    let i;
+
+    if (typeof args !== 'object' || args[0] === null) {
+        throw new Error(`unsupported argument ${JSON.stringify(args[0])}`);
+    }
 
-    for (i = 0; i < arguments.length; i++) {
-        let a = arguments[i];
+    for (i = 0; i < args.length; i++) {
+        let a = args[i];
 
         if (!(isObject(a) || isArray(a))) {
-            throw new Error('unsupported argument ' + JSON.stringify(a));
+            throw new Error(`unsupported argument ${JSON.stringify(a)}`);
         }
 
         if (o === undefined) {
@@ -57,7 +63,7 @@ function extend() {
                     }
                 } else {
                     if (typeOf(o[k]) !== typeOf(v)) {
-                        throw new Error("type mismatch: " + JSON.stringify(o[k]) + "(" + typeOf(o[k]) + ") != " + JSON.stringify(v) + "(" + typeOf(v) + ")");
+                        throw new Error(`type mismatch: ${JSON.stringify(o[k])}(${typeOf(o[k])}) != ${JSON.stringify(v)}(${typeOf(v)})`);
                     }
                 }
 
diff --git a/application/source/data/pathfinder.mjs b/application/source/data/pathfinder.mjs
index ef16b67d4..28a067d43 100644
--- a/application/source/data/pathfinder.mjs
+++ b/application/source/data/pathfinder.mjs
@@ -255,7 +255,7 @@ function getValueViaPath(subject, path, check) {
         }
 
         if (parts.length > 0) {
-            throw Error("the journey is not at its end (" + parts.join(DELIMITER) + ")");
+            throw Error(`the journey is not at its end (${parts.join(DELIMITER)})`);
         }
 
 
@@ -272,7 +272,7 @@ function getValueViaPath(subject, path, check) {
 
     }
 
-    throw TypeError("unsupported type " + typeof subject)
+    throw TypeError(`unsupported type ${typeof subject}`)
 
 }
 
@@ -331,8 +331,8 @@ function setValueViaPath(object, path, value) {
 
     let anchor = getValueViaPath.call(this, object, subpath);
 
-    if (!isObject(object) && !isArray(object)) {
-        throw TypeError("unsupported type: " + typeof object);
+    if (!(isObject(object) || isArray(object))) {
+        throw TypeError(`unsupported type: ${typeof object}`);
     }
 
     if (anchor instanceof Map || anchor instanceof WeakMap) {
diff --git a/application/source/data/transformer.mjs b/application/source/data/transformer.mjs
index 363b67ef4..0ff171ac2 100644
--- a/application/source/data/transformer.mjs
+++ b/application/source/data/transformer.mjs
@@ -190,7 +190,7 @@ function disassemble(command) {
         let c = g?.['char'];
 
         if (p && c) {
-            let r = '__' + new ID().toString() + '__';
+            let r = `__${new ID().toString()}__`;
             placeholder.set(r, c);
             command = command.replace(p, r);
         }
@@ -243,7 +243,8 @@ function transform(value) {
     const console = getGlobalObject('console');
 
     let args = clone(this.args);
-    let key, defaultValue;
+    let key;
+    let defaultValue;
 
     switch (this.command) {
 
@@ -263,7 +264,7 @@ function transform(value) {
             return value.toUpperCase();
 
         case 'tostring':
-            return "" + value;
+            return `${value}`;
 
         case 'tointeger':
             let n = parseInt(value);
@@ -367,7 +368,7 @@ function transform(value) {
                 return value.length;
             }
 
-            throw new TypeError("unsupported type " + typeof value);
+            throw new TypeError(`unsupported type ${typeof value}`);
 
         case 'to-base64':
         case 'btoa':
@@ -532,7 +533,7 @@ function transform(value) {
                     defaultValue = defaultValue.toLowerCase()
                     return ((defaultValue !== 'undefined' && defaultValue !== '' && defaultValue !== 'off' && defaultValue !== 'false' && defaultValue !== 'false') || defaultValue === 'on' || defaultValue === 'true' || defaultValue === 'true');
                 case 'string':
-                    return "" + defaultValue;
+                    return `${defaultValue}`;
                 case "object":
                     return JSON.parse(atob(defaultValue));
             }
@@ -541,9 +542,8 @@ function transform(value) {
 
 
         default:
-            throw new Error("unknown command " + this.command)
+            throw new Error(`unknown command ${this.command}`)
     }
 
-    return value;
 }
 
diff --git a/application/source/dom/attributes.mjs b/application/source/dom/attributes.mjs
index caf541560..ac553ac17 100644
--- a/application/source/dom/attributes.mjs
+++ b/application/source/dom/attributes.mjs
@@ -145,7 +145,7 @@ function getLinkedObjects(element, symbol) {
     validateSymbol(symbol)
 
     if (element?.[symbol] === undefined) {
-        throw new Error('there is no object link for ' + symbol.toString());
+        throw new Error(`there is no object link for ${symbol.toString()}`);
     }
 
     return element?.[symbol][Symbol.iterator]();
@@ -360,8 +360,8 @@ function findClosestByAttribute(element, key, value) {
     }
 
     let selector = validateString(key);
-    if (value !== undefined) selector += "=" + validateString(value);
-    let result = element.closest('[' + selector + ']');
+    if (value !== undefined) selector += `=${validateString(value)}`;
+    let result = element.closest(`[${selector}]`);
     if (result instanceof HTMLElement) {
         return result;
     }
@@ -406,7 +406,7 @@ function findClosestByClass(element, className) {
         return element;
     }
 
-    let result = element.closest('.' + className);
+    let result = element.closest(`.${className}`);
     if (result instanceof HTMLElement) {
         return result;
     }
diff --git a/application/source/dom/constants.mjs b/application/source/dom/constants.mjs
index e5827c543..ff5557be7 100644
--- a/application/source/dom/constants.mjs
+++ b/application/source/dom/constants.mjs
@@ -86,7 +86,7 @@ const ATTRIBUTE_PREFIX = 'data-monster-';
  * @since 1.8.0
  * @type {string}
  */
-const ATTRIBUTE_OPTIONS = ATTRIBUTE_PREFIX + 'options';
+const ATTRIBUTE_OPTIONS = `${ATTRIBUTE_PREFIX}options`;
 
 /**
  * This is the name of the attribute to pass options to a control
@@ -96,7 +96,7 @@ const ATTRIBUTE_OPTIONS = ATTRIBUTE_PREFIX + 'options';
  * @since 1.30.0
  * @type {string}
  */
-const ATTRIBUTE_OPTIONS_SELECTOR = ATTRIBUTE_PREFIX + 'options-selector';
+const ATTRIBUTE_OPTIONS_SELECTOR = `${ATTRIBUTE_PREFIX}options-selector`;
 
 /**
  * @memberOf Monster.DOM
@@ -104,13 +104,13 @@ const ATTRIBUTE_OPTIONS_SELECTOR = ATTRIBUTE_PREFIX + 'options-selector';
  * @license AGPLv3
  * @since 1.8.0
  */
-const ATTRIBUTE_THEME_PREFIX = ATTRIBUTE_PREFIX + 'theme-';
+const ATTRIBUTE_THEME_PREFIX = `${ATTRIBUTE_PREFIX}theme-`;
 
 /**
  * @memberOf Monster.DOM
  * @type {string}
  */
-const ATTRIBUTE_THEME_NAME = ATTRIBUTE_THEME_PREFIX + 'name';
+const ATTRIBUTE_THEME_NAME = `${ATTRIBUTE_THEME_PREFIX}name`;
 
 /**
  * @memberOf Monster.DOM
@@ -118,7 +118,7 @@ const ATTRIBUTE_THEME_NAME = ATTRIBUTE_THEME_PREFIX + 'name';
  * @license AGPLv3
  * @since 1.8.0
  */
-const ATTRIBUTE_UPDATER_ATTRIBUTES = ATTRIBUTE_PREFIX + 'attributes';
+const ATTRIBUTE_UPDATER_ATTRIBUTES = `${ATTRIBUTE_PREFIX}attributes`;
 
 /**
  * @memberOf Monster.DOM
@@ -126,7 +126,7 @@ const ATTRIBUTE_UPDATER_ATTRIBUTES = ATTRIBUTE_PREFIX + 'attributes';
  * @license AGPLv3
  * @since 1.27.1
  */
-const ATTRIBUTE_UPDATER_SELECT_THIS = ATTRIBUTE_PREFIX + 'select-this';
+const ATTRIBUTE_UPDATER_SELECT_THIS = `${ATTRIBUTE_PREFIX}select-this`;
 
 /**
  * @memberOf Monster.DOM
@@ -134,7 +134,7 @@ const ATTRIBUTE_UPDATER_SELECT_THIS = ATTRIBUTE_PREFIX + 'select-this';
  * @license AGPLv3
  * @since 1.8.0
  */
-const ATTRIBUTE_UPDATER_REPLACE = ATTRIBUTE_PREFIX + 'replace';
+const ATTRIBUTE_UPDATER_REPLACE = `${ATTRIBUTE_PREFIX}replace`;
 
 /**
  * @memberOf Monster.DOM
@@ -142,7 +142,7 @@ const ATTRIBUTE_UPDATER_REPLACE = ATTRIBUTE_PREFIX + 'replace';
  * @license AGPLv3
  * @since 1.8.0
  */
-const ATTRIBUTE_UPDATER_INSERT = ATTRIBUTE_PREFIX + 'insert';
+const ATTRIBUTE_UPDATER_INSERT = `${ATTRIBUTE_PREFIX}insert`;
 
 /**
  * @memberOf Monster.DOM
@@ -150,7 +150,7 @@ const ATTRIBUTE_UPDATER_INSERT = ATTRIBUTE_PREFIX + 'insert';
  * @license AGPLv3
  * @since 1.8.0
  */
-const ATTRIBUTE_UPDATER_INSERT_REFERENCE = ATTRIBUTE_PREFIX + 'insert-reference';
+const ATTRIBUTE_UPDATER_INSERT_REFERENCE = `${ATTRIBUTE_PREFIX}insert-reference`;
 
 /**
  * @memberOf Monster.DOM
@@ -158,7 +158,7 @@ const ATTRIBUTE_UPDATER_INSERT_REFERENCE = ATTRIBUTE_PREFIX + 'insert-reference'
  * @license AGPLv3
  * @since 1.8.0
  */
-const ATTRIBUTE_UPDATER_REMOVE = ATTRIBUTE_PREFIX + 'remove';
+const ATTRIBUTE_UPDATER_REMOVE = `${ATTRIBUTE_PREFIX}remove`;
 
 /**
  * @memberOf Monster.DOM
@@ -166,7 +166,7 @@ const ATTRIBUTE_UPDATER_REMOVE = ATTRIBUTE_PREFIX + 'remove';
  * @license AGPLv3
  * @since 1.9.0
  */
-const ATTRIBUTE_UPDATER_BIND = ATTRIBUTE_PREFIX + 'bind';
+const ATTRIBUTE_UPDATER_BIND = `${ATTRIBUTE_PREFIX}bind`;
 
 /**
  * @memberOf Monster.DOM
@@ -174,7 +174,7 @@ const ATTRIBUTE_UPDATER_BIND = ATTRIBUTE_PREFIX + 'bind';
  * @license AGPLv3
  * @since 1.27.0
  */
-const ATTRIBUTE_TEMPLATE_PREFIX = ATTRIBUTE_PREFIX + 'template-prefix';
+const ATTRIBUTE_TEMPLATE_PREFIX = `${ATTRIBUTE_PREFIX}template-prefix`;
 
 /**
  * @memberOf Monster.DOM
@@ -182,7 +182,7 @@ const ATTRIBUTE_TEMPLATE_PREFIX = ATTRIBUTE_PREFIX + 'template-prefix';
  * @license AGPLv3
  * @since 1.14.0
  */
-const ATTRIBUTE_ROLE = ATTRIBUTE_PREFIX + 'role';
+const ATTRIBUTE_ROLE = `${ATTRIBUTE_PREFIX}role`;
 
 /**
  * @memberOf Monster.DOM
@@ -206,7 +206,7 @@ const ATTRIBUTE_VALUE = 'value';
  * @license AGPLv3
  * @since 1.9.0
  */
-const ATTRIBUTE_OBJECTLINK = ATTRIBUTE_PREFIX + 'objectlink';
+const ATTRIBUTE_OBJECTLINK = `${ATTRIBUTE_PREFIX}objectlink`;
 
 /**
  * @memberOf Monster.DOM
@@ -214,7 +214,7 @@ const ATTRIBUTE_OBJECTLINK = ATTRIBUTE_PREFIX + 'objectlink';
  * @license AGPLv3
  * @since 1.24.0
  */
-const ATTRIBUTE_ERRORMESSAGE = ATTRIBUTE_PREFIX + 'error';
+const ATTRIBUTE_ERRORMESSAGE = `${ATTRIBUTE_PREFIX}error`;
 
 /**
  * @memberOf Monster.DOM
diff --git a/application/source/dom/customelement.mjs b/application/source/dom/customelement.mjs
index 54cbd001d..ffdffdfe0 100644
--- a/application/source/dom/customelement.mjs
+++ b/application/source/dom/customelement.mjs
@@ -422,7 +422,8 @@ class CustomElement extends HTMLElement {
     [assembleMethodSymbol]() {
 
         const self = this;
-        let elements, nodeList;
+        let elements;
+        let nodeList;
 
         const AttributeOptions = getOptionsFromAttributes.call(self);
         if (isObject(AttributeOptions) && Object.keys(AttributeOptions).length > 0) {
@@ -574,7 +575,7 @@ function getSlottedElements(query, name) {
         if (name === null) {
             selector += ':not([name])';
         } else {
-            selector += '[name=' + validateString(name) + ']';
+            selector += `[name=${validateString(name)}]`;
         }
 
     }
@@ -737,7 +738,7 @@ function getOptionsFromScriptTag() {
 
     const node = document.querySelector(self.getAttribute(ATTRIBUTE_OPTIONS_SELECTOR));
     if (!(node instanceof HTMLScriptElement)) {
-        addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, 'the selector ' + ATTRIBUTE_OPTIONS_SELECTOR + ' for options was specified (' + self.getAttribute(ATTRIBUTE_OPTIONS_SELECTOR) + ') but not found.');
+        addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, `the selector ${ATTRIBUTE_OPTIONS_SELECTOR} for options was specified (${self.getAttribute(ATTRIBUTE_OPTIONS_SELECTOR)}) but not found.`);
         return {};
     }
 
@@ -746,7 +747,7 @@ function getOptionsFromScriptTag() {
     try {
         obj = parseOptionsJSON.call(this, node.textContent.trim())
     } catch (e) {
-        addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, 'when analyzing the configuration from the script tag there was an error. ' + e);
+        addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, `when analyzing the configuration from the script tag there was an error. ${e}`);
     }
 
     return obj;
@@ -764,7 +765,7 @@ function getOptionsFromAttributes() {
         try {
             return parseOptionsJSON.call(self, this.getAttribute(ATTRIBUTE_OPTIONS))
         } catch (e) {
-            addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, 'the options attribute ' + ATTRIBUTE_OPTIONS + ' does not contain a valid json definition (actual: ' + this.getAttribute(ATTRIBUTE_OPTIONS) + ').' + e);
+            addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, `the options attribute ${ATTRIBUTE_OPTIONS} does not contain a valid json definition (actual: ${this.getAttribute(ATTRIBUTE_OPTIONS)}).${e}`);
         }
     }
 
@@ -777,8 +778,8 @@ function getOptionsFromAttributes() {
  * @return {Object}
  */
 function parseOptionsJSON(data) {
-
-    const self = this, obj = {};
+    
+    let obj = {};
 
     if (!isString(data)) {
         return obj;
@@ -793,14 +794,13 @@ function parseOptionsJSON(data) {
     }
 
     try {
-        let obj = JSON.parse(data);
-        return validateObject(obj);
+        obj = JSON.parse(data);
     } catch (e) {
         throw e;
     }
 
 
-    return obj;
+    return validateObject(obj);
 }
 
 /**
@@ -899,7 +899,8 @@ function initCSSStylesheet() {
  */
 function initShadowRoot() {
 
-    let template, html;
+    let template;
+    let html;
 
     try {
         template = findDocumentTemplate(this.constructor.getTag());
diff --git a/application/source/dom/resource.mjs b/application/source/dom/resource.mjs
index 5e7827ad2..de77c8318 100644
--- a/application/source/dom/resource.mjs
+++ b/application/source/dom/resource.mjs
@@ -235,7 +235,7 @@ function addEvents() {
 
         self[internalStateSymbol].setSubject({
             loaded: true,
-            error: self[referenceSymbol][self.constructor.getURLAttribute()] + ' is not available',
+            error: `${self[referenceSymbol][self.constructor.getURLAttribute()]} is not available`,
         })
 
         return;
diff --git a/application/source/dom/resourcemanager.mjs b/application/source/dom/resourcemanager.mjs
index c588d4aca..cb05a63c5 100644
--- a/application/source/dom/resourcemanager.mjs
+++ b/application/source/dom/resourcemanager.mjs
@@ -141,7 +141,7 @@ function runResourceMethod(method) {
     const result = [];
 
     for (const type of ['scripts', 'stylesheets', 'data']) {
-        const resources = self.getOption('resources.' + type);
+        const resources = self.getOption(`resources.${type}`);
         if (!isArray(resources)) {
             continue;
         }
@@ -188,7 +188,7 @@ function addResource(type, url, options) {
             resource = new Data(extend({}, options, {[ATTRIBUTE_SRC]: url}))
             break;
         default:
-            throw new Error('unsupported type ' + type)
+            throw new Error(`unsupported type ${type}`)
     }
 
     (self.getOption('resources')?.[type]).push(resource);
diff --git a/application/source/dom/template.mjs b/application/source/dom/template.mjs
index 31365101d..a5c482755 100644
--- a/application/source/dom/template.mjs
+++ b/application/source/dom/template.mjs
@@ -165,7 +165,7 @@ export function findDocumentTemplate(id, currentNode) {
     let theme = getDocumentTheme()
 
     if (prefixID) {
-        let themedPrefixID = prefixID + '-' + id + '-' + theme.getName();
+        let themedPrefixID = `${prefixID}-${id}-${theme.getName()}`;
 
         // current + themedPrefixID
         template = currentNode.getElementById(themedPrefixID);
@@ -180,7 +180,7 @@ export function findDocumentTemplate(id, currentNode) {
         }
     }
 
-    let themedID = id + '-' + theme.getName();
+    let themedID = `${id}-${theme.getName()}`;
 
     // current + themedID
     template = currentNode.getElementById(themedID);
@@ -206,6 +206,6 @@ export function findDocumentTemplate(id, currentNode) {
         return new Template(template);
     }
 
-    throw new Error("template " + id + " not found.")
+    throw new Error(`template ${id} not found.`)
 }
 
diff --git a/application/source/dom/updater.mjs b/application/source/dom/updater.mjs
index 6e068ae99..364c8eea5 100644
--- a/application/source/dom/updater.mjs
+++ b/application/source/dom/updater.mjs
@@ -237,7 +237,7 @@ function getCheckStateCallback() {
         // this is a reference to the current object (therefore no array function here)
         if (this instanceof HTMLInputElement) {
             if (['radio', 'checkbox'].indexOf(this.type) !== -1) {
-                return (this.value + "" === current + "") ? 'true' : undefined
+                return (`${this.value}` === `${current}`) ? 'true' : undefined
             }
         } else if (this instanceof HTMLOptionElement) {
 
@@ -372,11 +372,11 @@ function retrieveAndSetValue(element) {
 function retrieveFromBindings() {
     const self = this;
 
-    if (self[internalSymbol].element.matches('[' + ATTRIBUTE_UPDATER_BIND + ']')) {
+    if (self[internalSymbol].element.matches(`[${ATTRIBUTE_UPDATER_BIND}]`)) {
         retrieveAndSetValue.call(self, self[internalSymbol].element)
     }
 
-    for (const [, element] of self[internalSymbol].element.querySelectorAll('[' + ATTRIBUTE_UPDATER_BIND + ']').entries()) {
+    for (const [, element] of self[internalSymbol].element.querySelectorAll(`[${ATTRIBUTE_UPDATER_BIND}]`).entries()) {
         retrieveAndSetValue.call(self, element)
     }
 
@@ -392,7 +392,7 @@ function retrieveFromBindings() {
 function removeElement(change) {
     const self = this;
 
-    for (const [, element] of self[internalSymbol].element.querySelectorAll(':scope [' + ATTRIBUTE_UPDATER_REMOVE + ']').entries()) {
+    for (const [, element] of self[internalSymbol].element.querySelectorAll(`:scope [${ATTRIBUTE_UPDATER_REMOVE}]`).entries()) {
         element.parentNode.removeChild(element);
     }
 }
@@ -430,7 +430,7 @@ function insertElement(change) {
             const current = p.join('.');
 
             let iterator = new Set;
-            const query = '[' + ATTRIBUTE_UPDATER_INSERT + '*="path:' + current + '"]';
+            const query = `[${ATTRIBUTE_UPDATER_INSERT}*="path:${current}"]`;
 
             const e = container.querySelectorAll(query);
 
@@ -455,7 +455,7 @@ function insertElement(change) {
                 let def = trimSpaces(attributes);
                 let i = def.indexOf(' ');
                 let key = trimSpaces(def.substr(0, i));
-                let refPrefix = key + '-';
+                let refPrefix = `${key}-`;
                 let cmd = trimSpaces(def.substr(i));
 
                 // this case is actually excluded by the query but is nevertheless checked again here
@@ -491,10 +491,10 @@ function insertElement(change) {
 
                 for (const [i, obj] of Object.entries(value)) {
                     let ref = refPrefix + i;
-                    let currentPath = dataPath + "." + i;
+                    let currentPath = `${dataPath}.${i}`;
 
                     available.add(ref);
-                    let refElement = containerElement.querySelector('[' + ATTRIBUTE_UPDATER_INSERT_REFERENCE + '="' + ref + '"]');
+                    let refElement = containerElement.querySelector(`[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}="${ref}"]`);
 
                     if (refElement instanceof HTMLElement) {
                         insertPoint = refElement;
@@ -504,13 +504,13 @@ function insertElement(change) {
                     appendNewDocumentFragment(containerElement, key, ref, currentPath);
                 }
 
-                let nodes = containerElement.querySelectorAll('[' + ATTRIBUTE_UPDATER_INSERT_REFERENCE + '*="' + refPrefix + '"]');
+                let nodes = containerElement.querySelectorAll(`[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}*="${refPrefix}"]`);
                 for (const [, node] of Object.entries(nodes)) {
                     if (!available.has(node.getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE))) {
                         try {
                             containerElement.removeChild(node);
                         } catch (e) {
-                            containerElement.setAttribute(ATTRIBUTE_ERRORMESSAGE, (containerElement.getAttribute(ATTRIBUTE_ERRORMESSAGE) + ", " + e.message).trim());
+                            containerElement.setAttribute(ATTRIBUTE_ERRORMESSAGE, (`${containerElement.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${e.message}`).trim());
                         }
 
                     }
@@ -570,12 +570,12 @@ function applyRecursive(node, key, path) {
 
         if (node.hasAttribute(ATTRIBUTE_UPDATER_REPLACE)) {
             let value = node.getAttribute(ATTRIBUTE_UPDATER_REPLACE);
-            node.setAttribute(ATTRIBUTE_UPDATER_REPLACE, value.replaceAll("path:" + key, "path:" + path));
+            node.setAttribute(ATTRIBUTE_UPDATER_REPLACE, value.replaceAll(`path:${key}`, `path:${path}`));
         }
 
         if (node.hasAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES)) {
             let value = node.getAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES);
-            node.setAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES, value.replaceAll("path:" + key, "path:" + path));
+            node.setAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES, value.replaceAll(`path:${key}`, `path:${path}`));
         }
 
         for (const [, child] of Object.entries(node.childNodes)) {
@@ -630,8 +630,8 @@ function runUpdateContent(container, parts, subject) {
         parts.pop();
 
         // Unfortunately, static data is always changed as well, since it is not possible to react to changes here.
-        const query = '[' + ATTRIBUTE_UPDATER_REPLACE + '^="path:' + current + '"], [' + ATTRIBUTE_UPDATER_REPLACE + '^="static:"]';
-        const e = container.querySelectorAll('' + query);
+        const query = `[${ATTRIBUTE_UPDATER_REPLACE}^="path:${current}"], [${ATTRIBUTE_UPDATER_REPLACE}^="static:"]`;
+        const e = container.querySelectorAll(`${query}`);
 
         const iterator = new Set([
             ...e
@@ -673,7 +673,7 @@ function runUpdateContent(container, parts, subject) {
                 try {
                     element.appendChild(value);
                 } catch (e) {
-                    element.setAttribute(ATTRIBUTE_ERRORMESSAGE, (element.getAttribute(ATTRIBUTE_ERRORMESSAGE) + ", " + e.message).trim());
+                    element.setAttribute(ATTRIBUTE_ERRORMESSAGE, (`${element.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${e.message}`).trim());
                 }
 
             } else {
@@ -724,7 +724,7 @@ function runUpdateAttributes(container, parts, subject) {
 
         let iterator = new Set;
 
-        const query = '[' + ATTRIBUTE_UPDATER_SELECT_THIS + '], [' + ATTRIBUTE_UPDATER_ATTRIBUTES + '*="path:' + current + '"], [' + ATTRIBUTE_UPDATER_ATTRIBUTES + '^="static:"]';
+        const query = `[${ATTRIBUTE_UPDATER_SELECT_THIS}], [${ATTRIBUTE_UPDATER_ATTRIBUTES}*="path:${current}"], [${ATTRIBUTE_UPDATER_ATTRIBUTES}^="static:"]`;
 
         const e = container.querySelectorAll(query);
 
@@ -903,7 +903,7 @@ function addObjectWithUpdaterToElement (elements,symbol, object) {
         ])
     } else if (elements instanceof Set) {
     } else {
-        throw new TypeError('elements is not a valid type. (actual: ' + typeof elements + ')');
+        throw new TypeError(`elements is not a valid type. (actual: ${typeof elements})`);
     }
 
     let result = [];
diff --git a/application/source/i18n/formatter.mjs b/application/source/i18n/formatter.mjs
index 22f1c4f58..281a40806 100644
--- a/application/source/i18n/formatter.mjs
+++ b/application/source/i18n/formatter.mjs
@@ -97,9 +97,9 @@ class Formatter extends TextFormatter {
         const parameter = parts.join('::').trim();
 
 
-        let assembledText = openMarker + 'static:' + translationKey + ' | call:i18n';
+        let assembledText = `${openMarker}static:${translationKey} | call:i18n`;
         if (parameter.length > 0) {
-            assembledText += '::' + parameter;
+            assembledText += `::${parameter}`;
         }
         assembledText += closeMarker;
         return super.format(assembledText);
diff --git a/application/source/i18n/locale.mjs b/application/source/i18n/locale.mjs
index 7079981e1..f93009465 100644
--- a/application/source/i18n/locale.mjs
+++ b/application/source/i18n/locale.mjs
@@ -156,7 +156,7 @@ class Locale extends Base {
      * @return {string}
      */
     toString() {
-        return "" + this.localeString;
+        return `${this.localeString}`;
     }
 
     /**
@@ -266,21 +266,27 @@ function parseLocale(locale) {
 
     locale = validateString(locale).replace(/_/g, "-");
 
-    let language, region, variants, parts, script, extlang,
-        regexRegular = "(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)",
-        regexIrregular = "(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)",
-        regexGrandfathered = "(" + regexIrregular + "|" + regexRegular + ")",
-        regexPrivateUse = "(x(-[A-Za-z0-9]{1,8})+)",
-        regexSingleton = "[0-9A-WY-Za-wy-z]",
-        regexExtension = "(" + regexSingleton + "(-[A-Za-z0-9]{2,8})+)",
-        regexVariant = "([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})",
-        regexRegion = "([A-Za-z]{2}|[0-9]{3})",
-        regexScript = "([A-Za-z]{4})",
-        regexExtlang = "([A-Za-z]{3}(-[A-Za-z]{3}){0,2})",
-        regexLanguage = "(([A-Za-z]{2,3}(-" + regexExtlang + ")?)|[A-Za-z]{4}|[A-Za-z]{5,8})",
-        regexLangtag = "(" + regexLanguage + "(-" + regexScript + ")?" + "(-" + regexRegion + ")?" + "(-" + regexVariant + ")*" + "(-" + regexExtension + ")*" + "(-" + regexPrivateUse + ")?" + ")",
-        regexLanguageTag = "^(" + regexGrandfathered + "|" + regexLangtag + "|" + regexPrivateUse + ")$",
-        regex = new RegExp(regexLanguageTag), match;
+    let language;
+    let region;
+    let variants;
+    let parts;
+    let script;
+    let extlang;
+    let regexRegular = "(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)";
+    let regexIrregular = "(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)";
+    let regexGrandfathered = `(${regexIrregular}|${regexRegular})`;
+    let regexPrivateUse = "(x(-[A-Za-z0-9]{1,8})+)";
+    let regexSingleton = "[0-9A-WY-Za-wy-z]";
+    let regexExtension = `(${regexSingleton}(-[A-Za-z0-9]{2,8})+)`;
+    let regexVariant = "([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})";
+    let regexRegion = "([A-Za-z]{2}|[0-9]{3})";
+    let regexScript = "([A-Za-z]{4})";
+    let regexExtlang = "([A-Za-z]{3}(-[A-Za-z]{3}){0,2})";
+    let regexLanguage = `(([A-Za-z]{2,3}(-${regexExtlang})?)|[A-Za-z]{4}|[A-Za-z]{5,8})`;
+    let regexLangtag = `(${regexLanguage}(-${regexScript})?(-${regexRegion})?(-${regexVariant})*(-${regexExtension})*(-${regexPrivateUse})?)`;
+    let regexLanguageTag = `^(${regexGrandfathered}|${regexLangtag}|${regexPrivateUse})$`;
+    let regex = new RegExp(regexLanguageTag);
+    let match;
 
 
     if ((match = regex.exec(locale)) !== null) {
diff --git a/application/source/i18n/translations.mjs b/application/source/i18n/translations.mjs
index 6f8c15b33..be020dd56 100644
--- a/application/source/i18n/translations.mjs
+++ b/application/source/i18n/translations.mjs
@@ -53,7 +53,7 @@ class Translations extends Base {
     getText(key, defaultText) {
         if (!this.storage.has(key)) {
             if (defaultText === undefined) {
-                throw new Error('key ' + key + ' not found');
+                throw new Error(`key ${key} not found`);
             }
 
             return validateString(defaultText);
diff --git a/application/source/logging/logger.mjs b/application/source/logging/logger.mjs
index d45b108f7..c4e3a6af0 100644
--- a/application/source/logging/logger.mjs
+++ b/application/source/logging/logger.mjs
@@ -121,8 +121,13 @@ class Logger extends Base {
      * @returns {Logger}
      * @since 1.5.0
      */
-    logTrace() {
-        triggerLog.apply(this, [TRACE, ...arguments]);
+    logTrace(...args) {
+
+        if (typeof args !== 'object' || args[0] === null) {
+            throw new Error('the first argument must be an object')
+        }        
+        
+        triggerLog.apply(this, [TRACE, ...args]);
         return this;
     };
 
@@ -135,8 +140,13 @@ class Logger extends Base {
      * @returns {Logger}
      * @since 1.5.0
      */
-    logDebug() {
-        triggerLog.apply(this, [DEBUG, ...arguments]);
+    logDebug(...args) {
+
+        if (typeof args !== 'object' || args[0] === null) {
+            throw new Error('the first argument must be an object')
+        }        
+        
+        triggerLog.apply(this, [DEBUG, ...args]);
         return this;
     };
 
@@ -150,8 +160,13 @@ class Logger extends Base {
      * @returns {Logger}
      * @since 1.5.0
      */
-    logInfo() {
-        triggerLog.apply(this, [INFO, ...arguments]);
+    logInfo(...args) {
+
+        if (typeof args !== 'object' || args[0] === null) {
+            throw new Error('the first argument must be an object')
+        }        
+        
+        triggerLog.apply(this, [INFO, ...args]);
         return this;
     };
 
@@ -164,8 +179,13 @@ class Logger extends Base {
      * @returns {Logger}
      * @since 1.5.0
      */
-    logWarn() {
-        triggerLog.apply(this, [WARN, ...arguments]);
+    logWarn(...args) {
+
+        if (typeof args !== 'object' || args[0] === null) {
+            throw new Error('the first argument must be an object')
+        }        
+        
+        triggerLog.apply(this, [WARN, ...args]);
         return this;
     };
 
@@ -178,8 +198,13 @@ class Logger extends Base {
      * @returns {Logger}
      * @since 1.5.0
      */
-    logError() {
-        triggerLog.apply(this, [ERROR, ...arguments]);
+    logError(...args) {
+
+        if (typeof args !== 'object' || args[0] === null) {
+            throw new Error('the first argument must be an object')
+        }        
+        
+        triggerLog.apply(this, [ERROR, ...args]);
         return this;
     };
 
@@ -192,8 +217,13 @@ class Logger extends Base {
      * @returns {Logger}
      * @since 1.5.0
      */
-    logFatal() {
-        triggerLog.apply(this, [FATAL, ...arguments]);
+    logFatal(...args) {
+
+        if (typeof args !== 'object' || args[0] === null) {
+            throw new Error('the first argument must be an object')
+        }
+
+        triggerLog.apply(this, [FATAL, ...args]);
         return this;
     };
 
diff --git a/application/source/text/formatter.mjs b/application/source/text/formatter.mjs
index 119987d40..72ca51782 100644
--- a/application/source/text/formatter.mjs
+++ b/application/source/text/formatter.mjs
@@ -304,7 +304,6 @@ function tokenize(text, openMarker, closeMarker) {
 
         if (endIndex === -1) {
             throw new Error("syntax error in formatter template")
-            return;
         }
 
         let key = text.substring(openMarker.length, endIndex);
diff --git a/application/source/types/dataurl.mjs b/application/source/types/dataurl.mjs
index 89d1e33f1..b67536a0d 100644
--- a/application/source/types/dataurl.mjs
+++ b/application/source/types/dataurl.mjs
@@ -81,12 +81,12 @@ class DataUrl extends Base {
         let content = this[internal].content;
 
         if (this[internal].base64 === true) {
-            content = ';base64,' + content;
+            content = `;base64,${content}`;
         } else {
-            content = ',' + encodeURIComponent(content);
+            content = `,${encodeURIComponent(content)}`;
         }
 
-        return 'data:' + this[internal].mediatype.toString() + content;
+        return `data:${this[internal].mediatype.toString()}${content}`;
     }
 
 }
diff --git a/application/source/types/global.mjs b/application/source/types/global.mjs
index f15db1abb..3ebddaa35 100644
--- a/application/source/types/global.mjs
+++ b/application/source/types/global.mjs
@@ -112,7 +112,7 @@ function getGlobal() {
 function getGlobalObject(name) {
     validateString(name);
     let o = globalReference?.[name];
-    if (typeof o === 'undefined') throw new Error('the object ' + name + ' is not defined');
+    if (typeof o === 'undefined') throw new Error(`the object ${name} is not defined`);
     validateObject(o);
     return o;
 }
@@ -150,7 +150,7 @@ function getGlobalObject(name) {
 function getGlobalFunction(name) {
     validateString(name);
     let f = globalReference?.[name];
-    if (typeof f === 'undefined') throw new Error('the function ' + name + ' is not defined');
+    if (typeof f === 'undefined') throw new Error(`the function ${name} is not defined`);
     validateFunction(f);
     return f;
 }
diff --git a/application/source/types/mediatype.mjs b/application/source/types/mediatype.mjs
index 5d0c8da52..e188eba44 100644
--- a/application/source/types/mediatype.mjs
+++ b/application/source/types/mediatype.mjs
@@ -121,10 +121,10 @@ class MediaType extends Base {
 
         let parameter = [];
         for (let a of this[internal].parameter) {
-            parameter.push(a.key + '=' + a.value);
+            parameter.push(`${a.key}=${a.value}`);
         }
 
-        return this[internal].type + '/' + this[internal].subtype + (parameter.length > 0 ? ';' + parameter.join(';') : '');
+        return `${this[internal].type}/${this[internal].subtype}${(parameter.length > 0 ? `;${parameter.join(';')}` : '')}`;
     }
 
 }
diff --git a/application/source/types/node.mjs b/application/source/types/node.mjs
index 52a3c75d9..ac2ab5fd1 100644
--- a/application/source/types/node.mjs
+++ b/application/source/types/node.mjs
@@ -168,8 +168,8 @@ class Node extends Base {
             return parts.join("\n");
         }
 
-        let count = this.childNodes.length,
-            counter = 0;
+        let count = this.childNodes.length;
+        let counter = 0;
 
         for (const node of this.childNodes) {
             counter++;
diff --git a/application/source/types/nodelist.mjs b/application/source/types/nodelist.mjs
index 24e0aba55..1c432b4ba 100644
--- a/application/source/types/nodelist.mjs
+++ b/application/source/types/nodelist.mjs
@@ -79,7 +79,6 @@ class NodeList extends Set {
      */
     has(node) {
         return super.has(validateInstance(node, Node));
-        return false;
     }
 
     /**
diff --git a/application/source/types/observerlist.mjs b/application/source/types/observerlist.mjs
index 249baa7a8..10e1797fd 100644
--- a/application/source/types/observerlist.mjs
+++ b/application/source/types/observerlist.mjs
@@ -54,7 +54,8 @@ class ObserverList extends Base {
     detach(observer) {
         validateInstance(observer, Observer)
 
-        var i = 0, l = this.observers.length;
+        var i = 0;
+        var l = this.observers.length;
         for (; i < l; i++) {
             if (this.observers[i] === observer) {
                 this.observers.splice(i, 1);
@@ -72,7 +73,8 @@ class ObserverList extends Base {
      */
     contains(observer) {
         validateInstance(observer, Observer)
-        var i = 0, l = this.observers.length;
+        var i = 0;
+        var l = this.observers.length;
         for (; i < l; i++) {
             if (this.observers[i] === observer) {
                 return true;
@@ -90,7 +92,8 @@ class ObserverList extends Base {
 
         let pomises = []
 
-        let i = 0, l = this.observers.length;
+        let i = 0;
+        let l = this.observers.length;
         for (; i < l; i++) {
             pomises.push(this.observers[i].update(subject));
         }
diff --git a/application/source/types/proxyobserver.mjs b/application/source/types/proxyobserver.mjs
index dfb997c12..9cb536054 100644
--- a/application/source/types/proxyobserver.mjs
+++ b/application/source/types/proxyobserver.mjs
@@ -78,7 +78,8 @@ export {ProxyObserver}
      */
     setSubject(obj) {
 
-        let i, k = Object.keys(this.subject);
+        let i;
+        let k = Object.keys(this.subject);
         for (i = 0; i < k.length; i++) {
             delete this.subject[k[i]];
         }
diff --git a/application/source/types/uuid.mjs b/application/source/types/uuid.mjs
index 52b9ef288..96ad59b04 100644
--- a/application/source/types/uuid.mjs
+++ b/application/source/types/uuid.mjs
@@ -64,8 +64,8 @@ export {UUID}
  */
 function createWithRandom() {
     return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
-        var r = random(0, 65000) * 16 | 0,
-            v = ((c === 'x') ? r : (r & 0x3 | 0x8));
+        const r = random(0, 65000) * 16 | 0;
+        const v = ((c === 'x') ? r : (r & 0x3 | 0x8));
         return v.toString(16)[0];
     })
 }
diff --git a/application/source/types/validate.mjs b/application/source/types/validate.mjs
index 2803df9a6..4abf40192 100644
--- a/application/source/types/validate.mjs
+++ b/application/source/types/validate.mjs
@@ -199,10 +199,10 @@ function validateInstance(value, instance) {
         }
 
         if (n) {
-            n = " " + n;
+            n = ` ${n}`;
         }
 
-        throw new TypeError('value is not an instance of' + n)
+        throw new TypeError(`value is not an instance of${n}`)
     }
     return value
 }
diff --git a/application/source/types/version.mjs b/application/source/types/version.mjs
index 715905f57..6c8f68660 100644
--- a/application/source/types/version.mjs
+++ b/application/source/types/version.mjs
@@ -89,7 +89,7 @@ class Version extends Base {
      * @returns {string}
      */
     toString() {
-        return this.major + '.' + this.minor + '.' + this.patch;
+        return `${this.major}.${this.minor}.${this.patch}`;
     }
 
     /**
diff --git a/application/source/util/clone.mjs b/application/source/util/clone.mjs
index f8284703b..584ec09a6 100644
--- a/application/source/util/clone.mjs
+++ b/application/source/util/clone.mjs
@@ -105,11 +105,11 @@ function cloneObject(obj) {
     
     validateObject(obj);
     
-    const constructor = obj?.['constructor'];
+    const fkt = obj?.['constructor'];
 
     /** Object has clone method */
-    if(typeOf(constructor)==='function') {
-        const prototype = constructor?.prototype;
+    if(typeOf(fkt)==='function') {
+        const prototype = fkt?.prototype;
         if(typeof prototype==='object') {
             if(prototype.hasOwnProperty('getClone')&& typeOf(obj.getClone) === 'function') {
                 return obj.getClone();        
diff --git a/application/source/util/processing.mjs b/application/source/util/processing.mjs
index 8d33a0fa8..36a1eb275 100644
--- a/application/source/util/processing.mjs
+++ b/application/source/util/processing.mjs
@@ -98,7 +98,7 @@ class Processing extends Base {
      * @param {function} callback Callback
      * @throw {TypeError} the arguments must be either integer or functions
      */
-    constructor() {
+    constructor(...args) {
         super();
 
         this[internalSymbol] = {
@@ -107,7 +107,11 @@ class Processing extends Base {
 
         let time = 0
 
-        for (const [, arg] of Object.entries(arguments)) {
+        if (typeof args !== 'object' || args[0] === null) {
+            throw new TypeError('the arguments must be either integer or functions')
+        }        
+
+        for (const [, arg] of Object.entries(args)) {
             if (isInteger(arg) && arg >= 0) {
                 time = arg;
             } else if (isFunction(arg)) {
diff --git a/application/source/util/trimspaces.mjs b/application/source/util/trimspaces.mjs
index 8ae763235..d10d44acd 100644
--- a/application/source/util/trimspaces.mjs
+++ b/application/source/util/trimspaces.mjs
@@ -60,7 +60,7 @@ export {trimSpaces}
         let c = g?.['char'];
 
         if (p && c) {
-            let r = '__' + new ID().toString() + '__';
+            let r = `__${new ID().toString()}__`;
             placeholder.set(r, c);
             value = value.replace(p, r);
         }
@@ -69,7 +69,7 @@ export {trimSpaces}
 
     value = value.trim();
     placeholder.forEach((v, k) => {
-        value = value.replace(k, '\\' + v)
+        value = value.replace(k, `\\${v}`)
     })
 
     return value;
diff --git a/development/package.json b/development/package.json
index 044b52565..0afe0db91 100644
--- a/development/package.json
+++ b/development/package.json
@@ -39,6 +39,7 @@
     "jsdom-global": "^3.0.2",
     "mocha": "^10.2.0",
     "node-plantuml": "^0.9.0",
+    "rome": "^11.0.0",
     "sinon": "^15.0.1",
     "url": "^0.11.0",
     "url-exist": "3.0.1",
diff --git a/development/pnpm-lock.yaml b/development/pnpm-lock.yaml
index 1be6447f8..0c600c5c4 100644
--- a/development/pnpm-lock.yaml
+++ b/development/pnpm-lock.yaml
@@ -20,6 +20,7 @@ specifiers:
   jsdom-global: ^3.0.2
   mocha: ^10.2.0
   node-plantuml: ^0.9.0
+  rome: ^11.0.0
   sinon: ^15.0.1
   url: ^0.11.0
   url-exist: 3.0.1
@@ -46,6 +47,7 @@ devDependencies:
   jsdom-global: 3.0.2_jsdom@21.1.0
   mocha: 10.2.0
   node-plantuml: 0.9.0
+  rome: 11.0.0
   sinon: 15.0.1
   url: 0.11.0
   url-exist: 3.0.1
@@ -557,6 +559,54 @@ packages:
       webcrypto-core: 1.7.5
     dev: true
 
+  /@rometools/cli-darwin-arm64/11.0.0:
+    resolution: {integrity: sha512-F3vkdY+s3FLIEnAjSbyHTuIPB88cLpccimW4ecid5I7S6GzGG3iUJI4xT00JhH73K4P/qW20/9r+kH1T9Du8Xg==}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rometools/cli-darwin-x64/11.0.0:
+    resolution: {integrity: sha512-X6jhtS6Iml4GOzgNtnLwIp/KXXhSdqeVyfv69m/AHnIzx3gQAjPZ7BPnJLvTCbhe4SKHL+uTZYFSCJpkUUKE6w==}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rometools/cli-linux-arm64/11.0.0:
+    resolution: {integrity: sha512-dktTJJlTpmycBZ2TwhJBcAO8ztK8DdevdyZnFFxdYRvtmJgTjIsC2UFayf/SbKew8B8q1IhI0it+D6ihAeIpeg==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rometools/cli-linux-x64/11.0.0:
+    resolution: {integrity: sha512-WVcnXPNdWGUWo0p4NU8YzuthjYR7q+b4vRcjdxtP1DlpphZmSsoC/RSE85nEqRAz8hChcKUansVzOPM8BSsuGA==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rometools/cli-win32-arm64/11.0.0:
+    resolution: {integrity: sha512-tPj6RThQzS7Q45jqQll7NlTYvNcsg/BEP3LYiiazqSh9FAFnMkrV6ewUcMPKWyAfiyLs7jlz4rRvdNRUSygzfQ==}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rometools/cli-win32-x64/11.0.0:
+    resolution: {integrity: sha512-bmBai8WHxYjsGk1+je7ZTfCUCWq30WJI3pQM8pzTA674lfGTZ9ymJoZwTaIMSO4rL5V9mlO6uLunsBKso9VqOg==}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@sinonjs/commons/2.0.0:
     resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==}
     dependencies:
@@ -2379,6 +2429,20 @@ packages:
       glob: 7.2.3
     dev: true
 
+  /rome/11.0.0:
+    resolution: {integrity: sha512-rRo6JOwpMLc3OkeTDRXkrmrDqnxDvZ75GS4f0jLDBNmRgDXWbu0F8eVnJoRn+VbK2AE7vWvhVOMBjnWowcopkQ==}
+    engines: {node: '>=14.*'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@rometools/cli-darwin-arm64': 11.0.0
+      '@rometools/cli-darwin-x64': 11.0.0
+      '@rometools/cli-linux-arm64': 11.0.0
+      '@rometools/cli-linux-x64': 11.0.0
+      '@rometools/cli-win32-arm64': 11.0.0
+      '@rometools/cli-win32-x64': 11.0.0
+    dev: true
+
   /safe-buffer/5.1.2:
     resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
     dev: true
diff --git a/development/rome.json b/development/rome.json
new file mode 100644
index 000000000..5f1dba025
--- /dev/null
+++ b/development/rome.json
@@ -0,0 +1,12 @@
+{
+  "$schema": "./node_modules/rome/configuration_schema.json",
+  "linter": {
+    "enabled": true,
+    "rules": {
+      "recommended": true,
+      "performance": {
+        "noDelete": "off"
+      }
+    }
+  }
+}
\ No newline at end of file
-- 
GitLab