diff --git a/.eslintrc.json b/.eslintrc.json index 3dcf8b11e..a02e77d15 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,7 +4,5 @@ "wikimedia/server" ], "rules": { - "yml/block-sequence": "warn", - "yml/plain-scalar": "warn" } } diff --git a/.istanbul.yml b/.istanbul.yml index 96fc6c90c..1574cb44a 100644 --- a/.istanbul.yml +++ b/.istanbul.yml @@ -1,7 +1,6 @@ instrumentation: include-all-sources: true - excludes: [ - "resources/dist/*", # Compiled assets - "*.js", # Gruntfile.js and webpack.config.js - "src/index.js", # Application entry point - ] + excludes: + - "resources/dist/*" # Compiled assets + - "*.js" # Gruntfile.js and webpack.config.js + - src/index.js # Application entry point diff --git a/package-lock.json b/package-lock.json index db71d5495..cfc915738 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "bundlesize": "0.18.1", "clean-webpack-plugin": "3.0.0", "cssjanus": "1.3.1", - "eslint-config-wikimedia": "0.25.1", + "eslint-config-wikimedia": "0.26.0", "eslint-plugin-no-jquery": "2.7.0", "expose-loader": "4.1.0", "grunt-banana-checker": "0.11.1", @@ -51,6 +51,15 @@ "node": "18.17.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -1364,28 +1373,52 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.23.6", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.23.6.tgz", - "integrity": "sha512-cCtumxG+qrYORGeOkDQ58GtSt/bb2XiP9GC0x2YduoUEX2EmBQ48FtoZMUs+8wiIdTDN1izUiRUD2FDu+p+Lvg==", + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz", + "integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==", "dev": true, "dependencies": { "comment-parser": "1.3.1", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "~2.2.5" + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" }, "engines": { - "node": "^12 || ^14 || ^16 || ^17" + "node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "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-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1401,9 +1434,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1427,14 +1460,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -1455,9 +1497,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -2098,6 +2140,12 @@ "@types/node": "*" } }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, "node_modules/@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -2256,6 +2304,164 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vue/compiler-core": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.2.tgz", @@ -3219,9 +3425,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3530,6 +3736,15 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/are-we-there-yet": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", @@ -4216,6 +4431,30 @@ "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/builtins/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/bundlesize": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/bundlesize/-/bundlesize-0.18.1.tgz", @@ -4807,10 +5046,19 @@ "dev": true }, "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/clean-regexp": { "version": "1.0.0", @@ -6078,49 +6326,48 @@ } }, "node_modules/eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", - "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -6133,28 +6380,101 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-config-wikimedia": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.25.1.tgz", - "integrity": "sha512-1ppDlbwSSPuMLAIzvTXSDWNOEq3VnRu82jbc1jaG0aCjE3PpBVOEKUh0bbCk/mFVWEocUNeYIYeL9BHADq9ReA==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz", + "integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==", "dev": true, "dependencies": { - "browserslist-config-wikimedia": "^0.5.0", - "eslint": "^8.31.0", - "eslint-plugin-compat": "^4.1.4", - "eslint-plugin-es-x": "^5.2.1", - "eslint-plugin-jsdoc": "39.2.2", + "browserslist-config-wikimedia": "^0.5.1", + "eslint": "^8.53.0", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-es-x": "^7.3.0", + "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-jsdoc": "^42.0.0", "eslint-plugin-json-es": "^1.5.7", "eslint-plugin-mediawiki": "^0.5.0", - "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-mocha": "^10.2.0", + "eslint-plugin-n": "^16.0.1", "eslint-plugin-no-jquery": "^2.7.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-qunit": "^7.3.0", + "eslint-plugin-qunit": "^7.3.4", "eslint-plugin-security": "^1.7.1", - "eslint-plugin-unicorn": "^42.0.0", - "eslint-plugin-vue": "^8.7.1", + "eslint-plugin-unicorn": "^47.0.0", + "eslint-plugin-vue": "^9.18.1", "eslint-plugin-wdio": "^7.19.4", - "eslint-plugin-yml": "^0.14.0" + "eslint-plugin-yml": "^1.10.0" + } + }, + "node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-vue": { + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.0.tgz", + "integrity": "sha512-9/DV5CM7ItfgWmXjL6j3zyDtVTrslYdnEm+rnYNajdElx17b3erxi/Wc6FY7t3BQ6dgo0t/UBpgiWCOKtJyN8Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.4.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-config-wikimedia/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-config-wikimedia/node_modules/vue-eslint-parser": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.0.tgz", + "integrity": "sha512-7KsNBb6gHFA75BtneJsoK/dbZ281whUIwFYdQxA68QrCrGMXYzUMbPDHGcOQ0OocIVKrWSKWXZ4mL7tonCXoUw==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" } }, "node_modules/eslint-plugin-compat": { @@ -6194,40 +6514,67 @@ } }, "node_modules/eslint-plugin-es-x": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-5.4.0.tgz", - "integrity": "sha512-6Mniw760Nhd6brnDy+rz857LD+icZe5wXmsvXSuJ84svM0Q53ulJxpMhTJmpqHaLzYh7fuGAJ8V62ohbmqF+jA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", + "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", "dev": true, "dependencies": { - "eslint-utils": "^2.0.0 || ^3.0.0", - "regexpp": "^3.0.0" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.1.2" }, "engines": { - "node": ">=8.10.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "eslint": ">=4.19.1" + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.6.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.3.tgz", + "integrity": "sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } } }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.2.2.tgz", - "integrity": "sha512-ybkvja0p9JRzHEd2ST9h+Z47DLOuPyXpeb6r18/zKHdMmggPU1J0/zl+F0phea8ze9rMxi42MJVmGXi2NZ7PpA==", + "version": "42.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz", + "integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.23.1", + "@es-joy/jsdoccomment": "~0.37.0", + "are-docs-informative": "^0.0.2", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", - "esquery": "^1.4.0", - "semver": "^7.3.7", + "esquery": "^1.5.0", + "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" }, "engines": { - "node": "^14 || ^16 || ^17" + "node": "^14 || ^16 || ^17 || ^18 || ^19" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" @@ -6287,21 +6634,91 @@ } }, "node_modules/eslint-plugin-mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", - "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz", + "integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==", "dev": true, "dependencies": { "eslint-utils": "^3.0.0", - "ramda": "^0.27.1" + "rambda": "^7.4.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "peerDependencies": { "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-n": { + "version": "16.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", + "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-n/node_modules/type-fest": { + "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": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-no-jquery": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.7.0.tgz", @@ -6311,78 +6728,6 @@ "eslint": ">=2.3.0" } }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "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-node/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-node/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-node/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-qunit": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz", @@ -6406,34 +6751,69 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "42.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz", - "integrity": "sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg==", + "version": "47.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz", + "integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "ci-info": "^3.3.0", + "@babel/helper-validator-identifier": "^7.19.1", + "@eslint-community/eslint-utils": "^4.4.0", + "ci-info": "^3.8.0", "clean-regexp": "^1.0.0", - "eslint-utils": "^3.0.0", - "esquery": "^1.4.0", + "esquery": "^1.5.0", "indent-string": "^4.0.0", - "is-builtin-module": "^3.1.0", + "is-builtin-module": "^3.2.1", + "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.10.0", "safe-regex": "^2.1.1", - "semver": "^7.3.5", + "semver": "^7.3.8", "strip-indent": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=16" }, "funding": { "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=8.8.0" + "eslint": ">=8.38.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-plugin-unicorn/node_modules/regjsparser": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/eslint-plugin-unicorn/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/eslint-plugin-unicorn/node_modules/semver": { @@ -6496,18 +6876,19 @@ } }, "node_modules/eslint-plugin-yml": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-0.14.0.tgz", - "integrity": "sha512-+0+bBV/07txENbxfrHF9olGoLCHez64vmnOmjWOoLwmXOwfdaSRleBSPIi4nWQs7WwX8lm/fSLadOjbVEcsXQQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz", + "integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==", "dev": true, "dependencies": { "debug": "^4.3.2", + "eslint-compat-utils": "^0.1.1", "lodash": "^4.17.21", "natural-compare": "^1.4.0", - "yaml-eslint-parser": "^0.5.0" + "yaml-eslint-parser": "^1.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.17.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" @@ -6517,9 +6898,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -6527,6 +6908,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-utils": { @@ -6557,12 +6941,15 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ansi-styles": { @@ -6678,14 +7065,14 @@ } }, "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6708,9 +7095,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -7242,10 +7629,13 @@ "dev": true }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gauge": { "version": "2.7.4", @@ -7378,6 +7768,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -7628,6 +8030,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/grunt-banana-checker": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz", @@ -7770,6 +8178,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -8177,12 +8597,12 @@ } }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8957,16 +9377,6 @@ "node": ">=0.10.0" } }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9030,9 +9440,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.5.tgz", - "integrity": "sha512-2a6eRxSxp1BW040hFvaJxhsCMI9lT8QB8t14t+NY5tC5rckIR0U9cr2tjOeaFirmEOy6MHvmJnY7zTBHq431Lw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true, "engines": { "node": ">=12.0.0" @@ -10593,9 +11003,9 @@ } }, "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "dependencies": { "boolbase": "^1.0.0" @@ -10933,17 +11343,17 @@ "dev": true }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -11973,10 +12383,10 @@ "node": ">= 10" } }, - "node_modules/ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "node_modules/rambda": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", + "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", "dev": true }, "node_modules/randombytes": { @@ -12293,18 +12703,6 @@ "regexp-tree": "bin/regexp-tree" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", @@ -12478,12 +12876,12 @@ } }, "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12521,6 +12919,15 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -14019,6 +14426,27 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -14087,7 +14515,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, - "optional": true, "peer": true, "bin": { "tsc": "bin/tsc", @@ -15056,17 +15483,29 @@ } }, "node_modules/yaml-eslint-parser": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.5.0.tgz", - "integrity": "sha512-nJeyLA3YHAzhBTZbRAbu3W6xrSCucyxExmA+ZDtEdUFpGllxAZpto2Zxo2IG0r0eiuEiBM4e+wiAdxTziTq94g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz", + "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.0.0", "lodash": "^4.17.21", - "yaml": "^1.10.2" + "yaml": "^2.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yaml-eslint-parser/node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" } }, "node_modules/yargs": { @@ -15307,6 +15746,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -16202,25 +16647,40 @@ "dev": true }, "@es-joy/jsdoccomment": { - "version": "0.23.6", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.23.6.tgz", - "integrity": "sha512-cCtumxG+qrYORGeOkDQ58GtSt/bb2XiP9GC0x2YduoUEX2EmBQ48FtoZMUs+8wiIdTDN1izUiRUD2FDu+p+Lvg==", + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz", + "integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==", "dev": true, "requires": { "comment-parser": "1.3.1", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "~2.2.5" + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -16230,9 +16690,9 @@ }, "dependencies": { "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -16246,14 +16706,20 @@ } } }, + "@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true + }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" } }, @@ -16264,9 +16730,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "@istanbuljs/load-nyc-config": { @@ -16826,6 +17292,12 @@ "@types/node": "*" } }, + "@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, "@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -16981,6 +17453,107 @@ "@types/node": "*" } }, + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "@vue/compiler-core": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.2.tgz", @@ -17770,9 +18343,9 @@ "dev": true }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-globals": { @@ -18012,6 +18585,12 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true + }, "are-we-there-yet": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", @@ -18519,6 +19098,26 @@ "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" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "bundlesize": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/bundlesize/-/bundlesize-0.18.1.tgz", @@ -18953,9 +19552,9 @@ "dev": true }, "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true }, "clean-regexp": { @@ -19974,49 +20573,48 @@ } }, "eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", - "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -20092,28 +20690,77 @@ } } }, + "eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "requires": {} + }, "eslint-config-wikimedia": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.25.1.tgz", - "integrity": "sha512-1ppDlbwSSPuMLAIzvTXSDWNOEq3VnRu82jbc1jaG0aCjE3PpBVOEKUh0bbCk/mFVWEocUNeYIYeL9BHADq9ReA==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz", + "integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==", "dev": true, "requires": { - "browserslist-config-wikimedia": "^0.5.0", - "eslint": "^8.31.0", - "eslint-plugin-compat": "^4.1.4", - "eslint-plugin-es-x": "^5.2.1", - "eslint-plugin-jsdoc": "39.2.2", + "browserslist-config-wikimedia": "^0.5.1", + "eslint": "^8.53.0", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-es-x": "^7.3.0", + "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-jsdoc": "^42.0.0", "eslint-plugin-json-es": "^1.5.7", "eslint-plugin-mediawiki": "^0.5.0", - "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-mocha": "^10.2.0", + "eslint-plugin-n": "^16.0.1", "eslint-plugin-no-jquery": "^2.7.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-qunit": "^7.3.0", + "eslint-plugin-qunit": "^7.3.4", "eslint-plugin-security": "^1.7.1", - "eslint-plugin-unicorn": "^42.0.0", - "eslint-plugin-vue": "^8.7.1", + "eslint-plugin-unicorn": "^47.0.0", + "eslint-plugin-vue": "^9.18.1", "eslint-plugin-wdio": "^7.19.4", - "eslint-plugin-yml": "^0.14.0" + "eslint-plugin-yml": "^1.10.0" + }, + "dependencies": { + "eslint-plugin-vue": { + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.0.tgz", + "integrity": "sha512-9/DV5CM7ItfgWmXjL6j3zyDtVTrslYdnEm+rnYNajdElx17b3erxi/Wc6FY7t3BQ6dgo0t/UBpgiWCOKtJyN8Q==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.4.0", + "xml-name-validator": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "vue-eslint-parser": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.0.tgz", + "integrity": "sha512-7KsNBb6gHFA75BtneJsoK/dbZ281whUIwFYdQxA68QrCrGMXYzUMbPDHGcOQ0OocIVKrWSKWXZ4mL7tonCXoUw==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + } + } } }, "eslint-plugin-compat": { @@ -20143,27 +20790,38 @@ } }, "eslint-plugin-es-x": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-5.4.0.tgz", - "integrity": "sha512-6Mniw760Nhd6brnDy+rz857LD+icZe5wXmsvXSuJ84svM0Q53ulJxpMhTJmpqHaLzYh7fuGAJ8V62ohbmqF+jA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", + "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", "dev": true, "requires": { - "eslint-utils": "^2.0.0 || ^3.0.0", - "regexpp": "^3.0.0" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.1.2" + } + }, + "eslint-plugin-jest": { + "version": "27.6.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.3.tgz", + "integrity": "sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^5.10.0" } }, "eslint-plugin-jsdoc": { - "version": "39.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.2.2.tgz", - "integrity": "sha512-ybkvja0p9JRzHEd2ST9h+Z47DLOuPyXpeb6r18/zKHdMmggPU1J0/zl+F0phea8ze9rMxi42MJVmGXi2NZ7PpA==", + "version": "42.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz", + "integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.23.1", + "@es-joy/jsdoccomment": "~0.37.0", + "are-docs-informative": "^0.0.2", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", - "esquery": "^1.4.0", - "semver": "^7.3.7", + "esquery": "^1.5.0", + "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" }, "dependencies": { @@ -20205,13 +20863,58 @@ } }, "eslint-plugin-mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", - "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz", + "integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==", "dev": true, "requires": { "eslint-utils": "^3.0.0", - "ramda": "^0.27.1" + "rambda": "^7.4.0" + } + }, + "eslint-plugin-n": { + "version": "16.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", + "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "dependencies": { + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "type-fest": { + "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 + } } }, "eslint-plugin-no-jquery": { @@ -20221,53 +20924,6 @@ "dev": true, "requires": {} }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - } - }, - "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 - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, "eslint-plugin-qunit": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz", @@ -20288,27 +20944,52 @@ } }, "eslint-plugin-unicorn": { - "version": "42.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz", - "integrity": "sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg==", + "version": "47.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz", + "integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "ci-info": "^3.3.0", + "@babel/helper-validator-identifier": "^7.19.1", + "@eslint-community/eslint-utils": "^4.4.0", + "ci-info": "^3.8.0", "clean-regexp": "^1.0.0", - "eslint-utils": "^3.0.0", - "esquery": "^1.4.0", + "esquery": "^1.5.0", "indent-string": "^4.0.0", - "is-builtin-module": "^3.1.0", + "is-builtin-module": "^3.2.1", + "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.10.0", "safe-regex": "^2.1.1", - "semver": "^7.3.5", + "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 + }, + "regjsparser": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "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 + } + } + }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -20352,21 +21033,22 @@ "dev": true }, "eslint-plugin-yml": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-0.14.0.tgz", - "integrity": "sha512-+0+bBV/07txENbxfrHF9olGoLCHez64vmnOmjWOoLwmXOwfdaSRleBSPIi4nWQs7WwX8lm/fSLadOjbVEcsXQQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz", + "integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==", "dev": true, "requires": { "debug": "^4.3.2", + "eslint-compat-utils": "^0.1.1", "lodash": "^4.17.21", "natural-compare": "^1.4.0", - "yaml-eslint-parser": "^0.5.0" + "yaml-eslint-parser": "^1.2.1" } }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -20391,20 +21073,20 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -20414,9 +21096,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -20805,9 +21487,9 @@ "dev": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "gauge": { @@ -20910,6 +21592,15 @@ "pump": "^3.0.0" } }, + "get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -21120,6 +21811,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "grunt-banana-checker": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz", @@ -21220,6 +21917,15 @@ "type-fest": "^0.8.0" } }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -21515,12 +22221,12 @@ } }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "is-directory": { @@ -22084,12 +22790,6 @@ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true }, - "js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -22158,9 +22858,9 @@ } }, "jsdoc-type-pratt-parser": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.5.tgz", - "integrity": "sha512-2a6eRxSxp1BW040hFvaJxhsCMI9lT8QB8t14t+NY5tC5rckIR0U9cr2tjOeaFirmEOy6MHvmJnY7zTBHq431Lw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true }, "jsdom": { @@ -23377,9 +24077,9 @@ } }, "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { "boolbase": "^1.0.0" @@ -23638,17 +24338,17 @@ "dev": true }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "ora": { @@ -24400,10 +25100,10 @@ } } }, - "ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "rambda": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", + "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", "dev": true }, "randombytes": { @@ -24663,12 +25363,6 @@ "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 - }, "regexpu-core": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", @@ -24812,12 +25506,12 @@ } }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -24843,6 +25537,12 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true + }, "responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -25999,6 +26699,23 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -26055,7 +26772,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, - "optional": true, "peer": true }, "ua-parser-js": { @@ -26775,14 +27491,22 @@ "dev": true }, "yaml-eslint-parser": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.5.0.tgz", - "integrity": "sha512-nJeyLA3YHAzhBTZbRAbu3W6xrSCucyxExmA+ZDtEdUFpGllxAZpto2Zxo2IG0r0eiuEiBM4e+wiAdxTziTq94g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz", + "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==", "dev": true, "requires": { "eslint-visitor-keys": "^3.0.0", "lodash": "^4.17.21", - "yaml": "^1.10.2" + "yaml": "^2.0.0" + }, + "dependencies": { + "yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true + } } }, "yargs": { diff --git a/package.json b/package.json index e96c28f55..1955e0b69 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "bundlesize": "0.18.1", "clean-webpack-plugin": "3.0.0", "cssjanus": "1.3.1", - "eslint-config-wikimedia": "0.25.1", + "eslint-config-wikimedia": "0.26.0", "eslint-plugin-no-jquery": "2.7.0", "expose-loader": "4.1.0", "grunt-banana-checker": "0.11.1", diff --git a/resources/dist/index.js.map.json b/resources/dist/index.js.map.json index d35cfe2f7..a3e1b1f2b 100644 Binary files a/resources/dist/index.js.map.json and b/resources/dist/index.js.map.json differ diff --git a/src/actions.js b/src/actions.js index 5da194543..da6fb4cba 100644 --- a/src/actions.js +++ b/src/actions.js @@ -235,8 +235,8 @@ export function linkDwell( title, el, measures, gateway, generateToken, type ) { // The `enabled` flags allow to disable individual popup types while still showing the // footer link. This comes from the boot() action (called `initiallyEnabled` there) and // the preview() reducer. - // If the preview type has not been enabled, we ignore it as it cannot be disabled (currently) - // by the UI. + // If the preview type has not been enabled, we ignore it as it cannot be disabled + // (currently) by the UI. if ( isEnabled && isNewInteraction() ) { return dispatch( fetch( gateway, title, el, token, type ) ); } diff --git a/src/changeListeners/linkTitle.js b/src/changeListeners/linkTitle.js index 46133ac3d..5f1692d70 100644 --- a/src/changeListeners/linkTitle.js +++ b/src/changeListeners/linkTitle.js @@ -47,9 +47,10 @@ export default function linkTitle() { restoreTitleAttr( oldLink ); // FIXME: This will not work on anything other than 'reference' or 'preview' types as - // mw.popups.register does not register the previewType as a key in newState.preview.enabled - // This is not a problem at time of writing (November 2022) but will become a problem if we - // introduce custom preview types that must remove the title attribute. + // mw.popups.register does not register the previewType as a key in + // newState.preview.enabled + // This is not a problem at time of writing (November 2022) but will become a problem if + // we introduce custom preview types that must remove the title attribute. if ( newState.preview.enabled[ newState.preview.previewType ] ) { destroyTitleAttr( newState.preview.activeLink ); } diff --git a/src/changeListeners/settings.js b/src/changeListeners/settings.js index 627a5c0bc..0f6212f61 100644 --- a/src/changeListeners/settings.js +++ b/src/changeListeners/settings.js @@ -15,7 +15,8 @@ export default function settings( boundActions, render ) { } if ( settingsObj && - Object.keys( oldState.settings.previewTypesEnabled ).length !== Object.keys( newState.settings.previewTypesEnabled ).length + Object.keys( oldState.settings.previewTypesEnabled ).length !== + Object.keys( newState.settings.previewTypesEnabled ).length ) { // the number of settings changed so force it to be repainted. settingsObj.refresh( newState.settings.previewTypesEnabled ); diff --git a/src/changeListeners/syncUserSettings.js b/src/changeListeners/syncUserSettings.js index 2323092f9..e84f29444 100644 --- a/src/changeListeners/syncUserSettings.js +++ b/src/changeListeners/syncUserSettings.js @@ -22,7 +22,7 @@ export default function syncUserSettings( userSettings ) { return ( oldState, newState ) => { Object.keys( newState.preview.enabled ).forEach( ( key ) => { syncIfChanged( - oldState, newState, `preview.enabled.${key}`, + oldState, newState, `preview.enabled.${ key }`, ( value ) => { userSettings.storePreviewTypeEnabled( key, value ); } diff --git a/src/container.js b/src/container.js index 60b493f3c..68638584f 100644 --- a/src/container.js +++ b/src/container.js @@ -72,7 +72,7 @@ export default function createContainer() { */ get( name ) { if ( !this.has( name ) ) { - throw new Error( `The service "${name}" hasn't been defined.` ); + throw new Error( `The service "${ name }" hasn't been defined.` ); } const factory = factories[ name ]; diff --git a/src/counts.js b/src/counts.js index 98fd90705..840373a25 100644 --- a/src/counts.js +++ b/src/counts.js @@ -28,7 +28,7 @@ exports.getEditCountBucket = function getEditCountBucket( count ) { bucket = '1000+'; } - return `${bucket} edits`; + return `${ bucket } edits`; }; /** @@ -58,5 +58,5 @@ exports.getPreviewCountBucket = function getPreviewCountBucket( count ) { bucket = '21+'; } - return bucket !== undefined ? ( `${bucket} previews` ) : 'unknown'; + return bucket !== undefined ? ( `${ bucket } previews` ) : 'unknown'; }; diff --git a/src/formatter.js b/src/formatter.js index bc7ce1674..568faf0eb 100644 --- a/src/formatter.js +++ b/src/formatter.js @@ -36,12 +36,13 @@ export function formatPlainTextExtract( plainTextExtract, title ) { */ function makeTitleInExtractBold( extract, title ) { const elements = [], - boldIdentifier = ``, - snip = ``; + boldIdentifier = ``, + snip = ``; title = title.replace( /\s+/g, ' ' ).trim(); // Remove extra white spaces const escapedTitle = mw.util.escapeRegExp( title ); - const regExp = new RegExp( `(^|\\s)(${escapedTitle})(|$)`, 'i' ); + // eslint-disable-next-line security/detect-non-literal-regexp + const regExp = new RegExp( `(^|\\s)(${ escapedTitle })(|$)`, 'i' ); // Remove text in parentheses along with the parentheses extract = extract.replace( /\s+/, ' ' ); // Remove extra white spaces @@ -51,7 +52,7 @@ function makeTitleInExtractBold( extract, title ) { // Also, the title is escaped of RegExp elements thus can't have "*" extract = extract.replace( regExp, - `$1${snip}${boldIdentifier}$2${snip}$3` + `$1${ snip }${ boldIdentifier }$2${ snip }$3` ); extract = extract.split( snip ); diff --git a/src/gateway/reference.js b/src/gateway/reference.js index 51f79a768..5fba69a79 100644 --- a/src/gateway/reference.js +++ b/src/gateway/reference.js @@ -15,14 +15,14 @@ export default function createReferenceGateway() { * @return {HTMLElement} */ function scrapeReferenceText( id ) { - const idSelector = `#${CSS.escape( id )}`; + const idSelector = `#${ CSS.escape( id ) }`; /** * Same alternative selectors with and without mw-… as in the RESTbased endpoint. * * @see https://phabricator.wikimedia.org/diffusion/GMOA/browse/master/lib/transformations/references/structureReferenceListContent.js$138 */ - return document.querySelector( `${idSelector} .mw-reference-text, ${idSelector} .reference-text` ); + return document.querySelector( `${ idSelector } .mw-reference-text, ${ idSelector } .reference-text` ); } /** @@ -75,7 +75,7 @@ export default function createReferenceGateway() { } const model = { - url: `#${id}`, + url: `#${ id }`, extract: referenceNode.innerHTML, type: previewTypes.TYPE_REFERENCE, referenceType: scrapeReferenceType( referenceNode ), diff --git a/src/gateway/rest.js b/src/gateway/rest.js index 2353efcbd..0d309e656 100644 --- a/src/gateway/rest.js +++ b/src/gateway/rest.js @@ -41,7 +41,7 @@ export default function createRESTBaseGateway( ajax, config, extractParser ) { return ajax( { url: endpoint + encodeURIComponent( title ), headers: { - Accept: `application/json; charset=utf-8; profile="${RESTBASE_PROFILE}"`, + Accept: `application/json; charset=utf-8; profile="${ RESTBASE_PROFILE }"`, 'Accept-Language': config.acceptLanguage } } ); @@ -156,7 +156,7 @@ function generateThumbnailData( thumbnail, original, thumbSize ) { return originalIsSafe && original; } - parts[ parts.length - 1 ] = `${width}px-${filename}`; + parts[ parts.length - 1 ] = `${ width }px-${ filename }`; return { source: parts.join( '/' ), diff --git a/src/index.js b/src/index.js index 4a6cf527d..0f0b1a917 100644 --- a/src/index.js +++ b/src/index.js @@ -154,7 +154,7 @@ function handleDOMEventIfEligible( handler ) { // If the closest method is not defined, let's return early and // understand this better by logging an error. (T340081) if ( target && !target.closest ) { - const err = new Error( `T340081: Unexpected DOM element ${target.tagName} with nodeType ${target.nodeType}` ); + const err = new Error( `T340081: Unexpected DOM element ${ target.tagName } with nodeType ${ target.nodeType }` ); mw.errorLogger.logError( err, 'error.web-team' ); return; } @@ -245,7 +245,7 @@ function handleDOMEventIfEligible( handler ) { // Register default preview type mw.popups.register( { type: previewTypes.TYPE_PAGE, - selector: `#mw-content-text a[href][title]:not(${excludedLinksSelector})`, + selector: `#mw-content-text a[href][title]:not(${ excludedLinksSelector })`, delay: FETCH_COMPLETE_TARGET_DELAY - FETCH_START_DELAY, gateway: pagePreviewGateway, renderFn: createPagePreview, diff --git a/src/integrations/mwpopups.js b/src/integrations/mwpopups.js index 034b14fa3..6fc5318ae 100644 --- a/src/integrations/mwpopups.js +++ b/src/integrations/mwpopups.js @@ -9,7 +9,7 @@ import { previewTypes } from '../preview/model'; * @return {boolean} whether the preview type supports being disabled/enabled. */ function canShowSettingForPreviewType( type ) { - return mw.message( `popups-settings-option-${type}` ).exists(); + return mw.message( `popups-settings-option-${ type }` ).exists(); } /** @@ -19,7 +19,8 @@ function canShowSettingForPreviewType( type ) { * @param {Redux.Store} store Popups store * @param {Function} registerModel allows extensions to register custom preview handlers. * @param {Function} registerPreviewUI allows extensions to register custom preview renderers. - * @param {Function} registerGatewayForPreviewType allows extensions to register gateways for preview types. + * @param {Function} registerGatewayForPreviewType allows extensions to register gateways for + * preview types. * @param {Function} registerSetting * @param {UserSettings} userSettings * @return {Object} external Popups interface @@ -40,16 +41,19 @@ export default function createMwPopups( store, registerModel, registerPreviewUI, * * @typedef {Object} PopupSubtype * @property {string} type A unique string for identifying the subtype of a page preview - * @property {function(ext.popups.PreviewModel): ext.popups.Preview}[renderFn] How the custom preview type will render the preview. - * If not provided default renderer is used. + * @property {function(ext.popups.PreviewModel): ext.popups.Preview}[renderFn] How the + * custom preview type will render the preview. If not provided default renderer is used. * * @typedef {Object} PopupModule * @property {string} type A unique string for identifying the type of page preview - * @property {string} selector A CSS selector which identifies elements that will display this type of page preview + * @property {string} selector A CSS selector which identifies elements that will display + * this type of page preview * @property {Gateway} gateway A Gateway for obtaining the preview data. - * @property {function(ext.popups.PreviewModel): ext.popups.Preview}[renderFn] How the custom preview type will render the preview. + * @property {function(ext.popups.PreviewModel): ext.popups.Preview}[renderFn] How the + * custom preview type will render the preview. * If not provided default renderer is used. - * @property {PopupSubtype[]} subTypes this is for registering types that are subsets of the current type e.g. share the same selector. + * @property {PopupSubtype[]} subTypes this is for registering types that are subsets of + * the current type e.g. share the same selector. * @property {number} [delay] optional delay between hovering and displaying preview. * If not defined, delay will be zero. */ @@ -75,7 +79,7 @@ export default function createMwPopups( store, registerModel, registerPreviewUI, doNotRequireSummary } = module; if ( !type || !selector || !gateway ) { throw new Error( - `Registration of Popups custom preview type "${type}" failed: You must specify a type, a selector, and a gateway.` + `Registration of Popups custom preview type "${ type }" failed: You must specify a type, a selector, and a gateway.` ); } registerModel( type, selector, delay ); @@ -86,13 +90,17 @@ export default function createMwPopups( store, registerModel, registerPreviewUI, registerSetting( type, userSettings.isPreviewTypeEnabled( type ) ); } else { mw.log.warn( - `[Popups] No setting for ${type} registered. -Please create message with key "popups-settings-option-${type}" if this is a mistake.` + `[Popups] No setting for ${ type } registered. +Please create message with key "popups-settings-option-${ type }" if this is a mistake.` ); } if ( subTypes ) { subTypes.forEach( function ( subTypePreview ) { - registerPreviewUI( subTypePreview.type, subTypePreview.renderFn, subTypePreview.doNotRequireSummary ); + registerPreviewUI( + subTypePreview.type, + subTypePreview.renderFn, + subTypePreview.doNotRequireSummary + ); } ); } // Run initialization function if provided. diff --git a/src/preview/model.js b/src/preview/model.js index 50da7b863..72c36f0c1 100644 --- a/src/preview/model.js +++ b/src/preview/model.js @@ -144,7 +144,9 @@ const registeredPreviewTypes = []; * @return {string|null} One of the previewTypes.TYPE_… constants */ export function getPreviewType( el ) { - const candidates = registeredPreviewTypes.filter( ( type ) => elementMatchesSelector( el, type.selector ) ); + const candidates = registeredPreviewTypes.filter( + ( type ) => elementMatchesSelector( el, type.selector ) + ); // If the filter returned some possibilities, use the last registered one. if ( candidates.length > 0 ) { diff --git a/src/title.js b/src/title.js index aba4a24e4..d20fe9d85 100644 --- a/src/title.js +++ b/src/title.js @@ -44,6 +44,7 @@ export function getTitle( href, config ) { // No query params (pretty URL) if ( !queryLength ) { const pattern = mw.util.escapeRegExp( config.get( 'wgArticlePath' ) ).replace( '\\$1', '([^?#]+)' ), + // eslint-disable-next-line security/detect-non-literal-regexp matches = new RegExp( pattern ).exec( linkHref.path ); // We can't be sure decodeURIComponent() is able to parse every possible match @@ -57,7 +58,7 @@ export function getTitle( href, config ) { title = linkHref.query.title; } - return title ? `${title}${linkHref.fragment ? `#${linkHref.fragment}` : ''}` : undefined; + return title ? `${ title }${ linkHref.fragment ? `#${ linkHref.fragment }` : '' }` : undefined; } /** diff --git a/src/ui/renderer.js b/src/ui/renderer.js index 48ff1e93d..8d7c9b587 100644 --- a/src/ui/renderer.js +++ b/src/ui/renderer.js @@ -182,7 +182,7 @@ function supportsCSSClipPath() { return window.CSS && typeof CSS.supports === 'function' && CSS.supports( 'clip-path', 'polygon(1px 1px)' ); - /* eslint-enable compat/compat */ + } /** @@ -547,7 +547,7 @@ export function layoutPreview( thumbnail.height < predefinedLandscapeImageHeight && !supportsCSSClipPath() ) { const popupExtract = popup.querySelector( '.mwe-popups-extract' ); - popupExtract.style.marginTop = `${( thumbnail.height - pointerSpaceSize )}px`; + popupExtract.style.marginTop = `${ ( thumbnail.height - pointerSpaceSize ) }px`; } // The following classes are used here: @@ -562,9 +562,9 @@ export function layoutPreview( // * mwe-popups-no-image-pointer popup.classList.add.apply( popup.classList, classes ); - popup.style.left = `${layout.offset.left}px`; - popup.style.top = flippedY ? 'auto' : `${layout.offset.top}px`; - popup.style.bottom = flippedY ? `${windowHeight - layout.offset.top}px` : 'auto'; + popup.style.left = `${ layout.offset.left }px`; + popup.style.top = flippedY ? 'auto' : `${ layout.offset.top }px`; + popup.style.bottom = flippedY ? `${ windowHeight - layout.offset.top }px` : 'auto'; if ( hasThumbnail && !supportsCSSClipPath() ) { setThumbnailClipPath( preview, layout ); @@ -610,11 +610,11 @@ export function setThumbnailClipPath( const mask = document.getElementById( maskID ); mask.setAttribute( 'transform', - `matrix(${matrix.scaleX} 0 0 1 ${matrix.translateX} 0)` + `matrix(${ matrix.scaleX } 0 0 1 ${ matrix.translateX } 0)` ); el.querySelector( 'image' ) - .setAttribute( 'clip-path', `url(#${maskID})` ); + .setAttribute( 'clip-path', `url(#${ maskID })` ); } } diff --git a/src/ui/settingsDialog.js b/src/ui/settingsDialog.js index 61b15f6e8..fb5524b0b 100644 --- a/src/ui/settingsDialog.js +++ b/src/ui/settingsDialog.js @@ -17,11 +17,11 @@ export function createSettingsDialog( previewTypesEnabled ) { // This can produce: // * popups-settings-option-preview // * popups-settings-option-reference - name: mw.msg( `popups-settings-option-${id}` ), + name: mw.msg( `popups-settings-option-${ id }` ), // This can produce: // * popups-settings-option-preview-description // * popups-settings-option-reference-description - description: mw.msg( `popups-settings-option-${id}-description` ), + description: mw.msg( `popups-settings-option-${ id }-description` ), isChecked: previewTypesEnabled[ id ] } ) ); diff --git a/src/ui/settingsDialogRenderer.js b/src/ui/settingsDialogRenderer.js index 197baaff2..7c4effa27 100644 --- a/src/ui/settingsDialogRenderer.js +++ b/src/ui/settingsDialogRenderer.js @@ -120,7 +120,7 @@ export default function createSettingsDialogRenderer() { */ setEnabled( enabled ) { Object.keys( enabled ).forEach( ( type ) => { - const node = dialog.querySelector( `#mwe-popups-settings-${type}` ); + const node = dialog.querySelector( `#mwe-popups-settings-${ type }` ); if ( node ) { node.checked = enabled[ type ]; } diff --git a/src/ui/templates/pagePreview/pagePreview.js b/src/ui/templates/pagePreview/pagePreview.js index cd39f51ce..fc12ff67e 100644 --- a/src/ui/templates/pagePreview/pagePreview.js +++ b/src/ui/templates/pagePreview/pagePreview.js @@ -78,5 +78,5 @@ export { defaultExtractWidth }; // for testing * used for the extract */ export function getExtractWidth( thumbnail ) { - return thumbnail && thumbnail.isNarrow ? `${defaultExtractWidth + thumbnail.offset}px` : ''; + return thumbnail && thumbnail.isNarrow ? `${ defaultExtractWidth + thumbnail.offset }px` : ''; } diff --git a/src/ui/templates/popup/popup.js b/src/ui/templates/popup/popup.js index 1ea1d65c7..2999a0558 100644 --- a/src/ui/templates/popup/popup.js +++ b/src/ui/templates/popup/popup.js @@ -20,7 +20,7 @@ export function renderPopup( type, container ) { // * mwe-popups-type-unknown // * mwe-popups-type-generic // * mwe-popups-type-disambiguation - element.className = `mwe-popups mwe-popups-type-${type}`; + element.className = `mwe-popups mwe-popups-type-${ type }`; container.className = 'mwe-popups-container'; element.appendChild( container ); return element; diff --git a/src/ui/templates/preview/preview.js b/src/ui/templates/preview/preview.js index cb89b53b8..4d953ed1e 100644 --- a/src/ui/templates/preview/preview.js +++ b/src/ui/templates/preview/preview.js @@ -38,7 +38,7 @@ export function renderPreview( // * popups-icon--preview-unknown // * popups-icon--preview-generic // * popups-icon--preview-disambiguation - popup.querySelector( '.popups-icon' ).classList.add( `popups-icon--preview-${model.type}` ); + popup.querySelector( '.popups-icon' ).classList.add( `popups-icon--preview-${ model.type }` ); popup.querySelector( '.mwe-popups-extract' ).setAttribute( 'href', model.url ); const messageElement = popup.querySelector( '.mwe-popups-message' ); if ( message ) { diff --git a/src/ui/templates/referencePreview/referencePreview.js b/src/ui/templates/referencePreview/referencePreview.js index 54ed631fe..15af80eef 100644 --- a/src/ui/templates/referencePreview/referencePreview.js +++ b/src/ui/templates/referencePreview/referencePreview.js @@ -49,7 +49,7 @@ export function renderReferencePreview( // * popups-refpreview-news // * popups-refpreview-note // * popups-refpreview-web - let titleMsg = mw.message( `popups-refpreview-${type}` ); + let titleMsg = mw.message( `popups-refpreview-${ type }` ); if ( !titleMsg.exists() ) { titleMsg = mw.message( 'popups-refpreview-reference' ); } @@ -64,7 +64,7 @@ export function renderReferencePreview( // * popups-icon--reference-note // * popups-icon--reference-web el.querySelector( '.mwe-popups-title .popups-icon' ) - .classList.add( `popups-icon--reference-${type}` ); + .classList.add( `popups-icon--reference-${ type }` ); el.querySelector( '.mw-parser-output' ) .innerHTML = model.extract; @@ -74,7 +74,7 @@ export function renderReferencePreview( ( a ) => { a.target = '_blank'; // Don't let the external site access and possibly manipulate window.opener.location - a.rel = `${a.rel ? `${a.rel} ` : ''}noopener`; + a.rel = `${ a.rel ? `${ a.rel } ` : '' }noopener`; } ); @@ -160,8 +160,8 @@ export function renderReferencePreview( hasVerticalScroll = element.scrollHeight > element.clientHeight, scrollbarWidth = element.offsetWidth - element.clientWidth; const fade = extract.querySelector( '.mwe-popups-fade' ); - fade.style.bottom = hasHorizontalScroll ? `${scrollbarHeight}px` : 0; - fade.style.right = hasVerticalScroll ? `${scrollbarWidth}px` : 0; + fade.style.bottom = hasHorizontalScroll ? `${ scrollbarHeight }px` : 0; + fade.style.right = hasVerticalScroll ? `${ scrollbarWidth }px` : 0; element.isScrolling = !scrolledToBottom; extract.classList.toggle( 'mwe-popups-fade-out', element.isScrolling ); diff --git a/src/ui/templates/settingsDialog/settingsDialog.js b/src/ui/templates/settingsDialog/settingsDialog.js index b72880a60..522cb6807 100644 --- a/src/ui/templates/settingsDialog/settingsDialog.js +++ b/src/ui/templates/settingsDialog/settingsDialog.js @@ -60,36 +60,36 @@ export function renderSettingsDialog( model ) {
-

${heading}

+

${ heading }

- - + +
- ${choices.map( ( { id, name, description, isChecked } ) => ` + ${ choices.map( ( { id, name, description, isChecked } ) => `

  -

` ).join( '' )} +

` ).join( '' ) }
`.trim(); diff --git a/src/ui/thumbnail.js b/src/ui/thumbnail.js index e007c8158..52b2837bf 100644 --- a/src/ui/thumbnail.js +++ b/src/ui/thumbnail.js @@ -130,7 +130,7 @@ function createThumbnailImg( url ) { * Sets multiple attributes on a node. * * @param {HTMLElement} node - * @param {Record} attrs + * @param {Record} attrs */ const addAttributes = ( node, attrs ) => { Object.keys( attrs ).forEach( ( key ) => { diff --git a/src/userSettings.js b/src/userSettings.js index 232689395..6f2ce3639 100644 --- a/src/userSettings.js +++ b/src/userSettings.js @@ -41,9 +41,11 @@ export default function createUserSettings( storage ) { * * @method * @param {string} previewType + * + * @return {boolean} */ isPreviewTypeEnabled( previewType ) { - const storageKey = `mwe-popups-${previewType}-enabled`; + const storageKey = `mwe-popups-${ previewType }-enabled`; const value = storage.get( storageKey ); return value === null; }, @@ -63,7 +65,7 @@ export default function createUserSettings( storage ) { action: enabled ? 'anonymousEnabled' : 'anonymousDisabled' } ); } - const storageKey = `mwe-popups-${previewType}-enabled`; + const storageKey = `mwe-popups-${ previewType }-enabled`; if ( enabled ) { storage.remove( storageKey ); } else { diff --git a/tests/node-qunit/.eslintrc.json b/tests/node-qunit/.eslintrc.json index a25072259..a5be9bf08 100644 --- a/tests/node-qunit/.eslintrc.json +++ b/tests/node-qunit/.eslintrc.json @@ -6,9 +6,6 @@ ], "rules": { "no-jquery/no-class-state": "off", - "no-jquery/no-deferred": "warn", - "no-jquery/no-when": "warn", - "no-jquery/no-extend": "warn", "es-x/no-hashbang": "warn" } } diff --git a/tests/node-qunit/changeListeners/footerLink.test.js b/tests/node-qunit/changeListeners/footerLink.test.js index 884497573..28f1b1d87 100644 --- a/tests/node-qunit/changeListeners/footerLink.test.js +++ b/tests/node-qunit/changeListeners/footerLink.test.js @@ -9,7 +9,9 @@ QUnit.module( 'ext.popups/changeListeners/footerLink @integration', { // Stub internal usage of mw.message mw.message = ( str ) => ( { - text() { return str; } + text() { + return str; + } } ); boundActions.showSettings = this.showSettingsSpy = this.sandbox.spy(); diff --git a/tests/node-qunit/changeListeners/pageviews.test.js b/tests/node-qunit/changeListeners/pageviews.test.js index 5e0d2507d..b64d397e1 100644 --- a/tests/node-qunit/changeListeners/pageviews.test.js +++ b/tests/node-qunit/changeListeners/pageviews.test.js @@ -34,7 +34,9 @@ QUnit.module( 'ext.popups/pageviews', { // Stub internal usage of mw.Title.newFromText mw.Title.newFromText = ( str ) => { return { - getPrefixedDb: () => { return str; } + getPrefixedDb: () => { + return str; + } }; }; } @@ -67,7 +69,7 @@ QUnit.test( 'it should log the queued event', function ( assert ) { } ); QUnit.test( 'it should not log something that is not a pageview', function ( assert ) { - const noPageviewState = $.extend( {}, newState ); + const noPageviewState = Object.assign( {}, newState ); delete noPageviewState.pageviews.pageview; this.changeListener( undefined, newState ); diff --git a/tests/node-qunit/container.test.js b/tests/node-qunit/container.test.js index b43d24798..9e549e1d4 100644 --- a/tests/node-qunit/container.test.js +++ b/tests/node-qunit/container.test.js @@ -39,7 +39,9 @@ QUnit.test( '#get', function ( assert ) { // --- assert.throws( - () => { this.container.get( 'bar' ); }, + () => { + this.container.get( 'bar' ); + }, /The service "bar" hasn't been defined./, 'The container throws an error when no factory exists.' ); diff --git a/tests/node-qunit/counts.test.js b/tests/node-qunit/counts.test.js index b575c7f1c..a8e0c31ea 100644 --- a/tests/node-qunit/counts.test.js +++ b/tests/node-qunit/counts.test.js @@ -26,7 +26,7 @@ QUnit.test( '#getEditCountBucket', ( assert ) => { assert.strictEqual( bucket, cases[ i ][ 1 ], - `Edit count bucket is "${bucket}" when edit count is ${count}.` + `Edit count bucket is "${ bucket }" when edit count is ${ count }.` ); } } ); @@ -57,7 +57,7 @@ QUnit.test( '#getPreviewCountBucket', ( assert ) => { assert.strictEqual( bucket, cases[ i ][ 1 ], - `Preview count bucket is "${bucket}" when preview count is ${count}.` + `Preview count bucket is "${ bucket }" when preview count is ${ count }.` ); } } ); diff --git a/tests/node-qunit/gateway/mediawiki.test.js b/tests/node-qunit/gateway/mediawiki.test.js index ff4136145..d70ed7994 100644 --- a/tests/node-qunit/gateway/mediawiki.test.js +++ b/tests/node-qunit/gateway/mediawiki.test.js @@ -65,7 +65,7 @@ QUnit.module( 'ext.popups/gateway/mediawiki', { } ); QUnit.test( 'MediaWiki API gateway is called with correct arguments', function ( assert ) { - const config = $.extend( {}, DEFAULT_CONSTANTS, { + const config = Object.assign( {}, DEFAULT_CONSTANTS, { acceptLanguage: 'pl' } ); const spy = this.sandbox.spy(), @@ -136,8 +136,10 @@ QUnit.test( 'MediaWiki API gateway is correctly extracting the page data from th errorCases.forEach( ( data, i ) => { assert.throws( - () => { gateway.extractPageFromResponse( data ); }, - `Case ${i}: the gateway throws an error.` + () => { + gateway.extractPageFromResponse( data ); + }, + `Case ${ i }: the gateway throws an error.` ); } ); @@ -145,7 +147,7 @@ QUnit.test( 'MediaWiki API gateway is correctly extracting the page data from th assert.deepEqual( gateway.extractPageFromResponse( data[ 0 ] ), data[ 1 ], - `Case ${i}: the gateway extracts the response.` + `Case ${ i }: the gateway extracts the response.` ); } ); } ); @@ -237,7 +239,9 @@ QUnit.test( 'MediaWiki API gateway is abortable', function ( assert ) { deferred = $.Deferred(), api = { get: this.sandbox.stub().returns( - deferred.promise( { abort() { deferred.reject( 'http' ); } } ) + deferred.promise( { abort() { + deferred.reject( 'http' ); + } } ) ) }, gateway = createMediaWikiApiGateway( api, DEFAULT_CONSTANTS ); diff --git a/tests/node-qunit/gateway/reference.test.js b/tests/node-qunit/gateway/reference.test.js index 78d6f531e..c6af93a2e 100644 --- a/tests/node-qunit/gateway/reference.test.js +++ b/tests/node-qunit/gateway/reference.test.js @@ -6,9 +6,9 @@ QUnit.module( 'ext.popups/gateway/reference', { global.CSS = { escape: ( str ) => $.escapeSelector( str ) }; - mw.msg = ( key ) => `<${key}>`; + mw.msg = ( key ) => `<${ key }>`; mw.message = ( key ) => { - return { exists: () => !key.endsWith( 'generic' ), text: () => `<${key}>` }; + return { exists: () => !key.endsWith( 'generic' ), text: () => `<${ key }>` }; }; this.$sourceElement = $( '' ).appendTo( diff --git a/tests/node-qunit/gateway/rest.test.js b/tests/node-qunit/gateway/rest.test.js index 2f984118b..6636c7fd0 100644 --- a/tests/node-qunit/gateway/rest.test.js +++ b/tests/node-qunit/gateway/rest.test.js @@ -170,13 +170,13 @@ const DEFAULT_CONSTANTS = { ); function provideParsedExtract( page ) { - return `!${page.extract}!`; + return `!${ page.extract }!`; } QUnit.module( 'gateway/rest', { beforeEach() { mw.Title = function ( title ) { - this.getUrl = () => `url/${title}`; + this.getUrl = () => `url/${ title }`; }; }, afterEach() { @@ -185,7 +185,7 @@ QUnit.module( 'gateway/rest', { } ); QUnit.test( 'RESTBase gateway is called with correct arguments', function ( assert ) { - const config = $.extend( {}, DEFAULT_CONSTANTS, { + const config = Object.assign( {}, DEFAULT_CONSTANTS, { acceptLanguage: 'pl' } ); diff --git a/tests/node-qunit/previewBehavior.test.js b/tests/node-qunit/previewBehavior.test.js index 5548c6e6a..a5905f431 100644 --- a/tests/node-qunit/previewBehavior.test.js +++ b/tests/node-qunit/previewBehavior.test.js @@ -5,7 +5,9 @@ QUnit.module( 'ext.popups.preview.settingsBehavior', { beforeEach() { function newFromText( title ) { return { - getUrl() { return `url/${title}`; } + getUrl() { + return `url/${ title }`; + } }; } diff --git a/tests/node-qunit/run.js b/tests/node-qunit/run.js index f02a30a7a..8941648b8 100755 --- a/tests/node-qunit/run.js +++ b/tests/node-qunit/run.js @@ -16,6 +16,7 @@ require( '@babel/register' )( { } ); require.extensions[ '.svg' ] = ( module, filename ) => { + // eslint-disable-next-line security/detect-non-literal-fs-filename const svg = fs.readFileSync( filename, { encoding: 'utf8' } ); // eslint-disable-next-line no-underscore-dangle module._compile( svgInlineLoader( svg ), filename ); diff --git a/tests/node-qunit/stubs.js b/tests/node-qunit/stubs.js index f243f35a2..21c1ac3ea 100644 --- a/tests/node-qunit/stubs.js +++ b/tests/node-qunit/stubs.js @@ -72,7 +72,7 @@ export function createStubTitle( namespace, name, fragment = null ) { return { namespace, getPrefixedDb() { - return ( namespace ? `Namespace ${namespace}:` : '' ) + name; + return ( namespace ? `Namespace ${ namespace }:` : '' ) + name; }, getMainText() { return name; @@ -81,7 +81,7 @@ export function createStubTitle( namespace, name, fragment = null ) { return namespace; }, getUrl() { - return `/wiki/${this.getPrefixedDb()}`; + return `/wiki/${ this.getPrefixedDb() }`; }, getFragment() { return fragment; diff --git a/tests/node-qunit/ui/renderer.test.js b/tests/node-qunit/ui/renderer.test.js index e769f3f1d..69111e2ba 100644 --- a/tests/node-qunit/ui/renderer.test.js +++ b/tests/node-qunit/ui/renderer.test.js @@ -41,9 +41,9 @@ QUnit.module( 'ext.popups#renderer', { beforeEach() { this.sandbox.stub( constants.default, 'BRACKETED_DEVICE_PIXEL_RATIO' ).value( 1 ); - mw.msg = ( key ) => `<${key}>`; + mw.msg = ( key ) => `<${ key }>`; mw.message = ( key ) => { - return { exists: () => !key.endsWith( 'generic' ), text: () => `<${key}>` }; + return { exists: () => !key.endsWith( 'generic' ), text: () => `<${ key }>` }; }; mw.html = { @@ -77,7 +77,7 @@ QUnit.test( 'getExtractWidth', ( assert ) => { ], [ { isNarrow: true, offset: 10 - }, `${pagePreview.defaultExtractWidth + 10}px` ], + }, `${ pagePreview.defaultExtractWidth + 10 }px` ], [ { // Fall back to css stylesheet for non-narrow thumbs. isNarrow: false, offset: 100 @@ -88,7 +88,7 @@ QUnit.test( 'getExtractWidth', ( assert ) => { assert.strictEqual( pagePreview.getExtractWidth( case_[ 0 ] ), case_[ 1 ], - `Case ${i}: the expected extract width matches.` + `Case ${ i }: the expected extract width matches.` ); } ); } ); @@ -106,9 +106,9 @@ QUnit.test( 'createPointerMasks', ( assert ) => { cases.forEach( ( case_, i ) => { assert.strictEqual( - $container.find( `${case_[ 0 ]} path` ).attr( 'd' ), + $container.find( `${ case_[ 0 ] } path` ).attr( 'd' ), case_[ 1 ], - `Case ${i}: the SVG's polygons match.` + `Case ${ i }: the SVG's polygons match.` ); } ); } ); @@ -637,7 +637,7 @@ QUnit.test( '#createLayout - portrait preview, mouse event, link is on the top l flippedY: false, dir }, - `Case ${i}: the layout is correct.` + `Case ${ i }: the layout is correct.` ); } ); } ); @@ -685,7 +685,7 @@ QUnit.test( '#createLayout - tall preview, mouse event, link is on the bottom ce flippedY: true, dir }, - `Case ${i}: the layout is correct. Y is flipped.` + `Case ${ i }: the layout is correct. Y is flipped.` ); } ); } ); @@ -730,7 +730,7 @@ QUnit.test( '#createLayout - empty preview, keyboard event, link is on the cente flippedY: true, dir }, - `Case ${i}: the layout is correct. Both X and Y are flipped.` + `Case ${ i }: the layout is correct. Both X and Y are flipped.` ); } ); } ); @@ -778,7 +778,7 @@ QUnit.test( '#createLayout - empty preview, mouse event, popup pointer is in the flippedY: false, dir }, - `Case ${i}: the layout is correct.` + `Case ${ i }: the layout is correct.` ); } ); } ); @@ -1045,12 +1045,12 @@ QUnit.test( '#layoutPreview - no thumbnail', ( assert ) => { assert.strictEqual( $( preview.el ).css( 'top' ), - `${layout.offset.top}px`, + `${ layout.offset.top }px`, 'Top is correct.' ); assert.strictEqual( $( preview.el ).css( 'left' ), - `${layout.offset.left}px`, + `${ layout.offset.left }px`, 'Left is correct.' ); } ); @@ -1080,12 +1080,12 @@ QUnit.test( '#layoutPreview - tall preview, flipped X, has thumbnail', function ); assert.strictEqual( $( preview.el ).css( 'top' ), - `${layout.offset.top}px`, + `${ layout.offset.top }px`, 'Top is correct.' ); assert.strictEqual( $( preview.el ).css( 'left' ), - `${layout.offset.left}px`, + `${ layout.offset.left }px`, 'Left is correct.' ); assert.false( @@ -1124,17 +1124,17 @@ QUnit.test( '#layoutPreview - portrait preview, flipped X, has thumbnail, small ); assert.strictEqual( $( preview.el ).css( 'top' ), - `${layout.offset.top}px`, + `${ layout.offset.top }px`, 'Top is correct.' ); assert.strictEqual( $( preview.el ).css( 'left' ), - `${layout.offset.left}px`, + `${ layout.offset.left }px`, 'Left is correct.' ); assert.strictEqual( $( preview.el ).find( '.mwe-popups-extract' ).css( 'margin-top' ), - `${199 - 8}px`, // thumb height - pointer size + `${ 199 - 8 }px`, // thumb height - pointer size 'Extract margin top has been set when preview height is smaller than the predefined landscape image height.' ); assert.strictEqual( @@ -1169,12 +1169,12 @@ QUnit.test( '#layoutPreview - portrait preview, flipped X, has thumbnail, big he ); assert.strictEqual( $( preview.el ).css( 'top' ), - `${layout.offset.top}px`, + `${ layout.offset.top }px`, 'Top is correct.' ); assert.strictEqual( $( preview.el ).css( 'left' ), - `${layout.offset.left}px`, + `${ layout.offset.left }px`, 'Left is correct.' ); assert.strictEqual( @@ -1329,13 +1329,13 @@ QUnit.test( '#layoutPreview - tall preview, has thumbnail, flipped Y', ( assert assert.strictEqual( $( preview.el ).css( 'bottom' ), - `${windowHeight - layout.offset.top}px`, + `${ windowHeight - layout.offset.top }px`, 'Bottom is correct.' ); assert.strictEqual( $( preview.el ).css( 'left' ), - `${layout.offset.left}px`, + `${ layout.offset.left }px`, 'Left is correct.' ); assert.strictEqual( @@ -1370,12 +1370,12 @@ QUnit.test( '#layoutPreview - tall preview, has thumbnail, flipped X and Y', fun ); assert.strictEqual( $( preview.el ).css( 'left' ), - `${layout.offset.left}px`, + `${ layout.offset.left }px`, 'Left is correct.' ); assert.strictEqual( $( preview.el ).css( 'bottom' ), - `${windowHeight - layout.offset.top}px`, + `${ windowHeight - layout.offset.top }px`, 'Bottom is correct.' ); assert.strictEqual( @@ -1406,12 +1406,12 @@ QUnit.test( '#layoutPreview - portrait preview, has thumbnail, flipped X and Y', ); assert.strictEqual( $( preview.el ).css( 'left' ), - `${layout.offset.left}px`, + `${ layout.offset.left }px`, 'Left is correct.' ); assert.strictEqual( $( preview.el ).css( 'bottom' ), - `${windowHeight - layout.offset.top}px`, + `${ windowHeight - layout.offset.top }px`, 'Bottom is correct.' ); assert.strictEqual( @@ -1458,7 +1458,7 @@ QUnit.test( '#setThumbnailClipPath', function ( assert ) { assert.strictEqual( clipPath.getAttribute( 'transform' ), expected, - `Transform is correct for: { isTall: ${isTall}, dir: ${dir} }.` + `Transform is correct for: { isTall: ${ isTall }, dir: ${ dir } }.` ); } ); } ); @@ -1478,7 +1478,7 @@ QUnit.test( '#getThumbnailClipPathID', ( assert ) => { assert.strictEqual( renderer.getThumbnailClipPathID( isTall, flippedY, flippedX ), expected, - `Correct element ID is returned for: { flippedY: ${flippedY}, flippedX: ${flippedX}, isTall: ${isTall} }.` + `Correct element ID is returned for: { flippedY: ${ flippedY }, flippedX: ${ flippedX }, isTall: ${ isTall } }.` ); } ); } ); diff --git a/tests/node-qunit/ui/thumbnail.test.js b/tests/node-qunit/ui/thumbnail.test.js index 7f96a7eb2..9850fdc83 100644 --- a/tests/node-qunit/ui/thumbnail.test.js +++ b/tests/node-qunit/ui/thumbnail.test.js @@ -88,42 +88,42 @@ QUnit.test( 'createThumbnail - tall image element', ( assert ) => { assert.strictEqual( +$( thumbnail.el ).find( 'image' ).attr( 'x' ), case_.expectedX, - `Image element x coordinate is correct. ${case_.message}` + `Image element x coordinate is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).find( 'image' ).attr( 'y' ), case_.expectedY, - `Image element y coordinate is correct. ${case_.message}` + `Image element y coordinate is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).find( 'image' ).attr( 'width' ), case_.width, - `Image element width is correct. ${case_.message}` + `Image element width is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).find( 'image' ).attr( 'height' ), case_.height, - `Image element height is correct. ${case_.message}` + `Image element height is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).attr( 'width' ), case_.expectedSVGWidth, - `Image SVG width is correct. ${case_.message}` + `Image SVG width is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).attr( 'height' ), case_.expectedSVGHeight, - `Image SVG height is correct. ${case_.message}` + `Image SVG height is correct. ${ case_.message }` ); assert.strictEqual( thumbnail.isNarrow, case_.expectedIsNarrow, - `Image isNarrow is correct. ${case_.message}` + `Image isNarrow is correct. ${ case_.message }` ); assert.strictEqual( thumbnail.offset, case_.expectedOffset, - `Image offset is correct. ${case_.message}` + `Image offset is correct. ${ case_.message }` ); } ); } ); @@ -210,32 +210,32 @@ QUnit.test( 'createThumbnail - landscape image element', ( assert ) => { assert.strictEqual( +$( thumbnail.el ).find( 'image' ).attr( 'x' ), case_.expectedX, - `Image x coordinate is correct. ${case_.message}` + `Image x coordinate is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).find( 'image' ).attr( 'y' ), case_.expectedY, - `Image y coordinate is correct. ${case_.message}` + `Image y coordinate is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).find( 'image' ).attr( 'width' ), case_.width, - `Image element width is correct. ${case_.message}` + `Image element width is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).find( 'image' ).attr( 'height' ), case_.height, - `Image element height is correct. ${case_.message}` + `Image element height is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).attr( 'width' ), case_.expectedSVGWidth, - `Image SVG width is correct. ${case_.message}` + `Image SVG width is correct. ${ case_.message }` ); assert.strictEqual( +$( thumbnail.el ).attr( 'height' ), case_.expectedSVGHeight, - `Image SVG height is correct. ${case_.message}` + `Image SVG height is correct. ${ case_.message }` ); } ); } ); diff --git a/tests/selenium/.eslintrc.json b/tests/selenium/.eslintrc.json index b8e69cb08..e1584c5a7 100644 --- a/tests/selenium/.eslintrc.json +++ b/tests/selenium/.eslintrc.json @@ -7,7 +7,6 @@ "mw": "readonly" }, "rules": { - "no-jquery/no-jquery-constructor": "off", "wdio/no-pause": "warn" } } diff --git a/tests/selenium/pageobjects/popups.page.js b/tests/selenium/pageobjects/popups.page.js index 218f83d05..dfd0c448c 100644 --- a/tests/selenium/pageobjects/popups.page.js +++ b/tests/selenium/pageobjects/popups.page.js @@ -17,6 +17,7 @@ const POPUPS_MODULE_NAME = 'ext.popups.main'; async function makePage( title, path ) { + // eslint-disable-next-line security/detect-non-literal-fs-filename const content = fs.readFileSync( path, 'utf-8' ); const bot = await Api.bot(); await bot.edit( title, content ); @@ -24,16 +25,16 @@ async function makePage( title, path ) { class PopupsPage extends Page { async setupPagePreviews() { return browser.call( async () => { - const path = `${__dirname}/../fixtures/`; - await makePage( `${TEST_PAGE_POPUPS_TITLE} 2`, `${path}test_page_2.wikitext` ); - await makePage( TEST_PAGE_POPUPS_TITLE, `${path}test_page.wikitext` ); + const path = `${ __dirname }/../fixtures/`; + await makePage( `${ TEST_PAGE_POPUPS_TITLE } 2`, `${ path }test_page_2.wikitext` ); + await makePage( TEST_PAGE_POPUPS_TITLE, `${ path }test_page.wikitext` ); } ); } async setupReferencePreviews() { return browser.call( async () => { - const path = `${__dirname}/../fixtures/`; - await makePage( TEST_REFERENCE_POPUPS_TITLE, `${path}test_page.wikitext` ); + const path = `${ __dirname }/../fixtures/`; + await makePage( TEST_REFERENCE_POPUPS_TITLE, `${ path }test_page.wikitext` ); } ); } @@ -67,7 +68,7 @@ class PopupsPage extends Page { } async dwellReferenceLink( id ) { - await this.dwellLink( `#${id} a` ); + await this.dwellLink( `#${ id } a` ); } async dwellReferenceInceptionLink() { diff --git a/webpack.config.js b/webpack.config.js index 9758024a9..63ec996b7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -95,9 +95,9 @@ module.exports = ( env, argv ) => ( { // Rename source map extensions. Per T173491 files with a .map extension cannot be served // from prod. - sourceMapFilename: `[file]${srcMapExt}`, + sourceMapFilename: `[file]${ srcMapExt }`, - devtoolModuleFilenameTemplate: `${PUBLIC_PATH}/[resource-path]` + devtoolModuleFilenameTemplate: `${ PUBLIC_PATH }/[resource-path]` }, // Accurate source maps at the expense of build time. The source map is intentionally exposed