Repository: exadel-inc/esl
Pull request #1085 (2022-07-04 17:11:43)

chore: tests speed-up
The small Jest config improvements speed up running tests two times.

Before:
![sshot_2022-07-04-19-21-50](https://user-images.githubusercontent.com/564184/177196766-f24de2b2-5f97-44c2-978c-789c398b9693.png)
After:
![sshot_2022-07-04-19-22-11](https://user-images.githubusercontent.com/564184/177196779-87db5a11-e465-4cda-abf8-1bfaed8d1dc7.png)
 


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6ddc1120e..2eb1912bf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,23 +1,3 @@
-# [4.0.0-beta.9](https://github.com/exadel-inc/esl/compare/v4.0.0-beta.8...v4.0.0-beta.9) (2022-06-29)
-
-
-### Bug Fixes
-
-* **esl-image:** fix esl-image to prevent DOM XSS vulnerabilities ([4fd925d](https://github.com/exadel-inc/esl/commit/4fd925df8605994b0f7d345d77a425e0cdc487e8))
-* **esl-trigger:** custom aria-label maintaining in case a11yLabelActive and a11yLabelInactive are empty ([06d8f92](https://github.com/exadel-inc/esl/commit/06d8f924080849efe90c979151c6c342d4ca8ffc))
-* **esl-utils:** add ability to skip event listener through the target field ([75f6a18](https://github.com/exadel-inc/esl/commit/75f6a186ffcbd98e852627f479284edcb893583f))
-
-
-### Features
-
-* **esl-image:** prototype defined events ([f49ce01](https://github.com/exadel-inc/esl/commit/f49ce019d81cb76995c05d2dccc6621e8836af66))
-* **esl-media-query:** normalize data instead of fail ([3226156](https://github.com/exadel-inc/esl/commit/3226156264e58f085f023b0669179cc48f904c55))
-* **esl-media:** prototype defined events ([976a8b9](https://github.com/exadel-inc/esl/commit/976a8b9c54d4e0b40dcf9e5ee48024b1539e94f7))
-* **esl-select:** add `dropdown-class` param to specify dropdown additional CSS class(es) ([938357f](https://github.com/exadel-inc/esl/commit/938357fa6fb5db804f445f31eb4f73641dfbcccf))
-* **esl-utils:** `[@attr](https://github.com/attr)` extended with ability to pass Serializer/Parser ([012eb83](https://github.com/exadel-inc/esl/commit/012eb83ebcbba8315a2766af090239774c21234e))
-* **esl-utils:** create dom html sanitize method ([004642f](https://github.com/exadel-inc/esl/commit/004642f866ac1b2ed5278084963288d8c2fd17e0))
-* **gh-pages:** add blogs landing component ([fa71fe0](https://github.com/exadel-inc/esl/commit/fa71fe040ae4954ea55946b927751e33c9eb02ce))
-
 # [4.0.0-beta.8](https://github.com/exadel-inc/esl/compare/v4.0.0-beta.7...v4.0.0-beta.8) (2022-06-16)
 
 
diff --git a/README.md b/README.md
index dd37cef6f..a25590e56 100644
--- a/README.md
+++ b/README.md
@@ -168,42 +168,36 @@ you can find useful information about the project processes and agreements here:
 People who architect, maintain, and keep the idea of the ESL
 
 <table><tbody><tr>
-<td align="center" valign="top" width="16.6%">
+<td align="center" valign="top" width="20%">
     <a href="https://github.com/ala-n">
         <img src="https://github.com/ala-n.png?s=75" width="75" height="75" style="min-width: 75px"><br/>
         Alexey Stsefanovich
     </a>
 </td>
-<td align="center" valign="top" width="16.6%">
+<td align="center" valign="top" width="20%">
     <a href="https://github.com/julia-murashko">
         <img src="https://github.com/julia-murashko.png?s=75" width="75" height="75" style="min-width: 75px"><br/>
         Julia Murashko
     </a>
 </td>
-<td align="center" valign="top" width="16.6%">
+<td align="center" valign="top" width="20%">
     <a href="https://github.com/yadamskaya">
         <img src="https://github.com/yadamskaya.png?s=75" width="75" height="75" style="min-width: 75px"><br/>
         Yuliya Adamskaya
     </a>
 </td>
-<td align="center" valign="top" width="16.6%">
+<td align="center" valign="top" width="20%">
     <a href="https://github.com/dshovchko">
         <img src="https://github.com/dshovchko.png?s=75" width="75" height="75" style="min-width: 75px"><br/>
         Dmytro Shovchko
     </a>
 </td>
-<td align="center" valign="top" width="16.6%">
+<td align="center" valign="top" width="20%">
     <a href="https://github.com/abarmina">
         <img src="https://github.com/abarmina.png?s=75" width="75" height="75" style="min-width: 75px"><br/>
         Anna Barmina
     </a>
 </td>
-<td align="center" valign="top" width="16.6%">
-    <a href="https://github.com/NastaLeo">
-        <img src="https://github.com/NastaLeo.png?s=75" width="75" height="75" style="min-width: 75px"><br/>
-        Anastasiya Lesun
-    </a>
-</td>
 </tr></tbody></table>
 
 **ESL Contributors**: 
@@ -218,6 +212,13 @@ People who are actively contributing to the ESL
     </a><br/>
     Developer
 </td>
+<td align="center" valign="top" width="20%">
+    <a href="https://github.com/NastaLeo">
+        <img src="https://github.com/NastaLeo.png?s=75" width="75" height="75" style="min-width: 75px"><br/>
+        Anastasiya Lesun
+    </a><br/>
+    Developer
+</td>
 <td align="center" valign="top" width="20%">
     <a href="https://github.com/fshovchko">
         <img src="https://github.com/fshovchko.png?s=75" width="75" height="75" style="min-width: 75px"><br/>
@@ -239,13 +240,6 @@ People who are actively contributing to the ESL
     </a><br/>
     Developer
 </td>
-<td align="center" valign="top" width="20%">
-    <a href="https://github.com/Natalie-Smirnova">
-        <img src="https://github.com/Natalie-Smirnova.png?s=75" width="75" height="75" style="min-width: 75px"><br/>
-        Natalie Smirnova
-    </a><br/>
-    Developer
-</td>
 </tr><tr>
 <td align="center" valign="top" width="20%">
     <a href="https://www.linkedin.com/in/iryna-pavlenko-270930107">
diff --git a/eslint/coderules.eslintrc.yml b/eslint/coderules.eslintrc.yml
index bbe29e4ba..0333ffbf2 100644
--- a/eslint/coderules.eslintrc.yml
+++ b/eslint/coderules.eslintrc.yml
@@ -264,8 +264,3 @@ overrides:
       '@typescript-eslint/no-namespace': off
       # Temporary of as false positive
       '@typescript-eslint/no-unnecessary-type-arguments': off
-
-  - files:
-    - '**/polyfills/**/*.ts'
-    rules:
-      'no-new-wrappers': off
diff --git a/jest.config.js b/jest.config.js
index 5ffe5b3e4..54b02bc8b 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -1,7 +1,7 @@
 module.exports = {
   testEnvironment: 'jsdom',
   preset: 'ts-jest',
-  roots: ['src/modules', 'src/polyfills'],
+  roots: ['src/modules'],
   testRegex: '/test/(.+)\\.test\\.ts$',
   moduleFileExtensions: ['ts', 'js', 'json'],
   coverageDirectory: '.report',
@@ -10,6 +10,11 @@ module.exports = {
     './src/modules/esl-utils/test/deviceDetector.mock.ts',
     './src/modules/esl-utils/test/matchMedia.mock.ts'
   ],
+  globals: {
+    'ts-jest': {
+      isolatedModules: true
+    }
+  },
   collectCoverageFrom: [
     'src/modules/**/*.ts',
     // test dir
diff --git a/package-lock.json b/package-lock.json
index 32f4caa5f..6f8561f38 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,22 +1,22 @@
 {
   "name": "@exadel/esl",
-  "version": "4.0.0-beta.9",
+  "version": "4.0.0-beta.8",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "@exadel/esl",
-      "version": "4.0.0-beta.9",
+      "version": "4.0.0-beta.8",
       "license": "MIT",
       "dependencies": {
         "@types/resize-observer-browser": "0.1.7",
-        "@types/video.js": "7.3.42",
+        "@types/video.js": "7.3.41",
         "@types/youtube": "0.0.46"
       },
       "devDependencies": {
         "@11ty/eleventy": "^1.0.1",
-        "@commitlint/cli": "^17.0.3",
-        "@commitlint/config-conventional": "^17.0.3",
+        "@commitlint/cli": "^17.0.2",
+        "@commitlint/config-conventional": "^17.0.2",
         "@juggle/resize-observer": "^3.3.1",
         "@semantic-release/changelog": "^6.0.1",
         "@semantic-release/commit-analyzer": "^9.0.2",
@@ -26,8 +26,8 @@
         "@semantic-release/release-notes-generator": "^10.0.3",
         "@types/jest": "^28.1.3",
         "@types/smoothscroll-polyfill": "^0.3.1",
-        "@typescript-eslint/eslint-plugin": "^5.30.0",
-        "@typescript-eslint/parser": "^5.30.0",
+        "@typescript-eslint/eslint-plugin": "^5.29.0",
+        "@typescript-eslint/parser": "^5.29.0",
         "@webcomponents/custom-elements": "1.5.0",
         "browser-sync": "^2.27.10",
         "chokidar-cli": "^3.0.0",
@@ -46,7 +46,7 @@
         "jest": "^28.1.1",
         "jest-environment-jsdom": "^28.1.1",
         "js-yaml": "^4.1.0",
-        "kleur": "^4.1.5",
+        "kleur": "^4.1.4",
         "less": "^4.1.3",
         "lintspaces-cli": "^0.7.1",
         "postcss": "^8.4.14",
@@ -733,14 +733,14 @@
       }
     },
     "node_modules/@commitlint/cli": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.0.3.tgz",
-      "integrity": "sha512-oAo2vi5d8QZnAbtU5+0cR2j+A7PO8zuccux65R/EycwvsZrDVyW518FFrnJK2UQxbRtHFFIG+NjQ6vOiJV0Q8A==",
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.0.2.tgz",
+      "integrity": "sha512-Axe89Js0YzGGd4gxo3JLlF7yIdjOVpG1LbOorGc6PfYF+drBh14PvarSDLzyd2TNqdylUCq9wb9/A88ZjIdyhA==",
       "dev": true,
       "dependencies": {
         "@commitlint/format": "^17.0.0",
-        "@commitlint/lint": "^17.0.3",
-        "@commitlint/load": "^17.0.3",
+        "@commitlint/lint": "^17.0.0",
+        "@commitlint/load": "^17.0.0",
         "@commitlint/read": "^17.0.0",
         "@commitlint/types": "^17.0.0",
         "execa": "^5.0.0",
@@ -757,9 +757,9 @@
       }
     },
     "node_modules/@commitlint/config-conventional": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.0.3.tgz",
-      "integrity": "sha512-HCnzTm5ATwwwzNVq5Y57poS0a1oOOcd5pc1MmBpLbGmSysc4i7F/++JuwtdFPu16sgM3H9J/j2zznRLOSGVO2A==",
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.0.2.tgz",
+      "integrity": "sha512-MfP0I/JbxKkzo+HXWB7B3WstGS4BiniotU3d3xQ9gK8cR0DbeZ4MuyGCWF65YDyrcDTS3WlrJ3ndSPA1pqhoPw==",
       "dev": true,
       "dependencies": {
         "conventional-changelog-conventionalcommits": "^5.0.0"
@@ -769,40 +769,18 @@
       }
     },
     "node_modules/@commitlint/config-validator": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.0.3.tgz",
-      "integrity": "sha512-3tLRPQJKapksGE7Kee9axv+9z5I2GDHitDH4q63q7NmNA0wkB+DAorJ0RHz2/K00Zb1/MVdHzhCga34FJvDihQ==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.0.0.tgz",
+      "integrity": "sha512-78IQjoZWR4kDHp/U5y17euEWzswJpPkA9TDL5F6oZZZaLIEreWzrDZD5PWtM8MsSRl/K2LDU/UrzYju2bKLMpA==",
       "dev": true,
       "dependencies": {
         "@commitlint/types": "^17.0.0",
-        "ajv": "^8.11.0"
+        "ajv": "^6.12.6"
       },
       "engines": {
         "node": ">=v14"
       }
     },
-    "node_modules/@commitlint/config-validator/node_modules/ajv": {
-      "version": "8.11.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
-      "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
-      "dev": true,
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true
-    },
     "node_modules/@commitlint/ensure": {
       "version": "17.0.0",
       "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz",
@@ -839,9 +817,9 @@
       }
     },
     "node_modules/@commitlint/is-ignored": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.0.3.tgz",
-      "integrity": "sha512-/wgCXAvPtFTQZxsVxj7owLeRf5wwzcXLaYmrZPR4a87iD4sCvUIRl1/ogYrtOyUmHwWfQsvjqIB4mWE/SqWSnA==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.0.0.tgz",
+      "integrity": "sha512-UmacD0XM/wWykgdXn5CEWVS4XGuqzU+ZGvM2hwv85+SXGnIOaG88XHrt81u37ZeVt1riWW+YdOxcJW6+nd5v5w==",
       "dev": true,
       "dependencies": {
         "@commitlint/types": "^17.0.0",
@@ -852,12 +830,12 @@
       }
     },
     "node_modules/@commitlint/lint": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.0.3.tgz",
-      "integrity": "sha512-2o1fk7JUdxBUgszyt41sHC/8Nd5PXNpkmuOo9jvGIjDHzOwXyV0PSdbEVTH3xGz9NEmjohFHr5l+N+T9fcxong==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.0.0.tgz",
+      "integrity": "sha512-5FL7VLvGJQby24q0pd4UdM8FNFcL+ER1T/UBf8A9KRL5+QXV1Rkl6Zhcl7+SGpGlVo6Yo0pm6aLW716LVKWLGg==",
       "dev": true,
       "dependencies": {
-        "@commitlint/is-ignored": "^17.0.3",
+        "@commitlint/is-ignored": "^17.0.0",
         "@commitlint/parse": "^17.0.0",
         "@commitlint/rules": "^17.0.0",
         "@commitlint/types": "^17.0.0"
@@ -867,14 +845,14 @@
       }
     },
     "node_modules/@commitlint/load": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.0.3.tgz",
-      "integrity": "sha512-3Dhvr7GcKbKa/ey4QJ5MZH3+J7QFlARohUow6hftQyNjzoXXROm+RwpBes4dDFrXG1xDw9QPXA7uzrOShCd4bw==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.0.0.tgz",
+      "integrity": "sha512-XaiHF4yWQOPAI0O6wXvk+NYLtJn/Xb7jgZEeKd4C1ZWd7vR7u8z5h0PkWxSr0uLZGQsElGxv3fiZ32C5+q6M8w==",
       "dev": true,
       "dependencies": {
-        "@commitlint/config-validator": "^17.0.3",
+        "@commitlint/config-validator": "^17.0.0",
         "@commitlint/execute-rule": "^17.0.0",
-        "@commitlint/resolve-extends": "^17.0.3",
+        "@commitlint/resolve-extends": "^17.0.0",
         "@commitlint/types": "^17.0.0",
         "@types/node": ">=12",
         "chalk": "^4.1.0",
@@ -927,12 +905,12 @@
       }
     },
     "node_modules/@commitlint/resolve-extends": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.0.3.tgz",
-      "integrity": "sha512-H/RFMvrcBeJCMdnVC4i8I94108UDccIHrTke2tyQEg9nXQnR5/Hd6MhyNWkREvcrxh9Y+33JLb+PiPiaBxCtBA==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.0.0.tgz",
+      "integrity": "sha512-wi60WiJmwaQ7lzMXK8Vbc18Hq9tE2j/6iv2AFfPUGV7fvfY6Sf1iNKuUHirSqR0fquUyufIXe4y/K9A6LVIIvw==",
       "dev": true,
       "dependencies": {
-        "@commitlint/config-validator": "^17.0.3",
+        "@commitlint/config-validator": "^17.0.0",
         "@commitlint/types": "^17.0.0",
         "import-fresh": "^3.0.0",
         "lodash": "^4.17.19",
@@ -2369,9 +2347,9 @@
       "dev": true
     },
     "node_modules/@types/video.js": {
-      "version": "7.3.42",
-      "resolved": "https://registry.npmjs.org/@types/video.js/-/video.js-7.3.42.tgz",
-      "integrity": "sha512-AD6AQNMgLTqrgoayC6SshKh8EDkDd9x5pmEuiY9YsniHlhn5jPXdkVqrzKLwviapaRhQF15TQYxo1JWpqXCUBg=="
+      "version": "7.3.41",
+      "resolved": "https://registry.npmjs.org/@types/video.js/-/video.js-7.3.41.tgz",
+      "integrity": "sha512-nIr3LOSaowI/hfthdgmp8KOsaGe17m99RvCATQO33bn1mOaJVkS5O2VHSVfltpOCAvMF47D1I5bQOwL5ts3W4A=="
     },
     "node_modules/@types/yargs": {
       "version": "17.0.10",
@@ -2394,14 +2372,14 @@
       "integrity": "sha512-Yf1Y4bDj/QIn8v+zdy0l7+OW6s1uoUvzVn5cGqPNCsL4iUW4gYUlIdQIRtH9NOHVgwZNLbVeeRDEn6N4RMq6Nw=="
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.0.tgz",
-      "integrity": "sha512-lvhRJ2pGe2V9MEU46ELTdiHgiAFZPKtLhiU5wlnaYpMc2+c1R8fh8i80ZAa665drvjHKUJyRRGg3gEm1If54ow==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz",
+      "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "5.30.0",
-        "@typescript-eslint/type-utils": "5.30.0",
-        "@typescript-eslint/utils": "5.30.0",
+        "@typescript-eslint/scope-manager": "5.29.0",
+        "@typescript-eslint/type-utils": "5.29.0",
+        "@typescript-eslint/utils": "5.29.0",
         "debug": "^4.3.4",
         "functional-red-black-tree": "^1.0.1",
         "ignore": "^5.2.0",
@@ -2427,14 +2405,14 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.0.tgz",
-      "integrity": "sha512-2oYYUws5o2liX6SrFQ5RB88+PuRymaM2EU02/9Ppoyu70vllPnHVO7ioxDdq/ypXHA277R04SVjxvwI8HmZpzA==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz",
+      "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "5.30.0",
-        "@typescript-eslint/types": "5.30.0",
-        "@typescript-eslint/typescript-estree": "5.30.0",
+        "@typescript-eslint/scope-manager": "5.29.0",
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/typescript-estree": "5.29.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2454,13 +2432,13 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.0.tgz",
-      "integrity": "sha512-3TZxvlQcK5fhTBw5solQucWSJvonXf5yua5nx8OqK94hxdrT7/6W3/CS42MLd/f1BmlmmbGEgQcTHHCktUX5bQ==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz",
+      "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.30.0",
-        "@typescript-eslint/visitor-keys": "5.30.0"
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/visitor-keys": "5.29.0"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -2471,12 +2449,12 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.0.tgz",
-      "integrity": "sha512-GF8JZbZqSS+azehzlv/lmQQ3EU3VfWYzCczdZjJRxSEeXDQkqFhCBgFhallLDbPwQOEQ4MHpiPfkjKk7zlmeNg==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz",
+      "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/utils": "5.30.0",
+        "@typescript-eslint/utils": "5.29.0",
         "debug": "^4.3.4",
         "tsutils": "^3.21.0"
       },
@@ -2497,9 +2475,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.0.tgz",
-      "integrity": "sha512-vfqcBrsRNWw/LBXyncMF/KrUTYYzzygCSsVqlZ1qGu1QtGs6vMkt3US0VNSQ05grXi5Yadp3qv5XZdYLjpp8ag==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz",
+      "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -2510,13 +2488,13 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.0.tgz",
-      "integrity": "sha512-hDEawogreZB4n1zoqcrrtg/wPyyiCxmhPLpZ6kmWfKF5M5G0clRLaEexpuWr31fZ42F96SlD/5xCt1bT5Qm4Nw==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz",
+      "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.30.0",
-        "@typescript-eslint/visitor-keys": "5.30.0",
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/visitor-keys": "5.29.0",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
@@ -2537,15 +2515,15 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.0.tgz",
-      "integrity": "sha512-0bIgOgZflLKIcZsWvfklsaQTM3ZUbmtH0rJ1hKyV3raoUYyeZwcjQ8ZUJTzS7KnhNcsVT1Rxs7zeeMHEhGlltw==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz",
+      "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==",
       "dev": true,
       "dependencies": {
         "@types/json-schema": "^7.0.9",
-        "@typescript-eslint/scope-manager": "5.30.0",
-        "@typescript-eslint/types": "5.30.0",
-        "@typescript-eslint/typescript-estree": "5.30.0",
+        "@typescript-eslint/scope-manager": "5.29.0",
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/typescript-estree": "5.29.0",
         "eslint-scope": "^5.1.1",
         "eslint-utils": "^3.0.0"
       },
@@ -2561,12 +2539,12 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.0.tgz",
-      "integrity": "sha512-6WcIeRk2DQ3pHKxU1Ni0qMXJkjO/zLjBymlYBy/53qxe7yjEFSvzKLDToJjURUhSl2Fzhkl4SMXQoETauF74cw==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz",
+      "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.30.0",
+        "@typescript-eslint/types": "5.29.0",
         "eslint-visitor-keys": "^3.3.0"
       },
       "engines": {
@@ -4586,13 +4564,13 @@
       }
     },
     "node_modules/cosmiconfig-typescript-loader": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.2.tgz",
-      "integrity": "sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.1.tgz",
+      "integrity": "sha512-B9s6sX/omXq7I6gC6+YgLmrBFMJhPWew7ty/X5Tuwtd2zOSgWaUdXjkuVwbe3qqcdETo60+1nSVMekq//LIXVA==",
       "dev": true,
       "dependencies": {
         "cosmiconfig": "^7",
-        "ts-node": "^10.8.1"
+        "ts-node": "^10.8.0"
       },
       "engines": {
         "node": ">=12",
@@ -8713,9 +8691,9 @@
       }
     },
     "node_modules/kleur": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
-      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
+      "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==",
       "dev": true,
       "engines": {
         "node": ">=6"
@@ -17344,14 +17322,14 @@
       "optional": true
     },
     "@commitlint/cli": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.0.3.tgz",
-      "integrity": "sha512-oAo2vi5d8QZnAbtU5+0cR2j+A7PO8zuccux65R/EycwvsZrDVyW518FFrnJK2UQxbRtHFFIG+NjQ6vOiJV0Q8A==",
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.0.2.tgz",
+      "integrity": "sha512-Axe89Js0YzGGd4gxo3JLlF7yIdjOVpG1LbOorGc6PfYF+drBh14PvarSDLzyd2TNqdylUCq9wb9/A88ZjIdyhA==",
       "dev": true,
       "requires": {
         "@commitlint/format": "^17.0.0",
-        "@commitlint/lint": "^17.0.3",
-        "@commitlint/load": "^17.0.3",
+        "@commitlint/lint": "^17.0.0",
+        "@commitlint/load": "^17.0.0",
         "@commitlint/read": "^17.0.0",
         "@commitlint/types": "^17.0.0",
         "execa": "^5.0.0",
@@ -17362,42 +17340,22 @@
       }
     },
     "@commitlint/config-conventional": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.0.3.tgz",
-      "integrity": "sha512-HCnzTm5ATwwwzNVq5Y57poS0a1oOOcd5pc1MmBpLbGmSysc4i7F/++JuwtdFPu16sgM3H9J/j2zznRLOSGVO2A==",
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.0.2.tgz",
+      "integrity": "sha512-MfP0I/JbxKkzo+HXWB7B3WstGS4BiniotU3d3xQ9gK8cR0DbeZ4MuyGCWF65YDyrcDTS3WlrJ3ndSPA1pqhoPw==",
       "dev": true,
       "requires": {
         "conventional-changelog-conventionalcommits": "^5.0.0"
       }
     },
     "@commitlint/config-validator": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.0.3.tgz",
-      "integrity": "sha512-3tLRPQJKapksGE7Kee9axv+9z5I2GDHitDH4q63q7NmNA0wkB+DAorJ0RHz2/K00Zb1/MVdHzhCga34FJvDihQ==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.0.0.tgz",
+      "integrity": "sha512-78IQjoZWR4kDHp/U5y17euEWzswJpPkA9TDL5F6oZZZaLIEreWzrDZD5PWtM8MsSRl/K2LDU/UrzYju2bKLMpA==",
       "dev": true,
       "requires": {
         "@commitlint/types": "^17.0.0",
-        "ajv": "^8.11.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "8.11.0",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
-          "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "json-schema-traverse": "^1.0.0",
-            "require-from-string": "^2.0.2",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-          "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-          "dev": true
-        }
+        "ajv": "^6.12.6"
       }
     },
     "@commitlint/ensure": {
@@ -17427,9 +17385,9 @@
       }
     },
     "@commitlint/is-ignored": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.0.3.tgz",
-      "integrity": "sha512-/wgCXAvPtFTQZxsVxj7owLeRf5wwzcXLaYmrZPR4a87iD4sCvUIRl1/ogYrtOyUmHwWfQsvjqIB4mWE/SqWSnA==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.0.0.tgz",
+      "integrity": "sha512-UmacD0XM/wWykgdXn5CEWVS4XGuqzU+ZGvM2hwv85+SXGnIOaG88XHrt81u37ZeVt1riWW+YdOxcJW6+nd5v5w==",
       "dev": true,
       "requires": {
         "@commitlint/types": "^17.0.0",
@@ -17437,26 +17395,26 @@
       }
     },
     "@commitlint/lint": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.0.3.tgz",
-      "integrity": "sha512-2o1fk7JUdxBUgszyt41sHC/8Nd5PXNpkmuOo9jvGIjDHzOwXyV0PSdbEVTH3xGz9NEmjohFHr5l+N+T9fcxong==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.0.0.tgz",
+      "integrity": "sha512-5FL7VLvGJQby24q0pd4UdM8FNFcL+ER1T/UBf8A9KRL5+QXV1Rkl6Zhcl7+SGpGlVo6Yo0pm6aLW716LVKWLGg==",
       "dev": true,
       "requires": {
-        "@commitlint/is-ignored": "^17.0.3",
+        "@commitlint/is-ignored": "^17.0.0",
         "@commitlint/parse": "^17.0.0",
         "@commitlint/rules": "^17.0.0",
         "@commitlint/types": "^17.0.0"
       }
     },
     "@commitlint/load": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.0.3.tgz",
-      "integrity": "sha512-3Dhvr7GcKbKa/ey4QJ5MZH3+J7QFlARohUow6hftQyNjzoXXROm+RwpBes4dDFrXG1xDw9QPXA7uzrOShCd4bw==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.0.0.tgz",
+      "integrity": "sha512-XaiHF4yWQOPAI0O6wXvk+NYLtJn/Xb7jgZEeKd4C1ZWd7vR7u8z5h0PkWxSr0uLZGQsElGxv3fiZ32C5+q6M8w==",
       "dev": true,
       "requires": {
-        "@commitlint/config-validator": "^17.0.3",
+        "@commitlint/config-validator": "^17.0.0",
         "@commitlint/execute-rule": "^17.0.0",
-        "@commitlint/resolve-extends": "^17.0.3",
+        "@commitlint/resolve-extends": "^17.0.0",
         "@commitlint/types": "^17.0.0",
         "@types/node": ">=12",
         "chalk": "^4.1.0",
@@ -17497,12 +17455,12 @@
       }
     },
     "@commitlint/resolve-extends": {
-      "version": "17.0.3",
-      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.0.3.tgz",
-      "integrity": "sha512-H/RFMvrcBeJCMdnVC4i8I94108UDccIHrTke2tyQEg9nXQnR5/Hd6MhyNWkREvcrxh9Y+33JLb+PiPiaBxCtBA==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.0.0.tgz",
+      "integrity": "sha512-wi60WiJmwaQ7lzMXK8Vbc18Hq9tE2j/6iv2AFfPUGV7fvfY6Sf1iNKuUHirSqR0fquUyufIXe4y/K9A6LVIIvw==",
       "dev": true,
       "requires": {
-        "@commitlint/config-validator": "^17.0.3",
+        "@commitlint/config-validator": "^17.0.0",
         "@commitlint/types": "^17.0.0",
         "import-fresh": "^3.0.0",
         "lodash": "^4.17.19",
@@ -18716,9 +18674,9 @@
       "dev": true
     },
     "@types/video.js": {
-      "version": "7.3.42",
-      "resolved": "https://registry.npmjs.org/@types/video.js/-/video.js-7.3.42.tgz",
-      "integrity": "sha512-AD6AQNMgLTqrgoayC6SshKh8EDkDd9x5pmEuiY9YsniHlhn5jPXdkVqrzKLwviapaRhQF15TQYxo1JWpqXCUBg=="
+      "version": "7.3.41",
+      "resolved": "https://registry.npmjs.org/@types/video.js/-/video.js-7.3.41.tgz",
+      "integrity": "sha512-nIr3LOSaowI/hfthdgmp8KOsaGe17m99RvCATQO33bn1mOaJVkS5O2VHSVfltpOCAvMF47D1I5bQOwL5ts3W4A=="
     },
     "@types/yargs": {
       "version": "17.0.10",
@@ -18741,14 +18699,14 @@
       "integrity": "sha512-Yf1Y4bDj/QIn8v+zdy0l7+OW6s1uoUvzVn5cGqPNCsL4iUW4gYUlIdQIRtH9NOHVgwZNLbVeeRDEn6N4RMq6Nw=="
     },
     "@typescript-eslint/eslint-plugin": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.0.tgz",
-      "integrity": "sha512-lvhRJ2pGe2V9MEU46ELTdiHgiAFZPKtLhiU5wlnaYpMc2+c1R8fh8i80ZAa665drvjHKUJyRRGg3gEm1If54ow==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz",
+      "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/scope-manager": "5.30.0",
-        "@typescript-eslint/type-utils": "5.30.0",
-        "@typescript-eslint/utils": "5.30.0",
+        "@typescript-eslint/scope-manager": "5.29.0",
+        "@typescript-eslint/type-utils": "5.29.0",
+        "@typescript-eslint/utils": "5.29.0",
         "debug": "^4.3.4",
         "functional-red-black-tree": "^1.0.1",
         "ignore": "^5.2.0",
@@ -18758,52 +18716,52 @@
       }
     },
     "@typescript-eslint/parser": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.0.tgz",
-      "integrity": "sha512-2oYYUws5o2liX6SrFQ5RB88+PuRymaM2EU02/9Ppoyu70vllPnHVO7ioxDdq/ypXHA277R04SVjxvwI8HmZpzA==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz",
+      "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/scope-manager": "5.30.0",
-        "@typescript-eslint/types": "5.30.0",
-        "@typescript-eslint/typescript-estree": "5.30.0",
+        "@typescript-eslint/scope-manager": "5.29.0",
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/typescript-estree": "5.29.0",
         "debug": "^4.3.4"
       }
     },
     "@typescript-eslint/scope-manager": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.0.tgz",
-      "integrity": "sha512-3TZxvlQcK5fhTBw5solQucWSJvonXf5yua5nx8OqK94hxdrT7/6W3/CS42MLd/f1BmlmmbGEgQcTHHCktUX5bQ==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz",
+      "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "5.30.0",
-        "@typescript-eslint/visitor-keys": "5.30.0"
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/visitor-keys": "5.29.0"
       }
     },
     "@typescript-eslint/type-utils": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.0.tgz",
-      "integrity": "sha512-GF8JZbZqSS+azehzlv/lmQQ3EU3VfWYzCczdZjJRxSEeXDQkqFhCBgFhallLDbPwQOEQ4MHpiPfkjKk7zlmeNg==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz",
+      "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/utils": "5.30.0",
+        "@typescript-eslint/utils": "5.29.0",
         "debug": "^4.3.4",
         "tsutils": "^3.21.0"
       }
     },
     "@typescript-eslint/types": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.0.tgz",
