diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 100% rename from .eslintrc.js rename to .eslintrc.cjs diff --git a/.eslintrc.lang.js b/.eslintrc.lang.cjs similarity index 100% rename from .eslintrc.lang.js rename to .eslintrc.lang.cjs diff --git a/VERSION_11_UPGRADE.md b/VERSION_11_UPGRADE.md new file mode 100644 index 0000000000..c418aaba78 --- /dev/null +++ b/VERSION_11_UPGRADE.md @@ -0,0 +1,47 @@ +# Default Build Changes + +- remove apache, http, nginx, properties, coffeescript from :common #2848 + +### Feature Removal + +- HTML merging is now no longer included in core. You'll want to use a plugin instead. https://github.com/highlightjs/highlight.js/issues/2889 +- fixMarkup is gone now, provide your own replacement #2534 + +### Behavior changes + +- `initHighlighting` and `initHighlightingOnLoad` call `highlightAll` +- Calling `highlightAll` over and over is not guarded against + +### Grammar's removed or renamed + +- remove the old htmlbars stub, use handlebars +- remove c-like, use c, cpp, or arduino +- removed `sql_more`, use `sql` instead + +### Visual / Themeing / CSS Changes + +- Default padding on `.hljs` is now 1em (up from 0.5em) +- schoolbook no longer has a custom lined background, it's solid now + +### Alias Changes + +- php3,4,5,6,etc... aliases removed, use php instead +- `zsh` removed, use `sh` instead +- `freepascal`, `lazarus`, `lpr`, `lpm` removed. Use `delphi` or add you own aliases back. + +## API's changed + +- rename second_best to secondBest (highlightAuto) +- highlightElement/highlightBlock result now no longer returns `re` key, use `relevance` instead +- `CSS_NUMBER_MODE` has now been moved into the internal `css-shared` library +- `highlight()` result now renames some keys to mark them as private: `_top`, `_emitter`, and `_illegalBy` + +### Configuration options removed/changed + +- useBR gone, #2559 +- tabReplace gone, #2874 + +## Others + +- `relevance` returned may be a floating point number now +- regex utility `join` renamed to `_eitherRewriteBackreferences` (this was always internal) diff --git a/docs/api.rst b/docs/api.rst index 3c2936b0d4..1f58be722e 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -42,17 +42,7 @@ Returns an object with the following properties: * ``language``: detected language * ``relevance``: integer value representing the relevance score * ``value``: HTML string with highlighting markup -* ``second_best``: object with the same structure for second-best heuristically detected language (may be absent) - - -``fixMarkup(value)`` (deprecated as of 10.3) --------------------------------------------- - -**fixMarkup is deprecated and will be removed entirely in v11.** - -Post-processing of the highlighted markup. Currently consists of replacing indentation TAB characters and using ``
`` tags instead of new-line characters. Options are set globally with ``configure``. - -Accepts a string with the highlighted markup. +* ``secondBest``: object with the same structure for second-best heuristically detected language (may be absent) ``highlightBlock(block)`` @@ -73,8 +63,6 @@ in the ``class`` attribute of the DOM node. See the :doc:`class reference Configures global options: -* ``tabReplace``: a string used to replace TAB characters in indentation. -* ``useBR``: a flag to generate ``
`` tags instead of new-line characters in the output, useful when code is marked up using a non-``
`` container.
 * ``classPrefix``: a string prefix added before class names in the generated markup, used for backwards compatibility with stylesheets.
 * ``languages``: an array of language names and aliases restricting auto detection to only these languages.
 * ``languageDetectRe``: a regex to configure how CSS class names map to language (allows class names like say `color-as-php` vs the default of `language-php`, etc.)
@@ -84,11 +72,12 @@ Accepts an object representing options with the values to updated. Other options
 ::
 
   hljs.configure({
-    tabReplace: '    ', // 4 spaces
+    noHighlightRe: /^do-not-highlightme$/i,
+    languageDetectRe: /\bgrammar-([\w-]+)\b/i, // for `grammar-swift` style CSS naming
     classPrefix: ''     // don't append class prefix
                         // … other options aren't changed
   });
-  hljs.initHighlighting();
+  hljs.highlightAll();
 
 
 ``highlightAll()``
diff --git a/docs/style-guide.rst b/docs/style-guide.rst
index e813f94ec3..b02b47b670 100644
--- a/docs/style-guide.rst
+++ b/docs/style-guide.rst
@@ -60,17 +60,6 @@ Okay to use:
 These may seem arbitrary at first but it's what has shown to make sense in
 practice.
 
-There's also a common set of rules that *has* to be defined for the root
-container verbatim:
-
-::
-
-  .hljs {
-    display: block;
-    overflow-x: auto;
-    padding: 0.5em;
-  }
-
 
 ``.subst``
 ----------
diff --git a/package-lock.json b/package-lock.json
index 7217d29247..eb3f0d3ead 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -83,9 +83,9 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
-      "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+      "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
@@ -95,7 +95,6 @@
         "ignore": "^4.0.6",
         "import-fresh": "^3.2.1",
         "js-yaml": "^3.13.1",
-        "lodash": "^4.17.20",
         "minimatch": "^3.0.4",
         "strip-json-comments": "^3.1.1"
       },
@@ -103,6 +102,21 @@
         "node": "^10.12.0 || >=12.0.0"
       }
     },
+    "node_modules/@eslint/eslintrc/node_modules/globals": {
+      "version": "12.4.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+      "dev": true,
+      "dependencies": {
+        "type-fest": "^0.8.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/@eslint/eslintrc/node_modules/ignore": {
       "version": "4.0.6",
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
@@ -112,6 +126,15 @@
         "node": ">= 4"
       }
     },
+    "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
@@ -250,15 +273,6 @@
       "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
       "dev": true
     },
-    "node_modules/@rollup/pluginutils/node_modules/picomatch": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
     "node_modules/@types/estree": {
       "version": "0.0.39",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
@@ -300,13 +314,13 @@
       "dev": true
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.1.tgz",
-      "integrity": "sha512-yW2epMYZSpNJXZy22Biu+fLdTG8Mn6b22kR3TqblVk50HGNV8Zya15WAXuQCr8tKw4Qf1BL4QtI6kv6PCkLoJw==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.18.0.tgz",
+      "integrity": "sha512-Lzkc/2+7EoH7+NjIWLS2lVuKKqbEmJhtXe3rmfA8cyiKnZm3IfLf51irnBcmow8Q/AptVV0XBZmBJKuUJTe6cQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/experimental-utils": "4.15.1",
-        "@typescript-eslint/scope-manager": "4.15.1",
+        "@typescript-eslint/experimental-utils": "4.18.0",
+        "@typescript-eslint/scope-manager": "4.18.0",
         "debug": "^4.1.1",
         "functional-red-black-tree": "^1.0.1",
         "lodash": "^4.17.15",
@@ -344,15 +358,15 @@
       }
     },
     "node_modules/@typescript-eslint/experimental-utils": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.1.tgz",
-      "integrity": "sha512-9LQRmOzBRI1iOdJorr4jEnQhadxK4c9R2aEAsm7WE/7dq8wkKD1suaV0S/JucTL8QlYUPU1y2yjqg+aGC0IQBQ==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.18.0.tgz",
+      "integrity": "sha512-92h723Kblt9JcT2RRY3QS2xefFKar4ZQFVs3GityOKWQYgtajxt/tuXIzL7sVCUlM1hgreiV5gkGYyBpdOwO6A==",
       "dev": true,
       "dependencies": {
         "@types/json-schema": "^7.0.3",
-        "@typescript-eslint/scope-manager": "4.15.1",
-        "@typescript-eslint/types": "4.15.1",
-        "@typescript-eslint/typescript-estree": "4.15.1",
+        "@typescript-eslint/scope-manager": "4.18.0",
+        "@typescript-eslint/types": "4.18.0",
+        "@typescript-eslint/typescript-estree": "4.18.0",
         "eslint-scope": "^5.0.0",
         "eslint-utils": "^2.0.0"
       },
@@ -368,14 +382,14 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.1.tgz",
-      "integrity": "sha512-V8eXYxNJ9QmXi5ETDguB7O9diAXlIyS+e3xzLoP/oVE4WCAjssxLIa0mqCLsCGXulYJUfT+GV70Jv1vHsdKwtA==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.18.0.tgz",
+      "integrity": "sha512-W3z5S0ZbecwX3PhJEAnq4mnjK5JJXvXUDBYIYGoweCyWyuvAKfGHvzmpUzgB5L4cRBb+cTu9U/ro66dx7dIimA==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "4.15.1",
-        "@typescript-eslint/types": "4.15.1",
-        "@typescript-eslint/typescript-estree": "4.15.1",
+        "@typescript-eslint/scope-manager": "4.18.0",
+        "@typescript-eslint/types": "4.18.0",
+        "@typescript-eslint/typescript-estree": "4.18.0",
         "debug": "^4.1.1"
       },
       "engines": {
@@ -395,13 +409,13 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.1.tgz",
-      "integrity": "sha512-ibQrTFcAm7yG4C1iwpIYK7vDnFg+fKaZVfvyOm3sNsGAerKfwPVFtYft5EbjzByDJ4dj1WD8/34REJfw/9wdVA==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.18.0.tgz",
+      "integrity": "sha512-olX4yN6rvHR2eyFOcb6E4vmhDPsfdMyfQ3qR+oQNkAv8emKKlfxTWUXU5Mqxs2Fwe3Pf1BoPvrwZtwngxDzYzQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "4.15.1",
-        "@typescript-eslint/visitor-keys": "4.15.1"
+        "@typescript-eslint/types": "4.18.0",
+        "@typescript-eslint/visitor-keys": "4.18.0"
       },
       "engines": {
         "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
@@ -412,9 +426,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.1.tgz",
-      "integrity": "sha512-iGsaUyWFyLz0mHfXhX4zO6P7O3sExQpBJ2dgXB0G5g/8PRVfBBsmQIc3r83ranEQTALLR3Vko/fnCIVqmH+mPw==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.18.0.tgz",
+      "integrity": "sha512-/BRociARpj5E+9yQ7cwCF/SNOWwXJ3qhjurMuK2hIFUbr9vTuDeu476Zpu+ptxY2kSxUHDGLLKy+qGq2sOg37A==",
       "dev": true,
       "engines": {
         "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
@@ -425,13 +439,13 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.1.tgz",
-      "integrity": "sha512-z8MN3CicTEumrWAEB2e2CcoZa3KP9+SMYLIA2aM49XW3cWIaiVSOAGq30ffR5XHxRirqE90fgLw3e6WmNx5uNw==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.18.0.tgz",
+      "integrity": "sha512-wt4xvF6vvJI7epz+rEqxmoNQ4ZADArGQO9gDU+cM0U5fdVv7N+IAuVoVAoZSOZxzGHBfvE3XQMLdy+scsqFfeg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "4.15.1",
-        "@typescript-eslint/visitor-keys": "4.15.1",
+        "@typescript-eslint/types": "4.18.0",
+        "@typescript-eslint/visitor-keys": "4.18.0",
         "debug": "^4.1.1",
         "globby": "^11.0.1",
         "is-glob": "^4.0.1",
@@ -467,12 +481,12 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.1.tgz",
-      "integrity": "sha512-tYzaTP9plooRJY8eNlpAewTOqtWW/4ff/5wBjNVaJ0S0wC4Gpq/zDVRTJa5bq2v1pCNQ08xxMCndcvR+h7lMww==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.18.0.tgz",
+      "integrity": "sha512-Q9t90JCvfYaN0OfFUgaLqByOfz8yPeTAdotn/XYNm5q9eHax90gzdb+RJ6E9T5s97Kv/UHWKERTmqA0jTKAEHw==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "4.15.1",
+        "@typescript-eslint/types": "4.18.0",
         "eslint-visitor-keys": "^2.0.0"
       },
       "engines": {
@@ -725,9 +739,9 @@
       }
     },
     "node_modules/binary-extensions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
-      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
       "dev": true,
       "engines": {
         "node": ">=8"
@@ -791,15 +805,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/caseless": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -871,14 +876,13 @@
       }
     },
     "node_modules/chokidar": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+      "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
       "dev": true,
       "dependencies": {
         "anymatch": "~3.1.1",
         "braces": "~3.0.2",
-        "fsevents": "~2.1.2",
         "glob-parent": "~5.1.0",
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
@@ -889,13 +893,13 @@
         "node": ">= 8.10.0"
       },
       "optionalDependencies": {
-        "fsevents": "~2.1.2"
+        "fsevents": "~2.3.1"
       }
     },
     "node_modules/clean-css": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.0.1.tgz",
-      "integrity": "sha512-F1zAGOowUCg8yxT0O4UR+nmbMauf3YwbiUS60CPxpzJU7ulpamGzQomFrJSK4w/HqHtMmQKSHJUNue+dQQYQdg==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.1.tgz",
+      "integrity": "sha512-GQ6HdEyJN0543mRTA/TkZ7RPoMXGWKq1shs9H86F2kLuixR0RI+xd4JfhJxWUW08FGKQXTKAKpVjKQXu5zkFNA==",
       "dev": true,
       "dependencies": {
         "source-map": "~0.6.0"
@@ -914,91 +918,35 @@
       }
     },
     "node_modules/cli-table": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.4.tgz",
-      "integrity": "sha512-1vinpnX/ZERcmE443i3SZTmU5DF0rPO9DrL4I2iVAllhxzCM9SzPlHnz19fsZB78htkKZvYBvj6SZ6vXnaxmTA==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.1",
-        "string-width": "^4.2.0"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/cli-table/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz",
+      "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+        "colors": "1.0.3"
       },
       "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cli-table/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/cli-table/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
+        "node": ">= 0.2.0"
       }
     },
-    "node_modules/cli-table/node_modules/string-width": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+    "node_modules/cli-table/node_modules/colors": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+      "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
       "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">=0.1.90"
       }
     },
     "node_modules/cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      }
-    },
-    "node_modules/cliui/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/cliui/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
       "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
       }
     },
     "node_modules/color-convert": {
@@ -1038,9 +986,9 @@
       }
     },
     "node_modules/commander": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-7.0.0.tgz",
-      "integrity": "sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
+      "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==",
       "dev": true,
       "engines": {
         "node": ">= 10"
@@ -1138,24 +1086,20 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
-      "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
       "dev": true,
       "dependencies": {
         "ms": "2.1.2"
       },
       "engines": {
         "node": ">=6.0"
-      }
-    },
-    "node_modules/decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
     "node_modules/decimal.js": {
@@ -1232,9 +1176,9 @@
       "dev": true
     },
     "node_modules/diff": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
       "dev": true,
       "engines": {
         "node": ">=0.3.1"
@@ -1296,9 +1240,9 @@
       }
     },
     "node_modules/emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "dev": true
     },
     "node_modules/enquirer": {
@@ -1367,6 +1311,15 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -1377,33 +1330,44 @@
       }
     },
     "node_modules/escodegen": {
-      "version": "1.14.3",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
       "dev": true,
       "dependencies": {
         "esprima": "^4.0.1",
-        "estraverse": "^4.2.0",
+        "estraverse": "^5.2.0",
         "esutils": "^2.0.2",
-        "optionator": "^0.8.1",
-        "source-map": "~0.6.1"
+        "optionator": "^0.8.1"
       },
       "bin": {
         "escodegen": "bin/escodegen.js",
         "esgenerate": "bin/esgenerate.js"
       },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "optionalDependencies": {
+        "source-map": "~0.6.1"
+      }
+    },
+    "node_modules/escodegen/node_modules/estraverse": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+      "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+      "dev": true,
       "engines": {
         "node": ">=4.0"
       }
     },
     "node_modules/eslint": {
-      "version": "7.20.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz",
-      "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==",
+      "version": "7.22.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz",
+      "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.3.0",
+        "@eslint/eslintrc": "^0.4.0",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
@@ -1416,10 +1380,10 @@
         "espree": "^7.3.1",
         "esquery": "^1.4.0",
         "esutils": "^2.0.2",
-        "file-entry-cache": "^6.0.0",
+        "file-entry-cache": "^6.0.1",
         "functional-red-black-tree": "^1.0.1",
         "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
+        "globals": "^13.6.0",
         "ignore": "^4.0.6",
         "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
@@ -1427,7 +1391,7 @@
         "js-yaml": "^3.13.1",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.4.1",
-        "lodash": "^4.17.20",
+        "lodash": "^4.17.21",
         "minimatch": "^3.0.4",
         "natural-compare": "^1.4.0",
         "optionator": "^0.9.1",
@@ -1923,15 +1887,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/fast-glob/node_modules/picomatch": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
     "node_modules/fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
@@ -1954,9 +1909,9 @@
       }
     },
     "node_modules/file-entry-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
-      "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
       "dev": true,
       "dependencies": {
         "flat-cache": "^3.0.4"
@@ -2022,9 +1977,9 @@
       }
     },
     "node_modules/flatted": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
-      "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+      "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
       "dev": true
     },
     "node_modules/forever-agent": {
@@ -2057,10 +2012,11 @@
       "dev": true
     },
     "node_modules/fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
       "dev": true,
+      "hasInstallScript": true,
       "optional": true,
       "os": [
         "darwin"
@@ -2129,9 +2085,9 @@
       }
     },
     "node_modules/glob-promise": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.0.1.tgz",
-      "integrity": "sha512-QwMkHW0vn0hXHFQg3JWsj2HW8pJQhHeAvsaIcpn4EDP5bU757GtJP/ClLX4iKIFtzgodRiKtb+aOG/k6i2B5mw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.1.0.tgz",
+      "integrity": "sha512-wOdaX1+QJi3ldbjq4fXX/BbGSjhsG6eGXqMnBjQj9ubDiDLvrXbbXRj02rA0CXbMMM7J58dajiQ72va63D7pNw==",
       "dev": true,
       "dependencies": {
         "@types/glob": "^7.1.3"
@@ -2144,12 +2100,12 @@
       }
     },
     "node_modules/globals": {
-      "version": "12.4.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+      "version": "13.6.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.6.0.tgz",
+      "integrity": "sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ==",
       "dev": true,
       "dependencies": {
-        "type-fest": "^0.8.1"
+        "type-fest": "^0.20.2"
       },
       "engines": {
         "node": ">=8"
@@ -2191,15 +2147,14 @@
       }
     },
     "node_modules/handlebars": {
-      "version": "4.7.6",
-      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
-      "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
+      "version": "4.7.7",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+      "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
       "dev": true,
       "dependencies": {
         "minimist": "^1.2.5",
         "neo-async": "^2.6.0",
         "source-map": "^0.6.1",
-        "uglify-js": "^3.1.4",
         "wordwrap": "^1.0.0"
       },
       "bin": {
@@ -2377,15 +2332,6 @@
       "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
       "dev": true
     },
-    "node_modules/ip-regex": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
-      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -2582,9 +2528,9 @@
       "dev": true
     },
     "node_modules/js-yaml": {
-      "version": "3.14.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
-      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
       "dev": true,
       "dependencies": {
         "argparse": "^1.0.7",
@@ -2601,40 +2547,60 @@
       "dev": true
     },
     "node_modules/jsdom": {
-      "version": "16.4.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz",
-      "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==",
+      "version": "16.5.1",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.1.tgz",
+      "integrity": "sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA==",
       "dev": true,
       "dependencies": {
-        "abab": "^2.0.3",
-        "acorn": "^7.1.1",
+        "abab": "^2.0.5",
+        "acorn": "^8.0.5",
         "acorn-globals": "^6.0.0",
         "cssom": "^0.4.4",
-        "cssstyle": "^2.2.0",
+        "cssstyle": "^2.3.0",
         "data-urls": "^2.0.0",
-        "decimal.js": "^10.2.0",
+        "decimal.js": "^10.2.1",
         "domexception": "^2.0.1",
-        "escodegen": "^1.14.1",
+        "escodegen": "^2.0.0",
         "html-encoding-sniffer": "^2.0.1",
         "is-potential-custom-element-name": "^1.0.0",
         "nwsapi": "^2.2.0",
-        "parse5": "5.1.1",
+        "parse5": "6.0.1",
         "request": "^2.88.2",
-        "request-promise-native": "^1.0.8",
-        "saxes": "^5.0.0",
+        "request-promise-native": "^1.0.9",
+        "saxes": "^5.0.1",
         "symbol-tree": "^3.2.4",
-        "tough-cookie": "^3.0.1",
+        "tough-cookie": "^4.0.0",
         "w3c-hr-time": "^1.0.2",
         "w3c-xmlserializer": "^2.0.0",
         "webidl-conversions": "^6.1.0",
         "whatwg-encoding": "^1.0.5",
         "whatwg-mimetype": "^2.3.0",
         "whatwg-url": "^8.0.0",
-        "ws": "^7.2.3",
+        "ws": "^7.4.4",
         "xml-name-validator": "^3.0.0"
       },
       "engines": {
         "node": ">=10"
+      },
+      "peerDependencies": {
+        "canvas": "^2.5.0"
+      },
+      "peerDependenciesMeta": {
+        "canvas": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/jsdom/node_modules/acorn": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz",
+      "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
       }
     },
     "node_modules/json-schema": {
@@ -2729,9 +2695,9 @@
       }
     },
     "node_modules/lodash": {
-      "version": "4.17.20",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "dev": true
     },
     "node_modules/lodash.sortby": {
@@ -2826,35 +2792,35 @@
       "dev": true
     },
     "node_modules/mocha": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz",
-      "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==",
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz",
+      "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==",
       "dev": true,
       "dependencies": {
         "@ungap/promise-all-settled": "1.1.2",
         "ansi-colors": "4.1.1",
         "browser-stdout": "1.3.1",
-        "chokidar": "3.4.3",
-        "debug": "4.2.0",
-        "diff": "4.0.2",
+        "chokidar": "3.5.1",
+        "debug": "4.3.1",
+        "diff": "5.0.0",
         "escape-string-regexp": "4.0.0",
         "find-up": "5.0.0",
         "glob": "7.1.6",
         "growl": "1.10.5",
         "he": "1.2.0",
-        "js-yaml": "3.14.0",
+        "js-yaml": "4.0.0",
         "log-symbols": "4.0.0",
         "minimatch": "3.0.4",
-        "ms": "2.1.2",
-        "nanoid": "3.1.12",
+        "ms": "2.1.3",
+        "nanoid": "3.1.20",
         "serialize-javascript": "5.0.1",
         "strip-json-comments": "3.1.1",
-        "supports-color": "7.2.0",
+        "supports-color": "8.1.1",
         "which": "2.0.2",
         "wide-align": "1.1.3",
-        "workerpool": "6.0.2",
-        "yargs": "13.3.2",
-        "yargs-parser": "13.1.2",
+        "workerpool": "6.1.0",
+        "yargs": "16.2.0",
+        "yargs-parser": "20.2.4",
         "yargs-unparser": "2.0.0"
       },
       "bin": {
@@ -2863,8 +2829,18 @@
       },
       "engines": {
         "node": ">= 10.12.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mochajs"
       }
     },
+    "node_modules/mocha/node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
+    },
     "node_modules/mocha/node_modules/escape-string-regexp": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -2883,16 +2859,37 @@
         "node": ">=8"
       }
     },
+    "node_modules/mocha/node_modules/js-yaml": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz",
+      "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/mocha/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "dev": true
+    },
     "node_modules/mocha/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
       "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
     "node_modules/ms": {
@@ -2902,15 +2899,15 @@
       "dev": true
     },
     "node_modules/nanoid": {
-      "version": "3.1.12",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz",
-      "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==",
+      "version": "3.1.20",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
+      "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
       "dev": true,
       "bin": {
         "nanoid": "bin/nanoid.cjs"
       },
       "engines": {
-        "node": "^10 || ^12 || >=13.7"
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
       }
     },
     "node_modules/natural-compare": {
@@ -3102,9 +3099,9 @@
       }
     },
     "node_modules/parse5": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
-      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
       "dev": true
     },
     "node_modules/path-exists": {
@@ -3156,12 +3153,15 @@
       "dev": true
     },
     "node_modules/picomatch": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz",
-      "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
       "dev": true,
       "engines": {
-        "node": ">=8"
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
     "node_modules/pify": {
@@ -3403,15 +3403,6 @@
         "node": ">=8.10.0"
       }
     },
-    "node_modules/readdirp/node_modules/picomatch": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
     "node_modules/refa": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/refa/-/refa-0.4.1.tgz",
@@ -3522,12 +3513,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
-    },
     "node_modules/resolve": {
       "version": "1.19.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
@@ -3573,13 +3558,10 @@
       }
     },
     "node_modules/rollup": {
-      "version": "2.39.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.39.0.tgz",
-      "integrity": "sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw==",
+      "version": "2.41.4",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.41.4.tgz",
+      "integrity": "sha512-f9IHfMO8p2Y8OdisI7Oj3oKkPuaQ6cgSwYqAi0TDvP3w2p+oX1VejX/w28a1h8WTnrapzfO5d4Uqhww+gL0b0g==",
       "dev": true,
-      "dependencies": {
-        "fsevents": "~2.3.1"
-      },
       "bin": {
         "rollup": "dist/bin/rollup"
       },
@@ -3590,20 +3572,6 @@
         "fsevents": "~2.3.1"
       }
     },
-    "node_modules/rollup/node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
     "node_modules/run-parallel": {
       "version": "1.1.9",
       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
@@ -3652,12 +3620,6 @@
         "randombytes": "^2.1.0"
       }
     },
-    "node_modules/set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -3899,38 +3861,26 @@
       }
     },
     "node_modules/string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+      "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
       "dev": true,
       "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=8"
       }
     },
-    "node_modules/string-width/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/string-width/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+    "node_modules/string-width/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
       "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
       "engines": {
-        "node": ">=6"
+        "node": ">=8"
       }
     },
     "node_modules/string.prototype.trimend": {
@@ -4308,35 +4258,6 @@
         "node": ">=10.0.0"
       }
     },
-    "node_modules/table/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/table/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/table/node_modules/string-width": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/terser": {
       "version": "5.6.0",
       "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz",
@@ -4397,14 +4318,14 @@
       }
     },
     "node_modules/tough-cookie": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
-      "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
+      "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
       "dev": true,
       "dependencies": {
-        "ip-regex": "^2.1.0",
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
+        "psl": "^1.1.33",
+        "punycode": "^2.1.1",
+        "universalify": "^0.1.2"
       },
       "engines": {
         "node": ">=6"
@@ -4483,18 +4404,21 @@
       }
     },
     "node_modules/type-fest": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "dev": true,
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/typescript": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz",
-      "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
+      "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
       "dev": true,
       "bin": {
         "tsc": "bin/tsc",
@@ -4527,6 +4451,15 @@
       "dev": true,
       "optional": true
     },
+    "node_modules/universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
     "node_modules/uri-js": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -4649,12 +4582,6 @@
         "node": ">= 8"
       }
     },
-    "node_modules/which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
-    },
     "node_modules/wide-align": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
@@ -4714,46 +4641,61 @@
       "dev": true
     },
     "node_modules/workerpool": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz",
-      "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz",
+      "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==",
       "dev": true
     },
     "node_modules/wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "node_modules/wrap-ansi/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+    "node_modules/wrap-ansi/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
       "engines": {
-        "node": ">=6"
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "node_modules/wrap-ansi/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+    "node_modules/wrap-ansi/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dev": true,
       "dependencies": {
-        "ansi-regex": "^4.1.0"
+        "color-name": "~1.1.4"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=7.0.0"
       }
     },
+    "node_modules/wrap-ansi/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
     "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -4761,12 +4703,24 @@
       "dev": true
     },
     "node_modules/ws": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
-      "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
+      "version": "7.4.4",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
+      "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
       "dev": true,
       "engines": {
         "node": ">=8.3.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
       }
     },
     "node_modules/xml-name-validator": {
@@ -4782,10 +4736,13 @@
       "dev": true
     },
     "node_modules/y18n": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
-      "dev": true
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+      "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
     },
     "node_modules/yallist": {
       "version": "4.0.0",
@@ -4794,31 +4751,30 @@
       "dev": true
     },
     "node_modules/yargs": {
-      "version": "13.3.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "dev": true,
       "dependencies": {
-        "cliui": "^5.0.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.1.2"
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/yargs-parser": {
-      "version": "13.1.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+      "version": "20.2.4",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+      "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
       "dev": true,
-      "dependencies": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/yargs-unparser": {
@@ -4853,55 +4809,6 @@
       "engines": {
         "node": ">=10"
       }
-    },
-    "node_modules/yargs/node_modules/find-up": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/locate-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/p-locate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
     }
   },
   "dependencies": {
@@ -4945,9 +4852,9 @@
       }
     },
     "@eslint/eslintrc": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
-      "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+      "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
@@ -4957,16 +4864,30 @@
         "ignore": "^4.0.6",
         "import-fresh": "^3.2.1",
         "js-yaml": "^3.13.1",
-        "lodash": "^4.17.20",
         "minimatch": "^3.0.4",
         "strip-json-comments": "^3.1.1"
       },
       "dependencies": {
+        "globals": {
+          "version": "12.4.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.8.1"
+          }
+        },
         "ignore": {
           "version": "4.0.6",
           "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
           "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
           "dev": true
+        },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "dev": true
         }
       }
     },
@@ -5087,12 +5008,6 @@
           "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
           "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
           "dev": true
-        },
-        "picomatch": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-          "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-          "dev": true
         }
       }
     },
@@ -5137,13 +5052,13 @@
       "dev": true
     },
     "@typescript-eslint/eslint-plugin": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.1.tgz",
-      "integrity": "sha512-yW2epMYZSpNJXZy22Biu+fLdTG8Mn6b22kR3TqblVk50HGNV8Zya15WAXuQCr8tKw4Qf1BL4QtI6kv6PCkLoJw==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.18.0.tgz",
+      "integrity": "sha512-Lzkc/2+7EoH7+NjIWLS2lVuKKqbEmJhtXe3rmfA8cyiKnZm3IfLf51irnBcmow8Q/AptVV0XBZmBJKuUJTe6cQ==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/experimental-utils": "4.15.1",
-        "@typescript-eslint/scope-manager": "4.15.1",
+        "@typescript-eslint/experimental-utils": "4.18.0",
+        "@typescript-eslint/scope-manager": "4.18.0",
         "debug": "^4.1.1",
         "functional-red-black-tree": "^1.0.1",
         "lodash": "^4.17.15",
@@ -5161,55 +5076,55 @@
       }
     },
     "@typescript-eslint/experimental-utils": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.1.tgz",
-      "integrity": "sha512-9LQRmOzBRI1iOdJorr4jEnQhadxK4c9R2aEAsm7WE/7dq8wkKD1suaV0S/JucTL8QlYUPU1y2yjqg+aGC0IQBQ==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.18.0.tgz",
+      "integrity": "sha512-92h723Kblt9JcT2RRY3QS2xefFKar4ZQFVs3GityOKWQYgtajxt/tuXIzL7sVCUlM1hgreiV5gkGYyBpdOwO6A==",
       "dev": true,
       "requires": {
         "@types/json-schema": "^7.0.3",
-        "@typescript-eslint/scope-manager": "4.15.1",
-        "@typescript-eslint/types": "4.15.1",
-        "@typescript-eslint/typescript-estree": "4.15.1",
+        "@typescript-eslint/scope-manager": "4.18.0",
+        "@typescript-eslint/types": "4.18.0",
+        "@typescript-eslint/typescript-estree": "4.18.0",
         "eslint-scope": "^5.0.0",
         "eslint-utils": "^2.0.0"
       }
     },
     "@typescript-eslint/parser": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.1.tgz",
-      "integrity": "sha512-V8eXYxNJ9QmXi5ETDguB7O9diAXlIyS+e3xzLoP/oVE4WCAjssxLIa0mqCLsCGXulYJUfT+GV70Jv1vHsdKwtA==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.18.0.tgz",
+      "integrity": "sha512-W3z5S0ZbecwX3PhJEAnq4mnjK5JJXvXUDBYIYGoweCyWyuvAKfGHvzmpUzgB5L4cRBb+cTu9U/ro66dx7dIimA==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/scope-manager": "4.15.1",
-        "@typescript-eslint/types": "4.15.1",
-        "@typescript-eslint/typescript-estree": "4.15.1",
+        "@typescript-eslint/scope-manager": "4.18.0",
+        "@typescript-eslint/types": "4.18.0",
+        "@typescript-eslint/typescript-estree": "4.18.0",
         "debug": "^4.1.1"
       }
     },
     "@typescript-eslint/scope-manager": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.1.tgz",
-      "integrity": "sha512-ibQrTFcAm7yG4C1iwpIYK7vDnFg+fKaZVfvyOm3sNsGAerKfwPVFtYft5EbjzByDJ4dj1WD8/34REJfw/9wdVA==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.18.0.tgz",
+      "integrity": "sha512-olX4yN6rvHR2eyFOcb6E4vmhDPsfdMyfQ3qR+oQNkAv8emKKlfxTWUXU5Mqxs2Fwe3Pf1BoPvrwZtwngxDzYzQ==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "4.15.1",
-        "@typescript-eslint/visitor-keys": "4.15.1"
+        "@typescript-eslint/types": "4.18.0",
+        "@typescript-eslint/visitor-keys": "4.18.0"
       }
     },
     "@typescript-eslint/types": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.1.tgz",
-      "integrity": "sha512-iGsaUyWFyLz0mHfXhX4zO6P7O3sExQpBJ2dgXB0G5g/8PRVfBBsmQIc3r83ranEQTALLR3Vko/fnCIVqmH+mPw==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.18.0.tgz",
+      "integrity": "sha512-/BRociARpj5E+9yQ7cwCF/SNOWwXJ3qhjurMuK2hIFUbr9vTuDeu476Zpu+ptxY2kSxUHDGLLKy+qGq2sOg37A==",
       "dev": true
     },
     "@typescript-eslint/typescript-estree": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.1.tgz",
-      "integrity": "sha512-z8MN3CicTEumrWAEB2e2CcoZa3KP9+SMYLIA2aM49XW3cWIaiVSOAGq30ffR5XHxRirqE90fgLw3e6WmNx5uNw==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.18.0.tgz",
+      "integrity": "sha512-wt4xvF6vvJI7epz+rEqxmoNQ4ZADArGQO9gDU+cM0U5fdVv7N+IAuVoVAoZSOZxzGHBfvE3XQMLdy+scsqFfeg==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "4.15.1",
-        "@typescript-eslint/visitor-keys": "4.15.1",
+        "@typescript-eslint/types": "4.18.0",
+        "@typescript-eslint/visitor-keys": "4.18.0",
         "debug": "^4.1.1",
         "globby": "^11.0.1",
         "is-glob": "^4.0.1",
@@ -5229,12 +5144,12 @@
       }
     },
     "@typescript-eslint/visitor-keys": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.1.tgz",
-      "integrity": "sha512-tYzaTP9plooRJY8eNlpAewTOqtWW/4ff/5wBjNVaJ0S0wC4Gpq/zDVRTJa5bq2v1pCNQ08xxMCndcvR+h7lMww==",
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.18.0.tgz",
+      "integrity": "sha512-Q9t90JCvfYaN0OfFUgaLqByOfz8yPeTAdotn/XYNm5q9eHax90gzdb+RJ6E9T5s97Kv/UHWKERTmqA0jTKAEHw==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "4.15.1",
+        "@typescript-eslint/types": "4.18.0",
         "eslint-visitor-keys": "^2.0.0"
       },
       "dependencies": {
@@ -5431,9 +5346,9 @@
       }
     },
     "binary-extensions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
-      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
       "dev": true
     },
     "brace-expansion": {
@@ -5485,12 +5400,6 @@
       "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
       "dev": true
     },
-    "camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
-    },
     "caseless": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -5549,14 +5458,14 @@
       }
     },
     "chokidar": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+      "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
       "dev": true,
       "requires": {
         "anymatch": "~3.1.1",
         "braces": "~3.0.2",
-        "fsevents": "~2.1.2",
+        "fsevents": "~2.3.1",
         "glob-parent": "~5.1.0",
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
@@ -5565,9 +5474,9 @@
       }
     },
     "clean-css": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.0.1.tgz",
-      "integrity": "sha512-F1zAGOowUCg8yxT0O4UR+nmbMauf3YwbiUS60CPxpzJU7ulpamGzQomFrJSK4w/HqHtMmQKSHJUNue+dQQYQdg==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.1.tgz",
+      "integrity": "sha512-GQ6HdEyJN0543mRTA/TkZ7RPoMXGWKq1shs9H86F2kLuixR0RI+xd4JfhJxWUW08FGKQXTKAKpVjKQXu5zkFNA==",
       "dev": true,
       "requires": {
         "source-map": "~0.6.0"
@@ -5580,77 +5489,31 @@
       "dev": true
     },
     "cli-table": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.4.tgz",
-      "integrity": "sha512-1vinpnX/ZERcmE443i3SZTmU5DF0rPO9DrL4I2iVAllhxzCM9SzPlHnz19fsZB78htkKZvYBvj6SZ6vXnaxmTA==",
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz",
+      "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==",
       "dev": true,
       "requires": {
-        "chalk": "^2.4.1",
-        "string-width": "^4.2.0"
+        "colors": "1.0.3"
       },
       "dependencies": {
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+        "colors": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+          "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
           "dev": true
-        },
-        "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
         }
       }
     },
     "cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
       "requires": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
       }
     },
     "color-convert": {
@@ -5684,9 +5547,9 @@
       }
     },
     "commander": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-7.0.0.tgz",
-      "integrity": "sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
+      "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==",
       "dev": true
     },
     "commondir": {
@@ -5768,20 +5631,14 @@
       }
     },
     "debug": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
-      "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
       "dev": true,
       "requires": {
         "ms": "2.1.2"
       }
     },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
-    },
     "decimal.js": {
       "version": "10.2.1",
       "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz",
@@ -5844,9 +5701,9 @@
       "dev": true
     },
     "diff": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
       "dev": true
     },
     "dir-glob": {
@@ -5895,9 +5752,9 @@
       }
     },
     "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "dev": true
     },
     "enquirer": {
@@ -5956,6 +5813,12 @@
         "is-symbol": "^1.0.2"
       }
     },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true
+    },
     "escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -5963,26 +5826,34 @@
       "dev": true
     },
     "escodegen": {
-      "version": "1.14.3",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
       "dev": true,
       "requires": {
         "esprima": "^4.0.1",
-        "estraverse": "^4.2.0",
+        "estraverse": "^5.2.0",
         "esutils": "^2.0.2",
         "optionator": "^0.8.1",
         "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+          "dev": true
+        }
       }
     },
     "eslint": {
-      "version": "7.20.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz",
-      "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==",
+      "version": "7.22.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz",
+      "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.3.0",
+        "@eslint/eslintrc": "^0.4.0",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
@@ -5995,10 +5866,10 @@
         "espree": "^7.3.1",
         "esquery": "^1.4.0",
         "esutils": "^2.0.2",
-        "file-entry-cache": "^6.0.0",
+        "file-entry-cache": "^6.0.1",
         "functional-red-black-tree": "^1.0.1",
         "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
+        "globals": "^13.6.0",
         "ignore": "^4.0.6",
         "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
@@ -6006,7 +5877,7 @@
         "js-yaml": "^3.13.1",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.4.1",
-        "lodash": "^4.17.20",
+        "lodash": "^4.17.21",
         "minimatch": "^3.0.4",
         "natural-compare": "^1.4.0",
         "optionator": "^0.9.1",
@@ -6386,12 +6257,6 @@
           "requires": {
             "is-glob": "^4.0.1"
           }
-        },
-        "picomatch": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-          "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-          "dev": true
         }
       }
     },
@@ -6417,9 +6282,9 @@
       }
     },
     "file-entry-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
-      "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
       "dev": true,
       "requires": {
         "flat-cache": "^3.0.4"
@@ -6469,9 +6334,9 @@
       }
     },
     "flatted": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
-      "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+      "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
       "dev": true
     },
     "forever-agent": {
@@ -6498,9 +6363,9 @@
       "dev": true
     },
     "fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
       "dev": true,
       "optional": true
     },
@@ -6555,21 +6420,21 @@
       }
     },
     "glob-promise": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.0.1.tgz",
-      "integrity": "sha512-QwMkHW0vn0hXHFQg3JWsj2HW8pJQhHeAvsaIcpn4EDP5bU757GtJP/ClLX4iKIFtzgodRiKtb+aOG/k6i2B5mw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.1.0.tgz",
+      "integrity": "sha512-wOdaX1+QJi3ldbjq4fXX/BbGSjhsG6eGXqMnBjQj9ubDiDLvrXbbXRj02rA0CXbMMM7J58dajiQ72va63D7pNw==",
       "dev": true,
       "requires": {
         "@types/glob": "^7.1.3"
       }
     },
     "globals": {
-      "version": "12.4.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+      "version": "13.6.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.6.0.tgz",
+      "integrity": "sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ==",
       "dev": true,
       "requires": {
-        "type-fest": "^0.8.1"
+        "type-fest": "^0.20.2"
       }
     },
     "globby": {
@@ -6599,9 +6464,9 @@
       "dev": true
     },
     "handlebars": {
-      "version": "4.7.6",
-      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
-      "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
+      "version": "4.7.7",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+      "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
       "dev": true,
       "requires": {
         "minimist": "^1.2.5",
@@ -6733,12 +6598,6 @@
       "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
       "dev": true
     },
-    "ip-regex": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
-      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
-      "dev": true
-    },
     "is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -6895,9 +6754,9 @@
       "dev": true
     },
     "js-yaml": {
-      "version": "3.14.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
-      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
       "dev": true,
       "requires": {
         "argparse": "^1.0.7",
@@ -6911,37 +6770,45 @@
       "dev": true
     },
     "jsdom": {
-      "version": "16.4.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz",
-      "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==",
+      "version": "16.5.1",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.1.tgz",
+      "integrity": "sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA==",
       "dev": true,
       "requires": {
-        "abab": "^2.0.3",
-        "acorn": "^7.1.1",
+        "abab": "^2.0.5",
+        "acorn": "^8.0.5",
         "acorn-globals": "^6.0.0",
         "cssom": "^0.4.4",
-        "cssstyle": "^2.2.0",
+        "cssstyle": "^2.3.0",
         "data-urls": "^2.0.0",
-        "decimal.js": "^10.2.0",
+        "decimal.js": "^10.2.1",
         "domexception": "^2.0.1",
-        "escodegen": "^1.14.1",
+        "escodegen": "^2.0.0",
         "html-encoding-sniffer": "^2.0.1",
         "is-potential-custom-element-name": "^1.0.0",
         "nwsapi": "^2.2.0",
-        "parse5": "5.1.1",
+        "parse5": "6.0.1",
         "request": "^2.88.2",
-        "request-promise-native": "^1.0.8",
-        "saxes": "^5.0.0",
+        "request-promise-native": "^1.0.9",
+        "saxes": "^5.0.1",
         "symbol-tree": "^3.2.4",
-        "tough-cookie": "^3.0.1",
+        "tough-cookie": "^4.0.0",
         "w3c-hr-time": "^1.0.2",
         "w3c-xmlserializer": "^2.0.0",
         "webidl-conversions": "^6.1.0",
         "whatwg-encoding": "^1.0.5",
         "whatwg-mimetype": "^2.3.0",
         "whatwg-url": "^8.0.0",
-        "ws": "^7.2.3",
+        "ws": "^7.4.4",
         "xml-name-validator": "^3.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz",
+          "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==",
+          "dev": true
+        }
       }
     },
     "json-schema": {
@@ -7021,9 +6888,9 @@
       }
     },
     "lodash": {
-      "version": "4.17.20",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "dev": true
     },
     "lodash.sortby": {
@@ -7097,38 +6964,44 @@
       "dev": true
     },
     "mocha": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz",
-      "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==",
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz",
+      "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==",
       "dev": true,
       "requires": {
         "@ungap/promise-all-settled": "1.1.2",
         "ansi-colors": "4.1.1",
         "browser-stdout": "1.3.1",
-        "chokidar": "3.4.3",
-        "debug": "4.2.0",
-        "diff": "4.0.2",
+        "chokidar": "3.5.1",
+        "debug": "4.3.1",
+        "diff": "5.0.0",
         "escape-string-regexp": "4.0.0",
         "find-up": "5.0.0",
         "glob": "7.1.6",
         "growl": "1.10.5",
         "he": "1.2.0",
-        "js-yaml": "3.14.0",
+        "js-yaml": "4.0.0",
         "log-symbols": "4.0.0",
         "minimatch": "3.0.4",
-        "ms": "2.1.2",
-        "nanoid": "3.1.12",
+        "ms": "2.1.3",
+        "nanoid": "3.1.20",
         "serialize-javascript": "5.0.1",
         "strip-json-comments": "3.1.1",
-        "supports-color": "7.2.0",
+        "supports-color": "8.1.1",
         "which": "2.0.2",
         "wide-align": "1.1.3",
-        "workerpool": "6.0.2",
-        "yargs": "13.3.2",
-        "yargs-parser": "13.1.2",
+        "workerpool": "6.1.0",
+        "yargs": "16.2.0",
+        "yargs-parser": "20.2.4",
         "yargs-unparser": "2.0.0"
       },
       "dependencies": {
+        "argparse": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+          "dev": true
+        },
         "escape-string-regexp": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -7141,10 +7014,25 @@
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "js-yaml": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz",
+          "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==",
+          "dev": true,
+          "requires": {
+            "argparse": "^2.0.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+          "dev": true
+        },
         "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
           "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
@@ -7159,9 +7047,9 @@
       "dev": true
     },
     "nanoid": {
-      "version": "3.1.12",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz",
-      "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==",
+      "version": "3.1.20",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
+      "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
       "dev": true
     },
     "natural-compare": {
@@ -7317,9 +7205,9 @@
       }
     },
     "parse5": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
-      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
       "dev": true
     },
     "path-exists": {
@@ -7359,9 +7247,9 @@
       "dev": true
     },
     "picomatch": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz",
-      "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
       "dev": true
     },
     "pify": {
@@ -7547,14 +7435,6 @@
       "dev": true,
       "requires": {
         "picomatch": "^2.2.1"
-      },
-      "dependencies": {
-        "picomatch": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-          "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-          "dev": true
-        }
       }
     },
     "refa": {
@@ -7650,12 +7530,6 @@
       "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
       "dev": true
     },
-    "require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
-    },
     "resolve": {
       "version": "1.19.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
@@ -7688,21 +7562,12 @@
       }
     },
     "rollup": {
-      "version": "2.39.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.39.0.tgz",
-      "integrity": "sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw==",
+      "version": "2.41.4",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.41.4.tgz",
+      "integrity": "sha512-f9IHfMO8p2Y8OdisI7Oj3oKkPuaQ6cgSwYqAi0TDvP3w2p+oX1VejX/w28a1h8WTnrapzfO5d4Uqhww+gL0b0g==",
       "dev": true,
       "requires": {
         "fsevents": "~2.3.1"
-      },
-      "dependencies": {
-        "fsevents": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-          "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-          "dev": true,
-          "optional": true
-        }
       }
     },
     "run-parallel": {
@@ -7747,12 +7612,6 @@
         "randombytes": "^2.1.0"
       }
     },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
     "shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -7955,30 +7814,21 @@
       "dev": true
     },
     "string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+      "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
       "dev": true,
       "requires": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.0"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
           "dev": true
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
         }
       }
     },
@@ -8282,31 +8132,6 @@
         "lodash": "^4.17.20",
         "slice-ansi": "^4.0.0",
         "string-width": "^4.2.0"
-      },
-      "dependencies": {
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
-        }
       }
     },
     "terser": {
@@ -8359,14 +8184,14 @@
       }
     },
     "tough-cookie": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
-      "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
+      "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
       "dev": true,
       "requires": {
-        "ip-regex": "^2.1.0",
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
+        "psl": "^1.1.33",
+        "punycode": "^2.1.1",
+        "universalify": "^0.1.2"
       }
     },
     "tr46": {
@@ -8430,15 +8255,15 @@
       }
     },
     "type-fest": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "dev": true
     },
     "typescript": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz",
-      "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
+      "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
       "dev": true
     },
     "uglify-js": {
@@ -8460,6 +8285,12 @@
         }
       }
     },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "dev": true
+    },
     "uri-js": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -8561,12 +8392,6 @@
         "isexe": "^2.0.0"
       }
     },
-    "which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
-    },
     "wide-align": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
@@ -8616,36 +8441,45 @@
       "dev": true
     },
     "workerpool": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz",
-      "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz",
+      "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==",
       "dev": true
     },
     "wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
         },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "dev": true,
           "requires": {
-            "ansi-regex": "^4.1.0"
+            "color-name": "~1.1.4"
           }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
         }
       }
     },
@@ -8656,10 +8490,11 @@
       "dev": true
     },
     "ws": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
-      "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
-      "dev": true
+      "version": "7.4.4",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
+      "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
+      "dev": true,
+      "requires": {}
     },
     "xml-name-validator": {
       "version": "3.0.0",
@@ -8674,9 +8509,9 @@
       "dev": true
     },
     "y18n": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+      "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
       "dev": true
     },
     "yallist": {
@@ -8686,71 +8521,25 @@
       "dev": true
     },
     "yargs": {
-      "version": "13.3.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "dev": true,
       "requires": {
-        "cliui": "^5.0.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.1.2"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        }
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
       }
     },
     "yargs-parser": {
-      "version": "13.1.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      }
+      "version": "20.2.4",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+      "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+      "dev": true
     },
     "yargs-unparser": {
       "version": "2.0.0",
diff --git a/package.json b/package.json
index 783987da5a..7da0ee72d1 100644
--- a/package.json
+++ b/package.json
@@ -34,11 +34,17 @@
   },
   "main": "./lib/index.js",
   "types": "./types/index.d.ts",
+  "imports": {
+    "#hljs": "./build/lib/index.js",
+    "#tools/*": "./tools/lib/*.js"
+  },
+  "type": "module",
   "scripts": {
     "mocha": "mocha",
     "lint": "eslint src/*.js src/lib/*.js src/plugins/*.js demo/*.js",
-    "lint-languages": "eslint --no-eslintrc -c .eslintrc.lang.js src/languages/**/*.js",
+    "lint-languages": "eslint --no-eslintrc -c .eslintrc.lang.cjs src/languages/**/*.js",
     "build_and_test": "npm run build && npm run test",
+    "build_and_test_browser": "npm run build-browser && npm run test-browser",
     "build": "node ./tools/build.js -t node",
     "build-cdn": "node ./tools/build.js -t cdn",
     "build-browser": "node ./tools/build.js -t browser :common",
diff --git a/src/highlight.js b/src/highlight.js
index 49d974af18..d522766054 100644
--- a/src/highlight.js
+++ b/src/highlight.js
@@ -13,7 +13,6 @@ import * as MODES from './lib/modes.js';
 import { compileLanguage } from './lib/mode_compiler.js';
 import * as packageJSON from '../package.json';
 import { BuildVuePlugin } from "./plugins/vue.js";
-import { mergeHTMLPlugin } from "./plugins/merge_html.js";
 import * as logger from "./lib/logger.js";
 
 const escape = utils.escapeHTML;
@@ -36,7 +35,6 @@ const HLJS = function(hljs) {
   // safe/production mode - swallows more errors, tries to keep running
   // even if a single syntax or parse hits a fatal error
   let SAFE_MODE = true;
-  const fixMarkupRe = /(^(<[^>]+>|\t|)+|\n)/gm;
   const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?";
   /** @type {Language} */
   const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] };
@@ -48,8 +46,6 @@ const HLJS = function(hljs) {
     noHighlightRe: /^(no-?highlight)$/i,
     languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i,
     classPrefix: 'hljs-',
-    tabReplace: null,
-    useBR: false,
     languages: null,
     // beta configuration options, subject to change, welcome to discuss
     // https://github.com/highlightjs/highlight.js/issues/1086
@@ -201,7 +197,7 @@ const HLJS = function(hljs) {
           return;
         }
         result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]);
-        continuations[top.subLanguage] = /** @type {CompiledMode} */ (result.top);
+        continuations[top.subLanguage] = /** @type {CompiledMode} */ (result._top);
       } else {
         result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null);
       }
@@ -213,7 +209,7 @@ const HLJS = function(hljs) {
       if (top.relevance > 0) {
         relevance += result.relevance;
       }
-      emitter.addSublanguage(result.emitter, result.language);
+      emitter.addSublanguage(result._emitter, result.language);
     }
 
     function processBuffer() {
@@ -516,36 +512,37 @@ const HLJS = function(hljs) {
       return {
         // avoid possible breakage with v10 clients expecting
         // this to always be an integer
-        relevance: Math.floor(relevance),
-        value: result,
         language: languageName,
+        value: result,
+        relevance: Math.floor(relevance),
         illegal: false,
-        emitter: emitter,
-        top: top
+        _emitter: emitter,
+        _top: top
       };
     } catch (err) {
       if (err.message && err.message.includes('Illegal')) {
         return {
+          value: escape(codeToHighlight),
           illegal: true,
-          illegalBy: {
-            msg: err.message,
+          relevance: 0,
+          _illegalBy: {
+            message: err.message,
+            index: index,
             context: codeToHighlight.slice(index - 100, index + 100),
-            mode: err.mode
+            mode: err.mode,
+            resultSoFar: result
           },
-          sofar: result,
-          relevance: 0,
-          value: escape(codeToHighlight),
-          emitter: emitter
+          _emitter: emitter
         };
       } else if (SAFE_MODE) {
         return {
+          language: languageName,
+          value: escape(codeToHighlight),
           illegal: false,
           relevance: 0,
-          value: escape(codeToHighlight),
-          emitter: emitter,
-          language: languageName,
-          top: top,
-          errorRaised: err
+          errorRaised: err,
+          _emitter: emitter,
+          _top: top
         };
       } else {
         throw err;
@@ -562,13 +559,13 @@ const HLJS = function(hljs) {
    */
   function justTextHighlightResult(code) {
     const result = {
-      relevance: 0,
-      emitter: new options.__emitter(options),
       value: escape(code),
       illegal: false,
-      top: PLAINTEXT_LANGUAGE
+      relevance: 0,
+      _top: PLAINTEXT_LANGUAGE,
+      _emitter: new options.__emitter(options)
     };
-    result.emitter.addText(code);
+    result._emitter.addText(code);
     return result;
   }
 
@@ -579,7 +576,7 @@ const HLJS = function(hljs) {
   - language (detected language)
   - relevance (int)
   - value (an HTML string with highlighting markup)
-  - second_best (object with the same structure for second-best heuristically
+  - secondBest (object with the same structure for second-best heuristically
     detected language, may be absent)
 
     @param {string} code
@@ -620,35 +617,11 @@ const HLJS = function(hljs) {
 
     /** @type {AutoHighlightResult} */
     const result = best;
-    result.second_best = secondBest;
+    result.secondBest = secondBest;
 
     return result;
   }
 
-  /**
-  Post-processing of the highlighted markup:
-
-  - replace TABs with something more useful
-  - replace real line-breaks with '
' for non-pre containers - - @param {string} html - @returns {string} - */ - function fixMarkup(html) { - if (!(options.tabReplace || options.useBR)) { - return html; - } - - return html.replace(fixMarkupRe, match => { - if (match === '\n') { - return options.useBR ? '
' : match; - } else if (options.tabReplace) { - return match.replace(/\t/g, options.tabReplace); - } - return match; - }); - } - /** * Builds new class name for block given the language name * @@ -663,35 +636,8 @@ const HLJS = function(hljs) { if (language) element.classList.add(language); } - /** @type {HLJSPlugin} */ - const brPlugin = { - "before:highlightElement": ({ el }) => { - if (options.useBR) { - el.innerHTML = el.innerHTML.replace(/\n/g, '').replace(//g, '\n'); - } - }, - "after:highlightElement": ({ result }) => { - if (options.useBR) { - result.value = result.value.replace(/\n/g, "
"); - } - } - }; - - const TAB_REPLACE_RE = /^(<[^>]+>|\t)+/gm; - /** @type {HLJSPlugin} */ - const tabReplacePlugin = { - "after:highlightElement": ({ result }) => { - if (options.tabReplace) { - result.value = result.value.replace(TAB_REPLACE_RE, (m) => - m.replace(/\t/g, options.tabReplace) - ); - } - } - }; - /** - * Applies highlighting to a DOM node containing code. Accepts a DOM node and - * two optional parameters for fixMarkup. + * Applies highlighting to a DOM node containing code. * * @param {HighlightedHTMLElement} element - the HTML element to highlight */ @@ -721,12 +667,10 @@ const HLJS = function(hljs) { re: result.relevance, relavance: result.relevance }; - if (result.second_best) { - element.second_best = { - language: result.second_best.language, - // TODO: remove with version 11.0 - re: result.second_best.relevance, - relavance: result.second_best.relevance + if (result.secondBest) { + element.secondBest = { + language: result.secondBest.language, + relavance: result.secondBest.relevance }; } } @@ -737,34 +681,19 @@ const HLJS = function(hljs) { * @param {Partial} userOptions */ function configure(userOptions) { - if (userOptions.useBR) { - logger.deprecated("10.3.0", "'useBR' will be removed entirely in v11.0"); - logger.deprecated("10.3.0", "Please see https://github.com/highlightjs/highlight.js/issues/2559"); - } options = inherit(options, userOptions); } - /** - * Highlights to all
 blocks on a page
-   *
-   * @type {Function & {called?: boolean}}
-   */
   // TODO: remove v12, deprecated
   const initHighlighting = () => {
-    if (initHighlighting.called) return;
-    initHighlighting.called = true;
-
-    logger.deprecated("10.6.0", "initHighlighting() is deprecated.  Use highlightAll() instead.");
-
-    const blocks = document.querySelectorAll('pre code');
-    blocks.forEach(highlightElement);
+    highlightAll();
+    logger.deprecated("10.6.0", "initHighlighting() deprecated.  Use highlightAll() now.");
   };
 
-  // Higlights all when DOMContentLoaded fires
   // TODO: remove v12, deprecated
   function initHighlightingOnLoad() {
-    logger.deprecated("10.6.0", "initHighlightingOnLoad() is deprecated.  Use highlightAll() instead.");
-    wantsHighlight = true;
+    highlightAll();
+    logger.deprecated("10.6.0", "initHighlightingOnLoad() deprecated.  Use highlightAll() now.");
   }
 
   let wantsHighlight = false;
@@ -939,19 +868,6 @@ const HLJS = function(hljs) {
     });
   }
 
-  /**
-  Note: fixMarkup is deprecated and will be removed entirely in v11
-
-  @param {string} arg
-  @returns {string}
-  */
-  function deprecateFixMarkup(arg) {
-    logger.deprecated("10.2.0", "fixMarkup will be removed entirely in v11.0");
-    logger.deprecated("10.2.0", "Please see https://github.com/highlightjs/highlight.js/issues/2534");
-
-    return fixMarkup(arg);
-  }
-
   /**
    *
    * @param {HighlightedHTMLElement} el
@@ -968,7 +884,6 @@ const HLJS = function(hljs) {
     highlight,
     highlightAuto,
     highlightAll,
-    fixMarkup: deprecateFixMarkup,
     highlightElement,
     // TODO: Remove with v12 API
     highlightBlock: deprecateHighlightBlock,
@@ -1003,10 +918,6 @@ const HLJS = function(hljs) {
   // merge all the modes/regexs into our main object
   Object.assign(hljs, MODES);
 
-  // built-in plugins, likely to be moved out of core in the future
-  hljs.addPlugin(brPlugin); // slated to be removed in v11
-  hljs.addPlugin(mergeHTMLPlugin);
-  hljs.addPlugin(tabReplacePlugin);
   return hljs;
 };
 
diff --git a/src/languages/apache.js b/src/languages/apache.js
index 605bdfa455..6afaff143d 100644
--- a/src/languages/apache.js
+++ b/src/languages/apache.js
@@ -4,7 +4,7 @@ Author: Ruslan Keba 
 Contributors: Ivan Sagalaev 
 Website: https://httpd.apache.org
 Description: language definition for Apache configuration files (httpd.conf & .htaccess)
-Category: common, config
+Category: config
 Audit: 2020
 */
 
diff --git a/src/languages/bash.js b/src/languages/bash.js
index 9dd90dd6bd..7941603405 100644
--- a/src/languages/bash.js
+++ b/src/languages/bash.js
@@ -103,7 +103,7 @@ export default function(hljs) {
 
   return {
     name: 'Bash',
-    aliases: ['sh', 'zsh'],
+    aliases: ['sh'],
     keywords: {
       $pattern: /\b[a-z._-]+\b/,
       keyword:
diff --git a/src/languages/c-like.js b/src/languages/c-like.js
deleted file mode 100644
index 88a3d988eb..0000000000
--- a/src/languages/c-like.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-Language: C-like (deprecated, use C and C++ instead)
-Author: Ivan Sagalaev 
-Contributors: Evgeny Stepanischev , Zaven Muradyan , Roel Deckers , Sam Wu , Jordi Petit , Pieter Vantorre , Google Inc. (David Benjamin) 
-*/
-
-/*
-C and C++ have now been fully split into `c.js` and `cpp.js`.
-This file only exists for legacy purposes to support v10.
-TODO: Remove this in v11.
-
-See: https://github.com/highlightjs/highlight.js/issues/2146
-*/
-
-import cPlusPlus from './cpp.js';
-
-/** @type LanguageFn */
-export default function(hljs) {
-  const lang = cPlusPlus(hljs);
-
-  const C_ALIASES = [
-    "c",
-    "h"
-  ];
-
-  const CPP_ALIASES = [
-    'cc',
-    'c++',
-    'h++',
-    'hpp',
-    'hh',
-    'hxx',
-    'cxx'
-  ];
-
-  lang.disableAutodetect = true;
-  lang.aliases = [];
-  // support users only loading c-like (legacy)
-  if (!hljs.getLanguage("c")) lang.aliases.push(...C_ALIASES);
-  if (!hljs.getLanguage("cpp")) lang.aliases.push(...CPP_ALIASES);
-
-  // if c and cpp are loaded after then they will reclaim these
-  // aliases for themselves
-
-  return lang;
-}
diff --git a/src/languages/coffeescript.js b/src/languages/coffeescript.js
index 0097546326..8c1acc7ee5 100644
--- a/src/languages/coffeescript.js
+++ b/src/languages/coffeescript.js
@@ -3,7 +3,7 @@ Language: CoffeeScript
 Author: Dmytrii Nagirniak 
 Contributors: Oleg Efimov , Cédric Néhémie 
 Description: CoffeeScript is a programming language that transcompiles to JavaScript. For info about language see http://coffeescript.org/
-Category: common, scripting
+Category: scripting
 Website: https://coffeescript.org
 */
 
diff --git a/src/languages/css.js b/src/languages/css.js
index 58818f54c9..5198fa3c5e 100644
--- a/src/languages/css.js
+++ b/src/languages/css.js
@@ -43,7 +43,7 @@ export default function(hljs) {
       VENDOR_PREFIX,
       // to recognize keyframe 40% etc which are outside the scope of our
       // attribute value mode
-      hljs.CSS_NUMBER_MODE,
+      modes.CSS_NUMBER_MODE,
       {
         className: 'selector-id',
         begin: /#[A-Za-z0-9_-]+/,
@@ -83,7 +83,7 @@ export default function(hljs) {
         contains: [
           modes.HEXCOLOR,
           modes.IMPORTANT,
-          hljs.CSS_NUMBER_MODE,
+          modes.CSS_NUMBER_MODE,
           ...STRINGS,
           // needed to highlight these as strings and to avoid issues with
           // illegal characters that might be inside urls that would tigger the
@@ -135,7 +135,7 @@ export default function(hljs) {
                 className: "attribute"
               },
               ...STRINGS,
-              hljs.CSS_NUMBER_MODE
+              modes.CSS_NUMBER_MODE
             ]
           }
         ]
diff --git a/src/languages/delphi.js b/src/languages/delphi.js
index 5f1dbfdc29..1ff672c6c6 100644
--- a/src/languages/delphi.js
+++ b/src/languages/delphi.js
@@ -102,11 +102,7 @@ export default function(hljs) {
       'dpr',
       'dfm',
       'pas',
-      'pascal',
-      'freepascal',
-      'lazarus',
-      'lpr',
-      'lfm'
+      'pascal'
     ],
     case_insensitive: true,
     keywords: KEYWORDS,
diff --git a/src/languages/htmlbars.js b/src/languages/htmlbars.js
deleted file mode 100644
index 4a5dddd64b..0000000000
--- a/src/languages/htmlbars.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- Language: HTMLBars (legacy)
- Requires: xml.js
- Description: Matcher for Handlebars as well as EmberJS additions.
- Website: https://github.com/tildeio/htmlbars
- Category: template
- */
-
-/*
-
-See: https://github.com/highlightjs/highlight.js/issues/2181
-
-This file is a stub that is only left in place for compatbility reasons for
-anyone who may be manually pulling in this file via a require or fetching
-it individually via CDN.
-
-TODO: Remove in version 11.0.
-
-*/
-
-// compile time dependency on handlebars
-import handlebars from "./handlebars.js";
-
-export default function(hljs) {
-  const definition = handlebars(hljs);
-
-  definition.name = "HTMLbars";
-
-  // HACK: This lets handlebars do the auto-detection if it's been loaded (by
-  // default the build script will load in alphabetical order) and if not (perhaps
-  // an install is only using `htmlbars`, not `handlebars`) then this will still
-  // allow HTMLBars to participate in the auto-detection
-
-  // worse case someone will have HTMLbars and handlebars competing for the same
-  // content and will need to change their setup to only require handlebars, but
-  // I don't consider this a breaking change
-  if (hljs.getLanguage("handlebars")) {
-    definition.disableAutodetect = true;
-  }
-
-  return definition;
-}
diff --git a/src/languages/http.js b/src/languages/http.js
index 577d9db1af..af19f087e1 100644
--- a/src/languages/http.js
+++ b/src/languages/http.js
@@ -2,7 +2,7 @@
 Language: HTTP
 Description: HTTP request and response headers with automatic body highlighting
 Author: Ivan Sagalaev 
-Category: common, protocols
+Category: protocols
 Website: https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview
 */
 
diff --git a/src/languages/less.js b/src/languages/less.js
index 4cac68b418..6f83379595 100644
--- a/src/languages/less.js
+++ b/src/languages/less.js
@@ -58,7 +58,7 @@ export default function(hljs) {
     hljs.C_BLOCK_COMMENT_MODE,
     STRING_MODE("'"),
     STRING_MODE('"'),
-    hljs.CSS_NUMBER_MODE, // fixme: it does not include dot for numbers like .5em :(
+    modes.CSS_NUMBER_MODE, // fixme: it does not include dot for numbers like .5em :(
     {
       begin: '(url|data-uri)\\(',
       starts: {
diff --git a/src/languages/lib/css-shared.js b/src/languages/lib/css-shared.js
index 127fd51fb6..1a9f9e79b2 100644
--- a/src/languages/lib/css-shared.js
+++ b/src/languages/lib/css-shared.js
@@ -17,6 +17,19 @@ export const MODES = (hljs) => {
         hljs.APOS_STRING_MODE,
         hljs.QUOTE_STRING_MODE
       ]
+    },
+    CSS_NUMBER_MODE: {
+      className: 'number',
+      begin: hljs.NUMBER_RE + '(' +
+        '%|em|ex|ch|rem' +
+        '|vw|vh|vmin|vmax' +
+        '|cm|mm|in|pt|pc|px' +
+        '|deg|grad|rad|turn' +
+        '|s|ms' +
+        '|Hz|kHz' +
+        '|dpi|dpcm|dppx' +
+        ')?',
+      relevance: 0
     }
   };
 };
diff --git a/src/languages/nginx.js b/src/languages/nginx.js
index c6bddb6b64..83ac6c2100 100644
--- a/src/languages/nginx.js
+++ b/src/languages/nginx.js
@@ -2,7 +2,7 @@
 Language: Nginx config
 Author: Peter Leonov 
 Contributors: Ivan Sagalaev 
-Category: common, config
+Category: config
 Website: https://www.nginx.com
 */
 
diff --git a/src/languages/php.js b/src/languages/php.js
index 847e6599fe..ce0af400a8 100644
--- a/src/languages/php.js
+++ b/src/languages/php.js
@@ -103,7 +103,6 @@ export default function(hljs) {
     'Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass'
   };
   return {
-    aliases: ['php3', 'php4', 'php5', 'php6', 'php7', 'php8'],
     case_insensitive: true,
     keywords: KEYWORDS,
     contains: [
diff --git a/src/languages/properties.js b/src/languages/properties.js
index 4f5fa8d0f5..87eb082e30 100644
--- a/src/languages/properties.js
+++ b/src/languages/properties.js
@@ -2,7 +2,7 @@
 Language: .properties
 Contributors: Valentin Aitken , Egor Rogov 
 Website: https://en.wikipedia.org/wiki/.properties
-Category: common, config
+Category: config
 */
 
 export default function(hljs) {
diff --git a/src/languages/scss.js b/src/languages/scss.js
index 9b32a3629c..06bb634271 100644
--- a/src/languages/scss.js
+++ b/src/languages/scss.js
@@ -58,7 +58,7 @@ export default function(hljs) {
       { // pseudo-selector params
         begin: /\(/,
         end: /\)/,
-        contains: [ hljs.CSS_NUMBER_MODE ]
+        contains: [ modes.CSS_NUMBER_MODE ]
       },
       {
         className: 'attribute',
@@ -73,7 +73,7 @@ export default function(hljs) {
         contains: [
           VARIABLE,
           modes.HEXCOLOR,
-          hljs.CSS_NUMBER_MODE,
+          modes.CSS_NUMBER_MODE,
           hljs.QUOTE_STRING_MODE,
           hljs.APOS_STRING_MODE,
           modes.IMPORTANT
@@ -109,7 +109,7 @@ export default function(hljs) {
           hljs.QUOTE_STRING_MODE,
           hljs.APOS_STRING_MODE,
           modes.HEXCOLOR,
-          hljs.CSS_NUMBER_MODE
+          modes.CSS_NUMBER_MODE
         ]
       }
     ]
diff --git a/src/languages/sql_more.js b/src/languages/sql_more.js
deleted file mode 100644
index eb18c83e0f..0000000000
--- a/src/languages/sql_more.js
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- Language: SQL More (mix of MySQL, Oracle, etc)
- Contributors: Nikolay Lisienko , Heiko August , Travis Odom , Vadimtro , Benjamin Auder 
- Website: https://en.wikipedia.org/wiki/SQL
- Category: database
- */
-
-/*
-
-This is a preservation of the old bloated SQL grammar which includes pretty much
-the kitchen sink because no one was keeping track of which keywords belong to
-which databases.  This is likely to be removed in the future.
-
-- Oracle SQL should be factored into it's own 3rd party grammar.
-- MySQL should be factored out into it's own 3rd party grammar.
-
-*/
-
-export default function(hljs) {
-  var COMMENT_MODE = hljs.COMMENT('--', '$');
-  return {
-    name: 'SQL (more)',
-    aliases: ["mysql", "oracle"],
-    disableAutodetect: true,
-    case_insensitive: true,
-    illegal: /[<>{}*]/,
-    contains: [
-      {
-        beginKeywords:
-          'begin end start commit rollback savepoint lock alter create drop rename call ' +
-          'delete do handler insert load replace select truncate update set show pragma grant ' +
-          'merge describe use explain help declare prepare execute deallocate release ' +
-          'unlock purge reset change stop analyze cache flush optimize repair kill ' +
-          'install uninstall checksum restore check backup revoke comment values with',
-        end: /;/, endsWithParent: true,
-        keywords: {
-          $pattern: /[\w\.]+/,
-          keyword:
-            'as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add ' +
-            'addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias ' +
-            'all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply ' +
-            'archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan ' +
-            'atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid ' +
-            'authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile ' +
-            'before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float ' +
-            'binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound ' +
-            'bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel ' +
-            'capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base ' +
-            'char_length character_length characters characterset charindex charset charsetform charsetid check ' +
-            'checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close ' +
-            'cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation ' +
-            'collect colu colum column column_value columns columns_updated comment commit compact compatibility ' +
-            'compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn ' +
-            'connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection ' +
-            'consider consistent constant constraint constraints constructor container content contents context ' +
-            'contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost ' +
-            'count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation ' +
-            'critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user ' +
-            'cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add ' +
-            'date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts ' +
-            'day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate ' +
-            'declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults ' +
-            'deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank ' +
-            'depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor ' +
-            'deterministic diagnostics difference dimension direct_load directory disable disable_all ' +
-            'disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div ' +
-            'do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable ' +
-            'editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt ' +
-            'end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors ' +
-            'escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding ' +
-            'execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external ' +
-            'external_1 external_2 externally extract failed failed_login_attempts failover failure far fast ' +
-            'feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final ' +
-            'finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign ' +
-            'form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ' +
-            'ftp full function general generated get get_format get_lock getdate getutcdate global global_name ' +
-            'globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups ' +
-            'gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex ' +
-            'hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified ' +
-            'identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment ' +
-            'index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile ' +
-            'initial initialized initially initrans inmemory inner innodb input insert install instance instantiable ' +
-            'instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat ' +
-            'is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists ' +
-            'keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase ' +
-            'lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit ' +
-            'lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate ' +
-            'locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call ' +
-            'logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime ' +
-            'managed management manual map mapping mask master master_pos_wait match matched materialized max ' +
-            'maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans ' +
-            'md5 measures median medium member memcompress memory merge microsecond mid migration min minextents ' +
-            'minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month ' +
-            'months mount move movement multiset mutex name name_const names nan national native natural nav nchar ' +
-            'nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile ' +
-            'nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile ' +
-            'nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder ' +
-            'nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck ' +
-            'noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe ' +
-            'nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ' +
-            'ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old ' +
-            'on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date ' +
-            'oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary ' +
-            'out outer outfile outline output over overflow overriding package pad parallel parallel_enable ' +
-            'parameters parent parse partial partition partitions pascal passing password password_grace_time ' +
-            'password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex ' +
-            'pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc ' +
-            'performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin ' +
-            'policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction ' +
-            'prediction_cost prediction_details prediction_probability prediction_set prepare present preserve ' +
-            'prior priority private private_sga privileges procedural procedure procedure_analyze processlist ' +
-            'profiles project prompt protection public publishingservername purge quarter query quick quiesce quota ' +
-            'quotename radians raise rand range rank raw read reads readsize rebuild record records ' +
-            'recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh ' +
-            'regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy ' +
-            'reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename ' +
-            'repair repeat replace replicate replication required reset resetlogs resize resource respect restore ' +
-            'restricted result result_cache resumable resume retention return returning returns reuse reverse revoke ' +
-            'right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows ' +
-            'rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll ' +
-            'sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select ' +
-            'self semi sequence sequential serializable server servererror session session_user sessions_per_user set ' +
-            'sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor ' +
-            'si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin ' +
-            'size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex ' +
-            'source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows ' +
-            'sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone ' +
-            'standby start starting startup statement static statistics stats_binomial_test stats_crosstab ' +
-            'stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep ' +
-            'stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev ' +
-            'stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate ' +
-            'subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum ' +
-            'suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate ' +
-            'sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo ' +
-            'template temporary terminated tertiary_weights test than then thread through tier ties time time_format ' +
-            'time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr ' +
-            'timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking ' +
-            'transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate ' +
-            'try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress ' +
-            'under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot ' +
-            'unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert ' +
-            'url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date ' +
-            'utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var ' +
-            'var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray ' +
-            'verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear ' +
-            'wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped ' +
-            'xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces ' +
-            'xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek',
-          literal:
-            'true false null unknown',
-          built_in:
-            'array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number ' +
-            'numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void'
-        },
-        contains: [
-          {
-            className: 'string',
-            begin: '\'', end: '\'',
-            contains: [{begin: '\'\''}]
-          },
-          {
-            className: 'string',
-            begin: '"', end: '"',
-            contains: [{begin: '""'}]
-          },
-          {
-            className: 'string',
-            begin: '`', end: '`'
-          },
-          hljs.C_NUMBER_MODE,
-          hljs.C_BLOCK_COMMENT_MODE,
-          COMMENT_MODE,
-          hljs.HASH_COMMENT_MODE
-        ]
-      },
-      hljs.C_BLOCK_COMMENT_MODE,
-      COMMENT_MODE,
-      hljs.HASH_COMMENT_MODE
-    ]
-  };
-}
diff --git a/src/languages/stylus.js b/src/languages/stylus.js
index 4a0236399e..6dfba93dfb 100644
--- a/src/languages/stylus.js
+++ b/src/languages/stylus.js
@@ -111,7 +111,7 @@ export default function(hljs) {
             keyword: AT_MODIFIERS,
             attribute: css.MEDIA_FEATURES.join(" ")
           },
-          contains: [ hljs.CSS_NUMBER_MODE ]
+          contains: [ modes.CSS_NUMBER_MODE ]
         }
       },
 
@@ -125,7 +125,7 @@ export default function(hljs) {
       VARIABLE,
 
       // dimension
-      hljs.CSS_NUMBER_MODE,
+      modes.CSS_NUMBER_MODE,
 
       // functions
       //  - only from beginning of line + whitespace
@@ -147,7 +147,7 @@ export default function(hljs) {
               modes.HEXCOLOR,
               VARIABLE,
               hljs.APOS_STRING_MODE,
-              hljs.CSS_NUMBER_MODE,
+              modes.CSS_NUMBER_MODE,
               hljs.QUOTE_STRING_MODE
             ]
           }
@@ -168,7 +168,7 @@ export default function(hljs) {
             VARIABLE,
             hljs.APOS_STRING_MODE,
             hljs.QUOTE_STRING_MODE,
-            hljs.CSS_NUMBER_MODE,
+            modes.CSS_NUMBER_MODE,
             hljs.C_BLOCK_COMMENT_MODE,
             modes.IMPORTANT
           ],
diff --git a/src/lib/mode_compiler.js b/src/lib/mode_compiler.js
index 173185c60e..4ab7bd27c4 100644
--- a/src/lib/mode_compiler.js
+++ b/src/lib/mode_compiler.js
@@ -66,7 +66,7 @@ export function compileLanguage(language, { plugins }) {
         this.exec = () => null;
       }
       const terminators = this.regexes.map(el => el[1]);
-      this.matcherRe = langRe(regex.join(terminators), true);
+      this.matcherRe = langRe(regex._eitherRewriteBackreferences(terminators), true);
       this.lastIndex = 0;
     }
 
diff --git a/src/lib/modes.js b/src/lib/modes.js
index e4d2ab45b9..a6c6942ee6 100644
--- a/src/lib/modes.js
+++ b/src/lib/modes.js
@@ -99,19 +99,6 @@ export const BINARY_NUMBER_MODE = {
   begin: BINARY_NUMBER_RE,
   relevance: 0
 };
-export const CSS_NUMBER_MODE = {
-  className: 'number',
-  begin: NUMBER_RE + '(' +
-    '%|em|ex|ch|rem' +
-    '|vw|vh|vmin|vmax' +
-    '|cm|mm|in|pt|pc|px' +
-    '|deg|grad|rad|turn' +
-    '|s|ms' +
-    '|Hz|kHz' +
-    '|dpi|dpcm|dppx' +
-    ')?',
-  relevance: 0
-};
 export const REGEXP_MODE = {
   // this outer rule makes sure we actually have a WHOLE regex and not simply
   // an expression such as:
diff --git a/src/lib/regex.js b/src/lib/regex.js
index 55714db46f..3422666df8 100644
--- a/src/lib/regex.js
+++ b/src/lib/regex.js
@@ -89,6 +89,7 @@ export function startsWith(re, lexeme) {
 //   follow the '(' with a '?'.
 const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;
 
+// **INTERNAL** Not intended for outside usage
 // join logically computes regexps.join(separator), but fixes the
 // backreferences so they continue to match.
 // it also places each individual regular expression into it's own
@@ -99,7 +100,7 @@ const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;
  * @param {string} separator
  * @returns {string}
  */
-export function join(regexps, separator = "|") {
+export function _eitherRewriteBackreferences(regexps) {
   let numCaptures = 0;
 
   return regexps.map((regex) => {
@@ -127,5 +128,5 @@ export function join(regexps, separator = "|") {
       }
     }
     return out;
-  }).map(re => `(${re})`).join(separator);
+  }).map(re => `(${re})`).join("|");
 }
diff --git a/src/plugins/merge_html.js b/src/plugins/merge_html.js
deleted file mode 100644
index a081df649f..0000000000
--- a/src/plugins/merge_html.js
+++ /dev/null
@@ -1,156 +0,0 @@
-import { escapeHTML } from "../lib/utils.js";
-
-/* plugin itself */
-
-/** @type {HLJSPlugin} */
-export const mergeHTMLPlugin = {
-  "after:highlightElement": ({ el, result, text }) => {
-    const originalStream = nodeStream(el);
-    if (!originalStream.length) return;
-
-    const resultNode = document.createElement('div');
-    resultNode.innerHTML = result.value;
-    result.value = mergeStreams(originalStream, nodeStream(resultNode), text);
-  }
-};
-
-/* Stream merging support functions */
-
-/**
- * @typedef Event
- * @property {'start'|'stop'} event
- * @property {number} offset
- * @property {Node} node
- */
-
-/**
- * @param {Node} node
- */
-function tag(node) {
-  return node.nodeName.toLowerCase();
-}
-
-/**
- * @param {Node} node
- */
-export function nodeStream(node) {
-  /** @type Event[] */
-  const result = [];
-  (function _nodeStream(node, offset) {
-    for (let child = node.firstChild; child; child = child.nextSibling) {
-      if (child.nodeType === 3) {
-        offset += child.nodeValue.length;
-      } else if (child.nodeType === 1) {
-        result.push({
-          event: 'start',
-          offset: offset,
-          node: child
-        });
-        offset = _nodeStream(child, offset);
-        // Prevent void elements from having an end tag that would actually
-        // double them in the output. There are more void elements in HTML
-        // but we list only those realistically expected in code display.
-        if (!tag(child).match(/br|hr|img|input/)) {
-          result.push({
-            event: 'stop',
-            offset: offset,
-            node: child
-          });
-        }
-      }
-    }
-    return offset;
-  })(node, 0);
-  return result;
-}
-
-/**
- * @param {any} original - the original stream
- * @param {any} highlighted - stream of the highlighted source
- * @param {string} value - the original source itself
- */
-export function mergeStreams(original, highlighted, value) {
-  let processed = 0;
-  let result = '';
-  const nodeStack = [];
-
-  function selectStream() {
-    if (!original.length || !highlighted.length) {
-      return original.length ? original : highlighted;
-    }
-    if (original[0].offset !== highlighted[0].offset) {
-      return (original[0].offset < highlighted[0].offset) ? original : highlighted;
-    }
-
-    /*
-    To avoid starting the stream just before it should stop the order is
-    ensured that original always starts first and closes last:
-
-    if (event1 == 'start' && event2 == 'start')
-      return original;
-    if (event1 == 'start' && event2 == 'stop')
-      return highlighted;
-    if (event1 == 'stop' && event2 == 'start')
-      return original;
-    if (event1 == 'stop' && event2 == 'stop')
-      return highlighted;
-
-    ... which is collapsed to:
-    */
-    return highlighted[0].event === 'start' ? original : highlighted;
-  }
-
-  /**
-   * @param {Node} node
-   */
-  function open(node) {
-    /** @param {Attr} attr */
-    function attributeString(attr) {
-      return ' ' + attr.nodeName + '="' + escapeHTML(attr.value) + '"';
-    }
-    // @ts-ignore
-    result += '<' + tag(node) + [].map.call(node.attributes, attributeString).join('') + '>';
-  }
-
-  /**
-   * @param {Node} node
-   */
-  function close(node) {
-    result += '';
-  }
-
-  /**
-   * @param {Event} event
-   */
-  function render(event) {
-    (event.event === 'start' ? open : close)(event.node);
-  }
-
-  while (original.length || highlighted.length) {
-    let stream = selectStream();
-    result += escapeHTML(value.substring(processed, stream[0].offset));
-    processed = stream[0].offset;
-    if (stream === original) {
-      /*
-      On any opening or closing tag of the original markup we first close
-      the entire highlighted node stack, then render the original tag along
-      with all the following original tags at the same offset and then
-      reopen all the tags on the highlighted stack.
-      */
-      nodeStack.reverse().forEach(close);
-      do {
-        render(stream.splice(0, 1)[0]);
-        stream = selectStream();
-      } while (stream === original && stream.length && stream[0].offset === processed);
-      nodeStack.reverse().forEach(open);
-    } else {
-      if (stream[0].event === 'start') {
-        nodeStack.push(stream[0].node);
-      } else {
-        nodeStack.pop();
-      }
-      render(stream.splice(0, 1)[0]);
-    }
-  }
-  return result + escapeHTML(value.substr(processed));
-}
diff --git a/src/stub.js b/src/stub.js
new file mode 100644
index 0000000000..ee342b5e3d
--- /dev/null
+++ b/src/stub.js
@@ -0,0 +1,13 @@
+import HighlightJS from "./highlight.js";
+// @ts-ignore
+import * as builtIns from "builtInLanguages";
+
+const hljs = HighlightJS;
+
+for (const key of Object.keys(builtIns)) {
+  const languageName = key.replace("grmr_", "");
+  hljs.registerLanguage(languageName, builtIns[key]);
+}
+// console.log(hljs.listLanguages());
+
+export default hljs;
diff --git a/src/styles/a11y-dark.css b/src/styles/a11y-dark.css
index b93b742a45..76f75f1a04 100644
--- a/src/styles/a11y-dark.css
+++ b/src/styles/a11y-dark.css
@@ -2,6 +2,11 @@
 /* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */
 /* @author: ericwbailey */
 
+.hljs {
+  background: #2b2b2b;
+  color: #f8f8f2;
+}
+
 /* Comment */
 .hljs-comment,
 .hljs-quote {
@@ -57,14 +62,6 @@
   color: #dcc6e0;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #2b2b2b;
-  color: #f8f8f2;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/a11y-light.css b/src/styles/a11y-light.css
index f1bf8f3f8f..504d60b79b 100644
--- a/src/styles/a11y-light.css
+++ b/src/styles/a11y-light.css
@@ -2,6 +2,11 @@
 /* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */
 /* @author: ericwbailey */
 
+.hljs {
+  background: #fefefe;
+  color: #545454;
+}
+
 /* Comment */
 .hljs-comment,
 .hljs-quote {
@@ -57,14 +62,6 @@
   color: #7928a1;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #fefefe;
-  color: #545454;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/agate.css b/src/styles/agate.css
index 5d7a3e8c78..57abd15a91 100644
--- a/src/styles/agate.css
+++ b/src/styles/agate.css
@@ -17,9 +17,6 @@
  */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #333;
   color: white;
 }
diff --git a/src/styles/an-old-hope.css b/src/styles/an-old-hope.css
index a6d56f4b40..d0d2d3e768 100644
--- a/src/styles/an-old-hope.css
+++ b/src/styles/an-old-hope.css
@@ -1,4 +1,4 @@
-/* 
+/*
 
 An Old Hope – Star Wars Syntax (c) Gustavo Costa 
 Original theme - Ocean Dark Theme – by https://github.com/gavsiu
@@ -6,9 +6,16 @@ Based on Jesse Leite's Atom syntax theme 'An Old Hope' – https://github.com/Je
 
 */
 
+/* Millenium Falcon */
+.hljs
+{
+  background: #1C1D21;
+  color: #c0c5ce;
+}
+
 /* Death Star Comment */
 .hljs-comment,
-.hljs-quote 
+.hljs-quote
 {
   color: #B6B18B;
 }
@@ -21,7 +28,7 @@ Based on Jesse Leite's Atom syntax theme 'An Old Hope' – https://github.com/Je
 .hljs-selector-id,
 .hljs-selector-class,
 .hljs-regexp,
-.hljs-deletion 
+.hljs-deletion
 {
   color: #EB3C54;
 }
@@ -34,13 +41,13 @@ Based on Jesse Leite's Atom syntax theme 'An Old Hope' – https://github.com/Je
 .hljs-type,
 .hljs-params,
 .hljs-meta,
-.hljs-link 
+.hljs-link
 {
   color: #E7CE56;
 }
 
 /* Luke Skywalker */
-.hljs-attribute 
+.hljs-attribute
 {
   color: #EE7C2B;
 }
@@ -49,41 +56,31 @@ Based on Jesse Leite's Atom syntax theme 'An Old Hope' – https://github.com/Je
 .hljs-string,
 .hljs-symbol,
 .hljs-bullet,
-.hljs-addition 
+.hljs-addition
 {
   color: #4FB4D7;
 }
 
 /* Yoda */
 .hljs-title,
-.hljs-section 
+.hljs-section
 {
   color: #78BB65;
 }
 
 /* Mace Windu */
 .hljs-keyword,
-.hljs-selector-tag 
+.hljs-selector-tag
 {
   color: #B45EA4;
 }
 
-/* Millenium Falcon */
-.hljs 
-{
-  display: block;
-  overflow-x: auto;
-  background: #1C1D21;
-  color: #c0c5ce;
-  padding: 0.5em;
-}
-
-.hljs-emphasis 
+.hljs-emphasis
 {
   font-style: italic;
 }
 
-.hljs-strong 
+.hljs-strong
 {
   font-weight: bold;
 }
diff --git a/src/styles/androidstudio.css b/src/styles/androidstudio.css
index bc8e473b59..47779718bd 100644
--- a/src/styles/androidstudio.css
+++ b/src/styles/androidstudio.css
@@ -6,9 +6,6 @@ Author: Pedro Oliveira 
 .hljs {
   color: #a9b7c6;
   background: #282b2e;
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
 }
 
 .hljs-number,
diff --git a/src/styles/arduino-light.css b/src/styles/arduino-light.css
index e6039c36f8..ec7a25c09c 100644
--- a/src/styles/arduino-light.css
+++ b/src/styles/arduino-light.css
@@ -5,13 +5,10 @@ Arduino® Light Theme - Stefania Mellai 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
-  background: #FFFFFF;
+  background: white;
+  color: #434f54;
 }
 
-.hljs,
 .hljs-subst {
   color: #434f54;
 }
@@ -83,5 +80,5 @@ Arduino® Light Theme - Stefania Mellai 
 }
 
 .hljs-number {
-  color: #8A7B52;  
+  color: #8A7B52;
 }
diff --git a/src/styles/arta.css b/src/styles/arta.css
index 75ef3a9e59..bd7d6eeee1 100644
--- a/src/styles/arta.css
+++ b/src/styles/arta.css
@@ -4,13 +4,10 @@ Author: pumbur 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #222;
+  color: #aaa;
 }
 
-.hljs,
 .hljs-subst {
   color: #aaa;
 }
diff --git a/src/styles/ascetic.css b/src/styles/ascetic.css
index 48397e889d..73b3c314e6 100644
--- a/src/styles/ascetic.css
+++ b/src/styles/ascetic.css
@@ -5,9 +5,6 @@ Original style from softwaremaniacs.org (c) Ivan Sagalaev 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #363c69;
   background:#b7a68e url(./brown-papersq.png);
 }
 
@@ -18,9 +16,8 @@ Brown Paper style from goldblog.com.ua (c) Zaripov Yura 
   font-weight:bold;
 }
 
-.hljs,
 .hljs-subst {
-  color: #363c69;
+  /* default */
 }
 
 .hljs-string,
diff --git a/src/styles/codepen-embed.css b/src/styles/codepen-embed.css
index 195c4a0784..3189c1f33d 100644
--- a/src/styles/codepen-embed.css
+++ b/src/styles/codepen-embed.css
@@ -5,9 +5,6 @@
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #222;
   color: #fff;
 }
diff --git a/src/styles/color-brewer.css b/src/styles/color-brewer.css
index 7934d986a7..51c85233b4 100644
--- a/src/styles/color-brewer.css
+++ b/src/styles/color-brewer.css
@@ -7,15 +7,12 @@ Ported by Fabrício Tavares de Oliveira
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #000;
   background: #fff;
 }
 
-.hljs,
 .hljs-subst {
-  color: #000;
+  /* default */
 }
 
 .hljs-string,
diff --git a/src/styles/darcula.css b/src/styles/darcula.css
index 4c734f1cd7..4b627925bf 100644
--- a/src/styles/darcula.css
+++ b/src/styles/darcula.css
@@ -1,14 +1,9 @@
 /*
-
 Darcula color scheme from the JetBrains family of IDEs
-
 */
 
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #2b2b2b;
   color: #bababa;
 }
diff --git a/src/styles/dark.css b/src/styles/dark.css
index b4724f5f50..34708897f3 100644
--- a/src/styles/dark.css
+++ b/src/styles/dark.css
@@ -5,9 +5,7 @@ Dark style from softwaremaniacs.org (c) Ivan Sagalaev 
-
 */
 
 .hljs {
   display: block;
   overflow-x: auto;
-  padding: 0.5em;
+  padding: 1em;
   background: #F0F0F0;
+  color: #444;
 }
 
 
 /* Base color: saturation 0; */
 
-.hljs,
 .hljs-subst {
-  color: #444;
+  /* default */
 }
 
 .hljs-comment {
diff --git a/src/styles/docco.css b/src/styles/docco.css
index db366be372..5a44d8651d 100644
--- a/src/styles/docco.css
+++ b/src/styles/docco.css
@@ -3,9 +3,6 @@ Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   color: #000;
   background: #f8f8ff;
 }
diff --git a/src/styles/dracula.css b/src/styles/dracula.css
index d591db6801..f8dfb3d529 100644
--- a/src/styles/dracula.css
+++ b/src/styles/dracula.css
@@ -15,9 +15,7 @@ http://zenorocha.mit-license.org
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #f8f8f2;
   background: #282a36;
 }
 
@@ -33,9 +31,8 @@ http://zenorocha.mit-license.org
   color: #ff79c6;
 }
 
-.hljs,
 .hljs-subst {
-  color: #f8f8f2;
+  /* default */
 }
 
 .hljs-string,
diff --git a/src/styles/far.css b/src/styles/far.css
index 2b3f87b562..8669f97b95 100644
--- a/src/styles/far.css
+++ b/src/styles/far.css
@@ -5,15 +5,13 @@ FAR Style (c) MajestiC 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #0ff;
   background: #000080;
 }
 
-.hljs,
+
 .hljs-subst {
-  color: #0ff;
+  /* default */
 }
 
 .hljs-string,
diff --git a/src/styles/foundation.css b/src/styles/foundation.css
index 67c6e10152..d32f8050f6 100644
--- a/src/styles/foundation.css
+++ b/src/styles/foundation.css
@@ -7,9 +7,6 @@ Date: 2013-04-02
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #eee;
   color: black;
 }
diff --git a/src/styles/github-gist.css b/src/styles/github-gist.css
index 18240c8882..982ce16cdf 100644
--- a/src/styles/github-gist.css
+++ b/src/styles/github-gist.css
@@ -5,11 +5,8 @@
  */
 
 .hljs {
-  display: block;
   background: white;
-  padding: 0.5em;
   color: #333333;
-  overflow-x: auto;
 }
 
 .hljs-comment,
diff --git a/src/styles/github.css b/src/styles/github.css
index 791932b87e..4e7f3d1740 100644
--- a/src/styles/github.css
+++ b/src/styles/github.css
@@ -5,9 +5,6 @@ github.com style (c) Vasily Polovnyov 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   color: #333;
   background: #f8f8f8;
 }
diff --git a/src/styles/gml.css b/src/styles/gml.css
index 7fff0b8772..3c47525a1a 100644
--- a/src/styles/gml.css
+++ b/src/styles/gml.css
@@ -5,9 +5,6 @@ GML Theme - Meseta 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #222222;
   color: #C0C0C0;
 }
diff --git a/src/styles/googlecode.css b/src/styles/googlecode.css
index 884ad63538..2a5adcbb1c 100644
--- a/src/styles/googlecode.css
+++ b/src/styles/googlecode.css
@@ -5,9 +5,6 @@ Google Code style (c) Aahan Krish 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: white;
   color: black;
 }
diff --git a/src/styles/gradient-dark.css b/src/styles/gradient-dark.css
index ca6d001b41..35ae517dab 100644
--- a/src/styles/gradient-dark.css
+++ b/src/styles/gradient-dark.css
@@ -6,9 +6,6 @@ Gradient Dark (c) Samia Ali 
 
 .hljs
 {
-display: block;
-overflow-x: auto;
-padding: 0.5em;
 background: rgb(80,31,122);
 background: linear-gradient(166deg, rgba(80,31,122,1) 0%, rgba(40,32,179,1) 80%);
 color:#e7e4eb;
@@ -42,7 +39,7 @@ color:#e7e4eb;
 
 {
   color:#F19FFF;
-  
+
 }
 
 .hljs-keyword,
diff --git a/src/styles/gradient-light.css b/src/styles/gradient-light.css
index 801a136f4f..af57b67be9 100644
--- a/src/styles/gradient-light.css
+++ b/src/styles/gradient-light.css
@@ -6,9 +6,6 @@ Gradient Light (c) Samia Ali 
 
 .hljs
 {
-display: block;
-overflow-x: auto;
-padding: 0.5em;
 background: rgb(255,253,141);
 background: linear-gradient(142deg, rgba(255,253,141,1) 0%, rgba(252,183,255,1) 35%, rgba(144,236,255,1) 100%);
 color:#250482;
@@ -42,7 +39,7 @@ color:#01958B;
 
 {
   color:#43449F;
-  
+
 }
 
 .hljs-keyword,
diff --git a/src/styles/grayscale.css b/src/styles/grayscale.css
index 5376f34064..a549abcf31 100644
--- a/src/styles/grayscale.css
+++ b/src/styles/grayscale.css
@@ -5,9 +5,6 @@ grayscale style (c) MY Sun 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   color: #333;
   background: #fff;
 }
diff --git a/src/styles/gruvbox-dark.css b/src/styles/gruvbox-dark.css
index f563811a86..493a100abe 100644
--- a/src/styles/gruvbox-dark.css
+++ b/src/styles/gruvbox-dark.css
@@ -5,15 +5,13 @@ Gruvbox style (dark) (c) Pavel Pertsev (original style at https://github.com/mor
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #ebdbb2;
   background: #282828;
 }
 
-.hljs,
+
 .hljs-subst {
-  color: #ebdbb2;
+  /* default */
 }
 
 /* Gruvbox Red */
diff --git a/src/styles/gruvbox-light.css b/src/styles/gruvbox-light.css
index ff45468eb2..28d56116c3 100644
--- a/src/styles/gruvbox-light.css
+++ b/src/styles/gruvbox-light.css
@@ -5,15 +5,13 @@ Gruvbox style (light) (c) Pavel Pertsev (original style at https://github.com/mo
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #3c3836;
   background: #fbf1c7;
 }
 
-.hljs,
+
 .hljs-subst {
-  color: #3c3836;
+  /* default */
 }
 
 /* Gruvbox Red */
diff --git a/src/styles/hopscotch.css b/src/styles/hopscotch.css
index 5934601a00..e408c6d2b9 100644
--- a/src/styles/hopscotch.css
+++ b/src/styles/hopscotch.css
@@ -6,6 +6,11 @@
  * This work is licensed under the Creative Commons CC0 1.0 Universal License
  */
 
+.hljs {
+  background: #322931;
+  color: #b9b5b8;
+}
+
 /* Comment */
 .hljs-comment,
 .hljs-quote {
@@ -67,14 +72,6 @@
   color: #c85e7c;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #322931;
-  color: #b9b5b8;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/hybrid.css b/src/styles/hybrid.css
index 29735a1890..04ea31b9c7 100644
--- a/src/styles/hybrid.css
+++ b/src/styles/hybrid.css
@@ -4,12 +4,9 @@ vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)
 
 */
 
-/*background color*/
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #1d1f21;
+  color: #c5c8c6;
 }
 
 /*selection color*/
@@ -23,11 +20,6 @@ vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)
   background: #373b41;
 }
 
-/*foreground color*/
-.hljs {
-  color: #c5c8c6;
-}
-
 /*color: fg_yellow*/
 .hljs-title,
 .hljs-name {
diff --git a/src/styles/idea.css b/src/styles/idea.css
index 3bf1892bd4..5adc8f899d 100644
--- a/src/styles/idea.css
+++ b/src/styles/idea.css
@@ -5,9 +5,6 @@ Intellij Idea-like styling (c) Vasily Polovnyov 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   color: #000;
   background: #fff;
 }
diff --git a/src/styles/ir-black.css b/src/styles/ir-black.css
index bd4c755ed8..b70839ba47 100644
--- a/src/styles/ir-black.css
+++ b/src/styles/ir-black.css
@@ -3,9 +3,6 @@
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #000;
   color: #f8f8f8;
 }
diff --git a/src/styles/isbl-editor-dark.css b/src/styles/isbl-editor-dark.css
index 2f1d95dd50..0d52ef6967 100644
--- a/src/styles/isbl-editor-dark.css
+++ b/src/styles/isbl-editor-dark.css
@@ -5,9 +5,6 @@ ISBL Editor style dark color scheme (c) Dmitriy Tarasov 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #404040;
   color: #f0f0f0;
 }
diff --git a/src/styles/isbl-editor-light.css b/src/styles/isbl-editor-light.css
index 5dee9ca037..8ad8661d0a 100644
--- a/src/styles/isbl-editor-light.css
+++ b/src/styles/isbl-editor-light.css
@@ -5,9 +5,6 @@ ISBL Editor style light color schemec (c) Dmitriy Tarasov 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: white;
   color: black;
 }
diff --git a/src/styles/kimbie.dark.css b/src/styles/kimbie.dark.css
index d139cb5d0c..866fdac8fe 100644
--- a/src/styles/kimbie.dark.css
+++ b/src/styles/kimbie.dark.css
@@ -5,6 +5,11 @@
     URL:      https://github.com/idleberg/Kimbie-highlight.js
 */
 
+.hljs {
+  background: #221a0f;
+  color: #d3af86;
+}
+
 /* Kimbie Comment */
 .hljs-comment,
 .hljs-quote {
@@ -57,14 +62,6 @@
   color: #98676a;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #221a0f;
-  color: #d3af86;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/kimbie.light.css b/src/styles/kimbie.light.css
index 04ff6ed3a2..f865a538e3 100644
--- a/src/styles/kimbie.light.css
+++ b/src/styles/kimbie.light.css
@@ -5,6 +5,11 @@
     URL:      https://github.com/idleberg/Kimbie-highlight.js
 */
 
+.hljs {
+  background: #fbebd4;
+  color: #84613d;
+}
+
 /* Kimbie Comment */
 .hljs-comment,
 .hljs-quote {
@@ -57,14 +62,6 @@
   color: #98676a;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #fbebd4;
-  color: #84613d;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/lightfair.css b/src/styles/lightfair.css
index 7d645d60f9..5a5103ec55 100644
--- a/src/styles/lightfair.css
+++ b/src/styles/lightfair.css
@@ -5,9 +5,7 @@ Lightfair style (c) Tristian Kelly 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #444
   background: #fff;
 }
 
@@ -19,9 +17,8 @@ Lightfair style (c) Tristian Kelly 
     color:#778899;
 }
 
-.hljs,
 .hljs-subst {
-    color: #444
+  /* default */
 }
 
 .hljs-comment {
diff --git a/src/styles/lioshi.css b/src/styles/lioshi.css
index 594ac21556..f1df5043d4 100644
--- a/src/styles/lioshi.css
+++ b/src/styles/lioshi.css
@@ -1,6 +1,11 @@
 /* lioshi Theme */
 /* Original theme - https://github.com/lioshi/vscode-lioshi-theme */
 
+.hljs {
+  background: #303030;
+  color: #c5c8c6;
+}
+
 /* Comment */
 .hljs-comment {
   color: #8d8d8d;
@@ -67,14 +72,6 @@
   color: #dbc4d9;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #303030;
-  color: #c5c8c6;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/magula.css b/src/styles/magula.css
index b8003bf422..a891a6f702 100644
--- a/src/styles/magula.css
+++ b/src/styles/magula.css
@@ -8,9 +8,6 @@ Music: Aphex Twin / Xtal
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background-color: #f4f4f4;
   color: black;
 }
diff --git a/src/styles/mono-blue.css b/src/styles/mono-blue.css
index 24a35a3d8c..6a0ab02308 100644
--- a/src/styles/mono-blue.css
+++ b/src/styles/mono-blue.css
@@ -2,9 +2,6 @@
   Five-color theme from a single blue hue.
 */
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #eaeef3;
   color: #00193a;
 }
diff --git a/src/styles/monokai-sublime.css b/src/styles/monokai-sublime.css
index 2864170daf..5039177632 100644
--- a/src/styles/monokai-sublime.css
+++ b/src/styles/monokai-sublime.css
@@ -5,13 +5,10 @@ Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-lic
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #23241f;
+  color: #f8f8f2;
 }
 
-.hljs,
 .hljs-tag,
 .hljs-subst {
   color: #f8f8f2;
diff --git a/src/styles/monokai.css b/src/styles/monokai.css
index af24834a99..cbd44e9cc8 100644
--- a/src/styles/monokai.css
+++ b/src/styles/monokai.css
@@ -3,9 +3,6 @@ Monokai style - ported by Luigi Maselli - http://grigio.org
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #272822;
   color: #ddd;
 }
diff --git a/src/styles/night-owl.css b/src/styles/night-owl.css
index 45f45cd298..ec55032a6c 100644
--- a/src/styles/night-owl.css
+++ b/src/styles/night-owl.css
@@ -2,8 +2,8 @@
 
 Night Owl for highlight.js (c) Carl Baxter 
 
-An adaptation of Sarah Drasner's Night Owl VS Code Theme 
-https://github.com/sdras/night-owl-vscode-theme 
+An adaptation of Sarah Drasner's Night Owl VS Code Theme
+https://github.com/sdras/night-owl-vscode-theme
 
 Copyright (c) 2018 Sarah Drasner
 
@@ -28,9 +28,6 @@ SOFTWARE.
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #011627;
   color: #d6deeb;
 }
diff --git a/src/styles/nnfx-dark.css b/src/styles/nnfx-dark.css
index 0751ee5d99..efd329ffce 100644
--- a/src/styles/nnfx-dark.css
+++ b/src/styles/nnfx-dark.css
@@ -7,9 +7,6 @@
  */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #333;
   color: #fff;
 }
diff --git a/src/styles/nnfx.css b/src/styles/nnfx.css
index e7beaa518a..0f3cde5cfe 100644
--- a/src/styles/nnfx.css
+++ b/src/styles/nnfx.css
@@ -7,9 +7,6 @@
  */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #fff;
   color: #000;
 }
diff --git a/src/styles/nord.css b/src/styles/nord.css
index 424038443a..5c2420b932 100644
--- a/src/styles/nord.css
+++ b/src/styles/nord.css
@@ -11,9 +11,6 @@
  */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #2E3440;
 }
 
diff --git a/src/styles/obsidian.css b/src/styles/obsidian.css
index 356630fa23..924f5049d8 100644
--- a/src/styles/obsidian.css
+++ b/src/styles/obsidian.css
@@ -4,9 +4,7 @@
  */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #e0e2e4;
   background: #282b2e;
 }
 
@@ -21,10 +19,6 @@
   color: #ffcd22;
 }
 
-.hljs {
-  color: #e0e2e4;
-}
-
 .hljs-attribute {
   color: #668bb0;
 }
diff --git a/src/styles/ocean.css b/src/styles/ocean.css
index 5901581b40..fabe751b8f 100644
--- a/src/styles/ocean.css
+++ b/src/styles/ocean.css
@@ -2,6 +2,11 @@
 /* https://github.com/gavsiu */
 /* Original theme - https://github.com/chriskempson/base16 */
 
+.hljs {
+  background: #2b303b;
+  color: #c0c5ce;
+}
+
 /* Ocean Comment */
 .hljs-comment,
 .hljs-quote {
@@ -57,14 +62,6 @@
   color: #b48ead;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #2b303b;
-  color: #c0c5ce;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/paraiso-dark.css b/src/styles/paraiso-dark.css
index e7292401c6..c3af150a43 100644
--- a/src/styles/paraiso-dark.css
+++ b/src/styles/paraiso-dark.css
@@ -4,6 +4,11 @@
     Inspired by the art of Rubens LP (http://www.rubenslp.com.br)
 */
 
+.hljs {
+  background: #2f1e2e;
+  color: #a39e9b;
+}
+
 /* Paraíso Comment */
 .hljs-comment,
 .hljs-quote {
@@ -55,14 +60,6 @@
   color: #815ba4;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #2f1e2e;
-  color: #a39e9b;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/paraiso-light.css b/src/styles/paraiso-light.css
index 944857cd8d..f349ab628f 100644
--- a/src/styles/paraiso-light.css
+++ b/src/styles/paraiso-light.css
@@ -4,6 +4,11 @@
     Inspired by the art of Rubens LP (http://www.rubenslp.com.br)
 */
 
+.hljs {
+  background: #e7e9db;
+  color: #4f424c;
+}
+
 /* Paraíso Comment */
 .hljs-comment,
 .hljs-quote {
@@ -55,14 +60,6 @@
   color: #815ba4;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #e7e9db;
-  color: #4f424c;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/pojoaque.css b/src/styles/pojoaque.css
index 2e07847b2b..8b6e742bf7 100644
--- a/src/styles/pojoaque.css
+++ b/src/styles/pojoaque.css
@@ -7,9 +7,6 @@ Based on Solarized Style from http://ethanschoonover.com/solarized
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   color: #dccf8f;
   background: url(./pojoaque.jpg) repeat scroll left top #181914;
 }
diff --git a/src/styles/purebasic.css b/src/styles/purebasic.css
index 20a5230bcc..963e4e6d1b 100644
--- a/src/styles/purebasic.css
+++ b/src/styles/purebasic.css
@@ -22,13 +22,7 @@ NOTE_2:	Color names provided in comments were derived using "Name that Color" on
 */
 
 .hljs {
-	display: block;
-	overflow-x: auto;
-	padding: 0.5em;
 	background: #FFFFDF; /* Half and Half (approx.) */
-/* --- Uncomment to add PureBASIC native IDE styled font!
-	font-family: Consolas;
-*/
 }
 
 .hljs, /* --- used for PureBASIC base color --- */
diff --git a/src/styles/qtcreator_dark.css b/src/styles/qtcreator_dark.css
index 7aa56a3655..358ed69afc 100644
--- a/src/styles/qtcreator_dark.css
+++ b/src/styles/qtcreator_dark.css
@@ -6,13 +6,10 @@ Qt Creator dark color scheme
 
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #aaaaaa;
   background: #000000;
 }
 
-.hljs,
 .hljs-subst,
 .hljs-tag,
 .hljs-title {
diff --git a/src/styles/qtcreator_light.css b/src/styles/qtcreator_light.css
index 1efa2c660f..6904d0dace 100644
--- a/src/styles/qtcreator_light.css
+++ b/src/styles/qtcreator_light.css
@@ -1,18 +1,13 @@
 /*
-
 Qt Creator light color scheme
-
 */
 
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #000000;
   background: #ffffff;
 }
 
-.hljs,
 .hljs-subst,
 .hljs-tag,
 .hljs-title {
diff --git a/src/styles/railscasts.css b/src/styles/railscasts.css
index 008cdc5bf1..baafcb5348 100644
--- a/src/styles/railscasts.css
+++ b/src/styles/railscasts.css
@@ -5,9 +5,6 @@ Railscasts-like style (c) Visoft, Inc. (Damien White)
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #232323;
   color: #e6e1dc;
 }
diff --git a/src/styles/rainbow.css b/src/styles/rainbow.css
index 905eb8ef18..d39ca1832f 100644
--- a/src/styles/rainbow.css
+++ b/src/styles/rainbow.css
@@ -5,9 +5,6 @@ Style with support for rainbow parens
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #474949;
   color: #d1d9e1;
 }
diff --git a/src/styles/routeros.css b/src/styles/routeros.css
index ebe23990da..54b2a86946 100644
--- a/src/styles/routeros.css
+++ b/src/styles/routeros.css
@@ -5,15 +5,12 @@
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
+  color: #444;
   background: #F0F0F0;
 }
 
 /* Base color: saturation 0; */
 
-.hljs,
 .hljs-subst {
   color: #444;
 }
@@ -32,7 +29,7 @@
 
 .hljs-attribute {
   color: #0E9A00;
-}    
+}
 
 .hljs-function {
   color: #99069A;
diff --git a/src/styles/school-book.css b/src/styles/school-book.css
index 94838513f1..19360ba92d 100644
--- a/src/styles/school-book.css
+++ b/src/styles/school-book.css
@@ -5,14 +5,8 @@ School Book style from goldblog.com.ua (c) Zaripov Yura 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 15px 0.5em 0.5em 30px;
-  font-size: 11px;
-  line-height:16px;
-  background:#f6f6ae url(./school-book.png);
-  border-top: solid 2px #d2e8b9;
-  border-bottom: solid 1px #d2e8b9;
+  color: #3e5915;
+  background:#f6f5b2;
 }
 
 .hljs-keyword,
@@ -22,7 +16,6 @@ School Book style from goldblog.com.ua (c) Zaripov Yura 
   font-weight:bold;
 }
 
-.hljs,
 .hljs-subst {
   color: #3e5915;
 }
diff --git a/src/styles/school-book.png b/src/styles/school-book.png
deleted file mode 100644
index 956e9790a0..0000000000
Binary files a/src/styles/school-book.png and /dev/null differ
diff --git a/src/styles/shades-of-purple.css b/src/styles/shades-of-purple.css
index 9759cdd2b8..388618f755 100644
--- a/src/styles/shades-of-purple.css
+++ b/src/styles/shades-of-purple.css
@@ -7,15 +7,15 @@
  */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  /* Custom font is optional */
-  /* font-family: 'Operator Mono', 'Fira Code', 'Menlo', 'Monaco', 'Courier New', 'monospace';  */
-  padding: 0.5em;
   background: #2d2b57;
+  color: #e3dfff;
   font-weight: normal;
 }
 
+.hljs-subst {
+  color: #e3dfff;
+}
+
 .hljs-title {
   color: #fad000;
   font-weight: normal;
@@ -44,11 +44,6 @@
   color: #fb9e00;
 }
 
-.hljs,
-.hljs-subst {
-  color: #e3dfff;
-}
-
 .hljs-string,
 .hljs-attribute,
 .hljs-symbol,
diff --git a/src/styles/solarized-dark.css b/src/styles/solarized-dark.css
index b4c0da1f78..dcc33ebd7e 100644
--- a/src/styles/solarized-dark.css
+++ b/src/styles/solarized-dark.css
@@ -5,9 +5,6 @@ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #000;
   color: #f8f8f8;
 }
diff --git a/src/styles/tomorrow-night-blue.css b/src/styles/tomorrow-night-blue.css
index 78e59cc8cb..5712b98b45 100644
--- a/src/styles/tomorrow-night-blue.css
+++ b/src/styles/tomorrow-night-blue.css
@@ -59,11 +59,8 @@
 }
 
 .hljs {
-  display: block;
-  overflow-x: auto;
   background: #002451;
   color: white;
-  padding: 0.5em;
 }
 
 .hljs-emphasis {
diff --git a/src/styles/tomorrow-night-bright.css b/src/styles/tomorrow-night-bright.css
index e05af8ae24..f63d1c9f50 100644
--- a/src/styles/tomorrow-night-bright.css
+++ b/src/styles/tomorrow-night-bright.css
@@ -58,11 +58,8 @@
 }
 
 .hljs {
-  display: block;
-  overflow-x: auto;
   background: black;
   color: #eaeaea;
-  padding: 0.5em;
 }
 
 .hljs-emphasis {
diff --git a/src/styles/tomorrow-night-eighties.css b/src/styles/tomorrow-night-eighties.css
index 08fd51c742..d666acbd9f 100644
--- a/src/styles/tomorrow-night-eighties.css
+++ b/src/styles/tomorrow-night-eighties.css
@@ -2,6 +2,11 @@
 /* Original theme - https://github.com/chriskempson/tomorrow-theme */
 /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
 
+.hljs {
+  background: #2d2d2d;
+  color: #cccccc;
+}
+
 /* Tomorrow Comment */
 .hljs-comment,
 .hljs-quote {
@@ -57,14 +62,6 @@
   color: #cc99cc;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #2d2d2d;
-  color: #cccccc;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/tomorrow-night.css b/src/styles/tomorrow-night.css
index ddd270a4e7..53eb2d5cc5 100644
--- a/src/styles/tomorrow-night.css
+++ b/src/styles/tomorrow-night.css
@@ -3,6 +3,11 @@
 /* Original theme - https://github.com/chriskempson/tomorrow-theme */
 /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
 
+.hljs {
+  background: #1d1f21;
+  color: #c5c8c6;
+}
+
 /* Tomorrow Comment */
 .hljs-comment,
 .hljs-quote {
@@ -58,14 +63,6 @@
   color: #b294bb;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: #1d1f21;
-  color: #c5c8c6;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/tomorrow.css b/src/styles/tomorrow.css
index 026a62fe3b..e604fb80d7 100644
--- a/src/styles/tomorrow.css
+++ b/src/styles/tomorrow.css
@@ -1,5 +1,10 @@
 /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
 
+.hljs {
+  background: white;
+  color: #4d4d4c;
+}
+
 /* Tomorrow Comment */
 .hljs-comment,
 .hljs-quote {
@@ -55,14 +60,6 @@
   color: #8959a8;
 }
 
-.hljs {
-  display: block;
-  overflow-x: auto;
-  background: white;
-  color: #4d4d4c;
-  padding: 0.5em;
-}
-
 .hljs-emphasis {
   font-style: italic;
 }
diff --git a/src/styles/vs.css b/src/styles/vs.css
index c5d07d3115..a1ed6da859 100644
--- a/src/styles/vs.css
+++ b/src/styles/vs.css
@@ -4,9 +4,6 @@ Visual Studio-like style based on original C# coloring by Jason Diamond 
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #fff;
   color: black;
 }
diff --git a/src/styles/xt256.css b/src/styles/xt256.css
index 3e35ad2d5c..be5eea634d 100644
--- a/src/styles/xt256.css
+++ b/src/styles/xt256.css
@@ -7,11 +7,8 @@
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
   color: #eaeaea;
   background: #000;
-  padding: 0.5em;
 }
 
 .hljs-subst {
diff --git a/src/styles/zenburn.css b/src/styles/zenburn.css
index 07be502016..9f32e58eb2 100644
--- a/src/styles/zenburn.css
+++ b/src/styles/zenburn.css
@@ -6,9 +6,6 @@ based on dark.css by Ivan Sagalaev
 */
 
 .hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
   background: #3f3f3f;
   color: #dcdcdc;
 }
diff --git a/test/api/autoDetection.js b/test/api/autoDetection.js
index dc8d3d25a7..e47b9a9b95 100644
--- a/test/api/autoDetection.js
+++ b/test/api/autoDetection.js
@@ -1,7 +1,5 @@
-'use strict';
-
-const hljs   = require('../../build');
-const should = require('should');
+import hljs from '#hljs';
+import should from 'should';
 
 describe('.autoDetection()', () => {
   it('should get an existing language', () => {
diff --git a/test/api/beginKeywords.js b/test/api/beginKeywords.js
index 53bf85b796..53162e29f3 100644
--- a/test/api/beginKeywords.js
+++ b/test/api/beginKeywords.js
@@ -1,6 +1,4 @@
-'use strict';
-
-const hljs   = require('../../build');
+import hljs from '#hljs';
 
 let grammar = function() {
   return {
@@ -24,6 +22,10 @@ describe('beginKeywords', () => {
     hljs.registerLanguage("test", grammar);
     hljs.registerLanguage("has-followup", grammarWithFollowupRule);
   });
+  after( () => {
+    hljs.unregisterLanguage("test");
+    hljs.unregisterLanguage('has-followup');
+  });
 
   it("should allow subsequence matches to still succeed", () => {
     let content = "A.class = self";
diff --git a/test/api/binaryNumber.js b/test/api/binaryNumber.js
index 107788e213..caa2bddff2 100644
--- a/test/api/binaryNumber.js
+++ b/test/api/binaryNumber.js
@@ -1,6 +1,4 @@
-'use strict';
-
-const hljs = require('../../build');
+import hljs from '#hljs';
 const pattern = new RegExp(`${hljs.BINARY_NUMBER_RE}$`);
 
 describe('.BINARY_NUMBER_RE', () => {
diff --git a/test/api/cNumber.js b/test/api/cNumber.js
index b852287965..26591cc174 100644
--- a/test/api/cNumber.js
+++ b/test/api/cNumber.js
@@ -1,7 +1,5 @@
-'use strict';
-
-const _       = require('lodash');
-const hljs    = require('../../build');
+import hljs from '#hljs';
+import _ from 'lodash';
 
 const pattern      = new RegExp(`${hljs.C_NUMBER_RE}$`);
 
diff --git a/test/api/fixmarkup.js b/test/api/fixmarkup.js
deleted file mode 100644
index 360b6a51e9..0000000000
--- a/test/api/fixmarkup.js
+++ /dev/null
@@ -1,31 +0,0 @@
-'use strict';
-
-const should = require('should');
-const hljs   = require('../../build');
-
-describe('.fixmarkup()', () => {
-  after(() => {
-    hljs.configure({ useBR: false });
-  });
-
-  it('should not strip HTML from beginning of strings', () => {
-    hljs.configure({ useBR: true });
-    const value = '"some": \n "json"';
-    const result = hljs.fixMarkup(value);
-
-    result.should.equal(
-      '"some": 
"json"' - ); - }); - - it('should not add "undefined" to the beginning of the result (#1452)', () => { - hljs.configure({ useBR: true }); - const value = '{ "some": \n "json" }'; - const result = hljs.fixMarkup(value); - - - result.should.equal( - '{ "some":
"json" }' - ); - }); -}); diff --git a/test/api/getLanguage.js b/test/api/getLanguage.js index ae14ebb92e..0cd765d22c 100644 --- a/test/api/getLanguage.js +++ b/test/api/getLanguage.js @@ -1,7 +1,5 @@ -'use strict'; - -const hljs = require('../../build'); -const should = require('should'); +import hljs from '#hljs'; +import should from 'should'; describe('.getLanguage()', () => { it('should get an existing language', () => { diff --git a/test/api/highlight.cjs b/test/api/highlight.cjs new file mode 100644 index 0000000000..ea36fea933 --- /dev/null +++ b/test/api/highlight.cjs @@ -0,0 +1,17 @@ +'use strict'; + +describe('.highlight()', () => { + it('should works without continuation', async () => { + const { default: hljs } = await import('#hljs'); + const code = 'public void moveTo(int x, int y, int z);'; + const result = hljs.highlight('java', code, false, false); + + result.value.should.equal( + 'public ' + + 'void moveTo' + + '(int x, ' + + 'int y, ' + + 'int z);' + ); + }); +}); diff --git a/test/api/highlight.js b/test/api/highlight.js index 962c36e175..9a75f734c5 100644 --- a/test/api/highlight.js +++ b/test/api/highlight.js @@ -1,7 +1,4 @@ -'use strict'; - -const hljs = require('../../build'); -const should = require('should'); +import hljs from '#hljs'; describe('.highlight()', () => { it('should works without continuation', () => { diff --git a/test/api/ident.js b/test/api/ident.js index 89ea859335..0bece8f379 100644 --- a/test/api/ident.js +++ b/test/api/ident.js @@ -1,6 +1,4 @@ -'use strict'; - -const hljs = require('../../build'); +import hljs from '#hljs'; const pattern = new RegExp(`^${hljs.IDENT_RE}$`); diff --git a/test/api/index.js b/test/api/index.js index b15ed29936..4f38c88bf3 100644 --- a/test/api/index.js +++ b/test/api/index.js @@ -1,18 +1,14 @@ -'use strict'; - -describe('hljs', function() { - require('./autoDetection'); - require('./beginKeywords'); - require('./binaryNumber'); - require('./cNumber'); - require('./fixmarkup'); - require('./getLanguage'); - require('./highlight'); - require('./ident'); - require('./keywords'); - require('./number'); - require('./registerAlias'); - require('./unregisterLanguage'); - require('./starters'); - require('./underscoreIdent'); -}); +import "./autoDetection.js"; +import "./beginKeywords.js"; +import "./binaryNumber.js"; +import "./cNumber.js"; +import "./getLanguage.js"; +import "./highlight.js"; +import "./highlight.cjs"; +import "./ident.js"; +import "./keywords.js"; +import "./number.js"; +import "./registerAlias.js"; +import "./starters.js"; +import "./underscoreIdent.js"; +import "./unregisterLanguage.js"; diff --git a/test/api/keywords.js b/test/api/keywords.js index f72a212c08..46362bdf87 100644 --- a/test/api/keywords.js +++ b/test/api/keywords.js @@ -1,6 +1,4 @@ -'use strict'; - -const hljs = require('../../build'); +import hljs from '#hljs'; describe('computing the relevance score of a language', () => { it('should ignore common keywords', () => { diff --git a/test/api/number.js b/test/api/number.js index 85f60fe1a0..cef7ee3313 100644 --- a/test/api/number.js +++ b/test/api/number.js @@ -1,7 +1,5 @@ -'use strict'; - -const _ = require('lodash'); -const hljs = require('../../build'); +import hljs from '#hljs'; +import _ from 'lodash'; const pattern = new RegExp(`${hljs.NUMBER_RE}$`); diff --git a/test/api/registerAlias.js b/test/api/registerAlias.js index aede3ebb7a..94d3379097 100644 --- a/test/api/registerAlias.js +++ b/test/api/registerAlias.js @@ -1,7 +1,5 @@ -'use strict'; - -const hljs = require('../../build'); -const should = require('should'); +import hljs from '#hljs'; +import should from 'should'; describe('.registerAliases()', () => { it('should get an existing language by alias', () => { diff --git a/test/api/starters.js b/test/api/starters.js index c6afcbbe63..f6b8e434bb 100644 --- a/test/api/starters.js +++ b/test/api/starters.js @@ -1,6 +1,4 @@ -'use strict'; - -const hljs = require('../../build'); +import hljs from '#hljs'; const pattern = new RegExp(`^${hljs.RE_STARTERS_RE}$`); diff --git a/test/api/underscoreIdent.js b/test/api/underscoreIdent.js index 5fb03d4820..7adba59706 100644 --- a/test/api/underscoreIdent.js +++ b/test/api/underscoreIdent.js @@ -1,6 +1,4 @@ -'use strict'; - -const hljs = require('../../build'); +import hljs from '#hljs'; const pattern = new RegExp(`^${hljs.UNDERSCORE_IDENT_RE}$`); diff --git a/test/api/unregisterLanguage.js b/test/api/unregisterLanguage.js index ce0ff00b99..9d6ac06311 100644 --- a/test/api/unregisterLanguage.js +++ b/test/api/unregisterLanguage.js @@ -1,6 +1,4 @@ -"use strict"; - -const hljs = require("../../build"); +import hljs from '#hljs'; const jQuery = function() { return { diff --git a/test/browser/highlight_block_callbacks.js b/test/browser/highlight_block_callbacks.js index 165c3067a1..059e64d64f 100644 --- a/test/browser/highlight_block_callbacks.js +++ b/test/browser/highlight_block_callbacks.js @@ -1,8 +1,4 @@ -'use strict'; - -const {promisify} = require('util'); - -const {newTestCase, defaultCase, buildFakeDOM } = require('./test_case') +import {newTestCase, defaultCase, buildFakeDOM } from './test_case.js'; class ContentAdder { constructor(params) { diff --git a/test/browser/index.js b/test/browser/index.js index b429726aff..dd6cfcc3cf 100644 --- a/test/browser/index.js +++ b/test/browser/index.js @@ -1,5 +1,3 @@ -'use strict'; - -require('./plain'); -require('./worker'); -require('./highlight_block_callbacks'); +import './plain.js'; +import './worker.js'; +import './highlight_block_callbacks.js'; diff --git a/test/browser/plain.js b/test/browser/plain.js index 0416e94d3f..0b4fada580 100644 --- a/test/browser/plain.js +++ b/test/browser/plain.js @@ -1,16 +1,4 @@ -'use strict'; - -const {newTestCase, defaultCase, buildFakeDOM } = require('./test_case') - -describe('browser with html with quotes in attributes', function() { - it('should property escape all quotes', - newTestCase({ - code: "const oops = pick(employee, ['name', 'height'])\n", - language: "javascript", - expect: `const oops = pick(employee, ['name', 'height'])\n` - }).runner - ); -}) +import {newTestCase, defaultCase, buildFakeDOM } from './test_case.js'; describe('plain browser', function() { diff --git a/test/browser/test_case.js b/test/browser/test_case.js index 8ff8e87f64..2867785e98 100644 --- a/test/browser/test_case.js +++ b/test/browser/test_case.js @@ -1,8 +1,10 @@ -const {promisify} = require('util'); -const { JSDOM } = require('jsdom'); -const utility = require('../utility'); -const glob = promisify(require('glob')); -const fs = require('fs'); +import {promisify} from 'util'; +import { JSDOM } from 'jsdom'; +import * as utility from '../utility.js'; +import fs from 'fs'; +import _glob from 'glob'; + +const glob = promisify(_glob); // default to the minified library if it was built, otherwise fallback to // the non-minified @@ -57,4 +59,4 @@ const defaultCase = newTestCase({ '"Hello";' }); -module.exports = { newTestCase, defaultCase, buildFakeDOM, findLibrary }; +export { newTestCase, defaultCase, buildFakeDOM, findLibrary }; diff --git a/test/browser/worker.js b/test/browser/worker.js index c1e99ca64e..98447fa3c0 100644 --- a/test/browser/worker.js +++ b/test/browser/worker.js @@ -1,8 +1,6 @@ -'use strict'; +import Worker from 'tiny-worker'; -const Worker = require('tiny-worker'); - -const { defaultCase, findLibrary } = require('./test_case') +import { defaultCase, findLibrary } from './test_case.js'; describe('web worker', function() { before(async function() { diff --git a/test/builds/browser_build_as_commonjs.js b/test/builds/browser_build_as_commonjs.js index ef5f6815d7..b3170c4b7c 100644 --- a/test/builds/browser_build_as_commonjs.js +++ b/test/builds/browser_build_as_commonjs.js @@ -1,8 +1,8 @@ -const hljs = require("../../build/highlight"); +import hljs from "../../build/highlight.js"; -let major = parseInt(majorVersion=hljs.versionString.split(".")) +const major = parseInt(hljs.versionString.split(".")); if (major != 10) { - process.exit(1) + process.exit(1); } -console.log("Pass: browser build works with Node.js just fine.") +console.log("Pass: browser build works with Node.js just fine."); diff --git a/test/detect/index.js b/test/detect/index.js index b51adb10b3..1fb91fea58 100644 --- a/test/detect/index.js +++ b/test/detect/index.js @@ -1,14 +1,11 @@ -'use strict'; +import hljs from '#hljs'; -delete require.cache[require.resolve('../../build')]; -delete require.cache[require.resolve('../../build/lib/core')]; +import { promises as fs } from 'fs'; +import path from 'path'; +import * as utility from '../utility.js'; +import { getThirdPartyPackages } from '#tools/external_language'; -const fs = require('fs').promises; -const hljs = require('../../build'); hljs.debugMode(); // tests run in debug mode so errors are raised -const path = require('path'); -const utility = require('../utility'); -const { getThirdPartyPackages } = require('../../tools/lib/external_language'); function testAutoDetection(language, { detectPath }) { const languagePath = detectPath || utility.buildPath('detect', language); diff --git a/test/detect/sql_more/default.txt b/test/detect/sql_more/default.txt deleted file mode 100644 index d4325cc1c5..0000000000 --- a/test/detect/sql_more/default.txt +++ /dev/null @@ -1,12 +0,0 @@ -CREATE TABLE "topic" ( - "id" serial NOT NULL PRIMARY KEY, - "forum_id" integer NOT NULL, - "subject" varchar(255) NOT NULL -); -ALTER TABLE "topic" -ADD CONSTRAINT forum_id FOREIGN KEY ("forum_id") -REFERENCES "forum" ("id"); - --- Initials -insert into "topic" ("forum_id", "subject") -values (2, 'D''artagnian'); diff --git a/test/fixtures/expect/brInPre.txt b/test/fixtures/expect/brInPre.txt deleted file mode 100644 index e065147ab3..0000000000 --- a/test/fixtures/expect/brInPre.txt +++ /dev/null @@ -1 +0,0 @@ ->> '\x41\x42\x43'
'ABC'


>> '\x61\x62\x63'
'abc' diff --git a/test/fixtures/expect/custommarkup.txt b/test/fixtures/expect/custommarkup.txt deleted file mode 100644 index f0304c200c..0000000000 --- a/test/fixtures/expect/custommarkup.txt +++ /dev/null @@ -1,3 +0,0 @@ -<div id="contents"> - <p>Hello, World!Goodbye, cruel world! -</div> diff --git a/test/fixtures/expect/customtabreplace.txt b/test/fixtures/expect/customtabreplace.txt deleted file mode 100644 index f6a396b716..0000000000 --- a/test/fixtures/expect/customtabreplace.txt +++ /dev/null @@ -1,4 +0,0 @@ -for x in [1, 2, 3]: - count(x) - if x == 3: - count(x + 1) diff --git a/test/fixtures/expect/tabreplace.txt b/test/fixtures/expect/tabreplace.txt deleted file mode 100644 index 01d1c576ac..0000000000 --- a/test/fixtures/expect/tabreplace.txt +++ /dev/null @@ -1,2 +0,0 @@ -for x in [1, 2, 3]: - count(x) \ No newline at end of file diff --git a/test/fixtures/index.html b/test/fixtures/index.html index 99a45bdf71..0ca5640bbb 100644 --- a/test/fixtures/index.html +++ b/test/fixtures/index.html @@ -31,30 +31,6 @@ -
- - -
for x in [1, 2, 3]:
-	count(x)
- - -
<div id="contents">
-  <p>Hello, World!Goodbye, cruel world!
-</div>
-
- - -
for x in [1, 2, 3]:
-	count(x)
-	if x == 3:
-		count(x + 1)
- - -
>> '\x41\x42\x43'
'ABC'


>> '\x61\x62\x63'
'abc' -
- -
-
@@ -113,22 +89,6 @@
-
- -
<head>
<meta charset="utf-8">
<title></title>
</head>
- -
<head>
- <meta charset="utf-8">
- <title></title>
-</head>
- -
<head>
- <meta charset="utf-8">
- <title></title>
-</head>
- -
-
( [ ( ) ] )
diff --git a/test/fixtures/nested.js b/test/fixtures/nested.js index 3c6b59dab9..31b926d611 100644 --- a/test/fixtures/nested.js +++ b/test/fixtures/nested.js @@ -1,4 +1,4 @@ -module.exports = function(hljs) { +export default function(hljs) { var BODY = { className: 'body', endsWithParent: true }; diff --git a/test/index.js b/test/index.js index 62a78cdad6..7b94009143 100644 --- a/test/index.js +++ b/test/index.js @@ -1,26 +1,25 @@ -'use strict'; +import hljs from '#hljs'; -const hljs = require('../build'); hljs.debugMode(); // tests run in debug mode so errors are raised // Tests specific to the API exposed inside the hljs object. // Right now, that only includes tests for several common regular expressions. -require('./api'); +import './api/index.js'; // Test weird bugs we've fixed over time -require("./parser"); +import "./parser/index.js"; // Tests for auto detection of languages via `highlightAuto`. -require('./detect'); +import './detect/index.js'; // HTML markup tests for particular languages. Usually when there is an // incorrect highlighting of one language, once the bug get fixed, the // expected markup will be added into the `test/markup` folder to keep // theses highlighting errors from cropping up again. -require('./markup'); +import './markup/index.js'; // check regex for fatal issues like exponential backtracking, etc -require('./regex'); +import './regex/index.js'; // Tests meant for the browser only. Using the `test/fixtures/index.html` file // along with `jsdom` these tests check for things like: custom markup already @@ -28,4 +27,5 @@ require('./regex'); // and several other cases. Do note that the `test/fixtures/index.html` file // isn't actually used to test inside a browser but `jsdom` acts as a virtual // browser inside of node.js and runs together with all the other tests. -require('./special'); +import './special/index.js'; + diff --git a/test/markup/index.js b/test/markup/index.js index 28138ffa6b..f15d3938b0 100644 --- a/test/markup/index.js +++ b/test/markup/index.js @@ -1,14 +1,14 @@ 'use strict'; -const fs = require('fs').promises; -const glob = require('glob'); -const hljs = require('../../build'); -const path = require('path'); -const utility = require('../utility'); +import { promises as fs } from 'fs'; +import glob from 'glob';; +import hljs from '#hljs'; +import path from 'path'; +import * as utility from '../utility.js'; hljs.debugMode(); -const { getThirdPartyPackages } = require("../../tools/lib/external_language") +import { getThirdPartyPackages } from "#tools/external_language" function testLanguage(language, {testDir}) { describe(language, function() { diff --git a/test/markup/sql_more/interval.expect.txt b/test/markup/sql_more/interval.expect.txt deleted file mode 100644 index fa32487be7..0000000000 --- a/test/markup/sql_more/interval.expect.txt +++ /dev/null @@ -1,17 +0,0 @@ -SELECT - CURRENT_TIMESTAMP - - INTERVAL 2 YEARS - + INTERVAL 1 MONTH - - INTERVAL 3 DAYS - + INTERVAL 10 HOURS - + interval 30 MINUTES - - INTERVAL 20 SECOND AS past_timestamp -FROM VALUES ("dummy"); - -WITH ts AS ( - SELECT CURRENT_TIMESTAMP AS now FROM VALUES ('dummy') - ) -SELECT - now - INTERVAL 1 DAY - INTERVAL 2 HOURS - INTERVAL 3 MINUTES - INTERVAL 4 SECONDS AS LONG_VERSION, - now - INTERVAL '1 2:3:4.100' DAY TO SECOND AS SHORT_VERSION -FROM ts; diff --git a/test/markup/sql_more/interval.txt b/test/markup/sql_more/interval.txt deleted file mode 100644 index 9f1657d4b6..0000000000 --- a/test/markup/sql_more/interval.txt +++ /dev/null @@ -1,17 +0,0 @@ -SELECT - CURRENT_TIMESTAMP - - INTERVAL 2 YEARS - + INTERVAL 1 MONTH - - INTERVAL 3 DAYS - + INTERVAL 10 HOURS - + interval 30 MINUTES - - INTERVAL 20 SECOND AS past_timestamp -FROM VALUES ("dummy"); - -WITH ts AS ( - SELECT CURRENT_TIMESTAMP AS now FROM VALUES ('dummy') - ) -SELECT - now - INTERVAL 1 DAY - INTERVAL 2 HOURS - INTERVAL 3 MINUTES - INTERVAL 4 SECONDS AS LONG_VERSION, - now - INTERVAL '1 2:3:4.100' DAY TO SECOND AS SHORT_VERSION -FROM ts; diff --git a/test/markup/sql_more/join.expect.txt b/test/markup/sql_more/join.expect.txt deleted file mode 100644 index fdeacf3663..0000000000 --- a/test/markup/sql_more/join.expect.txt +++ /dev/null @@ -1,17 +0,0 @@ -SELECT - left_table.col1 AS l_col1, - left_table.col2 AS l_col2 -FROM - VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table - ANTI JOIN - VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table - ON left_table.col1 = right_table.col1; - -SELECT - left_table.col1 AS l_col1, - left_table.col2 AS l_col2 -FROM - VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table - LEFT SEMI JOIN - VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table - ON left_table.col1 = right_table.col1; diff --git a/test/markup/sql_more/join.txt b/test/markup/sql_more/join.txt deleted file mode 100644 index 3c23573a84..0000000000 --- a/test/markup/sql_more/join.txt +++ /dev/null @@ -1,17 +0,0 @@ -SELECT - left_table.col1 AS l_col1, - left_table.col2 AS l_col2 -FROM - VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table - ANTI JOIN - VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table - ON left_table.col1 = right_table.col1; - -SELECT - left_table.col1 AS l_col1, - left_table.col2 AS l_col2 -FROM - VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table - LEFT SEMI JOIN - VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table - ON left_table.col1 = right_table.col1; diff --git a/test/markup/sql_more/lateral-view.expect.txt b/test/markup/sql_more/lateral-view.expect.txt deleted file mode 100644 index 006b309b70..0000000000 --- a/test/markup/sql_more/lateral-view.expect.txt +++ /dev/null @@ -1,7 +0,0 @@ -SELECT - master_child.col1 AS master_id, - child_table.child_id -FROM VALUES - ( 1 , ARRAY(1,2,3)), - (2, ARRAY(4,5,6)) AS master_child -LATERAL VIEW EXPLODE(master_child.col2) child_table AS child_id; diff --git a/test/markup/sql_more/lateral-view.txt b/test/markup/sql_more/lateral-view.txt deleted file mode 100644 index 9a152f3956..0000000000 --- a/test/markup/sql_more/lateral-view.txt +++ /dev/null @@ -1,7 +0,0 @@ -SELECT - master_child.col1 AS master_id, - child_table.child_id -FROM VALUES - ( 1 , ARRAY(1,2,3)), - (2, ARRAY(4,5,6)) AS master_child -LATERAL VIEW EXPLODE(master_child.col2) child_table AS child_id; diff --git a/test/markup/sql_more/window-function.expect.txt b/test/markup/sql_more/window-function.expect.txt deleted file mode 100644 index a6882aac4a..0000000000 --- a/test/markup/sql_more/window-function.expect.txt +++ /dev/null @@ -1,23 +0,0 @@ -SELECT * -FROM ( - SELECT - posts.col1 AS emp_id, - posts.col2 AS dept_id, - posts.col3 AS posts, - DENSE_RANK() OVER post_ranking AS rank - FROM VALUES - (1, 1 ,100), - (2, 1 ,50), - (8, 1 ,250), - (3, 2 ,200), - (4, 2 ,300), - (9, 2 ,1000), - (5, 3 ,300), - (6, 3 ,100), - (7, 3 ,400) AS posts - WINDOW post_ranking AS ( - PARTITION BY posts.col2 - ORDER BY posts.col3 DESC - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -) -WHERE rank <= 2; diff --git a/test/markup/sql_more/window-function.txt b/test/markup/sql_more/window-function.txt deleted file mode 100644 index a3dbf70c73..0000000000 --- a/test/markup/sql_more/window-function.txt +++ /dev/null @@ -1,23 +0,0 @@ -SELECT * -FROM ( - SELECT - posts.col1 AS emp_id, - posts.col2 AS dept_id, - posts.col3 AS posts, - DENSE_RANK() OVER post_ranking AS rank - FROM VALUES - (1, 1 ,100), - (2, 1 ,50), - (8, 1 ,250), - (3, 2 ,200), - (4, 2 ,300), - (9, 2 ,1000), - (5, 3 ,300), - (6, 3 ,100), - (7, 3 ,400) AS posts - WINDOW post_ranking AS ( - PARTITION BY posts.col2 - ORDER BY posts.col3 DESC - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -) -WHERE rank <= 2; diff --git a/test/parser/compiler-extensions.js b/test/parser/compiler-extensions.js index 90b1d0f37e..4fa60480f2 100644 --- a/test/parser/compiler-extensions.js +++ b/test/parser/compiler-extensions.js @@ -1,4 +1,4 @@ -const hljs = require('../../build'); +import hljs from '#hljs'; // not quite ready to become a plugin yet, so these hooks // have been removed and we're skipping this test for now diff --git a/test/parser/index.js b/test/parser/index.js index 5b59a5b725..08d59140f8 100644 --- a/test/parser/index.js +++ b/test/parser/index.js @@ -1,11 +1,5 @@ -'use strict'; - -const should = require('should'); - -describe('hljs', function() { - require('./look-ahead-end-matchers'); - require('./resume-scan'); - require('./reuse-endsWithParent'); - require('./should-not-destroyData'); - require('./compiler-extensions'); -}); +import "./compiler-extensions.js"; +import "./look-ahead-end-matchers.js"; +import "./resume-scan.js"; +import "./reuse-endsWithParent.js"; +import "./should-not-destroyData.js"; diff --git a/test/parser/look-ahead-end-matchers.js b/test/parser/look-ahead-end-matchers.js index 241e1fd0f6..a6dfc55910 100644 --- a/test/parser/look-ahead-end-matchers.js +++ b/test/parser/look-ahead-end-matchers.js @@ -1,6 +1,9 @@ -const hljs = require('../../build'); +import hljs from '#hljs'; describe("parser specifics", function () { + after(()=>{ + hljs.unregisterLanguage('test-language'); + }); // CONTEXT: https://github.com/highlightjs/highlight.js/pull/2219 describe("a grammar with look-ahead end matchers", () => { diff --git a/test/parser/resume-scan.js b/test/parser/resume-scan.js index fb50a47f37..c761851626 100644 --- a/test/parser/resume-scan.js +++ b/test/parser/resume-scan.js @@ -1,6 +1,4 @@ -'use strict'; - -const hljs = require('../../build'); +import hljs from '#hljs'; hljs.debugMode(); // tests run in debug mode so errors are raised describe("bugs", function() { diff --git a/test/parser/reuse-endsWithParent.js b/test/parser/reuse-endsWithParent.js index 7a4d2fe9dc..5649ee2698 100644 --- a/test/parser/reuse-endsWithParent.js +++ b/test/parser/reuse-endsWithParent.js @@ -1,6 +1,9 @@ -const hljs = require('../../build'); +import hljs from '#hljs'; describe("bugs", function () { + after(()=>{ + hljs.unregisterLanguage('test-language'); + }); describe("modes containing 'endsWithParent'", () => { it("should be allowed to be reused", () => { diff --git a/test/parser/should-not-destroyData.js b/test/parser/should-not-destroyData.js index e12a571ed0..52ee49ab24 100644 --- a/test/parser/should-not-destroyData.js +++ b/test/parser/should-not-destroyData.js @@ -1,6 +1,9 @@ -const hljs = require('../../build'); +import hljs from '#hljs'; describe("parser/should not destroy data", function () { + after(()=>{ + hljs.unregisterLanguage('test-language'); + }); // CONTEXT: https://github.com/highlightjs/highlight.js/pull/2219 describe("a grammar with a mode that makes a 0 width match", () => { diff --git a/test/regex/index.js b/test/regex/index.js index 426568ba4f..5ffeead335 100644 --- a/test/regex/index.js +++ b/test/regex/index.js @@ -1,10 +1,8 @@ -'use strict'; - -const hljs = require('../../build'); -const { BFS, parseRegex, regexFor } = require('./lib/util.js'); -const { visitRegExpAST } = require('regexpp'); -const { JS, Words, NFA, CharSet } = require('refa'); -const { firstOf, underAStar, isFirstMatch, isAlwaysZeroWidth} = require('./lib/analysis.js'); +import hljs from '#hljs'; +import { visitRegExpAST } from 'regexpp'; +import { JS, Words, NFA, CharSet } from 'refa'; +import { parseRegex, regexFor } from './lib/util.js'; +import { firstOf, underAStar } from './lib/analysis.js'; hljs.debugMode(); diff --git a/test/regex/lib/analysis.js b/test/regex/lib/analysis.js index 3b14fbcb4a..274e91e528 100644 --- a/test/regex/lib/analysis.js +++ b/test/regex/lib/analysis.js @@ -84,4 +84,4 @@ function firstOf(iter) { return undefined; } -module.exports = { firstOf, underAStar, isFirstMatch, isAlwaysZeroWidth}; +export { firstOf, underAStar, isFirstMatch, isAlwaysZeroWidth}; diff --git a/test/regex/lib/util.js b/test/regex/lib/util.js index f323a37264..8c0ac5edb5 100644 --- a/test/regex/lib/util.js +++ b/test/regex/lib/util.js @@ -1,6 +1,6 @@ /* eslint-disable no-undefined */ -const { RegExpParser } = require('regexpp'); +import { RegExpParser } from 'regexpp'; /** * @typedef {import("regexpp/ast").Pattern} Pattern @@ -104,4 +104,4 @@ const parseRegex = (regex) => { return literal; }; -module.exports = { BFS, regexFor, parseRegex }; +export { BFS, regexFor, parseRegex }; diff --git a/test/special/buildClassName.js b/test/special/buildClassName.js index 304071e431..3bff060bc3 100644 --- a/test/special/buildClassName.js +++ b/test/special/buildClassName.js @@ -1,6 +1,6 @@ -'use strict'; +import { document } from './document.js' -describe('block class names', () => { +describe('block class names', function() { before( () => { const testHTML = document.querySelectorAll('#build-classname .hljs'); diff --git a/test/special/customMarkup.js b/test/special/customMarkup.js deleted file mode 100644 index fd88e377cc..0000000000 --- a/test/special/customMarkup.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -const utility = require('../utility'); - -describe('custom markup', () => { - before(() => { - const testHTML = document.querySelectorAll('#custom-markup .hljs'); - - this.blocks = [...testHTML].map(x => x.innerHTML); - }); - - it('should replace tabs', () => { - const filename = utility.buildPath('fixtures', 'expect', - 'tabreplace.txt'), - actual = this.blocks[0]; - - return utility.expectedFile(filename, 'utf-8', actual); - }); - - it('should keep custom markup', () => { - const filename = utility.buildPath('fixtures', 'expect', - 'custommarkup.txt'), - actual = this.blocks[1]; - - return utility.expectedFile(filename, 'utf-8', actual); - }); - - it('should keep custom markup and replace tabs', () => { - const filename = utility.buildPath('fixtures', 'expect', - 'customtabreplace.txt'), - actual = this.blocks[2]; - - return utility.expectedFile(filename, 'utf-8', actual); - }); - - it('should keep the same amount of void elements (
,
, ...)', () => { - const filename = utility.buildPath('fixtures', 'expect', 'brInPre.txt'), - actual = this.blocks[3]; - - return utility.expectedFile(filename, 'utf-8', actual); - }); -}); diff --git a/test/special/document.js b/test/special/document.js new file mode 100644 index 0000000000..3821a4af59 --- /dev/null +++ b/test/special/document.js @@ -0,0 +1,25 @@ +import hljs from '#hljs'; + +import { JSDOM } from 'jsdom'; +import * as utility from '../utility.js'; +import nested from '../fixtures/nested.js'; + +const filename = utility.buildPath('fixtures', 'index.html'); +const { window } = await JSDOM.fromFile(filename); + +// Allows hljs to use document +export const document = window.document; + +// Special language to test endsWithParentVariants +hljs.registerLanguage('nested', nested); + +// Setup hljs environment +hljs.configure({ tabReplace: ' ' }); +let blocks = document.querySelectorAll('pre code'); +blocks.forEach(hljs.highlightElement); + +// Setup hljs for non-`
` tests
+hljs.configure();
+
+blocks = document.querySelectorAll('.code');
+blocks.forEach(hljs.highlightElement);
diff --git a/test/special/endsWithParentVariants.js b/test/special/endsWithParentVariants.js
index db84ecc42b..47215e1a90 100644
--- a/test/special/endsWithParentVariants.js
+++ b/test/special/endsWithParentVariants.js
@@ -1,8 +1,7 @@
-'use strict';
+import { document } from './document.js'
+import * as utility from '../utility.js';
 
-const utility = require('../utility');
-
-describe('ends with parent variants', () => {
+describe('ends with parent variants', function() {
   before(() => {
     const filename = utility.buildPath('fixtures', 'expect', 'endsWithParentVariants.txt'),
           testHTML = document.querySelectorAll('#ends-with-parent-variants .hljs');
diff --git a/test/special/explicitLanguage.js b/test/special/explicitLanguage.js
index cc54e6123e..8cdede3b53 100644
--- a/test/special/explicitLanguage.js
+++ b/test/special/explicitLanguage.js
@@ -1,8 +1,7 @@
-'use strict';
+import { document } from './document.js'
+import * as utility from '../utility.js';
 
-const utility = require('../utility');
-
-describe('explicit language class', () => {
+describe('explicit language class', function() {
   before(() => {
     const filename = utility.buildPath('fixtures', 'expect', 'explicit1.txt'),
           testHTML = document.querySelectorAll('#explicit-language .hljs');
diff --git a/test/special/index.js b/test/special/index.js
index 80f91e3466..2ff50ca937 100644
--- a/test/special/index.js
+++ b/test/special/index.js
@@ -1,42 +1,6 @@
-'use strict';
-
-const hljs     = require('../../build');
-hljs.debugMode(); // tests run in debug mode so errors are raised
-
-const { JSDOM } = require('jsdom');
-const { readFile } = require('fs').promises;
-const utility  = require('../utility');
-
-describe('special cases tests', () => {
-  before(async () => {
-    const filename = utility.buildPath('fixtures', 'index.html');
-    const page = await readFile(filename, 'utf-8');
-    const { window } = await new JSDOM(page);
-
-    // Allows hljs to use document
-    global.document = window.document;
-
-    // Special language to test endsWithParentVariants
-    hljs.registerLanguage('nested', require('../fixtures/nested.js'));
-
-    // Setup hljs environment
-    hljs.configure({ tabReplace: '    ' });
-    let blocks = document.querySelectorAll('pre code');
-    blocks.forEach(hljs.highlightElement);
-
-    // Setup hljs for non-`
` tests
-    hljs.configure({ useBR: true });
-
-    blocks = document.querySelectorAll('.code');
-    blocks.forEach(hljs.highlightElement);
-  });
-
-  require('./explicitLanguage');
-  require('./customMarkup');
-  require('./languageAlias');
-  require('./noHighlight');
-  require('./subLanguages');
-  require('./buildClassName');
-  require('./useBr');
-  require('./endsWithParentVariants')
-});
+import "./buildClassName.js";
+import "./endsWithParentVariants.js";
+import "./explicitLanguage.js";
+import "./languageAlias.js";
+import "./noHighlight.js";
+import "./subLanguages.js";
diff --git a/test/special/languageAlias.js b/test/special/languageAlias.js
index 7f80294cc3..1c7ac34bb0 100644
--- a/test/special/languageAlias.js
+++ b/test/special/languageAlias.js
@@ -1,8 +1,7 @@
-'use strict';
+import { document } from './document.js'
+import * as utility from '../utility.js';
 
-const utility = require('../utility');
-
-describe('language alias', () => {
+describe('language alias', function() {
   before(() => {
     const testHTML = document.querySelectorAll('#language-alias .hljs');
 
diff --git a/test/special/noHighlight.js b/test/special/noHighlight.js
index 3907b37722..cd684f958f 100644
--- a/test/special/noHighlight.js
+++ b/test/special/noHighlight.js
@@ -1,6 +1,6 @@
-'use strict';
+import { document } from './document.js'
 
-describe('no highlighting', () => {
+describe('no highlighting', function() {
   before(() => {
     const testHTML = document.querySelectorAll('#no-highlight pre');
 
diff --git a/test/special/subLanguages.js b/test/special/subLanguages.js
index a04d128b06..c146e22645 100644
--- a/test/special/subLanguages.js
+++ b/test/special/subLanguages.js
@@ -1,8 +1,7 @@
-'use strict';
+import { document } from './document.js'
+import * as utility from '../utility.js';
 
-const utility = require('../utility');
-
-describe('sub-languages', () => {
+describe('sub-languages', function() {
   before(() => {
     this.block = document.querySelector('#sublanguages');
   });
diff --git a/test/special/useBr.js b/test/special/useBr.js
deleted file mode 100644
index 55b255fe9b..0000000000
--- a/test/special/useBr.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-const utility = require('../utility');
-
-describe('use br', () => {
-  before(() => {
-    const filename = utility.buildPath('fixtures', 'expect', 'useBr.txt'),
-          testHTML = document.querySelectorAll('#use-br .hljs');
-
-    return utility.setupFile(filename, 'utf-8', this, testHTML);
-  });
-
-  it('should respect 
tags', () => { - const actual = this.blocks[0]; - - actual.should.equal(this.expected); - }); - - it('should ignore literal new lines', () => { - const actual = this.blocks[1]; - - actual.should.equal(this.expected); - }); - - it('should recognize xml-style
', () => { - const actual = this.blocks[2]; - - actual.should.equal(this.expected); - }); -}); diff --git a/test/utility.js b/test/utility.js index 60318df03f..ba72c79710 100644 --- a/test/utility.js +++ b/test/utility.js @@ -1,22 +1,24 @@ -'use strict'; +import { promises as fs } from "fs"; +const { readFile } = fs; +import path from "path"; +import { fileURLToPath } from "url"; -const { readFile } = require('fs').promises; -const path = require('path'); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); // Build a path relative to `test/` -exports.buildPath = function() { +export const buildPath = function() { const args = [...arguments], paths = [__dirname].concat(args); return path.join.apply(this, paths); }; -exports.expectedFile = (filename, encoding, actual) => { +export const expectedFile = (filename, encoding, actual) => { return readFile(filename, encoding) .then(expected => actual.trim().should.equal(expected.trim())); }; -exports.setupFile = (filename, encoding, that, testHTML) => { +export const setupFile = (filename, encoding, that, testHTML) => { return readFile(filename, encoding) .then(expected => { that.expected = expected.trim(); diff --git a/tools/build.js b/tools/build.js old mode 100644 new mode 100755 diff --git a/tools/build_browser.js b/tools/build_browser.js index 3b2b59592f..bb0112418e 100644 --- a/tools/build_browser.js +++ b/tools/build_browser.js @@ -12,6 +12,8 @@ const { install, installCleanCSS, mkdir, renderTemplate } = require("./lib/makes const log = (...args) => console.log(...args); const { rollupCode } = require("./lib/bundling.js"); const bundling = require('./lib/bundling.js'); +const Table = require('cli-table'); +const { result } = require('lodash'); function buildHeader(args) { return "/*\n" + @@ -20,6 +22,23 @@ function buildHeader(args) { ` Copyright (c) ${config.copyrightYears}, ${args.author.name}\n*/`; } +function detailedGrammarSizes(languages) { + if (languages.length > 180) return; + + const resultTable = new Table({ + head: ['lang','minified'], + // colWidths: [20,20,10,20,10,20], + chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, + style: { + head: ['grey'] + } + }); + languages.map(async(lang) => { + resultTable.push([lang.name, lang.data.length]); + }); + console.log(resultTable.sort((b, a) => a[1] - b[1]).toString()); +} + async function buildBrowser(options) { let languages = await getLanguages(); // filter languages for inclusion in the highlight.js bundle @@ -31,23 +50,21 @@ async function buildBrowser(options) { log("Preparing languages."); await Promise.all( languages.map(async(lang) => { - await lang.compile({ terser: config.terser }); + // await lang.compile({ terser: config.terser }); process.stdout.write("."); }) ); log(""); + detailedGrammarSizes(languages); + const size = await buildBrowserHighlightJS(languages, { minify: options.minify }); log("-----"); log("Core :", size.core, "bytes"); if (options.minify) { log("Core (min) :", size.core_min, "bytes"); } - log("Languages :", + log("Languages (raw) :", languages.map((el) => el.data.length).reduce((acc, curr) => acc + curr, 0), "bytes"); - if (options.minify) { - log("Languages (min) :", - languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes"); - } log("highlight.js :", size.full, "bytes"); if (options.minify) { log("highlight.min.js :", size.minified, "bytes"); @@ -150,22 +167,48 @@ async function buildBrowserHighlightJS(languages, { minify }) { const outFile = `${process.env.BUILD_DIR}/highlight.js`; const minifiedFile = outFile.replace(/js$/, "min.js"); - const input = { ...config.rollup.browser_core.input, input: `src/highlight.js` }; + const built_in_langs = { + name: "dynamicLanguages", + resolveId: (source) => { + if (source == "builtInLanguages") { return "builtInLanguages"} + return null; + }, + load: (id) => { + if (id == "builtInLanguages") { + const escape = (s) => "grmr_" + s.replace("-", "_"); + let src = ""; + src += languages.map((x) => `import ${escape(x.name)} from '${x.path}'`).join("\n"); + src += `\nexport {${languages.map((x) => escape(x.name)).join(",")}}`; + return src; + } + return null; + } + } + + const plugins = [...config.rollup.browser_core.input.plugins, built_in_langs]; + + const input = { ...config.rollup.browser_core.input, input: `src/stub.js`, plugins }; const output = { ...config.rollup.browser_core.output, file: outFile }; let librarySrc = await rollupCode(input, output); - // var librarySrc = await fs.readFile("src/highlight.js", {encoding: "utf8"}); - const coreSize = librarySrc.length; + + // we don't use this, we just use it to get a size approximation for the build stats + const coreSrc = await rollupCode({ ...config.rollup.browser_core.input, input: `src/highlight.js`, plugins }, output); + const coreSize = coreSrc.length; // strip off the original top comment librarySrc = librarySrc.replace(/\/\*.*?\*\//s, ""); const fullSrc = [ header, librarySrc, - ...languages.map((lang) => lang.module)].join("\n"); + // ...languages.map((lang) => lang.module) + ].join("\n"); const tasks = []; tasks.push(fs.writeFile(outFile, fullSrc, { encoding: "utf8" })); + tasks.push(fs.writeFile(`${process.env.BUILD_DIR}/package.json`, JSON.stringify({ + type:'commonjs' + }), { encoding: "utf8" })); const shas = { "highlight.js": bundling.sha384(fullSrc) }; @@ -175,13 +218,15 @@ async function buildBrowserHighlightJS(languages, { minify }) { if (minify) { const tersed = await Terser.minify(librarySrc, config.terser); + const tersedCore = await Terser.minify(coreSrc, config.terser); minifiedSrc = [ header, tersed.code, - ...languages.map((lang) => lang.minified)].join("\n"); + // ...languages.map((lang) => lang.minified) + ].join("\n"); // get approximate core minified size - core_min = [header, tersed.code].join().length; + core_min = [header, tersedCore.code].join().length; tasks.push(fs.writeFile(minifiedFile, minifiedSrc, { encoding: "utf8" })); shas["highlight.min.js"] = bundling.sha384(minifiedSrc); diff --git a/tools/build_config.js b/tools/build_config.js index 9052aaf92e..b522e54a49 100644 --- a/tools/build_config.js +++ b/tools/build_config.js @@ -5,7 +5,9 @@ const { nodeResolve } = require('@rollup/plugin-node-resolve'); module.exports = { build_dir: "build", copyrightYears: `2006-${new Date().getFullYear()}`, - clean_css: {}, + clean_css: { + level: 2 + }, rollup: { node: { output: { format: "cjs", strict: false, exports: "auto" }, diff --git a/tools/build_node.js b/tools/build_node.js index 90b041e5d2..be39fcf835 100644 --- a/tools/build_node.js +++ b/tools/build_node.js @@ -42,6 +42,7 @@ async function buildNodeHighlightJS() { async function buildPackageJSON() { const packageJson = require("../package"); + packageJson.type = 'commonjs'; await fs.writeFile(`${process.env.BUILD_DIR}/package.json`, JSON.stringify(packageJson, null, 2)); } diff --git a/tools/checkAutoDetect.js b/tools/checkAutoDetect.js index 4836a557b0..f4ff21ed0e 100755 --- a/tools/checkAutoDetect.js +++ b/tools/checkAutoDetect.js @@ -26,13 +26,13 @@ function testAutoDetection(language, index, languages) { .forEach(function(content) { const expected = language, actual = hljs.highlightAuto(content); - if (actual.language !== expected && actual.second_best.language !== expected) { + if (actual.language !== expected && actual.secondBest.language !== expected) { return resultTable.push([ expected, colors.red(actual.language), actual.relevance ? actual.relevance : colors.grey('None'), - colors.red(actual.second_best.language), - actual.second_best.relevance ? actual.second_best.relevance : colors.grey('None') + colors.red(actual.secondBest.language), + actual.secondBest.relevance ? actual.secondBest.relevance : colors.grey('None') ]); } if (actual.language !== expected) { @@ -40,18 +40,18 @@ function testAutoDetection(language, index, languages) { expected, colors.yellow(actual.language), actual.relevance ? actual.relevance : colors.grey('None'), - colors.yellow(actual.second_best.language), - actual.second_best.relevance ? actual.second_best.relevance : colors.grey('None') + colors.yellow(actual.secondBest.language), + actual.secondBest.relevance ? actual.secondBest.relevance : colors.grey('None') ]); } // equal relevance is flagged - if (actual.relevance == actual.second_best.relevance) { + if (actual.relevance == actual.secondBest.relevance) { return resultTable.push([ expected, actual.language, actual.relevance ? colors.yellow(actual.relevance) : colors.grey('None'), - actual.second_best.language, - actual.second_best.relevance ? colors.yellow(actual.second_best.relevance) : colors.grey('None'), + actual.secondBest.language, + actual.secondBest.relevance ? colors.yellow(actual.secondBest.relevance) : colors.grey('None'), "Relevance match." ]); } diff --git a/tools/developer.html b/tools/developer.html index b446aacd13..f01722d392 100644 --- a/tools/developer.html +++ b/tools/developer.html @@ -215,8 +215,8 @@

Markup

vue.language = hljs.getLanguage(language) ? language : ''; var rendering_stats = result.language + ': relevance ' + (result.relevance ); - if (result.second_best) { - rendering_stats += ', ' + result.second_best.language + ': ' + (result.second_best.relevance || result.second_best.r); + if (result.secondBest) { + rendering_stats += ', ' + result.secondBest.language + ': ' + (result.secondBest.relevance || result.secondBest.r); } editor.find('.rendering_stats').text(rendering_stats); editor.find('.rendering_time').text(rendering_time); diff --git a/tools/lib/makestuff.js b/tools/lib/makestuff.js index 1562ea8798..38d15a0582 100644 --- a/tools/lib/makestuff.js +++ b/tools/lib/makestuff.js @@ -14,8 +14,17 @@ function install(file, dest = file) { fs.copyFileSync(file, `${process.env.BUILD_DIR}/${dest}`); } +const DEFAULT_CSS = ` +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; +} +`.trim(); + function installCleanCSS(file, dest) { - const content = fs.readFileSync(file, { encoding: "utf8" }); + const theme = fs.readFileSync(file, { encoding: "utf8" }); + const content = DEFAULT_CSS + "\n" + theme; const out = new CleanCSS(config.clean_css).minify(content).styles; fs.writeFileSync(`${process.env.BUILD_DIR}/${dest}`, out); } diff --git a/tools/package.json b/tools/package.json new file mode 100644 index 0000000000..5bbefffbab --- /dev/null +++ b/tools/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/types/index.d.ts b/types/index.d.ts index 96b14965c6..28a19be9ba 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -17,7 +17,6 @@ interface VuePlugin { interface PublicApi { highlight: (languageName: string, code: string, ignoreIllegals?: boolean, continuation?: Mode) => HighlightResult highlightAuto: (code: string, languageSubset?: string[]) => AutoHighlightResult - fixMarkup: (html: string) => string highlightBlock: (element: HTMLElement) => void configure: (options: Partial) => void initHighlighting: () => void @@ -51,7 +50,6 @@ interface ModesAPI { NUMBER_MODE: Mode C_NUMBER_MODE: Mode BINARY_NUMBER_MODE: Mode - CSS_NUMBER_MODE: Mode REGEXP_MODE: Mode TITLE_MODE: Mode UNDERSCORE_TITLE_MODE: Mode @@ -74,21 +72,24 @@ interface HighlightResult { relevance : number value : string language? : string - emitter : Emitter illegal : boolean - top? : Language | CompiledMode - illegalBy? : illegalData - sofar? : string + _illegalBy? : illegalData errorRaised? : Error // * for auto-highlight - second_best? : Omit + secondBest? : Omit code?: string + // technically psuedo-private API + _emitter : Emitter + _top? : Language | CompiledMode + } interface AutoHighlightResult extends HighlightResult {} interface illegalData { - msg: string + message: string context: string + index: number + resultSoFar : string mode: CompiledMode } @@ -116,8 +117,6 @@ interface HLJSOptions { noHighlightRe: RegExp languageDetectRe: RegExp classPrefix: string - tabReplace?: string - useBR: boolean languages?: string[] __emitter: EmitterConstructor } @@ -136,7 +135,7 @@ interface CallbackResponse { type AnnotatedError = Error & {mode?: Mode | Language, languageName?: string, badRule?: Mode} type ModeCallback = (match: RegExpMatchArray, response: CallbackResponse) => void -type HighlightedHTMLElement = HTMLElement & {result?: object, second_best?: object, parentNode: HTMLElement} +type HighlightedHTMLElement = HTMLElement & {result?: object, secondBest?: object, parentNode: HTMLElement} type EnhancedMatch = RegExpMatchArray & {rule: CompiledMode, type: MatchType} type MatchType = "begin" | "end" | "illegal"