diff --git a/.eslintrc.json b/.eslintrc.json index 7c1365d6b..f61a6ffcf 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,5 +1,10 @@ { - "extends": ["eslint:recommended", "prettier"], + "extends": [ + "eslint:recommended", + "prettier", + "plugin:n/recommended", + "plugin:unicorn/recommended" + ], "env": { "node": true, "es6": true @@ -21,7 +26,14 @@ "spaced-comment": 2, "yoda": [2, "never"], "curly": [2, "multi-line"], - "no-else-return": 2 + "no-else-return": 2, + + "unicorn/prefer-module": 0, + "unicorn/filename-case": 0, + "unicorn/no-null": 0, + "unicorn/prefer-code-point": 0, + "unicorn/prefer-string-slice": 0, + "unicorn/prefer-add-event-listener": 0 }, "overrides": [ { @@ -55,7 +67,9 @@ "@typescript-eslint/prefer-includes": 2, "@typescript-eslint/no-unnecessary-condition": 2, "@typescript-eslint/switch-exhaustiveness-check": 2, - "@typescript-eslint/prefer-nullish-coalescing": 2 + "@typescript-eslint/prefer-nullish-coalescing": 2, + + "n/no-unsupported-features/es-syntax": 0 } } ] diff --git a/package-lock.json b/package-lock.json index e27c3f69c..7cf367153 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,8 @@ "@typescript-eslint/parser": "^5.45.0", "eslint": "^8.28.0", "eslint-config-prettier": "^8.5.0", + "eslint-plugin-n": "^15.5.1", + "eslint-plugin-unicorn": "^45.0.1", "jest": "^29.3.1", "prettier": "^2.8.0", "ts-jest": "^29.0.3", @@ -645,6 +647,21 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.1.2.tgz", + "integrity": "sha512-7qELuQWWjVDdVsFQ5+beUl+KPczrEDA7S3zM4QUd/bJl7oXgsmpXaEVqrRTnOBqenOV4rWf2kVZk2Ot085zPWA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -1237,6 +1254,12 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "node_modules/@types/prettier": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", @@ -1747,6 +1770,27 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1821,6 +1865,27 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -2159,6 +2224,119 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.5.1.tgz", + "integrity": "sha512-kAd+xhZm7brHoFLzKLB7/FGRFJNg/srmv67mqb7tto22rpr4wv/LV6RuXzAfv3jbab7+k1wi42PsIhGviywaaw==", + "dev": true, + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "45.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.1.tgz", + "integrity": "sha512-tLnIw5oDJJc3ILYtlKtqOxPP64FZLTkZkgeuoN6e7x6zw+rhBjOxyvq2c7577LGxXuIhBYrwisZuKNqOOHp3BA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.19.1", + "@eslint-community/eslint-utils": "^4.1.0", + "ci-info": "^3.6.1", + "clean-regexp": "^1.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.0", + "jsesc": "^3.0.2", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "regjsparser": "^0.9.1", + "safe-regex": "^2.1.1", + "semver": "^7.3.8", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=8.28.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -2699,6 +2877,12 @@ "node": ">=8" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -2767,6 +2951,15 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2789,6 +2982,21 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -3624,6 +3832,12 @@ "node": ">=8" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -3724,6 +3938,15 @@ "node": ">=6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3766,6 +3989,27 @@ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3990,6 +4234,15 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4088,6 +4341,65 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/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/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -4100,6 +4412,27 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4213,10 +4546,19 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4289,6 +4631,38 @@ "source-map": "^0.6.0" } }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -4373,6 +4747,18 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -4621,6 +5007,16 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -5210,6 +5606,15 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@eslint-community/eslint-utils": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.1.2.tgz", + "integrity": "sha512-7qELuQWWjVDdVsFQ5+beUl+KPczrEDA7S3zM4QUd/bJl7oXgsmpXaEVqrRTnOBqenOV4rWf2kVZk2Ot085zPWA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, "@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -5700,6 +6105,12 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "@types/prettier": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", @@ -6041,6 +6452,21 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -6087,6 +6513,23 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -6382,6 +6825,81 @@ "dev": true, "requires": {} }, + "eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-plugin-n": { + "version": "15.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.5.1.tgz", + "integrity": "sha512-kAd+xhZm7brHoFLzKLB7/FGRFJNg/srmv67mqb7tto22rpr4wv/LV6RuXzAfv3jbab7+k1wi42PsIhGviywaaw==", + "dev": true, + "requires": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + } + }, + "eslint-plugin-unicorn": { + "version": "45.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.1.tgz", + "integrity": "sha512-tLnIw5oDJJc3ILYtlKtqOxPP64FZLTkZkgeuoN6e7x6zw+rhBjOxyvq2c7577LGxXuIhBYrwisZuKNqOOHp3BA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.19.1", + "@eslint-community/eslint-utils": "^4.1.0", + "ci-info": "^3.6.1", + "clean-regexp": "^1.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.0", + "jsesc": "^3.0.2", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "regjsparser": "^0.9.1", + "safe-regex": "^2.1.1", + "semver": "^7.3.8", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true + } + } + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -6734,6 +7252,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -6778,6 +7302,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6800,6 +7330,15 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, "is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -7436,6 +7975,12 @@ "p-locate": "^4.1.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -7517,6 +8062,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7556,6 +8107,26 @@ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -7716,6 +8287,12 @@ "find-up": "^4.0.0" } }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7775,12 +8352,74 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "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 + } + } + }, + "regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7851,10 +8490,19 @@ "queue-microtask": "^1.2.2" } }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -7909,6 +8557,38 @@ "source-map": "^0.6.0" } }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7974,6 +8654,15 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -8129,6 +8818,16 @@ } } }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", diff --git a/package.json b/package.json index 15c67fac0..7a8cbd875 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,8 @@ "@typescript-eslint/parser": "^5.45.0", "eslint": "^8.28.0", "eslint-config-prettier": "^8.5.0", + "eslint-plugin-n": "^15.5.1", + "eslint-plugin-unicorn": "^45.0.1", "jest": "^29.3.1", "prettier": "^2.8.0", "ts-jest": "^29.0.3", diff --git a/src/FeedHandler.spec.ts b/src/FeedHandler.spec.ts index be273f4d1..065fde41b 100644 --- a/src/FeedHandler.spec.ts +++ b/src/FeedHandler.spec.ts @@ -1,16 +1,16 @@ // Runs tests for feeds -import * as helper from "./__fixtures__/test-helper"; -import { DomHandler, getFeed, parseFeed } from "."; -import fs from "fs"; -import path from "path"; +import * as helper from "./__fixtures__/test-helper.js"; +import { DomHandler, getFeed, parseFeed } from "./index.js"; +import fs from "node:fs"; +import path from "node:path"; const documents = path.join(__dirname, "__fixtures__", "Documents"); -helper.createSuite("Feeds", (test, cb) => { +helper.createSuite("Feeds", (test, callback) => { const file = fs.readFileSync(path.join(documents, test.file), "utf8"); - const handler: DomHandler = new DomHandler((err) => - cb(err, getFeed(handler.dom)) + const handler: DomHandler = new DomHandler((error) => + callback(error, getFeed(handler.dom)) ); helper.writeToParser(handler, { xmlMode: true }, file); diff --git a/src/Parser.spec.ts b/src/Parser.spec.ts index 88fb2bde9..3a32cad0a 100644 --- a/src/Parser.spec.ts +++ b/src/Parser.spec.ts @@ -1,5 +1,5 @@ -import { Parser, Tokenizer } from "."; -import type { Handler } from "./Parser"; +import { Parser, Tokenizer } from "./index.js"; +import type { Handler } from "./Parser.js"; describe("API", () => { test("should work without callbacks", () => { diff --git a/src/Parser.ts b/src/Parser.ts index 69a5636fb..710f44274 100644 --- a/src/Parser.ts +++ b/src/Parser.ts @@ -256,10 +256,10 @@ export class Parser implements Callbacks { * Entities can be emitted on the character, or directly after. * We use the section start here to get accurate indices. */ - const idx = this.tokenizer.getSectionStart(); - this.endIndex = idx - 1; + const index = this.tokenizer.getSectionStart(); + this.endIndex = index - 1; this.cbs.ontext?.(fromCodePoint(cp)); - this.startIndex = idx; + this.startIndex = index; } protected isVoidElement(name: string): boolean { @@ -291,8 +291,8 @@ export class Parser implements Callbacks { this.stack.length > 0 && impliesClose.has(this.stack[this.stack.length - 1]) ) { - const el = this.stack.pop()!; - this.cbs.onclosetag?.(el, true); + const element = this.stack.pop()!; + this.cbs.onclosetag?.(element, true); } } if (!this.isVoidElement(name)) { @@ -449,8 +449,8 @@ export class Parser implements Callbacks { } private getInstructionName(value: string) { - const idx = value.search(reNameEnd); - let name = idx < 0 ? value : value.substr(0, idx); + const index = value.search(reNameEnd); + let name = index < 0 ? value : value.substr(0, index); if (this.lowerCaseTagNames) { name = name.toLowerCase(); @@ -522,9 +522,9 @@ export class Parser implements Callbacks { // Set the end index for all remaining tags this.endIndex = this.startIndex; for ( - let i = this.stack.length; - i > 0; - this.cbs.onclosetag(this.stack[--i], true) + let index = this.stack.length; + index > 0; + this.cbs.onclosetag(this.stack[--index], true) ); } this.cbs.onend?.(); @@ -565,17 +565,17 @@ export class Parser implements Callbacks { this.shiftBuffer(); } - let str = this.buffers[0].slice( + let slice = this.buffers[0].slice( start - this.bufferOffset, end - this.bufferOffset ); while (end - this.bufferOffset > this.buffers[0].length) { this.shiftBuffer(); - str += this.buffers[0].slice(0, end - this.bufferOffset); + slice += this.buffers[0].slice(0, end - this.bufferOffset); } - return str; + return slice; } private shiftBuffer(): void { @@ -609,7 +609,7 @@ export class Parser implements Callbacks { */ public end(chunk?: string): void { if (this.ended) { - this.cbs.onerror?.(Error(".end() after done!")); + this.cbs.onerror?.(new Error(".end() after done!")); return; } diff --git a/src/Tokenizer.spec.ts b/src/Tokenizer.spec.ts index 8f5672cf4..e5b53231f 100644 --- a/src/Tokenizer.spec.ts +++ b/src/Tokenizer.spec.ts @@ -1,17 +1,18 @@ -import { Tokenizer } from "."; +import { Tokenizer } from "./index.js"; -function tokenize(str: string) { +function tokenize(data: string) { const log: unknown[][] = []; const tokenizer = new Tokenizer( {}, new Proxy({} as any, { - get(_, prop) { - return (...args: unknown[]) => log.push([prop, ...args]); + get(_, property) { + return (...values: unknown[]) => + log.push([property, ...values]); }, }) ); - tokenizer.write(str); + tokenizer.write(data); tokenizer.end(); return log; @@ -47,12 +48,12 @@ describe("Tokenizer", () => { const tokenizer = new Tokenizer( {}, new Proxy({} as any, { - get(_, prop) { - return (...args: unknown[]) => { - if (prop === "ontext") { + get(_, property) { + return (...values: unknown[]) => { + if (property === "ontext") { tokenizer.pause(); } - log.push([prop, ...args]); + log.push([property, ...values]); }; }, }) diff --git a/src/Tokenizer.ts b/src/Tokenizer.ts index cb94a78ce..d9635af84 100644 --- a/src/Tokenizer.ts +++ b/src/Tokenizer.ts @@ -13,7 +13,7 @@ const enum CharCodes { CarriageReturn = 0xd, // "\r" Space = 0x20, // " " ExclamationMark = 0x21, // "!" - Num = 0x23, // "#" + Number = 0x23, // "#" Amp = 0x26, // "&" SingleQuote = 0x27, // "'" DoubleQuote = 0x22, // '"' @@ -625,7 +625,7 @@ export default class Tokenizer { this.entityExcess = 1; this.entityResult = 0; - if (c === CharCodes.Num) { + if (c === CharCodes.Number) { this.state = State.BeforeNumericEntity; } else if (c === CharCodes.Amp) { // We have two `&` characters in a row. Stay in the current state. @@ -698,15 +698,17 @@ export default class Tokenizer { 14; switch (valueLength) { - case 1: + case 1: { this.emitCodePoint( this.entityTrie[this.entityResult] & ~BinTrieFlags.VALUE_LENGTH ); break; - case 2: + } + case 2: { this.emitCodePoint(this.entityTrie[this.entityResult + 1]); break; + } case 3: { this.emitCodePoint(this.entityTrie[this.entityResult + 1]); this.emitCodePoint(this.entityTrie[this.entityResult + 2]); @@ -818,65 +820,123 @@ export default class Tokenizer { private parse() { while (this.shouldContinue()) { const c = this.buffer.charCodeAt(this.index - this.offset); - if (this.state === State.Text) { - this.stateText(c); - } else if (this.state === State.SpecialStartSequence) { - this.stateSpecialStartSequence(c); - } else if (this.state === State.InSpecialTag) { - this.stateInSpecialTag(c); - } else if (this.state === State.CDATASequence) { - this.stateCDATASequence(c); - } else if (this.state === State.InAttributeValueDq) { - this.stateInAttributeValueDoubleQuotes(c); - } else if (this.state === State.InAttributeName) { - this.stateInAttributeName(c); - } else if (this.state === State.InCommentLike) { - this.stateInCommentLike(c); - } else if (this.state === State.InSpecialComment) { - this.stateInSpecialComment(c); - } else if (this.state === State.BeforeAttributeName) { - this.stateBeforeAttributeName(c); - } else if (this.state === State.InTagName) { - this.stateInTagName(c); - } else if (this.state === State.InClosingTagName) { - this.stateInClosingTagName(c); - } else if (this.state === State.BeforeTagName) { - this.stateBeforeTagName(c); - } else if (this.state === State.AfterAttributeName) { - this.stateAfterAttributeName(c); - } else if (this.state === State.InAttributeValueSq) { - this.stateInAttributeValueSingleQuotes(c); - } else if (this.state === State.BeforeAttributeValue) { - this.stateBeforeAttributeValue(c); - } else if (this.state === State.BeforeClosingTagName) { - this.stateBeforeClosingTagName(c); - } else if (this.state === State.AfterClosingTagName) { - this.stateAfterClosingTagName(c); - } else if (this.state === State.BeforeSpecialS) { - this.stateBeforeSpecialS(c); - } else if (this.state === State.InAttributeValueNq) { - this.stateInAttributeValueNoQuotes(c); - } else if (this.state === State.InSelfClosingTag) { - this.stateInSelfClosingTag(c); - } else if (this.state === State.InDeclaration) { - this.stateInDeclaration(c); - } else if (this.state === State.BeforeDeclaration) { - this.stateBeforeDeclaration(c); - } else if (this.state === State.BeforeComment) { - this.stateBeforeComment(c); - } else if (this.state === State.InProcessingInstruction) { - this.stateInProcessingInstruction(c); - } else if (this.state === State.InNamedEntity) { - this.stateInNamedEntity(c); - } else if (this.state === State.BeforeEntity) { - this.stateBeforeEntity(c); - } else if (this.state === State.InHexEntity) { - this.stateInHexEntity(c); - } else if (this.state === State.InNumericEntity) { - this.stateInNumericEntity(c); - } else { - // `this._state === State.BeforeNumericEntity` - this.stateBeforeNumericEntity(c); + switch (this.state) { + case State.Text: { + this.stateText(c); + break; + } + case State.SpecialStartSequence: { + this.stateSpecialStartSequence(c); + break; + } + case State.InSpecialTag: { + this.stateInSpecialTag(c); + break; + } + case State.CDATASequence: { + this.stateCDATASequence(c); + break; + } + case State.InAttributeValueDq: { + this.stateInAttributeValueDoubleQuotes(c); + break; + } + case State.InAttributeName: { + this.stateInAttributeName(c); + break; + } + case State.InCommentLike: { + this.stateInCommentLike(c); + break; + } + case State.InSpecialComment: { + this.stateInSpecialComment(c); + break; + } + case State.BeforeAttributeName: { + this.stateBeforeAttributeName(c); + break; + } + case State.InTagName: { + this.stateInTagName(c); + break; + } + case State.InClosingTagName: { + this.stateInClosingTagName(c); + break; + } + case State.BeforeTagName: { + this.stateBeforeTagName(c); + break; + } + case State.AfterAttributeName: { + this.stateAfterAttributeName(c); + break; + } + case State.InAttributeValueSq: { + this.stateInAttributeValueSingleQuotes(c); + break; + } + case State.BeforeAttributeValue: { + this.stateBeforeAttributeValue(c); + break; + } + case State.BeforeClosingTagName: { + this.stateBeforeClosingTagName(c); + break; + } + case State.AfterClosingTagName: { + this.stateAfterClosingTagName(c); + break; + } + case State.BeforeSpecialS: { + this.stateBeforeSpecialS(c); + break; + } + case State.InAttributeValueNq: { + this.stateInAttributeValueNoQuotes(c); + break; + } + case State.InSelfClosingTag: { + this.stateInSelfClosingTag(c); + break; + } + case State.InDeclaration: { + this.stateInDeclaration(c); + break; + } + case State.BeforeDeclaration: { + this.stateBeforeDeclaration(c); + break; + } + case State.BeforeComment: { + this.stateBeforeComment(c); + break; + } + case State.InProcessingInstruction: { + this.stateInProcessingInstruction(c); + break; + } + case State.InNamedEntity: { + this.stateInNamedEntity(c); + break; + } + case State.BeforeEntity: { + this.stateBeforeEntity(c); + break; + } + case State.InHexEntity: { + this.stateInHexEntity(c); + break; + } + case State.InNumericEntity: { + this.stateInNumericEntity(c); + break; + } + default: { + // `this._state === State.BeforeNumericEntity` + this.stateBeforeNumericEntity(c); + } } this.index++; } diff --git a/src/WritableStream.spec.ts b/src/WritableStream.spec.ts index bcba9d512..65fab7fcc 100644 --- a/src/WritableStream.spec.ts +++ b/src/WritableStream.spec.ts @@ -1,7 +1,7 @@ -import fs from "fs"; -import path from "path"; -import { WritableStream } from "./WritableStream"; -import * as helper from "./__fixtures__/test-helper"; +import fs from "node:fs"; +import path from "node:path"; +import { WritableStream } from "./WritableStream.js"; +import * as helper from "./__fixtures__/test-helper.js"; describe("WritableStream", () => { test("should decode fragmented unicode characters", () => { @@ -17,7 +17,7 @@ describe("WritableStream", () => { }); }); -helper.createSuite("Stream", (test, cb) => { +helper.createSuite("Stream", (test, callback) => { const filePath = path.join( __dirname, "__fixtures__", @@ -28,18 +28,18 @@ helper.createSuite("Stream", (test, cb) => { fs.createReadStream(filePath) .pipe( new WritableStream( - helper.getEventCollector((err, events) => { - cb(err, events); + helper.getEventCollector((error, events) => { + callback(error, events); - const handler = helper.getEventCollector(cb); + const handler = helper.getEventCollector(callback); const stream = new WritableStream(handler, test.options); - fs.readFile(filePath, (err, data) => - err ? cb(err) : stream.end(data) + fs.readFile(filePath, (error, data) => + error ? callback(error) : stream.end(data) ); }), test.options ) ) - .on("error", cb); + .on("error", callback); }); diff --git a/src/WritableStream.ts b/src/WritableStream.ts index 2f3a5af3f..0a6eda29f 100644 --- a/src/WritableStream.ts +++ b/src/WritableStream.ts @@ -3,8 +3,8 @@ import { Parser, Handler, ParserOptions } from "./Parser.js"; * NOTE: If either of these two imports produces a type error, * please update your @types/node dependency! */ -import { Writable } from "stream"; -import { StringDecoder } from "string_decoder"; +import { Writable } from "node:stream"; +import { StringDecoder } from "node:string_decoder"; // Following the example in https://nodejs.org/api/stream.html#stream_decoding_buffers_in_a_writable_stream function isBuffer(_chunk: string | Buffer, encoding: string): _chunk is Buffer { @@ -28,16 +28,16 @@ export class WritableStream extends Writable { override _write( chunk: string | Buffer, encoding: string, - cb: () => void + callback: () => void ): void { this._parser.write( isBuffer(chunk, encoding) ? this._decoder.write(chunk) : chunk ); - cb(); + callback(); } - override _final(cb: () => void): void { + override _final(callback: () => void): void { this._parser.end(this._decoder.end()); - cb(); + callback(); } } diff --git a/src/__fixtures__/test-helper.ts b/src/__fixtures__/test-helper.ts index 425c09cc5..cab15d115 100644 --- a/src/__fixtures__/test-helper.ts +++ b/src/__fixtures__/test-helper.ts @@ -1,6 +1,6 @@ -import { Parser, Handler, ParserOptions } from "../Parser"; -import fs from "fs"; -import path from "path"; +import { Parser, Handler, ParserOptions } from "../Parser.js"; +import fs from "node:fs"; +import path from "node:path"; /** * Write to the parser twice, once a bytes, once as @@ -18,8 +18,8 @@ export function writeToParser( ): void { const parser = new Parser(handler, options); // First, try to run the test via chunks - for (let i = 0; i < data.length; i++) { - parser.write(data.charAt(i)); + for (let index = 0; index < data.length; index++) { + parser.write(data.charAt(index)); } parser.end(); // Then, parse everything @@ -41,49 +41,65 @@ interface Event { * @param cb Function to call with all events. */ export function getEventCollector( - cb: (error: Error | null, events?: Event[]) => void + callback: (error: Error | null, events?: Event[]) => void ): Partial { const events: Event[] = []; let parser: Parser; function handle(event: string, ...data: unknown[]): void { - if (event === "onerror") { - cb(data[0] as Error); - } else if (event === "onend") { - cb(null, events); - } else if (event === "onreset") { - events.length = 0; - } else if (event === "onparserinit") { - parser = data[0] as Parser; - // Don't collect event - } else if ( - event === "ontext" && - events[events.length - 1]?.event === "text" - ) { - const last = events[events.length - 1]; - // Combine text nodes - (last.data[0] as string) += data[0]; - last.endIndex = parser.endIndex; - } else { - // Remove `undefined`s from attribute responses, as they cannot be represented in JSON. - if (event === "onattribute" && data[2] === undefined) { - data.pop(); + switch (event) { + case "onerror": { + callback(data[0] as Error); + + break; } + case "onend": { + callback(null, events); - if (!(parser.startIndex <= parser.endIndex)) { - throw new Error( - `Invalid start/end index ${parser.startIndex} > ${parser.endIndex}` - ); + break; } + case "onreset": { + events.length = 0; - events.push({ - event: event.substr(2), - startIndex: parser.startIndex, - endIndex: parser.endIndex, - data, - }); + break; + } + case "onparserinit": { + parser = data[0] as Parser; + // Don't collect event - parser.endIndex; + break; + } + default: { + if ( + event === "ontext" && + events[events.length - 1]?.event === "text" + ) { + const last = events[events.length - 1]; + // Combine text nodes + (last.data[0] as string) += data[0]; + last.endIndex = parser.endIndex; + } else { + // Remove `undefined`s from attribute responses, as they cannot be represented in JSON. + if (event === "onattribute" && data[2] === undefined) { + data.pop(); + } + + if (!(parser.startIndex <= parser.endIndex)) { + throw new Error( + `Invalid start/end index ${parser.startIndex} > ${parser.endIndex}` + ); + } + + events.push({ + event: event.slice(2), + startIndex: parser.startIndex, + endIndex: parser.endIndex, + data, + }); + + parser.endIndex; + } + } } } @@ -99,11 +115,11 @@ export function getEventCollector( * @param file Test file to execute. * @param done Function to call on completion. */ -function getCallback(file: TestFile, done: (err?: Error | null) => void) { +function getCallback(file: TestFile, done: (error?: Error | null) => void) { let firstResult: unknown | undefined; - return (err: null | Error, actual?: unknown | unknown[]) => { - expect(err).toBeNull(); + return (error: null | Error, actual?: unknown | unknown[]) => { + expect(error).toBeNull(); if (firstResult) { expect(actual).toStrictEqual(firstResult); @@ -146,19 +162,18 @@ export function createSuite( done: (error: Error | null, actual?: unknown | unknown[]) => void ) => void ): void { - describe(name, readDir); + describe(name, () => { + const directory = path.join(__dirname, name); - function readDir() { - const dir = path.join(__dirname, name); + for (const name of fs.readdirSync(directory)) { + if (name.startsWith(".") || name.startsWith("_")) { + continue; + } - fs.readdirSync(dir) - .filter((file) => !file.startsWith(".") && !file.startsWith("_")) - .map((name) => path.join(dir, name)) - .map(require) - .forEach(runTest); - } + // eslint-disable-next-line @typescript-eslint/no-var-requires + const test: TestFile = require(path.join(directory, name)); - function runTest(file: TestFile) { - test(file.name, (done) => getResult(file, getCallback(file, done))); - } + it(test.name, (done) => getResult(test, getCallback(test, done))); + } + }); } diff --git a/src/__tests__/events.ts b/src/__tests__/events.ts index 82c20f5a2..d3adeb888 100644 --- a/src/__tests__/events.ts +++ b/src/__tests__/events.ts @@ -1,21 +1,25 @@ -import { Parser } from ".."; -import * as helper from "../__fixtures__/test-helper"; +import { Parser } from "../index.js"; +import * as helper from "../__fixtures__/test-helper.js"; -helper.createSuite("Events", ({ options, input }, cb) => - helper.writeToParser(helper.getEventCollector(cb), options?.parser, input) +helper.createSuite("Events", ({ options, input }, callback) => + helper.writeToParser( + helper.getEventCollector(callback), + options?.parser, + input + ) ); describe("Helper", () => { it("should handle errors", () => { - const eventCb = jest.fn(); - const parser = new Parser(helper.getEventCollector(eventCb)); + const eventCallback = jest.fn(); + const parser = new Parser(helper.getEventCollector(eventCallback)); parser.end(); parser.write("foo"); - expect(eventCb).toHaveBeenCalledTimes(2); - expect(eventCb).toHaveBeenNthCalledWith(1, null, []); - expect(eventCb).toHaveBeenLastCalledWith( + expect(eventCallback).toHaveBeenCalledTimes(2); + expect(eventCallback).toHaveBeenNthCalledWith(1, null, []); + expect(eventCallback).toHaveBeenLastCalledWith( new Error(".write() after done!") ); }); diff --git a/src/index.spec.ts b/src/index.spec.ts index c55cd3a2e..27d08bd04 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -4,7 +4,7 @@ import { createDomStream, DomHandler, DefaultHandler, -} from "."; +} from "./index.js"; import { Element } from "domhandler"; // Add an `attributes` prop to the Element for now, to make it possible for Jest to render DOM nodes. @@ -31,8 +31,8 @@ describe("Index", () => { }); test("createDomStream", (done) => { - const domStream = createDomStream((err, dom) => { - expect(err).toBeNull(); + const domStream = createDomStream((error, dom) => { + expect(error).toBeNull(); expect(dom).toMatchSnapshot(); done(); diff --git a/src/index.ts b/src/index.ts index abff02cc2..80a83fe1b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { Parser, ParserOptions } from "./Parser.js"; -export { Parser, type ParserOptions }; +export { Parser, type ParserOptions } from "./Parser.js"; import { DomHandler, @@ -9,9 +9,14 @@ import { Document, } from "domhandler"; -export { DomHandler, type DomHandlerOptions }; +export { + DomHandler, + // Old name for DomHandler + DomHandler as DefaultHandler, + type DomHandlerOptions, +} from "domhandler"; -type Options = ParserOptions & DomHandlerOptions; +export type Options = ParserOptions & DomHandlerOptions; // Helper methods @@ -47,11 +52,11 @@ export function parseDOM(data: string, options?: Options): ChildNode[] { * @param elementCb An optional callback that will be called every time a tag has been completed inside of the DOM. */ export function createDomStream( - cb: (error: Error | null, dom: ChildNode[]) => void, + callback: (error: Error | null, dom: ChildNode[]) => void, options?: Options, - elementCb?: (element: Element) => void + elementCallback?: (element: Element) => void ): Parser { - const handler = new DomHandler(cb, options, elementCb); + const handler = new DomHandler(callback, options, elementCallback); return new Parser(handler, options); } @@ -64,12 +69,13 @@ export { * All of the following exports exist for backwards-compatibility. * They should probably be removed eventually. */ -import * as ElementType from "domelementtype"; -export { ElementType }; +export * as ElementType from "domelementtype"; import { getFeed, Feed } from "domutils"; -export { getFeed }; +export { getFeed } from "domutils"; + +const parseFeedDefaultOptions = { xmlMode: true }; /** * Parse a feed. @@ -79,12 +85,9 @@ export { getFeed }; */ export function parseFeed( feed: string, - options: ParserOptions & DomHandlerOptions = { xmlMode: true } + options: Options = parseFeedDefaultOptions ): Feed | null { return getFeed(parseDOM(feed, options)); } export * as DomUtils from "domutils"; - -// Old name for DomHandler -export { DomHandler as DefaultHandler };