-      "integrity": "sha512-vfqcBrsRNWw/LBXyncMF/KrUTYYzzygCSsVqlZ1qGu1QtGs6vMkt3US0VNSQ05grXi5Yadp3qv5XZdYLjpp8ag==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz",
+      "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==",
       "dev": true
     },
     "@typescript-eslint/typescript-estree": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.0.tgz",
-      "integrity": "sha512-hDEawogreZB4n1zoqcrrtg/wPyyiCxmhPLpZ6kmWfKF5M5G0clRLaEexpuWr31fZ42F96SlD/5xCt1bT5Qm4Nw==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz",
+      "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "5.30.0",
-        "@typescript-eslint/visitor-keys": "5.30.0",
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/visitor-keys": "5.29.0",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
@@ -18812,26 +18770,26 @@
       }
     },
     "@typescript-eslint/utils": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.0.tgz",
-      "integrity": "sha512-0bIgOgZflLKIcZsWvfklsaQTM3ZUbmtH0rJ1hKyV3raoUYyeZwcjQ8ZUJTzS7KnhNcsVT1Rxs7zeeMHEhGlltw==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz",
+      "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==",
       "dev": true,
       "requires": {
         "@types/json-schema": "^7.0.9",
-        "@typescript-eslint/scope-manager": "5.30.0",
-        "@typescript-eslint/types": "5.30.0",
-        "@typescript-eslint/typescript-estree": "5.30.0",
+        "@typescript-eslint/scope-manager": "5.29.0",
+        "@typescript-eslint/types": "5.29.0",
+        "@typescript-eslint/typescript-estree": "5.29.0",
         "eslint-scope": "^5.1.1",
         "eslint-utils": "^3.0.0"
       }
     },
     "@typescript-eslint/visitor-keys": {
-      "version": "5.30.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.0.tgz",
-      "integrity": "sha512-6WcIeRk2DQ3pHKxU1Ni0qMXJkjO/zLjBymlYBy/53qxe7yjEFSvzKLDToJjURUhSl2Fzhkl4SMXQoETauF74cw==",
+      "version": "5.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz",
+      "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "5.30.0",
+        "@typescript-eslint/types": "5.29.0",
         "eslint-visitor-keys": "^3.3.0"
       }
     },
@@ -20454,13 +20412,13 @@
       }
     },
     "cosmiconfig-typescript-loader": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.2.tgz",
-      "integrity": "sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.1.tgz",
+      "integrity": "sha512-B9s6sX/omXq7I6gC6+YgLmrBFMJhPWew7ty/X5Tuwtd2zOSgWaUdXjkuVwbe3qqcdETo60+1nSVMekq//LIXVA==",
       "dev": true,
       "requires": {
         "cosmiconfig": "^7",
-        "ts-node": "^10.8.1"
+        "ts-node": "^10.8.0"
       }
     },
     "create-require": {
@@ -23557,9 +23515,9 @@
       "dev": true
     },
     "kleur": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
-      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
+      "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==",
       "dev": true
     },
     "klona": {
diff --git a/package.json b/package.json
index 5ac79ee9a..3aadb9675 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@exadel/esl",
-  "version": "4.0.0-beta.9",
+  "version": "4.0.0-beta.8",
   "private": false,
   "description": "Exadel Smart Library (ESL) is the lightweight custom elements library that provide a set of super-flexible components",
   "license": "MIT",
@@ -53,11 +53,11 @@
     "build:less:cpy": "copyfiles \"src/**/*.less\" \".\" --up 1 --all",
     "build:less:css": "foreach -x \"lessc #{path} #{dir}/#{name}.css\" -i \"**/*.mixin.less\" -g \"modules/{*,*/*,{draft,esl-utils,esl-forms}/*/*}.less\"",
     "build:docs": "copyfiles \"src/**/*.md\" \".\" --up 1 --all",
-    "clean-pages": "rimraf \"pages/dist/**\"",
-    "minify:css": "cleancss -o \"pages/dist/bundles/localdev.css\" \"pages/dist/bundles/localdev.css\"",
+    "clean-pages": "rimraf pages/dist/**",
+    "minify:css": "cleancss -o pages/dist/bundles/localdev.css pages/dist/bundles/localdev.css",
     "build-pages": "npm run clean-pages && concurrently \"npm run build-pages:ts\" \"npm run build-pages:less && npm run minify:css\" && npm run build-pages:eleventy",
     "build-pages:ts": "cd pages && webpack --mode=production",
-    "build-pages:less": "lessc \"pages/src/localdev.less\" \"pages/dist/bundles/localdev.css\" --source-map=pages/dist/bundles/localdev.css.map",
+    "build-pages:less": "lessc pages/src/localdev.less pages/dist/bundles/localdev.css --source-map=pages/dist/bundles/localdev.css.map",
     "build-pages:eleventy": "cd pages && npx @11ty/eleventy -- --env=production",
     "build-pages:analyzer": "cd pages && webpack --mode=production --profile --json ../.report/stats.json && webpack-bundle-analyzer ../.report/stats.json ../pages/dist/bundles -s gzip -m static -r ../.report/stats.html",
     "watch:ts": "cd pages && webpack --watch",
@@ -67,9 +67,9 @@
     "test:unit": "jest --silent --noStackTrace",
     "test:report": "jest --coverage",
     "lint": "concurrently \"npm run lint:js\" \"npm run lint:css\" \"npm run lint:spaces\" && node build/catlog.js \"Linting passed\"",
-    "lint:js": "eslint \"src/**/*.ts\" \"pages/src/**/*.ts\" --max-warnings 3",
-    "lint:css": "stylelint \"src/**/*.less\" \"pages/src/**/*.less\"",
-    "lint:spaces": "lintspaces \"./pages/{src,views,controller}/**/*.{html,njk,less,json}\" \"./src/**/*.{less}\" -n -t -d spaces",
+    "lint:js": "eslint src/**/*.ts pages/src/**/*.ts --max-warnings 3",
+    "lint:css": "stylelint src/**/*.less pages/src/**/*.less",
+    "lint:spaces": "lintspaces ./pages/{src,views,controller}/**/*.{html,less,json} ./src/**/*.{less} -n -t -d spaces",
     "prepare": "husky install && npm run build",
     "preversion": "npm test"
   },
@@ -78,13 +78,13 @@
   },
   "dependencies": {
     "@types/resize-observer-browser": "0.1.7",
-    "@types/video.js": "7.3.42",
+    "@types/video.js": "7.3.41",
     "@types/youtube": "0.0.46"
   },
   "devDependencies": {
     "@11ty/eleventy": "^1.0.1",
-    "@commitlint/cli": "^17.0.3",
-    "@commitlint/config-conventional": "^17.0.3",
+    "@commitlint/cli": "^17.0.2",
+    "@commitlint/config-conventional": "^17.0.2",
     "@juggle/resize-observer": "^3.3.1",
     "@semantic-release/changelog": "^6.0.1",
     "@semantic-release/commit-analyzer": "^9.0.2",
@@ -94,8 +94,8 @@
     "@semantic-release/release-notes-generator": "^10.0.3",
     "@types/jest": "^28.1.3",
     "@types/smoothscroll-polyfill": "^0.3.1",
-    "@typescript-eslint/eslint-plugin": "^5.30.0",
-    "@typescript-eslint/parser": "^5.30.0",
+    "@typescript-eslint/eslint-plugin": "^5.29.0",
+    "@typescript-eslint/parser": "^5.29.0",
     "@webcomponents/custom-elements": "1.5.0",
     "browser-sync": "^2.27.10",
     "chokidar-cli": "^3.0.0",
@@ -114,7 +114,7 @@
     "jest": "^28.1.1",
     "jest-environment-jsdom": "^28.1.1",
     "js-yaml": "^4.1.0",
-    "kleur": "^4.1.5",
+    "kleur": "^4.1.4",
     "less": "^4.1.3",
     "lintspaces-cli": "^0.7.1",
     "postcss": "^8.4.14",
diff --git a/pages/11ty/slice.filter.js b/pages/11ty/slice.filter.js
deleted file mode 100644
index 888130036..000000000
--- a/pages/11ty/slice.filter.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** filter to limit collection */
-const limit = (collection, count) => collection ? collection.slice(0, count) : [];
-
-module.exports = (config) => {
-  config.addFilter('limit', limit);
-};
diff --git a/pages/11ty/sort.filter.js b/pages/11ty/sort.filter.js
index 96624b03f..0f94279da 100644
--- a/pages/11ty/sort.filter.js
+++ b/pages/11ty/sort.filter.js
@@ -15,10 +15,7 @@ module.exports = (config) => {
   const nameComparer = (a, b) => a.data.name.localeCompare(b.data.name);
   /** Order metadata comparer */
   const orderComparer = (a, b) => (a.data.order || 0) - (b.data.order || 0);
-  /** Date metadata comparer */
-  const dateComparer = (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime();
 
   config.addFilter('sortByName', sortFilter(nameComparer));
   config.addFilter('sortByNameAndOrder', sortFilter(compose(orderComparer, nameComparer)));
-  config.addFilter('sortByDate', sortFilter(dateComparer));
 };
diff --git a/pages/11ty/text.filter.js b/pages/11ty/text.filter.js
deleted file mode 100644
index 6708b6dcf..000000000
--- a/pages/11ty/text.filter.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const {JSDOM} = require('jsdom');
-
-/** filter to extract text content from HTML */
-const extractTextContent = (content) => {
-  const {window} = new JSDOM(content);
-  return window.document.body.textContent;
-};
-
-module.exports = (config) => {
-  config.addFilter('text', extractTextContent);
-};
diff --git a/pages/11ty/trim.filter.js b/pages/11ty/trim.filter.js
deleted file mode 100644
index 1a58cbef5..000000000
--- a/pages/11ty/trim.filter.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/** filter to trim text */
-
-const trimFilter = (content, limit) => (content.length <= limit) ? content : `${content.substring(0, limit)}...`;
-
-module.exports = (config) => {
-  config.addFilter('trim', trimFilter);
-};
diff --git a/pages/src/landing/blogs/blogs.less b/pages/src/landing/blogs/blogs.less
deleted file mode 100644
index 5f4e4538a..000000000
--- a/pages/src/landing/blogs/blogs.less
+++ /dev/null
@@ -1,50 +0,0 @@
-@import (reference) "../../common/variables.less";
-
-.blogs {
-  position: relative;
-  margin-bottom: 2rem;
-
-  &-item {
-    display: flex;
-    flex: 1 0 0px;
-    align-items: center;
-    padding: 30px 45px;
-    list-style: none;
-    @media @sm-xl {
-      display: block;
-    }
-    @media @sm {
-      min-width: 300px;
-      max-width: 350px;
-    }
-    @media @md-lg {
-      min-width: 340px;
-      max-width: 500px;
-    }
-    @media @xl {
-      min-width: 400px;
-      max-width: 500px;
-    }
-  }
-
-  &-container {
-    margin: 0 -45px;
-    padding-bottom: 35px;
-
-    @media @sm-xl {
-      padding-bottom: 50px;
-      display: flex;
-      flex-wrap: wrap;
-    }
-  }
-
-  &-content-name {
-    margin-bottom: 20px;
-    font-size: 1.5rem;
-  }
-
-  &-content-text {
-    margin-bottom: 20px;
-    font-size: 1rem;
-  }
-}
diff --git a/pages/src/landing/landing.less b/pages/src/landing/landing.less
index b3144a9ec..bd530869c 100644
--- a/pages/src/landing/landing.less
+++ b/pages/src/landing/landing.less
@@ -2,5 +2,4 @@
 @import "./benefits/benefits.less";
 @import "./browser-support/browser-support.less";
 @import "./promo-banner/promo-banner.less";
-@import "./blogs/blogs.less";
 //@import "./overview/overview.less";
diff --git a/pages/src/navigation/footer/footer.less b/pages/src/navigation/footer/footer.less
index b9ca173dc..facff08de 100644
--- a/pages/src/navigation/footer/footer.less
+++ b/pages/src/navigation/footer/footer.less
@@ -29,7 +29,7 @@
     color: @primary-blue;
     font-weight: 500;
     font-size: 1rem;
-    margin-left: 15px;
+    margin-left: 25px;
 
     @media @md-xl {
       display: block;
@@ -39,7 +39,7 @@
   &-link {
     display: inline-block;
     color: white;
-    padding: 10px 0;
+    padding: 10px;
     outline-offset: -2px;
     font-size: 1.125rem;
 
@@ -172,7 +172,7 @@
     font-size: 0.9rem;
   }
   &-common-links &-link {
-    padding: 0;
+    padding: 0 10px;
     font-size: inherit;
     > svg {
       width: 25px;
@@ -180,6 +180,9 @@
     }
   }
 
+  &-copyright {
+    padding: 0 10px;
+  }
   &-copyright &-link {
     font-size: inherit;
     padding: 0;
diff --git a/pages/views/_includes/landing/benefits.njk b/pages/views/_includes/landing/benefits.njk
index 2b5e28006..91eddde14 100644
--- a/pages/views/_includes/landing/benefits.njk
+++ b/pages/views/_includes/landing/benefits.njk
@@ -17,3 +17,4 @@
 
   {% include 'static/assets/common/accent-invert.svg' %}
 </div>
+
diff --git a/pages/views/_includes/landing/blogs.njk b/pages/views/_includes/landing/blogs.njk
deleted file mode 100644
index d896d525d..000000000
--- a/pages/views/_includes/landing/blogs.njk
+++ /dev/null
@@ -1,18 +0,0 @@
-{% set releasedBlogs = collections.blogs | released %}
-{% if releasedBlogs.length %}
-<div class="blogs container">
-  <h2>{{ landing.blogs.title }}</h2>
-  <esl-animate target="::next::child" group></esl-animate>
-  <ul class="blogs-container">
-    {% for item in releasedBlogs | reverse | limit(3) %}
-      <li class="blogs-item esl-animate-slide-left">
-        <div class="blogs-content">
-          <h4 class="blogs-content-name">{{ item.data.name }}</h4>
-          <p class="blogs-content-text">{{ item.templateContent | text | trim(250) }}</p>
-          <a class="btn-link"  href="{{ item.url | url }}">{{ landing.blogs.cta.text }}</a>
-        </div>
-      </li>
-    {% endfor %}
-  </ul>
-</div>
-{% endif %}
diff --git a/pages/views/_includes/navigation/footer-compact.njk b/pages/views/_includes/navigation/footer-compact.njk
index e041794ce..bc3687a13 100644
--- a/pages/views/_includes/navigation/footer-compact.njk
+++ b/pages/views/_includes/navigation/footer-compact.njk
@@ -1,7 +1,7 @@
 <div class="container">
   <hr class="footer-divider"/>
   <div class="text-center text-gray">
-    <div>ESL v{{ env.version }} © {{ env.date.getFullYear() }} Exadel, Inc</div>
+    <div>ESL v{{ env.version }} © 2021 Exadel, Inc</div>
     <div>
       Core Team Contributors:
       <a target="_blank" href="https://github.com/ala-n">Alexey Stsefanovich</a>,
diff --git a/pages/views/_includes/navigation/sidebar-item.njk b/pages/views/_includes/navigation/sidebar-item.njk
index fbb83676a..38fd66059 100644
--- a/pages/views/_includes/navigation/sidebar-item.njk
+++ b/pages/views/_includes/navigation/sidebar-item.njk
@@ -14,8 +14,8 @@
       {% if opt.beta %}
         <sup class="badge badge-sup badge-warning">beta</sup>
       {% endif %}
-      {% if opt.new %}
-        <sup class="badge badge-sup badge-warning">new</sup>
+      {% if opt.draft %}
+        <sup class="badge badge-sup badge-danger">draft</sup>
       {% endif %}
     </esl-trigger>
   </div>
diff --git a/pages/views/_includes/navigation/sidebar.njk b/pages/views/_includes/navigation/sidebar.njk
index 32fc69bda..e5719ac73 100644
--- a/pages/views/_includes/navigation/sidebar.njk
+++ b/pages/views/_includes/navigation/sidebar.njk
@@ -31,10 +31,9 @@
         <li class="sidebar-nav-item">
           {{ navitem ('Examples', 'examples', 'static/assets/sidebar/examples.svg') }}
         </li>
-        {% set releasedBlogs = collections.blogs | released %}
-        {% if releasedBlogs.length %}
+        {% if env.isDev %}
         <li class="sidebar-nav-item">
-          {{ navitem ('Blogs', 'blogs', 'static/assets/sidebar/blogs.svg', { new: true }) }}
+          {{ navitem ('Blogs', 'blogs', 'static/assets/sidebar/blogs.svg', { draft: true }) }}
         </li>
         {% endif %}
       </ul>
diff --git a/pages/views/blogs/Prelelease v4.0.0.md b/pages/views/blogs/Prelelease v4.0.0.md
index 5c7acb11e..e61405e10 100644
--- a/pages/views/blogs/Prelelease v4.0.0.md
+++ b/pages/views/blogs/Prelelease v4.0.0.md
@@ -3,7 +3,6 @@ layout: content
 name: Pre 4.0.0 Highlights (Part 1)
 title: Pre 4.0.0 Highlights (Part 1)
 tags: [blogs, draft]
-date: 2016-01-02
 ---
 
 Привет ребят!
diff --git a/pages/views/blogs/index.njk b/pages/views/blogs/index.njk
index 6ff04c804..0dc1c26d0 100644
--- a/pages/views/blogs/index.njk
+++ b/pages/views/blogs/index.njk
@@ -2,10 +2,10 @@
 layout: collection-grid
 title: Blogs
 name: See All
-eleventyExcludeFromCollections: true
 order: 1000
 collection: blogs
 hidden: true
 list: true
 tags: blogs
 ---
+
diff --git a/pages/views/core/esl-base-element.njk b/pages/views/core/esl-base-element.njk
index d9a6b7b65..61490caf9 100644
--- a/pages/views/core/esl-base-element.njk
+++ b/pages/views/core/esl-base-element.njk
@@ -9,3 +9,4 @@ iconAlt: '<esl-.../>'
 ---
 
 {% mdRender 'src/modules/esl-base-element/README.md', 'intro' %}
+
diff --git a/pages/views/core/esl-media-query.njk b/pages/views/core/esl-media-query.njk
index 22affe5ef..647f1a32e 100644
--- a/pages/views/core/esl-media-query.njk
+++ b/pages/views/core/esl-media-query.njk
@@ -8,3 +8,4 @@ iconAlt: '@+xs, @x1, not @ie, @mobile'
 ---
 
 {% mdRender 'src/modules/esl-media-query/README.md', 'intro' %}
+
diff --git a/pages/views/core/esl-mixin-element.njk b/pages/views/core/esl-mixin-element.njk
index 9a9913e33..9533da960 100644
--- a/pages/views/core/esl-mixin-element.njk
+++ b/pages/views/core/esl-mixin-element.njk
@@ -9,3 +9,4 @@ iconAlt: '<div esl-.../>'
 ---
 
 {% mdRender 'src/modules/esl-mixin-element/README.md', 'intro' %}
+
diff --git a/pages/views/core/esl-utils.njk b/pages/views/core/esl-utils.njk
index 518851ba9..7bbf5e90a 100644
--- a/pages/views/core/esl-utils.njk
+++ b/pages/views/core/esl-utils.njk
@@ -8,3 +8,4 @@ iconAlt: '@bind @memoize @prop'
 ---
 
 {% mdRender 'src/modules/esl-utils/README.md', 'intro' %}
+
diff --git a/pages/views/examples/toggleable.njk b/pages/views/examples/toggleable.njk
index d0a0808b3..8b8d0ee40 100644
--- a/pages/views/examples/toggleable.njk
+++ b/pages/views/examples/toggleable.njk
@@ -34,9 +34,9 @@ aside:
     </div>
     <p>Triggers</p>
     <div class="btn-container">
-      <esl-trigger target="#toggleable1" mode="toggle" a11y-label-active a11y-label-inactive="expand" class="btn btn-sec-blue">Toggle</esl-trigger>
-      <esl-trigger target="#toggleable1" mode="show" a11y-label-active="collapse" class="btn btn-sec-blue">Show</esl-trigger>
-      <esl-trigger target="#toggleable1" mode="hide" aria-label="hide" class="btn btn-sec-blue">Hide</esl-trigger>
+      <esl-trigger target="#toggleable1" mode="toggle" a11y-label-active a11y-label-inactive='expand' class="btn btn-sec-blue">Toggle</esl-trigger>
+      <esl-trigger target="#toggleable1" mode="show" a11y-label-active='collapse' class="btn btn-sec-blue">Show</esl-trigger>
+      <esl-trigger target="#toggleable1" mode="hide" class="btn btn-sec-blue">Hide</esl-trigger>
     </div>
   </div>
 </section>
diff --git a/pages/views/index.11tydata.yml b/pages/views/index.11tydata.yml
index 73b45adbc..fab617fa8 100644
--- a/pages/views/index.11tydata.yml
+++ b/pages/views/index.11tydata.yml
@@ -53,10 +53,6 @@ landing:
           Our UI component library doesn't introduce any additional restrictions — only benefits, as it offers
           utilities and framework-agnostic web components that work with any tech stack.
 
-  blogs:
-    title: Articles
-    cta:
-      text: READ MORE
   support:
     title: Browser Support
     text:
diff --git a/pages/views/index.njk b/pages/views/index.njk
index 6c84ffaff..ce2512e35 100644
--- a/pages/views/index.njk
+++ b/pages/views/index.njk
@@ -7,4 +7,3 @@ layout: landing
 {#{% include 'landing/overview.njk/'%}#}
 {% include 'landing/browser-support.njk/'%}
 {% include 'landing/promo-banner.njk/'%}
-{% include 'landing/blogs.njk/'%}
diff --git a/src/modules/esl-forms/esl-select/README.md b/src/modules/esl-forms/esl-select/README.md
index 089fc6896..fac36d6ec 100644
--- a/src/modules/esl-forms/esl-select/README.md
+++ b/src/modules/esl-forms/esl-select/README.md
@@ -17,8 +17,6 @@ Uses "select with dropdown" view. Supports both single and multiple selection.
 
 - `has-focus-class` - class(es) for focused state. Select ia also focused if the dropdown list is opened
 
-- `dropdown-class` - class(es) for select dropdown
-
 - `select-all-label` - select all options text
 
 - `more-label-format` - text to add when there is not enough space to show all selected options inline. 
diff --git a/src/modules/esl-forms/esl-select/core/esl-select-dropdown.ts b/src/modules/esl-forms/esl-select/core/esl-select-dropdown.ts
index a52a132f9..c5ac25fd2 100644
--- a/src/modules/esl-forms/esl-select/core/esl-select-dropdown.ts
+++ b/src/modules/esl-forms/esl-select/core/esl-select-dropdown.ts
@@ -62,7 +62,6 @@ export class ESLSelectDropdown extends ESLToggleable {
     document.body.appendChild(this);
     this._disposeTimeout && window.clearTimeout(this._disposeTimeout);
 
-    this.$$cls(this.$owner.dropdownClass, true);
     this.$list.pinSelected = this.$owner.pinSelected;
     this.$list.selectAllLabel = this.$owner.selectAllLabel;
     this.$list.$select = this.$owner.$select;
diff --git a/src/modules/esl-forms/esl-select/core/esl-select.shape.ts b/src/modules/esl-forms/esl-select/core/esl-select.shape.ts
index f68fde109..d33243cf1 100644
--- a/src/modules/esl-forms/esl-select/core/esl-select.shape.ts
+++ b/src/modules/esl-forms/esl-select/core/esl-select.shape.ts
@@ -15,9 +15,6 @@ export interface ESLSelectTagShape extends ESLBaseElementShape<ESLSelect> {
   /** Define class(es) for focused state. Select is also focused if the dropdown list is opened */
   'has-focus-class'?: string;
 
-  /** Define class(es) for select dropdown */
-  'dropdown-class'?: string;
-
   /** Define label to select all options text ('Select All' by default) */
   'select-all-label'?: string;
 
diff --git a/src/modules/esl-forms/esl-select/core/esl-select.ts b/src/modules/esl-forms/esl-select/core/esl-select.ts
index 56d72f0d5..0963d52bd 100644
--- a/src/modules/esl-forms/esl-select/core/esl-select.ts
+++ b/src/modules/esl-forms/esl-select/core/esl-select.ts
@@ -33,8 +33,6 @@ export class ESLSelect extends ESLSelectWrapper {
   @attr() public hasValueClass: string;
   /** Class(es) for focused state. Select is also focused if the dropdown list is opened */
   @attr() public hasFocusClass: string;
-  /** Class(es) for select dropdown */
-  @attr() public dropdownClass: string;
   /** Select all options text */
   @attr({defaultValue: 'Select All'}) public selectAllLabel: string;
 
diff --git a/src/modules/esl-image/core/esl-image-strategies.ts b/src/modules/esl-image/core/esl-image-strategies.ts
index 798f6bdfa..9d82b763c 100644
--- a/src/modules/esl-image/core/esl-image-strategies.ts
+++ b/src/modules/esl-image/core/esl-image-strategies.ts
@@ -1,4 +1,3 @@
-import {sanitize} from '../../esl-utils/dom/sanitize';
 import {ESLImage} from './esl-image';
 
 /**
@@ -68,7 +67,11 @@ export const STRATEGIES: ESLImageStrategyMap = {
       request.open('GET', shadowImg.src, true);
       request.onreadystatechange = (): void => {
         if (request.readyState !== 4 || request.status !== 200) return;
-        img.innerHTML = sanitize(request.responseText, ['svg']);
+        const tmp = document.createElement('div');
+        tmp.innerHTML = request.responseText;
+        Array.from(tmp.querySelectorAll('script') || [])
+          .forEach((node: Element) => node.remove());
+        img.innerHTML = tmp.innerHTML;
       };
       request.send();
     },
diff --git a/src/modules/esl-media-query/README.md b/src/modules/esl-media-query/README.md
index 3bfaee3c9..c6403ec61 100644
--- a/src/modules/esl-media-query/README.md
+++ b/src/modules/esl-media-query/README.md
@@ -204,3 +204,42 @@ Event Target methods:
 - `ESLMediaRuleList.prototype.removeEventListener(cb: EventListener)` or
 `ESLMediaRuleList.prototype.removeEventListener('change', cb: EventListener)` - unsubscribes from `ESLMediaRuleList` object value changes 
 
+### Decorator `@media` (beta, deprecated for now)
+
+Special `@media` decorator to simplify work with {@link ESLMediaRuleList} 
+come with `esl-media-query` module.
+It is applicable for both properties and methods
+
+`@media` decorator expect tuple definition format, so you need to pass two arguments: 
+ - queries string - media queries definitions separated by `|`
+ - values string - values separated by `|` (equals to `queries` by default)
+
+If `@media` decorates property it creates an accessor for a current 
+{@link ESLMediaRuleList} instance value
+```ts
+class Test {
+  @media('@sm|@md|@lg', 'sm|md|lg') public breakpoint: string;
+}
+```
+
+If `@media` decorates a method, then it creates an auto-subscribable `ESLEventListener` definition.
+So the following definitions are equal:
+
+```ts
+import {ESLMediaRuleListEvent} from './esl-media-rule-list';
+
+class Test {
+  @media('@sm|@md|@lg', 'sm|md|lg')
+  protected onBreakpointChange(e: ESLMediaRuleListEvent) {
+    // ...
+  }
+
+  @listen({
+    event: 'change',
+    target: ESlMediaRuleList.fromTuple('@sm|@md|@lg', 'sm|md|lg')
+  })
+  protected onBreakpointChange(e: ESLMediaRuleListEvent) {
+    // ...
+  }
+}
+```
diff --git a/src/modules/esl-media-query/core.ts b/src/modules/esl-media-query/core.ts
index 90c2f8fe9..a9a54d925 100644
--- a/src/modules/esl-media-query/core.ts
+++ b/src/modules/esl-media-query/core.ts
@@ -5,3 +5,5 @@ export * from './core/common/screen-breakpoint';
 export * from './core/esl-media-query';
 export * from './core/esl-media-rule';
 export * from './core/esl-media-rule-list';
+
+// export * from './core/decorator/media';
diff --git a/src/modules/esl-media-query/core/decorator/media.ts b/src/modules/esl-media-query/core/decorator/media.ts
new file mode 100644
index 000000000..5b03a261b
--- /dev/null
+++ b/src/modules/esl-media-query/core/decorator/media.ts
@@ -0,0 +1,70 @@
+import {ESLMediaRuleList} from '../esl-media-rule-list';
+import {memoizeFn} from '../../../esl-utils/misc/memoize';
+
+import type {RulePayloadParser} from '../esl-media-rule';
+
+// Defines rule to create a unique hash of @media params
+const hashFn = (...args: any[]): string | undefined => {
+  let serialized = '';
+  for (const arg of args) {
+    if (typeof arg === 'function' && !arg.name) return undefined;
+    serialized += typeof arg === 'function' ? arg.name : String(arg);
+  }
+  return serialized;
+};
+
+/**
+ * Decorator to access active value of the passed {@link ESLMediaRuleList}
+ * Applicable to both properties and methods
+ *
+ * @param query - media queries definitions separated by `|`
+ * @param values - values for passed queries (equals to `queries` by default)
+ *
+ * If decorates property - creates an accessor for a current {@link ESLMediaRuleList} instance value
+ * @example
+ * ```ts
+ * @media('@sm|@md|@lg', 'sm|md|lg') public breakpoint: string;
+ * ```
+ *
+ * If decorates a method then marks it as an auto-subscribable `ESLEventListener` definition
+ * Shortcut for `@listen({ event: 'change', target: ESlMediaRuleList.fromTuple(...) })`
+ * @example
+ * ```ts
+ * @media('@sm|@md|@lg', 'sm|md|lg')
+ * protected onBreakpointChange(e: ESLMediaRuleListEvent) { ... }
+ * ```
+ *
+ * @deprecated until testing phase completed
+ */
+export const media = memoizeFn(mediaDecorator, hashFn);
+
+
+function mediaDecorator(query: string): PropertyDecorator;
+function mediaDecorator<U>(query: string, parser: RulePayloadParser<U>): PropertyDecorator;
+function mediaDecorator(mask: string, values: string): PropertyDecorator;
+function mediaDecorator<U>(mask: string, values: string, parser: RulePayloadParser<U>): PropertyDecorator;
+function mediaDecorator(...args: any[]): PropertyDecorator {
+  const rules: ESLMediaRuleList = ESLMediaRuleList.parse(...args as Parameters<typeof ESLMediaRuleList.parse>);
+
+  return function listener(target: HTMLElement, propertyKey: string, descriptor?: PropertyDescriptor): void {
+    if (descriptor) {
+      if (typeof descriptor.value !== 'function') {
+        throw Error('@media decorator is applicable only to listener methods or properties');
+      }
+      Object.assign(descriptor.value, {
+        auto: true,
+        event: 'change',
+        target: rules
+      });
+      // Allow collecting
+      descriptor.enumerable = true;
+      return;
+    }
+
+    Object.defineProperty(target, propertyKey, {
+      get: () => rules.value,
+      enumerable: true,
+      configurable: true
+    });
+  };
+}
diff --git a/src/modules/esl-tab/core/esl-tab.ts b/src/modules/esl-tab/core/esl-tab.ts
index 8164a571c..17ee7d74b 100644
--- a/src/modules/esl-tab/core/esl-tab.ts
+++ b/src/modules/esl-tab/core/esl-tab.ts
@@ -28,9 +28,7 @@ export class ESLTab extends ESLTrigger {
     const target = this.$a11yTarget;
     if (!target) return;
 
-    if (this.a11yLabelActive !== null || this.a11yLabelInactive !== null) {
-      setAttr(target, 'aria-label', this.a11yLabel);
-    }
+    setAttr(target, 'aria-label', this.a11yLabel);
     setAttr(target, 'aria-selected', String(this.active));
     setAttr(target, 'tabindex', this.active ? '0' : '-1');
 
diff --git a/src/modules/esl-trigger/core/esl-trigger.ts b/src/modules/esl-trigger/core/esl-trigger.ts
index 41c5567dd..c93961b75 100644
--- a/src/modules/esl-trigger/core/esl-trigger.ts
+++ b/src/modules/esl-trigger/core/esl-trigger.ts
@@ -43,9 +43,9 @@ export class ESLTrigger extends ESLBaseElement {
   @attr({defaultValue: ''}) public a11yTarget: string;
 
   /** Value of aria-label for active state */
-  @attr({defaultValue: null}) public a11yLabelActive: string | null;
+  @attr() public a11yLabelActive: string;
   /** Value of aria-label for inactive state */
-  @attr({defaultValue: null}) public a11yLabelInactive: string | null;
+  @attr() public a11yLabelInactive: string;
 
   /** Show delay value */
   @attr({defaultValue: 'none'}) public showDelay: string;
@@ -271,9 +271,7 @@ export class ESLTrigger extends ESLBaseElement {
     const target = this.$a11yTarget;
     if (!target) return;
 
-    if (this.a11yLabelActive !== null || this.a11yLabelInactive !== null) {
-      setAttr(target, 'aria-label', this.a11yLabel);
-    }
+    setAttr(target, 'aria-label', this.a11yLabel);
     setAttr(target, 'aria-expanded', String(this.active));
     if (this.$target && this.$target.id) {
       setAttr(target, 'aria-controls', this.$target.id);
diff --git a/src/modules/esl-utils/all.ts b/src/modules/esl-utils/all.ts
index 56eb5f6df..2cc0c2822 100644
--- a/src/modules/esl-utils/all.ts
+++ b/src/modules/esl-utils/all.ts
@@ -38,7 +38,6 @@ export * from './dom/focus';
 export * from './dom/keys';
 export * from './dom/ready';
 export * from './dom/rtl';
-export * from './dom/sanitize';
 export * from './dom/script';
 export * from './dom/scroll';
 export * from './dom/traversing';
diff --git a/src/modules/esl-utils/decorators/attr.ts b/src/modules/esl-utils/decorators/attr.ts
index ed5e9c523..56eec5723 100644
--- a/src/modules/esl-utils/decorators/attr.ts
+++ b/src/modules/esl-utils/decorators/attr.ts
@@ -1,5 +1,5 @@
 import {identity} from '../misc/functions';
-import {parseString, toKebabCase} from '../misc/format';
+import {toKebabCase} from '../misc/format';
 import {getAttr, setAttr} from '../dom/attr';
 import type {AttributeDecorator, AttributeTarget} from '../dom/attr';
 
@@ -25,6 +25,10 @@ type AttrDescriptor<T = string> = {
 const buildAttrName =
   (propName: string, dataAttr: boolean): string => dataAttr ? `data-${toKebabCase(propName)}` : toKebabCase(propName);
 
+export const toString = (val: string | null): string => val ?? '';
+export const toNumber = parseFloat;
+export const toBoolean = (val: string | null): boolean => val !== null && val !== 'false';
+
 /**
  * Decorator to map current property to element attribute value.
  * Maps string type property.
@@ -37,7 +41,7 @@ export const attr = <T = string>(config: AttrDescriptor<T> = {}): AttributeDecor
     function get(): T | null {
       const val = getAttr(this, attrName);
       if (val === null && 'defaultValue' in config) return config.defaultValue as T;
-      return (config.parser || parseString as AttrParser<any>)(val);
+      return (config.parser || toString as AttrParser<any>)(val);
     }
     function set(value: T): void {
       setAttr(this, attrName, (config.serializer as AttrSerializer<any> || identity)(value));
diff --git a/src/modules/esl-utils/dom/sanitize.ts b/src/modules/esl-utils/dom/sanitize.ts
deleted file mode 100644
index a3bd7b9d4..000000000
--- a/src/modules/esl-utils/dom/sanitize.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-/** checks if the attribute is dangerous */
-const isDangerousAttribute = (name: string, value: string): boolean => {
-  const val = value.replace(/\s+/g, '').toLowerCase();
-  if (['src', 'data', 'href', 'xlink:href'].includes(name)
-    && (val.includes('javascript:') || val.includes('data:text/html'))) return true;
-  return name.indexOf('on') === 0;
-};
-
-/** loops through each attribute, if it's dangerous, remove it */
-const removeDangerousAttributes = (el: Element): void => {
-  Array.from(el.attributes).forEach(({name, value}) => {
-    if (isDangerousAttribute(name, value)) {
-      el.removeAttribute(name);
-    }
-  });
-};
-
-/** removes malicious attributes from element and its children */
-const sanitizeElAttributes = (body: Element): void => {
-  Array.from(body.children).forEach((el) => {
-    removeDangerousAttributes(el);
-    sanitizeElAttributes(el);
-  });
-};
-
-/** removes script elements inside element */
-const removeScripts = (body: Element): void => {
-  const scripts = body.querySelectorAll('script');
-  Array.from(scripts).forEach((script) => script.remove());
-};
-
-const filterElements = (body: Element, allowedTopLevelTags: string[]): void => {
-  if (!allowedTopLevelTags.length) return;
-  Array.from(body.childNodes).forEach((el: Element) => {
-    if (!allowedTopLevelTags.includes(el.tagName)) body.removeChild(el);
-  });
-};
-
-/**
- * Sanitizes html string from malicious attributes, values, and scripts
- * Can also filter elements at the top nesting level by tag names.
- * @param html - html string to sanitize
- * @param allowedTopLevelTags - array of allowed tag names
- */
-export function sanitize(html: string, allowedTopLevelTags: string[] = []): string {
-  // converts the string to an HTML document
-  const parser = new DOMParser();
-  const doc = parser.parseFromString(html, 'text/html');
-  const body = doc.body || document.createElement('body');
-  // sanitizes html
-  removeScripts(body);
-  sanitizeElAttributes(body);
-  // filter allowed tags
-  filterElements(body, allowedTopLevelTags);
-
-  return body.innerHTML;
-}
diff --git a/src/modules/esl-utils/misc/format.ts b/src/modules/esl-utils/misc/format.ts
index eae4c727d..16b227166 100644
--- a/src/modules/esl-utils/misc/format.ts
+++ b/src/modules/esl-utils/misc/format.ts
@@ -22,12 +22,6 @@ export const unwrapParenthesis = (str: string): string => {
   return str.trim().replace(/^\((.*)\)$/, '$1').trim();
 };
 
-/** Parses `null` and `undefined` as an empty string */
-export const parseString = (val: string | null): string => String(val ?? '');
-
-/** Parses string representation of the boolean value */
-export const parseBoolean = (val: string | null): boolean => val !== null && val !== 'false';
-
 /**
  * Parses number with the ability to pass an alternative fallback for NaN.
  * Note: falsy values except 0 are treated as NaN
diff --git a/src/polyfills/list/es6.object.assign.ts b/src/polyfills/list/es6.object.assign.ts
index 61aaa5576..896959188 100644
--- a/src/polyfills/list/es6.object.assign.ts
+++ b/src/polyfills/list/es6.object.assign.ts
@@ -3,36 +3,17 @@
  * Target Browsers: `IE11`
  * Object.assign polyfill
  */
-function toObject(value: any): any {
-  if (value === undefined || value === null) throw new TypeError('Cannot convert undefined or null to object');
-  if (typeof value === 'boolean') return new Boolean(value);
-  if (typeof value === 'number') return new Number(value);
-  if (typeof value === 'string') return new String(value);
-  if (typeof value === 'symbol') return Object(value);
-  return value;
-}
-
-function copyProperty(from: any, to: any, name: string): void {
-  const desc = Object.getOwnPropertyDescriptor(from, name);
-  if (desc !== undefined && desc.enumerable) to[name] = from[name];
-}
-
 if (!Object.assign) {
   Object.assign = function assign(target: any, ...sources: any[]): any {
-    if (this instanceof Object.assign) throw new TypeError('Invoked as a constructor');
-    const to = toObject(target);
     for (let i = 0; i < sources.length; i++) {
-      const nextSource = sources[i];
-      if (nextSource !== undefined && nextSource !== null) {
-        const from = toObject(nextSource);
-        const keys = Object.getOwnPropertyNames(from);
-        keys.forEach(copyProperty.bind(null, from, to));
-        if (Object.getOwnPropertySymbols) {
-          const symbols = Object.getOwnPropertySymbols(from);
-          symbols.forEach(copyProperty.bind(null, from, to));
-        }
+      const source = sources[i];
+      if (!source || typeof source !== 'object' && typeof source !== 'function') continue;
+      const keys =  Object.keys(source);
+      for (let j = 0; j < keys.length; j++) {
+        const key = keys[j];
+        target[key] = source[key];
       }
     }
-    return to;
+    return target;
   };
 }


Test patch:
diff --git a/src/modules/esl-image/test/esl-image.test.ts b/src/modules/esl-image/test/esl-image.test.ts
deleted file mode 100644
index 048bce208..000000000
--- a/src/modules/esl-image/test/esl-image.test.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import {ESLImage} from '../core';
-import {mockXMLHttpRequest} from './xmlHttpRequest.mock';
-
-describe('ESLImageElement', () => {
-  describe('DOM XSS vulnerabilities in mode="inner-svg"', () => {
-
-    ESLImage.register('esl-image');
-    const el = new ESLImage();
-    el.src = 'http:/localhost/test.svg';
-    el.mode = 'inner-svg';
-    let mock: any;
-
-    beforeAll(() => {
-      mock = mockXMLHttpRequest();
-    });
-    afterAll(() => {
-      mock.cleanUp();
-    });
-
-    afterEach(() => {
-      if (!el.parentElement) return;
-      document.body.removeChild(el);
-    });
-
-    const SVG = '<svg><circle cx="5" cy="5" r="5"></circle></svg>';
-    const DANGER_ATTRS = '<svg onload="alert(document.cookie)"><circle cx="5" cy="5" r="5"></circle></svg>';
-    const DANGER_CONTENT_SCRIPT = '<svg><circle cx="5" cy="5" r="5"></circle><script>alert(\'xss\')</script></svg>';
-    // eslint-disable-next-line max-len
-    const DANGER_CONTENT_DATA_URI = '<svg><a xlink:href="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"><circle cx="5" cy="5" r="5"></circle></a></svg>';
-    const DANGER_CONTENT_LINK_HREF = '<svg><a href="javascript:alert(document.cookie)"><circle cx="5" cy="5" r="5"></circle></a></svg>';
-
-    test('load content from src and put it into innerHTML', () => {
-      mock.setData(SVG);
-      document.body.append(el);
-      expect(el.innerHTML).toBe(SVG);
-    });
-
-    test('SVG with dangerous on event attribute', () => {
-      mock.setData(DANGER_ATTRS);
-      document.body.append(el);
-      expect(el.innerHTML).toBe(SVG);
-    });
-
-    test('SVG with dangerous script in content', () => {
-      mock.setData(DANGER_CONTENT_SCRIPT);
-      document.body.append(el);
-      expect(el.innerHTML).toBe(SVG);
-    });
-
-    test('SVG with the link with malicious attr in content', () => {
-      mock.setData(DANGER_CONTENT_DATA_URI);
-      document.body.append(el);
-      expect(el.innerHTML).toBe('<svg><a><circle cx="5" cy="5" r="5"></circle></a></svg>');
-    });
-
-    test('SVG with the link with malicious href attr in content', () => {
-      mock.setData(DANGER_CONTENT_LINK_HREF);
-      document.body.append(el);
-      expect(el.innerHTML).toBe('<svg><a><circle cx="5" cy="5" r="5"></circle></a></svg>');
-    });
-
-    test('should load only SVG', () => {
-      mock.setData(`<a href="javascript:alert('xss')">Click me!</a>${SVG}`);
-      document.body.append(el);
-      expect(el.innerHTML).toBe(SVG);
-    });
-  });
-});
diff --git a/src/modules/esl-image/test/xmlHttpRequest.mock.ts b/src/modules/esl-image/test/xmlHttpRequest.mock.ts
deleted file mode 100644
index 71a5a26c1..000000000
--- a/src/modules/esl-image/test/xmlHttpRequest.mock.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-interface mockXMLHttpRequestController {
-  open: jest.Mock;
-  onreadystatechange: jest.Mock;
-  cleanUp: () => void;
-  setData: (newData: string, newStatus?: number, newReadyState?: number) => void;
-  send: jest.Mock;
-}
-
-interface mockedXMLHttpRequest {
-  open: jest.Mock;
-  onreadystatechange: jest.Mock;
-  send: jest.Mock;
-  readyState: number;
-  status: number;
-  responseText: string;
-}
-
-export function mockXMLHttpRequest(): mockXMLHttpRequestController  {
-  // mocked properties
-  let readyState = 4;
-  let status = 200;
-  let responseText: string = 'responseText from mocked XMLHttpRequest';
-
-  // mocked functions
-  const open = jest.fn();
-  const onreadystatechange = jest.fn();
-  const send = jest.fn(function send() {
-    this.onreadystatechange();
-  });
-
-  // set data to return on next request
-  function setData(newData: string, newStatus: number = 200, newReadyState: number = 4): void {
-    responseText = newData;
-    status = newStatus;
-    readyState = newReadyState;
-  }
-
-  // clean up mocked implementation
-  function cleanUp(): void {
-    if (window.XMLHttpRequest) {
-      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
-      // @ts-ignore
-      delete window.XMLHttpRequest;
-    }
-  }
-
-  // mock constructor that will replace window XMLHttpRequest
-  function mockConstructor(): mockedXMLHttpRequest {
-    return {
-      readyState,
-      status,
-      responseText,
-      open,
-      onreadystatechange,
-      send
-    };
-  }
-
-  // override/define XMLHttpRequest
-  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
-  // @ts-ignore
-  window.XMLHttpRequest = mockConstructor;
-
-  // returning necessary methods for further testing and functionality
-  return {
-    open,
-    onreadystatechange,
-    cleanUp,
-    setData,
-    send
-  };
-}
diff --git a/src/modules/esl-media-query/test/esl-media-rule-list.test.ts b/src/modules/esl-media-query/test/esl-media-rule-list.test.ts
index bf89f6abf..1c0f11f87 100644
--- a/src/modules/esl-media-query/test/esl-media-rule-list.test.ts
+++ b/src/modules/esl-media-query/test/esl-media-rule-list.test.ts
@@ -6,176 +6,167 @@ describe('ESLMediaRuleList', () => {
   const mockSmMatchMedia = getMatchMediaMock(ESLScreenBreakpoints.get('sm')!.mediaQuery);
   const mockMdMatchMedia = getMatchMediaMock(ESLScreenBreakpoints.get('md')!.mediaQuery);
 
-  describe('Integration cases:', () => {
-    test('Basic case: "1 | @sm => 2 | @md => 3" parsed correctly', () => {
-      const mrl = ESLMediaRuleList.parse('1 | @sm => 2 | @md => 3');
-      expect(mrl.rules.length).toBe(3);
-
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = false;
-      expect(mrl.active).toBeDefined();
-      expect(mrl.value).toBe('1');
-
-      mockSmMatchMedia.matches = true;
-      mockMdMatchMedia.matches = false;
-      expect(mrl.value).toBe('2');
-
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = true;
-      expect(mrl.value).toBe('3');
-
-      mockSmMatchMedia.matches = true;
-      mockMdMatchMedia.matches = true;
-      expect(mrl.value).toBe('3');
-    });
-
-    test('Extended media case parsed correctly: "1 | @sm and @md => 2"', () => {
-      const mrl = ESLMediaRuleList.parse('1 | @sm and @md => 2');
-      const listener = jest.fn();
-
-      expect(mrl.rules.length).toBe(2);
-
-      mrl.addEventListener(listener);
-
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = false;
-      expect(mrl.value).toBe('1');
-
-      mockSmMatchMedia.matches = true;
-      mockMdMatchMedia.matches = false;
-      expect(mrl.value).toBe('1');
-
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = true;
-      expect(mrl.value).toBe('1');
-      expect(listener).not.toBeCalled();
-
-      mockSmMatchMedia.matches = true;
-      mockMdMatchMedia.matches = true;
-      expect(mrl.value).toBe('2');
-      expect(listener).toBeCalled();
-    });
-
-    test('Extended media case parsed correctly: "1 | @sm or @md => 2"', () => {
-      const mrl = ESLMediaRuleList.parse('1 | @sm or @md => 2');
-      const listener = jest.fn();
-
-      expect(mrl.rules.length).toBe(2);
-
-      mrl.addEventListener(listener);
-
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = false;
-      expect(mrl.value).toBe('1');
-      expect(listener).not.toBeCalled();
-
-      mockSmMatchMedia.matches = true;
-      mockMdMatchMedia.matches = false;
-      expect(mrl.value).toBe('2');
-      expect(listener).toBeCalled();
-
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = true;
-      expect(mrl.value).toBe('2');
-
-      mockSmMatchMedia.matches = true;
-      mockMdMatchMedia.matches = true;
-      expect(mrl.value).toBe('2');
-    });
-
-    test('Tuple media query "all|@sm|@md ==> 1|2|3" correctly parsed', () => {
-      const mrl = ESLMediaRuleList.parseTuple('all|@sm|@md', '1|2|3');
-      expect(mrl.rules.length).toBe(3);
-
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = false;
-      expect(mrl.value).toBe('1');
-
-      mockSmMatchMedia.matches = true;
-      mockMdMatchMedia.matches = false;
-      expect(mrl.value).toBe('2');
-
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = true;
-      expect(mrl.value).toBe('3');
-
-      mockSmMatchMedia.matches = true;
-      mockMdMatchMedia.matches = true;
-      expect(mrl.value).toBe('3');
-    });
-
-    afterEach(() => {
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = false;
-    });
+  test('123 (default)', () => {
+    const mrl = ESLMediaRuleList.parse('123');
+    expect(mrl.rules.length).toBe(1);
+    expect(mrl.active.length).toBeGreaterThan(0);
+    expect(mrl.value).toBe('123');
+    expect(mrl.activeValue).toBe('123');
   });
 
-  describe('Basic cases:', () => {
-    test('Single value parsed to the single "all" rule', () => {
-      const mrl = ESLMediaRuleList.parse('123');
-      expect(mrl.rules.length).toBe(1);
-      expect(mrl.active.length).toBeGreaterThan(0);
-      expect(mrl.value).toBe('123');
-      expect(mrl.activeValue).toBe('123');
-    });
-
-    test('Single rule with media query "@sm => 1"', () => {
-      const mrl = ESLMediaRuleList.parse('@sm => 1');
-      expect(mrl.rules.length).toBe(1);
-    });
-
-    test('Single rule "@sm => 1" response to the matcher correctly', () => {
-      const mrl = ESLMediaRuleList.parse('@sm => 1');
-
-      mockSmMatchMedia.matches = false;
-      expect(mrl.value).toBe(undefined);
-
-      mockSmMatchMedia.matches = true;
-      expect(mrl.value).toBe('1');
-
-      mockSmMatchMedia.matches = false;
-      expect(mrl.value).toBe(undefined);
-    });
-
-    afterEach(() => {
-      mockSmMatchMedia.matches = false;
-      mockMdMatchMedia.matches = false;
-    });
+  test('@sm => 1', () => {
+    const mrl = ESLMediaRuleList.parse('@sm => 1');
+    expect(mrl.rules.length).toBe(1);
+
+    mockSmMatchMedia.matches = false;
+    expect(mrl.value).toBe(undefined);
+
+    mockSmMatchMedia.matches = true;
+    expect(mrl.value).toBe('1');
+
+    mockSmMatchMedia.matches = false;
+    expect(mrl.value).toBe(undefined);
+  });
+
+  test('1 | @sm => 2 | @md => 3', () => {
+    const mrl = ESLMediaRuleList.parse('1 | @sm => 2 | @md => 3');
+    expect(mrl.rules.length).toBe(3);
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.active).toBeDefined();
+    expect(mrl.value).toBe('1');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('2');
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('3');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('3');
+  });
+
+  test('1 | @sm and @md => 2', () => {
+    const mrl = ESLMediaRuleList.parse('1 | @sm and @md => 2');
+    const listener = jest.fn();
+
+    expect(mrl.rules.length).toBe(2);
+
+    mrl.addEventListener(listener);
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('1');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('1');
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('1');
+    expect(listener).not.toBeCalled();
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('2');
+    expect(listener).toBeCalled();
+  });
+
+  test('1 | @sm or @md => 2', () => {
+    const mrl = ESLMediaRuleList.parse('1 | @sm or @md => 2');
+    const listener = jest.fn();
+
+    expect(mrl.rules.length).toBe(2);
+
+    mrl.addEventListener(listener);
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('1');
+    expect(listener).not.toBeCalled();
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('2');
+    expect(listener).toBeCalled();
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('2');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('2');
+  });
+
+  test('all|@sm|@md ==> 1|2|3', () => {
+    const mrl = ESLMediaRuleList.parseTuple('all|@sm|@md', '1|2|3');
+    expect(mrl.rules.length).toBe(3);
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('1');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('2');
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('3');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('3');
+  });
+  test('all|@sm|@md ==> 1|2', () => {
+    const mrl = ESLMediaRuleList.parseTuple('all|@sm|@md', '1|2');
+    expect(mrl.rules.length).toBe(3);
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('1');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('2');
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('2');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('2');
+  });
+  test('all|@sm|@md ==> 1', () => {
+    const mrl = ESLMediaRuleList.parseTuple('all|@sm|@md', '1');
+    expect(mrl.rules.length).toBe(3);
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('1');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = false;
+    expect(mrl.value).toBe('1');
+
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('1');
+
+    mockSmMatchMedia.matches = true;
+    mockMdMatchMedia.matches = true;
+    expect(mrl.value).toBe('1');
   });
 
-  describe('Partial tuple parsing', () => {
-    test('Single value is accepted and copied for each condition', () => {
-      const ruleList = ESLMediaRuleList.parseTuple('@sm|@md|@lg', '123');
-      expect(ruleList.rules.length).toBe(3);
-      for (const rule of ruleList.rules) {
-        expect(rule.payload).toBe('123');
-      }
-    });
-
-    test('Partial value parsing leads to autocomplete values with the last one', () => {
-      const ruleList = ESLMediaRuleList.parseTuple('@sm|@md|@lg', '1 | 12');
-      expect(ruleList.rules.length).toBe(3);
-      expect(ruleList.rules[0].payload).toBe('1');
-      expect(ruleList.rules[1].payload).toBe('12');
-      expect(ruleList.rules[2].payload).toBe('12');
-    });
-
-    test('Empty value to be parsed aas empty sting', () => {
-      const ruleList = ESLMediaRuleList.parseTuple('(min-width: 100px)', '');
-      expect(ruleList.rules.length).toBe(1);
-      expect(ruleList.rules[0].payload).toBe('');
-      expect(ruleList.rules[0].query.toString()).toBe('(min-width: 100px)');
-    });
-
-    test('Empty mask leads to all query', () => {
-      const ruleList = ESLMediaRuleList.parseTuple('', '');
-      expect(ruleList.rules.length).toBe(1);
-      expect(ruleList.rules[0].payload).toBe('');
-      expect(ruleList.rules[0].query.toString()).toBe('all');
-    });
-
-    test('Values cortege longer then mask cortege is not allowed', () => {
-      expect(() => ESLMediaRuleList.parseTuple('@xs', '1|2|3')).toThrowError();
-    });
+  afterEach(() => {
+    mockSmMatchMedia.matches = false;
+    mockMdMatchMedia.matches = false;
   });
 });
diff --git a/src/modules/esl-media-query/test/esl-screen-breakpoint.test.ts b/src/modules/esl-media-query/test/esl-screen-breakpoint.test.ts
index 9351f81ab..9f595eb68 100644
--- a/src/modules/esl-media-query/test/esl-screen-breakpoint.test.ts
+++ b/src/modules/esl-media-query/test/esl-screen-breakpoint.test.ts
@@ -1,80 +1,34 @@
 import {ESLScreenBreakpoints} from '../core';
 
 describe('ESLScreenBreakpoint tests', () => {
-  const {add, get} = ESLScreenBreakpoints;
-
-  test(
-    'Get un-existing shortcut returs undefined',
-    () => expect(get('some')).toBeUndefined()
-  );
-
   test('Get all breakpoints (default)', () => {
     expect(new Set(ESLScreenBreakpoints.names)).toEqual(new Set(['xs', 'sm', 'md', 'lg', 'xl']));
   });
 
-  test(
-    'Add custom breakpoint "SMALL"',
-    () => expect(add('SMALL', 300, 400)).toBeUndefined()
-  );
-  test(
-    'Get custom breakpoint "SMALL" regular query',
-    () => expect(get('SMALL')?.mediaQuery).toBe('(min-width: 300px) and (max-width: 400px)')
-  );
-
-  test(
-    'Get custom breakpoint "SMALL" ge query',
-    () => expect(get('SMALL')?.mediaQueryGE).toBe('(min-width: 300px)')
-  );
-
-  test(
-    'Get custom breakpoint "SMALL" le query',
-    () => expect(get('SMALL')?.mediaQueryLE).toBe('(max-width: 400px)')
-  );
-
-  test(
-    'Replace custom breakpoint "SMALL"',
-    () => expect(add('Small', 400, 500)?.mediaQuery)
-      .toBe('(min-width: 300px) and (max-width: 400px)')
-  );
-  test(
-    'Get updated custom breakpoint "SMALL" regular query',
-    () => expect(get('small')?.mediaQuery).toBe('(min-width: 400px) and (max-width: 500px)')
-  );
-
-  test(
-    'Add default custom breakpoint "xs"',
-    () => expect(add('xs', 11, 22)).not.toBeUndefined()
-  );
-
-  test(
-    'Check that default custom breakpoint "xs" updated',
-    () => expect(get('xs')?.mediaQuery).toBe('(min-width: 11px) and (max-width: 22px)')
-  );
+  test('add and get custom breakpoints tests', () => {
+    expect(ESLScreenBreakpoints.add('SMALL', 300, 400)).toBeUndefined();
+    expect(ESLScreenBreakpoints.get('SMALL')?.mediaQuery).toBe('(min-width: 300px) and (max-width: 400px)');
+    expect(ESLScreenBreakpoints.get('SMALL')?.mediaQueryGE).toBe('(min-width: 300px)');
+    expect(ESLScreenBreakpoints.get('SMALL')?.mediaQueryLE).toBe('(max-width: 400px)');
+    expect(ESLScreenBreakpoints.add('Small', 400, 500)?.mediaQuery)
+      .toBe('(min-width: 300px) and (max-width: 400px)');
+    expect(ESLScreenBreakpoints.get('small')?.mediaQuery).toBe('(min-width: 400px) and (max-width: 500px)');
+    ESLScreenBreakpoints.add('xs', 11, 22);
+    expect(ESLScreenBreakpoints.get('xs')?.mediaQuery).toBe('(min-width: 11px) and (max-width: 22px)');
+  });
 
   test('Get all breakpoints after adding custom', () => {
     expect(new Set(ESLScreenBreakpoints.names))
       .toEqual(new Set(['xs', 'sm', 'md', 'lg', 'xl', 'small']));
   });
 
-  test(
-    'Empty keys is not allowed in custom breakpoint name',
-    () => expect(() => add('', 200, 300)).toThrowError()
-  );
-  test(
-    'Non-Latin keys are not allowed in custom breakpoint name',
-    () => expect(() => add('небольшой', 200, 300)).toThrowError()
-  );
-  test(
-    'Extra "@" is not allowed in custom breakpoint name',
-    () => expect(() => add('@XS', 200, 300)).toThrowError()
-  );
-  test(
-    'Numeric key is not allowed in custom breakpoint name',
-    () => expect(() => add('123', 200, 300)).toThrowError()
-  );
-
-  test(
-    'Digits allowed as part of regular custom breakpoint name',
-    () => expect(() => add('xs123', 200, 300)).not.toThrowError()
-  );
+  test('Error tests', () => {
+    const testFn = ESLScreenBreakpoints.add;
+    expect(() => testFn('небольшой', 200, 300)).toThrowError();
+    expect(() => testFn('@XS', 200, 300)).toThrowError();
+    expect(() => testFn('', 200, 300)).toThrowError();
+    expect(() => testFn('234', 200, 300)).toThrowError();
+    expect(() => testFn('XS2', 200, 300)).not.toThrowError();
+    expect(ESLScreenBreakpoints.get('some')).toBeUndefined();
+  });
 });
diff --git a/src/modules/esl-trigger/test/esl-trigger.a11y.test.ts b/src/modules/esl-trigger/test/esl-trigger.a11y.test.ts
deleted file mode 100644
index 81b2fb6a1..000000000
--- a/src/modules/esl-trigger/test/esl-trigger.a11y.test.ts
+++ /dev/null
@@ -1,173 +0,0 @@
-import '../../../polyfills/es5-target-shim';
-import {SyntheticEventTarget} from '../../esl-utils/dom/events/target';
-import {EventUtils} from '../../esl-utils/dom/events/utils';
-import {ESLTrigger} from '../core/esl-trigger';
-import type {ESLToggleable} from '../../esl-toggleable/core/esl-toggleable';
-
-function createTargetMock(init: Partial<ESLToggleable> = {}): ESLToggleable {
-  const et = new SyntheticEventTarget();
-  return Object.assign(et, {
-    show: jest.fn(function () {
-      this.open = true;
-      EventUtils.dispatch(this, 'esl:show');
-    }),
-    hide: jest.fn(function () {
-      this.open = false;
-      EventUtils.dispatch(this, 'esl:hide');
-    }),
-    open: false
-  }, init) as any;
-}
-
-describe('esl-trigger a11y attributes test', () => {
-  const LABEL_ATTR = 'aria-label';
-
-  beforeAll(() => {
-    ESLTrigger.register();
-  });
-
-  describe(
-    'a11yLabelActive attribute basic tests',
-    () => {
-      const trigger = document.createElement(ESLTrigger.is) as ESLTrigger;
-
-      beforeAll(() => {
-        trigger.a11yLabelActive = 'active';
-        document.body.append(trigger);
-        trigger.$target = createTargetMock();
-      });
-
-      test(
-        '"aria-label" should be empty in initial state',
-        () => expect(trigger.getAttribute(LABEL_ATTR)).toBeNull()
-      );
-
-      test(
-        '"aria-label" should be set to `a11yLabelActive` value when target becomes active',
-        () => {
-          trigger.$target?.show();
-          expect(trigger.getAttribute(LABEL_ATTR)).toBe('active');
-        }
-      );
-
-      test(
-        '"aria-label" should be empty after the target becomes inactive',
-        () => {
-          trigger.$target?.hide();
-          expect(trigger.getAttribute(LABEL_ATTR)).toBeNull();
-        }
-      );
-
-      afterAll(() => document.body.removeChild(trigger));
-    }
-  );
-
-  describe(
-    'a11yLabelInactive attribute basic tests',
-    () => {
-      const trigger = document.createElement(ESLTrigger.is) as ESLTrigger;
-
-      beforeAll(() => {
-        trigger.a11yLabelInactive = 'inactive';
-        document.body.append(trigger);
-        trigger.$target = createTargetMock();
-      });
-
-      test(
-        '"aria-label" should be set to a11yLabelInactive in initial state',
-        () => expect(trigger.getAttribute(LABEL_ATTR)).toBe('inactive')
-      );
-
-      test(
-        '"aria-label" should be empty when target becomes active',
-        () => {
-          trigger.$target?.show();
-          expect(trigger.getAttribute(LABEL_ATTR)).toBeNull();
-        }
-      );
-
-      test(
-        '"aria-label" should be set to a11yLabelInactive after the target becomes inactive',
-        () => {
-          trigger.$target?.hide();
-          expect(trigger.getAttribute(LABEL_ATTR)).toBe('inactive');
-        }
-      );
-
-      afterAll(() => document.body.removeChild(trigger));
-    }
-  );
-
-  // TODO: split on separate tests for initial state and test for attributes conflict
-  describe(
-    'a11yLabelActive and a11yLabelInactive are both present (+ initially active flow)',
-    () => {
-      const trigger = document.createElement(ESLTrigger.is) as ESLTrigger;
-
-      beforeAll(() => {
-        trigger.a11yLabelActive = 'active';
-        trigger.a11yLabelInactive = 'inactive';
-        document.body.append(trigger);
-        trigger.$target = createTargetMock({open: true});
-      });
-
-      test(
-        '"aria-label" should be set to a11yLabelActive in initial state for initially active target',
-        () => expect(trigger.getAttribute(LABEL_ATTR)).toBe('active')
-      );
-      test(
-        '"aria-label" should be set to a11yLabelInactive after the target becomes inactive',
-        () => {
-          trigger.$target?.hide();
-          expect(trigger.getAttribute(LABEL_ATTR)).toBe('inactive');
-        }
-      );
-      test(
-        '"aria-label" should be set to a11yLabelActive when target becomes active',
-        () => {
-          trigger.$target?.show();
-          expect(trigger.getAttribute(LABEL_ATTR)).toBe('active');
-        }
-      );
-
-      afterAll(() => document.body.removeChild(trigger));
-    }
-  );
-
-  describe(
-    'a11yLabelInactive and a11yLabelActive attributes are not specified',
-    () => {
-      const INIT_VAL = 'test-init-val';
-      const trigger = document.createElement(ESLTrigger.is) as ESLTrigger;
-
-      beforeAll(() => {
-        trigger.setAttribute(LABEL_ATTR, INIT_VAL);
-        document.body.append(trigger);
-        trigger.$target = createTargetMock();
-      });
-
-      test(
-        '"aria-label" should have initial value on start',
-        () => expect(trigger.getAttribute(LABEL_ATTR)).toBe(INIT_VAL)
-      );
-
-      test(
-        '"aria-label" should have initial value when target becomes active',
-        () => {
-          trigger.$target?.show();
-          expect(trigger.getAttribute(LABEL_ATTR)).toBe(INIT_VAL);
-        }
-      );
-
-      test(
-        '"aria-label" should have initial value after the target becomes inactive',
-        () => {
-          trigger.$target?.hide();
-          expect(trigger.getAttribute(LABEL_ATTR)).toBe(INIT_VAL);
-        }
-      );
-
-      afterAll(() => document.body.removeChild(trigger));
-    }
-  );
-});
diff --git a/src/modules/esl-utils/decorators/test/attr.test.ts b/src/modules/esl-utils/decorators/test/attr.test.ts
index 15be8e549..d7e91d8d8 100644
--- a/src/modules/esl-utils/decorators/test/attr.test.ts
+++ b/src/modules/esl-utils/decorators/test/attr.test.ts
@@ -1,6 +1,5 @@
 import '../../../../polyfills/es5-target-shim';
-import {attr} from '../attr';
-import {parseBoolean} from '../../misc/format';
+import {attr, toBoolean, toNumber} from '../attr';
 
 describe('Decorator: attr', () => {
 
@@ -20,9 +19,9 @@ describe('Decorator: attr', () => {
     @attr({defaultValue: 'def'})
     public defField: string | boolean;
 
-    @attr({parser: parseFloat})
+    @attr({parser: toNumber})
     public attrNumber: number;
-    @attr({parser: parseBoolean, serializer: Boolean})
+    @attr({parser: toBoolean, serializer: Boolean})
     public attrBoolean: boolean;
   }
   customElements.define('test-el-attr', TestElement);
diff --git a/src/modules/esl-utils/dom/test/sanitize.test.ts b/src/modules/esl-utils/dom/test/sanitize.test.ts
deleted file mode 100644
index c8d8c0371..000000000
--- a/src/modules/esl-utils/dom/test/sanitize.test.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import {sanitize} from '../sanitize';
-
-describe('sanitize', () => {
-  test('should return the original markup', () => {
-    const markup = '<div><p>Text</p></div>';
-    const html = sanitize(markup);
-    expect(html).toBe(markup);
-  });
-
-  test('should clean dangerous script', () => {
-    const markup = '<div><p>Text</p></div>';
-    const html = sanitize(`<script>alert(document.cookie)</script>${markup}`);
-    expect(html).toBe(markup);
-  });
-
-  test('should clean dangerous script inside another elements', () => {
-    const html = sanitize('<div><div><script>alert(document.cookie)</script></div></div>');
-    expect(html).toBe('<div><div></div></div>');
-  });
-
-  test('should clean dangerous on event attributes', () => {
-    const markup = '<div><p>Text</p></div>';
-    const html = sanitize(`${markup}<img src="x" onerror="alert(document.cookie)">`);
-    expect(html).toBe(`${markup}<img src="x">`);
-  });
-
-  test('should clean dangerous href attribute with javascript content', () => {
-    const markup = '<div><p>Text</p></div>';
-    const html = sanitize(`<a href="javascript:alert(document.cookie)">${markup}</a>`);
-    expect(html).toBe(`<a>${markup}</a>`);
-  });
-
-  test('should clean dangerous src attribute with data-uri text/html content', () => {
-    const html = sanitize('<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"></iframe>');
-    expect(html).toBe('<iframe></iframe>');
-  });
-
-  test('should clean dangerous data attribute with data-uri text/html content', () => {
-    const html = sanitize('<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"></object>');
-    expect(html).toBe('<object></object>');
-  });
-
-  test('should clean dangerous xlink:href attributes with data-uri text/html content', () => {
-    const markup = '<rect width="100" height="100"></rect>';
-    const html = sanitize(`<a xlink:href="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">${markup}</a>`);
-    expect(html).toBe(`<a>${markup}</a>`);
-  });
-
-  test('should filter first level elements by tags', () => {
-    const html = sanitize('<h1>Title</h1><h2>Header</h2><div><p>Text</p></div>', ['H1']);
-    expect(html).toBe('<h1>Title</h1>');
-  });
-
-  test('should filter elements only at first level', () => {
-    const html = sanitize('<div><p>Text</p></div><p>Another text</p>', ['P']);
-    expect(html).toBe('<p>Another text</p>');
-  });
-});
diff --git a/src/modules/esl-utils/misc/test/format.test.ts b/src/modules/esl-utils/misc/test/format.test.ts
index 77fa80a8b..ce4057640 100644
--- a/src/modules/esl-utils/misc/test/format.test.ts
+++ b/src/modules/esl-utils/misc/test/format.test.ts
@@ -6,9 +6,7 @@ import {
   parseAspectRatio,
   evaluate,
   format,
-  parseNumber,
-  parseBoolean,
-  parseString
+  parseNumber
 } from '../format';
 
 describe('misc/format helper tests', () => {
@@ -98,34 +96,6 @@ describe('misc/format helper tests', () => {
     });
   });
 
-  describe('parseBoolean', () => {
-    test.each([
-      [null, false],
-      ['false', false],
-      ['', true],
-      ['true', true],
-      ['0', true],
-      ['1', true],
-      ['brr', true]
-    ])(
-      'args = %p, result: %p',
-      (args, exp) => expect(parseBoolean.call(null, args)).toBe(exp)
-    );
-  });
-
-  describe('parseString', () => {
-    test.each([
-      [undefined, ''],
-      [null, ''],
-      ['false', 'false'],
-      ['', ''],
-      ['true', 'true']
-    ])(
-      'args = %p, result: %p',
-      (args, exp) => expect(parseString.call(null, args)).toBe(exp)
-    );
-  });
-
   describe('parseNumber', () => {
     test.each([
       [['123'], 123],
diff --git a/src/polyfills/test/es6.object.assign.test.ts b/src/polyfills/test/es6.object.assign.test.ts
deleted file mode 100644
index 58d1aa741..000000000
--- a/src/polyfills/test/es6.object.assign.test.ts
+++ /dev/null
@@ -1,394 +0,0 @@
-const originalAssignFn = Object.assign;
-Object.defineProperty(Object, 'assign', {writable: true, value: undefined});
-import '../list/es6.object.assign';
-
-class TestError extends Error {}
-
-afterAll(() => {
-  Object.assign = originalAssignFn;
-});
-
-describe('Object.assign() polyfill', () => {
-  test('object override sameproperty', () => {
-    // Object properties are assigned to target in ascending index order,
-    // i.e. a later assignment to the same property overrides an earlier assignment.
-    const target = {a: 1};
-    const result = Object.assign(target, {a: 2}, {a: 'c'});
-    expect(result.a).toBe('c');
-  });
-
-  test('only one argument', () => {
-    // Should return ToObject(target)
-    const target = 'a';
-    const result = Object.assign(target as any);
-    expect(typeof result).toBe('object');
-    expect(result.valueOf()).toEqual('a');
-  });
-
-  test('override notstringtarget', () => {
-    // Every string from sources will be wrapped to objects, and override from the first letter(result[0]) all the time
-    const target = 12;
-    const result = Object.assign(target, 'aaa', 'bb2b', '1c');
-    expect(Object.getOwnPropertyNames(result).length).toBe(4);
-    expect(result[0]).toBe('1');
-    expect(result[1]).toBe('c');
-    expect(result[2]).toBe('2');
-    expect(result[3]).toBe('b');
-  });
-
-  test('override', () => {
-    const target = {a: 1};
-    /*
-    '1a2c3' have own enumerable properties, so it Should be wrapped to objects;
-    {b:6} is an object,should be assigned to final object.
-    undefined and null should be ignored;
-    125 is a number,it cannot has own enumerable properties;
-    {a:'c'},{a:5} will override property a, the value should be 5.
-    */
-    const result = Object.assign(target, '1a2c3', {a: 'c'}, undefined, {b: 6}, null, 125, {a: 5});
-    expect(Object.getOwnPropertyNames(result).length).toBe(7);
-    expect(result.a).toBe(5);
-    expect(result[0]).toBe('1');
-    expect(result[1]).toBe('a');
-    expect(result[2]).toBe('2');
-    expect(result[3]).toBe('c');
-    expect(result[4]).toBe('3');
-    expect(result.b).toBe(6);
-  });
-
-  test('source is Null Undefined', () => {
-    const target = new Object();
-    // null and undefined source should be ignored, result should be original object.
-    const result = Object.assign(target, undefined, null);
-    expect(result).toEqual(target);
-  });
-
-  test('source is Number Boolean Symbol', () => {
-    const target = new Object();
-    /*
-    Number, Boolean, and Symbol cannot have their own enumerable properties,
-    so cannot be Assigned. Here result should be the original object.
-    */
-    const result = Object.assign(target, 123, true, Symbol('foo'));
-    expect(result).toEqual(target);
-  });
-
-  test('source is String', () => {
-    const target = new Object();
-    // string have own enumerable properties, so it can be wrapped to objects.
-    const result = Object.assign(target, '123');
-    expect(result[0]).toBe('1');
-    expect(result[1]).toBe('2');
-    expect(result[2]).toBe('3');
-  });
-
-  test('target is Boolean', () => {
-    // if target is Boolean,the return value should be a new object whose value is target.
-    const result = Object.assign(true, {a: 2});
-    expect(typeof result).toBe('object');
-    expect(result.valueOf()).toEqual(true);
-  });
-
-  test('target is Null', () => {
-    // if target is null, should throw a TypeError exception.
-    // @ts-ignore
-    expect(() => Object.assign(null, {a: 1})).toThrow(TypeError);
-  });
-
-  test('target is Number', () => {
-    // if target is Number, the return value should be a new object whose value is target.
-    const result = Object.assign(1, {a: 2});
-    expect(typeof result).toBe('object');
-    expect(result.valueOf()).toEqual(1);
-  });
-
-  test('target is Object', () => {
-    const target = {foo: 1};
-    // if target is Object, its properties will be the properties of new object.
-    const result = Object.assign(target, {a: 2});
-    expect(typeof result).toBe('object');
-    expect(result.a).toEqual(2);
-    expect(result.foo).toEqual(1);
-  });
-
-  test('target is String', () => {
-    // if target is String, the return value should be a new object whose value is target.
-    const result = Object.assign('1', {a: 2});
-    expect(typeof result).toBe('object');
-    expect(result.valueOf()).toEqual('1');
-  });
-
-  test('target is Symbol', () => {
-    // if target is Symbol, the return value should be a new Symbol object whose [[SymbolData]] value is target.
-    const target = Symbol('foo');
-    const result = Object.assign(target, {a: 1});
-    expect(typeof result).toBe('object');
-    expect(result.toString()).toEqual('Symbol(foo)');
-  });
-
-  test('target is Undefined', () => {
-    // if target is Undefined, should throw a TypeError exception.
-    // @ts-ignore
-    expect(() => Object.assign(undefined, {a: 1})).toThrow(TypeError);
-  });
-
-  test('assign descriptor', () => {
-    const descriptor = Object.getOwnPropertyDescriptor(Object, 'assign');
-    expect(descriptor).toHaveProperty('writable', true);
-    expect(descriptor).toHaveProperty('enumerable', false);
-    expect(descriptor).toHaveProperty('configurable', true);
-  });
-
-  test('assignment to readonly property of target must throw a typeerror exception', () => {
-    // Assignment to readonly property of target must throw a TypeError exception
-    expect(() => Object.assign('a', [1])).toThrow(TypeError);
-  });
-
-  test('invoked as constructor', () => {
-    /*
-    Built-in function objects that are not identified as constructors do not
-    implement the [[Construct]] internal method unless otherwise specified in
-    the description of a particular function.
-    */
-    expect(() => {
-      // @ts-ignore
-      new Object.assign({});
-    }).toThrow(TypeError);
-  });
-
-  test('assign name', () => {
-    /*
-    ES6 Section 17:
-    Every built-in Function object, including constructors, that is not
-    identified as an anonymous function has a name property whose value is a
-    String. Unless otherwise specified, this value is the name that is given to
-    the function in this specification.
-    [...]
-    Unless otherwise specified, the name property of a built-in Function
-    object, if it exists, has the attributes { [[Writable]]: false,
-    [[Enumerable]]: false, [[Configurable]]: true }.
-    */
-    expect(Object.assign.name).toBe('assign');
-    const descriptor = Object.getOwnPropertyDescriptor(Object.assign, 'name');
-    expect(descriptor).toHaveProperty('writable', false);
-    expect(descriptor).toHaveProperty('enumerable', false);
-    expect(descriptor).toHaveProperty('configurable', true);
-  });
-
-  test('source - get attributes error', () => {
-    // Errors thrown during retrieval of source object attributes
-    const source = {
-      get attr() {throw new TestError();}
-    };
-    expect(() => Object.assign({}, source)).toThrow(TestError);
-  });
-
-  test('source - non-enumerable', () => {
-    // Does not assign non-enumerable source properties
-    const target = {};
-    const source = Object.defineProperty({}, 'attr', {value: 1, enumerable: false});
-    const result = Object.assign(target, source);
-
-    expect(Object.hasOwnProperty.call(target, 'attr')).toBe(false);
-    expect(result).toEqual(target);
-  });
-
-  test('source - own property error', () => {
-    // Invoked with a source whose own property descriptor cannot be retrieved
-    const source = new Proxy({
-      attr: null
-    }, {
-      getOwnPropertyDescriptor: () => {
-        throw new TestError();
-      }
-    });
-    expect(() => Object.assign({}, source)).toThrow(TestError);
-  });
-
-  test('source - own property keys error', () => {
-    // Invoked with a source whose own property keys cannot be retrieved
-    const source = new Proxy({}, {
-      ownKeys: () => { throw new TestError(); }
-    });
-    expect(() => Object.assign({}, source)).toThrow(TestError);
-  });
-
-  test('strings and symbol order', () => {
-    // Symbol-valued properties are copied after String-valued properties.
-    const log: string[] = [];
-    const sym1 = Symbol('x');
-    const sym2 = Symbol('y');
-    const source = {};
-
-    Object.defineProperty(source, sym1, {
-      get: () => log.push('get sym(x)'),
-      enumerable: true, configurable: true,
-    });
-    Object.defineProperty(source, 'a', {
-      get: () => log.push('get a'),
-      enumerable: true, configurable: true,
-    });
-    Object.defineProperty(source, sym2, {
-      get: () => log.push('get sym(y)'),
-      enumerable: true, configurable: true,
-    });
-    Object.defineProperty(source, 'b', {
-      get: () => log.push('get b'),
-      enumerable: true, configurable: true,
-    });
-
-    Object.assign({}, source);
-    expect(log).toEqual(['get a', 'get b', 'get sym(x)', 'get sym(y)']);
-  });
-
-  test('target is frozen accessor property set succeeds', () => {
-    // [[Set]] to accessor property of frozen `target` succeeds.
-    let value1 = 1;
-    const target1 = {
-      set foo(val: any) { value1 = val; },
-    };
-    Object.freeze(target1);
-    Object.assign(target1, {foo: 2});
-    expect(value1).toBe(2);
-
-    const sym = Symbol();
-    let value2 = 1;
-    const target2 = Object.freeze({
-      set [sym](val: any) { value2 = val; },
-    });
-    Object.freeze(target2);
-    Object.assign(target2, {[sym]: 2});
-    expect(value2).toBe(2);
-  });
-
-  test('target is frozen data property set throws', () => {
-    // [[Set]] to data property of frozen `target` fails with TypeError.
-    const sym = Symbol();
-    const target1 = {[sym]: 1};
-    Object.freeze(target1);
-    expect(() => Object.assign(target1, {[sym]: 1})).toThrow(TypeError);
-
-    const target2 = Object.freeze({foo: 1});
-    expect(() => Object.assign(target2, {foo: 1})).toThrow(TypeError);
-  });
-
-  test('target is non extensible existing accessor property', () => {
-    // [[Set]] to existing accessor property of non-extensible `target` is successful.
-    let value1 = 1;
-    const target1 = Object.preventExtensions({
-      set foo(val: any) { value1 = val; },
-    });
-    Object.assign(target1, {foo: 2});
-    expect(value1).toBe(2);
-
-    const sym = Symbol();
-    let value2 = 1;
-    const target2 = {
-      set [sym](val: any) { value2 = val; },
-    };
-    Object.preventExtensions(target2);
-    Object.assign(target2, {[sym]: 2});
-    expect(value2).toBe(2);
-  });
-
-  test('target is non extensible existing data property', () => {
-    // [[Set]] to existing data property of non-extensible `target` is successful.
-    const target1 = Object.preventExtensions({foo: 1});
-    Object.assign(target1, {foo: 2});
-    expect(target1.foo).toBe(2);
-
-    const sym = Symbol();
-    const target2 = {[sym]: 1};
-    Object.preventExtensions(target2);
-    Object.assign(target2, {[sym]: 2});
-    expect(target2[sym]).toBe(2);
-  });
-
-  test('target is non-extensible property creation throws', () => {
-    // [[Set]] to non-existing property of non-extensible `target` fails with TypeError.
-    const target1 = Object.preventExtensions({foo: 1});
-    expect(() => Object.assign(target1, {get bar() {return;}})).toThrow(TypeError);
-
-    const target2 = {};
-    Object.preventExtensions(target2);
-    expect(() => Object.assign(target2, {[Symbol()]: 1})).toThrow(TypeError);
-  });
-
-  test('target is sealed existing accessor property', () => {
-    // [[Set]] to existing accessor property of sealed `target` is successful.
-    let value1 = 1;
-    const target1 = Object.seal({
-      set foo(val: any) { value1 = val; }
-    });
-    Object.assign(target1, {foo: 2});
-    expect(value1).toBe(2);
-
-    const sym = Symbol();
-    let value2 = 1;
-    const target2 = {
-      set [sym](val: any) { value2 = val; }
-    };
-    Object.seal(target2);
-    Object.assign(target2, {[sym]: 2});
-    expect(value2).toBe(2);
-  });
-
-  test('target is sealed existing data property', () => {
-    // [[Set]] to existing data property of sealed `target` is successful.
-    const target1 = Object.seal({foo: 1});
-    Object.assign(target1, {foo: 2});
-    expect(target1.foo).toBe(2);
-
-    const sym = Symbol();
-    const target2 = {[sym]: 1};
-    Object.seal(target2);
-    Object.assign(target2, {[sym]: 2});
-    expect(target2[sym]).toBe(2);
-  });
-
-  test('target is sealed property creation throws', () => {
-    // [[Set]] to non-existing property of sealed `target` fails with TypeError.
-    const target1 = Object.seal({foo: 1});
-    expect(() => Object.assign(target1, {get bar() {return;}})).toThrow(TypeError);
-
-    const target2 = {};
-    Object.seal(target2);
-    expect(() => Object.assign(target2, {[Symbol()]: 1})).toThrow(TypeError);
-  });
-
-  test('target set not-writable', () => {
-    // Errors thrown during definition of target object attributes
-    const target = {};
-    Object.defineProperty(target, 'attr', {writable: false});
-    expect(() => Object.assign(target, {attr: 1})).toThrow(TypeError);
-  });
-
-  test('target set user error', () => {
-    // Errors thrown during definition of target object attributes
-    const target = {};
-    Object.defineProperty(target, 'attr', {
-      set: (_) => { throw new TestError(); }
-    });
-    expect(() => Object.assign(target, {attr: 1})).toThrow(TestError);
-  });
-
-  test('prototype pollution via __proto__', () => {
-    const maliciousPayload = '{"a": 1, "__proto__": {"polluted": true}}';
-    const a: any = {};
-    const result = Object.assign({}, JSON.parse(maliciousPayload));
-
-    expect(({} as any).polluted).not.toBe(true); // safe Plain Old Javascript Object
-    expect(a.polluted).not.toBe(true); // safe a input
-    expect(result.polluted).toBe(true);
-  });
-
-  test('prototype pollution via constructor', () => {
-    const maliciousPayload = '{"a": 1, "constructor": {"prototype": {"polluted": true}}}';
-    const a: any = {};
-    const result = Object.assign({}, JSON.parse(maliciousPayload));
-
-    expect(result.constructor.prototype.polluted).toBe(true);
-    expect(a.constructor.prototype.polluted).toBe(undefined);
-    expect(({} as any).constructor.prototype.polluted).toBe(undefined);
-  });
-});