mediawiki/extensions/DonationInterface: main (log #1265198)

sourcepatches

This run took 50 seconds.

From 211bfd3c0af63342d0e2f8b9815636f8e97ef311 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 15 Apr 2024 07:00:57 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.27.0

Change-Id: Icc5d2eefc0ff13b141dde72c987b7d8b2af7571d
---
 .../js/ext.donationInterface.jaVariant02.js   |   3 +
 package-lock.json                             | 855 +++++++-----------
 package.json                                  |   2 +-
 3 files changed, 345 insertions(+), 515 deletions(-)

diff --git a/modules/js/ext.donationInterface.jaVariant02.js b/modules/js/ext.donationInterface.jaVariant02.js
index e351353..19a6b61 100644
--- a/modules/js/ext.donationInterface.jaVariant02.js
+++ b/modules/js/ext.donationInterface.jaVariant02.js
@@ -4,6 +4,9 @@
  * text is decided, please make the optimal text standard and delete this and
  * the extension.json module configuration for ext.donationInterface.jaVariant02
  * and ext.donationInterface.adyenCheckoutWithJaVariant02.
+ *
+ * @param mw
+ * @param $
  */
 
 ( function ( mw, $ ) {
diff --git a/package-lock.json b/package-lock.json
index bbb1ad8..50cbe1d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,7 @@
 		"": {
 			"name": "DonationInterface",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.26.0",
+				"eslint-config-wikimedia": "0.27.0",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.11.1",
 				"grunt-contrib-watch": "1.1.0",
@@ -37,9 +37,9 @@
 			}
 		},
 		"node_modules/@babel/helper-validator-identifier": {
-			"version": "7.19.1",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
-			"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+			"version": "7.22.20",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+			"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
 			"dev": true,
 			"engines": {
 				"node": ">=6.9.0"
@@ -160,17 +160,17 @@
 			}
 		},
 		"node_modules/@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.42.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz",
+			"integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==",
 			"dev": true,
 			"dependencies": {
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20"
+				"node": ">=16"
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
@@ -188,15 +188,6 @@
 				"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
 			}
 		},
-		"node_modules/@eslint-community/eslint-utils/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==",
-			"dev": true,
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			}
-		},
 		"node_modules/@eslint-community/regexpp": {
 			"version": "4.10.0",
 			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
@@ -260,9 +251,9 @@
 			}
 		},
 		"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==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -367,9 +358,9 @@
 			"dev": true
 		},
 		"node_modules/@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+			"version": "7.5.8",
+			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+			"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
 			"dev": true
 		},
 		"node_modules/@typescript-eslint/scope-manager": {
@@ -494,18 +485,6 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			}
 		},
-		"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
-			"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/@ungap/structured-clone": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@@ -710,9 +689,9 @@
 			}
 		},
 		"node_modules/browserslist": {
-			"version": "4.22.3",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz",
-			"integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -729,8 +708,8 @@
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001580",
-				"electron-to-chromium": "^1.4.648",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			},
@@ -839,9 +818,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001583",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz",
-			"integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==",
+			"version": "1.0.30001610",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz",
+			"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==",
 			"dev": true,
 			"funding": [
 				{
@@ -926,9 +905,9 @@
 			}
 		},
 		"node_modules/ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true,
 			"funding": [
 				{
@@ -994,9 +973,9 @@
 			}
 		},
 		"node_modules/comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true,
 			"engines": {
 				"node": ">= 12.0.0"
@@ -1014,6 +993,19 @@
 			"integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
 			"dev": true
 		},
+		"node_modules/core-js-compat": {
+			"version": "3.36.1",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
+			"integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==",
+			"dev": true,
+			"dependencies": {
+				"browserslist": "^4.23.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/core-js"
+			}
+		},
 		"node_modules/core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -1359,9 +1351,9 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.656",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz",
-			"integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==",
+			"version": "1.4.736",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
+			"integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==",
 			"dev": true
 		},
 		"node_modules/emoji-regex": {
@@ -1420,16 +1412,16 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"dependencies": {
 				"@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",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -1475,10 +1467,13 @@
 			}
 		},
 		"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==",
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz",
+			"integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==",
 			"dev": true,
+			"dependencies": {
+				"semver": "^7.5.4"
+			},
 			"engines": {
 				"node": ">=12"
 			},
@@ -1487,93 +1482,36 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.27.0.tgz",
+			"integrity": "sha512-KkZ54+MUnggz17C/RCEMXQSpiiqZRF7p9fjrz4phaaeKlTrjg0B+QbM5zcDWcjGiAWaJUptHaH17+RZldadkUw==",
 			"dev": true,
 			"dependencies": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.6.1",
+				"eslint": "^8.57.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-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^27.9.0",
+				"eslint-plugin-jsdoc": "48.2.1",
 				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
+				"eslint-plugin-mediawiki": "^0.6.0",
+				"eslint-plugin-mocha": "^10.4.1",
+				"eslint-plugin-n": "^16.6.2",
 				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^51.0.1",
+				"eslint-plugin-vue": "^9.23.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.13.2"
 			}
 		},
 		"node_modules/eslint-config-wikimedia/node_modules/browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz",
+			"integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==",
 			"dev": true
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-vue": {
-			"version": "9.21.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.21.1.tgz",
-			"integrity": "sha512-XVtI7z39yOVBFJyi8Ljbn7kY9yHzznKXL02qQYn+ta63Iy4A9JFBw6o4OSB9hyD2++tVT+su9kQqetUyCCwhjw==",
-			"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.2",
-				"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/eslint-visitor-keys": {
-			"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-config-wikimedia/node_modules/vue-eslint-parser": {
-			"version": "9.4.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
-			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
-			"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": {
 			"version": "4.2.0",
 			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
@@ -1657,14 +1595,14 @@
 			}
 		},
 		"node_modules/eslint-plugin-es-x": {
-			"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==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz",
+			"integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.1.2",
 				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"eslint-compat-utils": "^0.5.0"
 			},
 			"engines": {
 				"node": "^14.18.0 || >=16.0.0"
@@ -1677,9 +1615,9 @@
 			}
 		},
 		"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==",
+			"version": "27.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
+			"integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
 			"dev": true,
 			"dependencies": {
 				"@typescript-eslint/utils": "^5.10.0"
@@ -1688,7 +1626,7 @@
 				"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0",
+				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0",
 				"eslint": "^7.0.0 || ^8.0.0",
 				"jest": "*"
 			},
@@ -1702,25 +1640,26 @@
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz",
+			"integrity": "sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==",
 			"dev": true,
 			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.42.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.0",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19"
+				"node": ">=18"
 			},
 			"peerDependencies": {
-				"eslint": "^7.0.0 || ^8.0.0"
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": {
@@ -1735,6 +1674,16 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
+		"node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+			"dev": true,
+			"dependencies": {
+				"spdx-exceptions": "^2.1.0",
+				"spdx-license-ids": "^3.0.0"
+			}
+		},
 		"node_modules/eslint-plugin-json-es": {
 			"version": "1.5.7",
 			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
@@ -1748,22 +1697,13 @@
 				"eslint": ">= 7"
 			}
 		},
-		"node_modules/eslint-plugin-json-es/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==",
-			"dev": true,
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			}
-		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.6.0.tgz",
+			"integrity": "sha512-a2Zm18N5nPyflBajM2ZWATxucIpYPEmOSjFzUR1OBH3hAL0GY9fx1mpezEwzqAQ862d+kPkolgQOzktnZe8nKA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			},
 			"peerDependencies": {
@@ -1771,12 +1711,13 @@
 			}
 		},
 		"node_modules/eslint-plugin-mocha": {
-			"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==",
+			"version": "10.4.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.2.tgz",
+			"integrity": "sha512-cur4dVYnSEWTBwdqIBQFxa/9siAhesu0TX+lbJ4ClE9j0eNMNe6BSx3vkFFNz6tGoveyMyELFXa30f3fvuAVDg==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			},
 			"engines": {
@@ -1836,16 +1777,16 @@
 			}
 		},
 		"node_modules/eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
 				"requireindex": "^1.2.0"
 			},
 			"engines": {
-				"node": "12.x || 14.x || >=16.0.0"
+				"node": "^16.0.0 || ^18.0.0 || >=20.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-security": {
@@ -1858,26 +1799,26 @@
 			}
 		},
 		"node_modules/eslint-plugin-unicorn": {
-			"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==",
+			"version": "51.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz",
+			"integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.22.20",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^2.1.4",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.34.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.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",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.5.4",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
@@ -1887,46 +1828,48 @@
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.38.0"
+				"eslint": ">=8.56.0"
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "8.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-			"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+			"version": "9.25.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz",
+			"integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-utils": "^3.0.0",
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
-				"nth-check": "^2.0.1",
-				"postcss-selector-parser": "^6.0.9",
-				"semver": "^7.3.5",
-				"vue-eslint-parser": "^8.0.1"
+				"nth-check": "^2.1.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.2",
+				"xml-name-validator": "^4.0.0"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^14.17.0 || >=16.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.24.12",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
+			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
 			"dev": true,
 			"engines": {
-				"node": ">=12.0.0"
+				"node": "^16.13 || >=18"
 			}
 		},
 		"node_modules/eslint-plugin-yml": {
-			"version": "1.12.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.12.2.tgz",
-			"integrity": "sha512-hvS9p08FhPT7i/ynwl7/Wt7ke7Rf4P2D6fT8lZlL43peZDTsHtH2A0SIFQ7Kt7+mJ6if6P+FX3iJhMkdnxQwpg==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.4.0",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -1941,21 +1884,6 @@
 				"eslint": ">=6.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-yml/node_modules/eslint-compat-utils": {
-			"version": "0.4.1",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.4.1.tgz",
-			"integrity": "sha512-5N7ZaJG5pZxUeNNJfUchurLVrunD1xJvyg5kYOIVF8kg1f3ajTikmAu/5fZ9w100omNPOoMjngRszh/Q/uFGMg==",
-			"dev": true,
-			"dependencies": {
-				"semver": "^7.5.4"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"peerDependencies": {
-				"eslint": ">=6.0.0"
-			}
-		},
 		"node_modules/eslint-scope": {
 			"version": "7.2.2",
 			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
@@ -1990,15 +1918,27 @@
 				"eslint": ">=5"
 			}
 		},
-		"node_modules/eslint-visitor-keys": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-			"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+		"node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+			"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
 			"dev": true,
 			"engines": {
 				"node": ">=10"
 			}
 		},
+		"node_modules/eslint-visitor-keys": {
+			"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/argparse": {
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -2017,18 +1957,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/eslint/node_modules/eslint-visitor-keys": {
-			"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/find-up": {
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -2143,18 +2071,6 @@
 				"url": "https://opencollective.com/eslint"
 			}
 		},
-		"node_modules/espree/node_modules/eslint-visitor-keys": {
-			"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/esprima": {
 			"version": "4.0.1",
 			"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
@@ -4404,9 +4320,9 @@
 			}
 		},
 		"node_modules/regexp-tree": {
-			"version": "0.1.24",
-			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz",
-			"integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==",
+			"version": "0.1.27",
+			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
+			"integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
 			"dev": true,
 			"bin": {
 				"regexp-tree": "bin/regexp-tree"
@@ -4581,9 +4497,9 @@
 			"dev": true
 		},
 		"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==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"dependencies": {
 				"lru-cache": "^6.0.0"
@@ -5538,21 +5454,21 @@
 			}
 		},
 		"node_modules/vue-eslint-parser": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-			"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
+			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
 			"dev": true,
 			"dependencies": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
+				"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.5"
+				"semver": "^7.3.6"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^14.17.0 || >=16.0.0"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/mysticatea"
@@ -5561,18 +5477,6 @@
 				"eslint": ">=6.0.0"
 			}
 		},
-		"node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
-			"version": "3.4.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
-			"integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
-			"dev": true,
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://opencollective.com/eslint"
-			}
-		},
 		"node_modules/websocket-driver": {
 			"version": "0.7.0",
 			"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
@@ -5713,10 +5617,13 @@
 			"dev": true
 		},
 		"node_modules/yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
+			"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
 			"dev": true,
+			"bin": {
+				"yaml": "bin.mjs"
+			},
 			"engines": {
 				"node": ">= 14"
 			}
@@ -5738,18 +5645,6 @@
 				"url": "https://github.com/sponsors/ota-meshi"
 			}
 		},
-		"node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": {
-			"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/yargs": {
 			"version": "16.2.0",
 			"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -5807,9 +5702,9 @@
 			}
 		},
 		"@babel/helper-validator-identifier": {
-			"version": "7.19.1",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
-			"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+			"version": "7.22.20",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+			"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
 			"dev": true
 		},
 		"@babel/highlight": {
@@ -5864,12 +5759,12 @@
 			"requires": {}
 		},
 		"@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.42.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz",
+			"integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==",
 			"dev": true,
 			"requires": {
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			}
@@ -5881,14 +5776,6 @@
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^3.3.0"
-			},
-			"dependencies": {
-				"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==",
-					"dev": true
-				}
 			}
 		},
 		"@eslint-community/regexpp": {
@@ -5941,9 +5828,9 @@
 			}
 		},
 		"@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true
 		},
 		"@humanwhocodes/config-array": {
@@ -6026,9 +5913,9 @@
 			"dev": true
 		},
 		"@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+			"version": "7.5.8",
+			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+			"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
 			"dev": true
 		},
 		"@typescript-eslint/scope-manager": {
@@ -6104,14 +5991,6 @@
 			"requires": {
 				"@typescript-eslint/types": "5.62.0",
 				"eslint-visitor-keys": "^3.3.0"
-			},
-			"dependencies": {
-				"eslint-visitor-keys": {
-					"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
-				}
 			}
 		},
 		"@ungap/structured-clone": {
@@ -6276,13 +6155,13 @@
 			}
 		},
 		"browserslist": {
-			"version": "4.22.3",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz",
-			"integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001580",
-				"electron-to-chromium": "^1.4.648",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			}
@@ -6357,9 +6236,9 @@
 			}
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001583",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz",
-			"integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==",
+			"version": "1.0.30001610",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz",
+			"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==",
 			"dev": true
 		},
 		"chalk": {
@@ -6414,9 +6293,9 @@
 			}
 		},
 		"ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true
 		},
 		"clean-regexp": {
@@ -6467,9 +6346,9 @@
 			"dev": true
 		},
 		"comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true
 		},
 		"concat-map": {
@@ -6484,6 +6363,15 @@
 			"integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
 			"dev": true
 		},
+		"core-js-compat": {
+			"version": "3.36.1",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
+			"integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==",
+			"dev": true,
+			"requires": {
+				"browserslist": "^4.23.0"
+			}
+		},
 		"core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -6738,9 +6626,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.656",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz",
-			"integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==",
+			"version": "1.4.736",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
+			"integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==",
 			"dev": true
 		},
 		"emoji-regex": {
@@ -6787,16 +6675,16 @@
 			"dev": true
 		},
 		"eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"requires": {
 				"@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",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -6844,12 +6732,6 @@
 					"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
 					"dev": true
 				},
-				"eslint-visitor-keys": {
-					"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
-				},
 				"find-up": {
 					"version": "5.0.0",
 					"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -6917,78 +6799,44 @@
 			}
 		},
 		"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==",
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz",
+			"integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==",
 			"dev": true,
-			"requires": {}
+			"requires": {
+				"semver": "^7.5.4"
+			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.27.0.tgz",
+			"integrity": "sha512-KkZ54+MUnggz17C/RCEMXQSpiiqZRF7p9fjrz4phaaeKlTrjg0B+QbM5zcDWcjGiAWaJUptHaH17+RZldadkUw==",
 			"dev": true,
 			"requires": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.6.1",
+				"eslint": "^8.57.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-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^27.9.0",
+				"eslint-plugin-jsdoc": "48.2.1",
 				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
+				"eslint-plugin-mediawiki": "^0.6.0",
+				"eslint-plugin-mocha": "^10.4.1",
+				"eslint-plugin-n": "^16.6.2",
 				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^51.0.1",
+				"eslint-plugin-vue": "^9.23.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.13.2"
 			},
 			"dependencies": {
 				"browserslist-config-wikimedia": {
-					"version": "0.5.1",
-					"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-					"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
-					"dev": true
-				},
-				"eslint-plugin-vue": {
-					"version": "9.21.1",
-					"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.21.1.tgz",
-					"integrity": "sha512-XVtI7z39yOVBFJyi8Ljbn7kY9yHzznKXL02qQYn+ta63Iy4A9JFBw6o4OSB9hyD2++tVT+su9kQqetUyCCwhjw==",
-					"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.2",
-						"xml-name-validator": "^4.0.0"
-					}
-				},
-				"eslint-visitor-keys": {
-					"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==",
+					"version": "0.6.1",
+					"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz",
+					"integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==",
 					"dev": true
-				},
-				"vue-eslint-parser": {
-					"version": "9.4.2",
-					"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
-					"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
-					"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"
-					}
 				}
 			}
 		},
@@ -7047,39 +6895,40 @@
 			}
 		},
 		"eslint-plugin-es-x": {
-			"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==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz",
+			"integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.1.2",
 				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"eslint-compat-utils": "^0.5.0"
 			}
 		},
 		"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==",
+			"version": "27.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
+			"integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
 			"dev": true,
 			"requires": {
 				"@typescript-eslint/utils": "^5.10.0"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz",
+			"integrity": "sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==",
 			"dev": true,
 			"requires": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.42.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.0",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"dependencies": {
 				"escape-string-regexp": {
@@ -7087,6 +6936,16 @@
 					"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
 					"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
 					"dev": true
+				},
+				"spdx-expression-parse": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+					"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+					"dev": true,
+					"requires": {
+						"spdx-exceptions": "^2.1.0",
+						"spdx-license-ids": "^3.0.0"
+					}
 				}
 			}
 		},
@@ -7098,33 +6957,26 @@
 			"requires": {
 				"eslint-visitor-keys": "^3.3.0",
 				"espree": "^9.3.1"
-			},
-			"dependencies": {
-				"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==",
-					"dev": true
-				}
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.6.0.tgz",
+			"integrity": "sha512-a2Zm18N5nPyflBajM2ZWATxucIpYPEmOSjFzUR1OBH3hAL0GY9fx1mpezEwzqAQ862d+kPkolgQOzktnZe8nKA==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			}
 		},
 		"eslint-plugin-mocha": {
-			"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==",
+			"version": "10.4.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.2.tgz",
+			"integrity": "sha512-cur4dVYnSEWTBwdqIBQFxa/9siAhesu0TX+lbJ4ClE9j0eNMNe6BSx3vkFFNz6tGoveyMyELFXa30f3fvuAVDg==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			}
 		},
@@ -7166,9 +7018,9 @@
 			"requires": {}
 		},
 		"eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -7185,71 +7037,62 @@
 			}
 		},
 		"eslint-plugin-unicorn": {
-			"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==",
+			"version": "51.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz",
+			"integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.22.20",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^2.1.4",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.34.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.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",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.5.4",
 				"strip-indent": "^3.0.0"
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "8.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-			"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+			"version": "9.25.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz",
+			"integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==",
 			"dev": true,
 			"requires": {
-				"eslint-utils": "^3.0.0",
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
-				"nth-check": "^2.0.1",
-				"postcss-selector-parser": "^6.0.9",
-				"semver": "^7.3.5",
-				"vue-eslint-parser": "^8.0.1"
+				"nth-check": "^2.1.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.2",
+				"xml-name-validator": "^4.0.0"
 			}
 		},
 		"eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.24.12",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
+			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
 			"dev": true
 		},
 		"eslint-plugin-yml": {
-			"version": "1.12.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.12.2.tgz",
-			"integrity": "sha512-hvS9p08FhPT7i/ynwl7/Wt7ke7Rf4P2D6fT8lZlL43peZDTsHtH2A0SIFQ7Kt7+mJ6if6P+FX3iJhMkdnxQwpg==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.4.0",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
-			},
-			"dependencies": {
-				"eslint-compat-utils": {
-					"version": "0.4.1",
-					"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.4.1.tgz",
-					"integrity": "sha512-5N7ZaJG5pZxUeNNJfUchurLVrunD1xJvyg5kYOIVF8kg1f3ajTikmAu/5fZ9w100omNPOoMjngRszh/Q/uFGMg==",
-					"dev": true,
-					"requires": {
-						"semver": "^7.5.4"
-					}
-				}
 			}
 		},
 		"eslint-scope": {
@@ -7269,12 +7112,20 @@
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^2.0.0"
+			},
+			"dependencies": {
+				"eslint-visitor-keys": {
+					"version": "2.1.0",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+					"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+					"dev": true
+				}
 			}
 		},
 		"eslint-visitor-keys": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-			"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+			"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": {
@@ -7286,14 +7137,6 @@
 				"acorn": "^8.9.0",
 				"acorn-jsx": "^5.3.2",
 				"eslint-visitor-keys": "^3.4.1"
-			},
-			"dependencies": {
-				"eslint-visitor-keys": {
-					"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
-				}
 			}
 		},
 		"esprima": {
@@ -8987,9 +8830,9 @@
 			}
 		},
 		"regexp-tree": {
-			"version": "0.1.24",
-			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz",
-			"integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==",
+			"version": "0.1.27",
+			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
+			"integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
 			"dev": true
 		},
 		"regjsparser": {
@@ -9112,9 +8955,9 @@
 			"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==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"requires": {
 				"lru-cache": "^6.0.0"
@@ -9864,26 +9707,18 @@
 			}
 		},
 		"vue-eslint-parser": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-			"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
+			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
 			"dev": true,
 			"requires": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
+				"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.5"
-			},
-			"dependencies": {
-				"eslint-visitor-keys": {
-					"version": "3.4.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
-					"integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
-					"dev": true
-				}
+				"semver": "^7.3.6"
 			}
 		},
 		"websocket-driver": {
@@ -9989,9 +9824,9 @@
 			"dev": true
 		},
 		"yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
+			"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
 			"dev": true
 		},
 		"yaml-eslint-parser": {
@@ -10003,14 +9838,6 @@
 				"eslint-visitor-keys": "^3.0.0",
 				"lodash": "^4.17.21",
 				"yaml": "^2.0.0"
-			},
-			"dependencies": {
-				"eslint-visitor-keys": {
-					"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
-				}
 			}
 		},
 		"yargs": {
diff --git a/package.json b/package.json
index 9471e12..9d5cfbe 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,7 @@
 		"url": "https://gerrit.wikimedia.org/r/p/mediawiki/extensions/DonationInterface.git"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.26.0",
+		"eslint-config-wikimedia": "0.27.0",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.11.1",
 		"grunt-contrib-watch": "1.1.0",
-- 
2.39.2

$ date
--- stdout ---
Mon Apr 15 07:00:18 UTC 2024

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-DonationInterface.git repo --depth=1 -b master
--- stderr ---
Cloning into 'repo'...
--- stdout ---

--- end ---
$ git config user.name libraryupgrader
--- stdout ---

--- end ---
$ git config user.email tools.libraryupgrader@tools.wmflabs.org
--- stdout ---

--- end ---
$ git submodule update --init
--- stdout ---

--- end ---
$ grr init
--- stdout ---
Installed commit-msg hook.

--- end ---
$ git show-ref refs/heads/master
--- stdout ---
21c6d57bb2bc62be86b864db6d5d47c5335e0e1c refs/heads/master

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {},
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 0,
      "critical": 0,
      "total": 0
    },
    "dependencies": {
      "prod": 1,
      "dev": 485,
      "optional": 0,
      "peer": 10,
      "peerOptional": 0,
      "total": 485
    }
  }
}

--- end ---
$ /usr/bin/composer install
--- stderr ---
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
                                                      Updating dependencies
Lock file operations: 65 installs, 0 updates, 0 removals
  - Locking addshore/psr-6-mediawiki-bagostuff-adapter (0.1)
  - Locking amzn/login-and-pay-with-amazon-sdk-php (2.5.0)
  - Locking clio/clio (0.1.8)
  - Locking coderkungfu/php-queue (1.0.1)
  - Locking composer/ca-bundle (1.5.0)
  - Locking composer/pcre (3.1.3)
  - Locking composer/semver (3.4.0)
  - Locking composer/spdx-licenses (1.5.8)
  - Locking composer/xdebug-handler (3.0.4)
  - Locking corneltek/getoptionkit (2.7.2)
  - Locking dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
  - Locking doctrine/deprecations (1.1.3)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking geoip2/geoip2 (v2.13.0)
  - Locking maxmind-db/reader (v1.11.1)
  - Locking maxmind/minfraud (v1.23.0)
  - Locking maxmind/web-service-common (v0.9.0)
  - Locking mediawiki/mediawiki-codesniffer (v43.0.0)
  - Locking mediawiki/mediawiki-phan-config (0.14.0)
  - Locking mediawiki/minus-x (1.1.1)
  - Locking mediawiki/phan-taint-check-plugin (6.0.0)
  - Locking microsoft/tolerant-php-parser (v0.1.2)
  - Locking monolog/monolog (2.9.3)
  - Locking neitanod/forceutf8 (v2.0.4)
  - Locking netresearch/jsonmapper (v4.4.1)
  - Locking phan/phan (5.4.3)
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
  - Locking php-parallel-lint/php-parallel-lint (v1.3.2)
  - Locking phpcsstandards/phpcsextra (1.1.2)
  - Locking phpcsstandards/phpcsutils (1.0.9)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.4.0)
  - Locking phpdocumentor/type-resolver (1.8.2)
  - Locking phpmailer/phpmailer (v6.9.1)
  - Locking phpstan/phpdoc-parser (1.28.0)
  - Locking predis/predis (v1.1.10)
  - Locking psr/cache (1.0.1)
  - Locking psr/container (1.1.2)
  - Locking psr/log (1.1.4)
  - Locking respect/stringifier (0.2.0)
  - Locking respect/validation (2.2.4)
  - Locking sabre/event (5.1.4)
  - Locking squizlabs/php_codesniffer (3.8.1)
  - Locking symfony/console (v5.4.36)
  - Locking symfony/deprecation-contracts (v2.5.3)
  - Locking symfony/http-foundation (v2.8.52)
  - Locking symfony/polyfill-ctype (v1.29.0)
  - Locking symfony/polyfill-intl-grapheme (v1.29.0)
  - Locking symfony/polyfill-intl-normalizer (v1.29.0)
  - Locking symfony/polyfill-mbstring (v1.29.0)
  - Locking symfony/polyfill-php54 (v1.20.0)
  - Locking symfony/polyfill-php55 (v1.20.0)
  - Locking symfony/polyfill-php73 (v1.29.0)
  - Locking symfony/polyfill-php80 (v1.29.0)
  - Locking symfony/service-contracts (v2.5.3)
  - Locking symfony/string (v5.4.36)
  - Locking symfony/yaml (v5.4.35)
  - Locking tysonandre/var_representation_polyfill (0.1.3)
  - Locking webmozart/assert (1.11.0)
  - Locking whichbrowser/parser (v2.1.7)
  - Locking wikimedia/remex-html (4.1.0)
  - Locking wikimedia/smash-pig (v0.8.10.2)
  - Locking wikimedia/testing-access-wrapper (1.0.0)
  - Locking wikimedia/utfnormal (3.0.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 65 installs, 0 updates, 0 removals
  - Syncing amzn/login-and-pay-with-amazon-sdk-php (2.5.0) into cache
    0 [>---------------------------]    0 [->--------------------------]
  - Installing squizlabs/php_codesniffer (3.8.1): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
  - Installing psr/cache (1.0.1): Extracting archive
  - Installing addshore/psr-6-mediawiki-bagostuff-adapter (0.1): Extracting archive
  - Installing clio/clio (0.1.8): Extracting archive
  - Installing composer/pcre (3.1.3): Extracting archive
  - Installing maxmind-db/reader (v1.11.1): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.29.0): Extracting archive
  - Installing respect/stringifier (0.2.0): Extracting archive
  - Installing respect/validation (2.2.4): Extracting archive
  - Installing composer/ca-bundle (1.5.0): Extracting archive
  - Installing maxmind/web-service-common (v0.9.0): Extracting archive
  - Installing geoip2/geoip2 (v2.13.0): Extracting archive
  - Installing maxmind/minfraud (v1.23.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.29.0): Extracting archive
  - Installing phpcsstandards/phpcsutils (1.0.9): Extracting archive
  - Installing phpcsstandards/phpcsextra (1.1.2): Extracting archive
  - Installing composer/spdx-licenses (1.5.8): Extracting archive
  - Installing composer/semver (3.4.0): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v43.0.0): Extracting archive
  - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.29.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.29.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.29.0): Extracting archive
  - Installing symfony/string (v5.4.36): Extracting archive
  - Installing symfony/deprecation-contracts (v2.5.3): Extracting archive
  - Installing psr/container (1.1.2): Extracting archive
  - Installing symfony/service-contracts (v2.5.3): Extracting archive
  - Installing symfony/polyfill-php73 (v1.29.0): Extracting archive
  - Installing symfony/console (v5.4.36): Extracting archive
  - Installing sabre/event (5.1.4): Extracting archive
  - Installing netresearch/jsonmapper (v4.4.1): Extracting archive
  - Installing microsoft/tolerant-php-parser (v0.1.2): Extracting archive
  - Installing webmozart/assert (1.11.0): Extracting archive
  - Installing phpstan/phpdoc-parser (1.28.0): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing doctrine/deprecations (1.1.3): Extracting archive
  - Installing phpdocumentor/type-resolver (1.8.2): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.4.0): Extracting archive
  - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
  - Installing psr/log (1.1.4): Extracting archive
  - Installing composer/xdebug-handler (3.0.4): Extracting archive
  - Installing phan/phan (5.4.3): Extracting archive
  - Installing mediawiki/phan-taint-check-plugin (6.0.0): Extracting archive
  - Installing mediawiki/mediawiki-phan-config (0.14.0): Extracting archive
  - Installing mediawiki/minus-x (1.1.1): Extracting archive
  - Installing monolog/monolog (2.9.3): Extracting archive
  - Installing neitanod/forceutf8 (v2.0.4): Extracting archive
  - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
  - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
  - Installing php-parallel-lint/php-parallel-lint (v1.3.2): Extracting archive
  - Installing symfony/polyfill-php54 (v1.20.0)
  - Installing symfony/polyfill-php55 (v1.20.0)
  - Installing whichbrowser/parser (v2.1.7): Extracting archive
  - Installing wikimedia/utfnormal (3.0.2): Extracting archive
  - Installing wikimedia/remex-html (4.1.0): Extracting archive
  - Installing symfony/yaml (v5.4.35): Extracting archive
  - Installing symfony/http-foundation (v2.8.52): Extracting archive
  - Installing predis/predis (v1.1.10): Extracting archive
  - Installing phpmailer/phpmailer (v6.9.1): Extracting archive
  - Installing corneltek/getoptionkit (2.7.2): Extracting archive
  - Installing coderkungfu/php-queue (1.0.1): Extracting archive
  - Installing amzn/login-and-pay-with-amazon-sdk-php (2.5.0): Cloning 0c923fe992 from cache
  - Installing wikimedia/smash-pig (v0.8.10.2): Extracting archive
  - Installing wikimedia/testing-access-wrapper (1.0.0): Extracting archive
  0/60 [>---------------------------]   0%
 20/60 [=========>------------------]  33%
 36/60 [================>-----------]  60%
 48/60 [======================>-----]  80%
 59/60 [===========================>]  98%
 60/60 [============================] 100%
33 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating optimized autoload files
Class SmashPig\PaymentProviders\Fundraiseup\Tests\AuditTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Fundraiseup/Tests/phpunit/AuditTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Ingenico\Tests\Manual\TestCreatePayment located in ./vendor/wikimedia/smash-pig/PaymentProviders/Ingenico/Tests/manual/TestCreatePayment.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Ingenico\Tests\IdealStatusProviderTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Ingenico/Tests/phpunit/IdealStatusProviderTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Ingenico\Tests\HostedCheckoutProviderTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Ingenico/Tests/phpunit/HostedCheckoutProviderTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Ingenico\Tests\ApiTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Ingenico/Tests/phpunit/ApiTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Ingenico\Tests\AuditTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Ingenico/Tests/phpunit/AuditTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Ingenico\Tests\AuthenticatorTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Ingenico/Tests/phpunit/AuthenticatorTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Ingenico\Tests\BankPaymentProviderTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Ingenico/Tests/phpunit/BankPaymentProviderTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Ingenico\Tests\PaymentProviderTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Ingenico/Tests/phpunit/PaymentProviderTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Ingenico\Tests\TokenizeRecurringJobTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Ingenico/Tests/phpunit/TokenizeRecurringJobTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Amazon\Tests\RecordPaymentsJobTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Amazon/Tests/phpunit/RecordPaymentsJobTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Amazon\Tests\NormalizeTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Amazon/Tests/phpunit/NormalizeTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Amazon\Tests\ActionsTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Amazon/Tests/phpunit/ActionsTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Amazon\Tests\ApiTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Amazon/Tests/phpunit/ApiTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Amazon\Tests\AuditTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Amazon/Tests/phpunit/AuditTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Test\CaptureJobTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/CaptureJobTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Test\RestResponseValidatorTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/RestResponseValidatorTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Test\RequeueMessageTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/RequeueMessageTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Tests\PaymentCaptureActionTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/PaymentCaptureActionTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Tests\RefundInitiatedActionTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/RefundInitiatedActionTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Test\RecurringPaymentTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/RecurringPaymentTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Tests\ReferenceDataTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/ReferenceDataTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Test\ApiTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/ApiTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Test\AutoRescueActionTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/AutoRescueActionTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Tests\ChargebackInitiatedActionTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/ChargebackInitiatedActionTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Tests\ReportAvailableTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/ReportAvailableTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Test\AuditTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/AuditTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Test\RecordCaptureJobTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/RecordCaptureJobTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Tests\TokenizeRecurringJobTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/TokenizeRecurringJobTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\Tests\CaptureResponseActionTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/Tests/phpunit/CaptureResponseActionTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\NotificationRequest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\NotificationRequestItem located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\anyType2anyTypeMap located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\entry located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\sendNotification located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\sendNotificationResponse located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\Amount located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\ServiceException located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\Error located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\Type located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Adyen\WSDL\ClassMap located in ./vendor/wikimedia/smash-pig/PaymentProviders/Adyen/WSDL/Notification.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\dlocal\Tests\PaidMessageJobTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/dlocal/Tests/phpunit/PaidMessageJobTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\dlocal\Tests\RestResponseValidatorTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/dlocal/Tests/phpunit/RestResponseValidatorTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\dlocal\Tests\RejectedMessageJobTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/dlocal/Tests/phpunit/RejectedMessageJobTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\dlocal\Tests\SignatureCalculatorTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/dlocal/Tests/phpunit/SignatureCalculatorTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\dlocal\Tests\ApiTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/dlocal/Tests/phpunit/ApiTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\dlocal\Test\AuditTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/dlocal/Tests/phpunit/AuditTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\dlocal\Tests\CardPaymentProviderTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/dlocal/Tests/phpunit/CardPaymentProviderTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\PayPal\Tests\CaptureIncomingMessageTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/PayPal/Tests/phpunit/CaptureIncomingMessageTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\PayPal\Tests\PaymentProviderTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/PayPal/Tests/phpunit/PaymentProviderTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Braintree\Tests\SignatureValidatorTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Braintree/Tests/phpunit/SignatureValidatorTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Braintree\Tests\PayPalPaymentProviderTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Braintree/Tests/phpunit/PayPalPaymentProviderTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Braintree\Tests\VenmoPaymentProviderTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Braintree/Tests/phpunit/VenmoPaymentProviderTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Braintree\Tests\ApiTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Braintree/Tests/phpunit/ApiTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Braintree\Test\AuditTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Braintree/Tests/phpunit/AuditTest.php does not comply with psr-4 autoloading standard. Skipping.
Class SmashPig\PaymentProviders\Braintree\Tests\PaymentProviderTest located in ./vendor/wikimedia/smash-pig/PaymentProviders/Braintree/Tests/phpunit/PaymentProviderTest.php does not comply with psr-4 autoloading standard. Skipping.
23 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils

--- end ---
Upgrading n:eslint-config-wikimedia from 0.26.0 -> 0.27.0
$ /usr/bin/npm install
--- stderr ---
npm WARN deprecated stylelint-stylistic@0.4.3: This package has been deprecated in favor of @stylistic/stylelint-plugin
--- stdout ---

added 477 packages, and audited 478 packages in 5s

92 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ /usr/bin/npm install grunt-eslint@24.3.0 --save-exact
--- stdout ---

up to date, audited 478 packages in 948ms

92 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ ./node_modules/.bin/eslint amazon_gateway/amazon.js modules/js/ext.donationInterface.errorLog.js modules/js/ext.donationInterface.jaVariant02.js modules/js/ext.donationInterface.employerAutoComplete.js ./Gruntfile.js ingenico_gateway/forms/js/ingenico.js modules/js/ext.donationInterface.monthlyConvert_010.js modules/js/ext.donationInterface.monthlyConvertMultiplier.js modules/iframe.liberator.js modules/js/ext.donationInterface.employerExplainAlt.js adyen_gateway/forms/adyen.js braintree_gateway/forms/braintree.js modules/js/skinOverride.js modules/js/ext.donationInterface.monthlyConvertButtonFlip.js modules/js/ext.donationInterface.forms.js modules/js/ext.donationInterface.emailPreferences.js modules/js/ext.donationInterface.validation.js modules/js/ext.donationInterface.alwaysRedirect.js modules/js/ext.donationInterface.recurUpgrade.js paypal_ec_gateway/forms/js/paypal.js ./package-lock.json ./package.json modules/js/ext.donationInterface.employerExplain.js modules/js/ext.donationInterface.monthlyConvert.js ./extension.json modules/js/ext.donationInterface.monthlyConvert_011.js modules/js/ext.donationInterface.monthlyConvert_003.js ./composer.json modules/validate_input.js dlocal_gateway/forms/dlocal.js --fix
--- stdout ---

/src/repo/adyen_gateway/forms/adyen.js
   23:1   warning  Missing JSDoc @return type                   jsdoc/require-returns-type
   73:23  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  155:23  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  215:34  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  219:14  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  229:1   warning  Missing JSDoc @param "extraData" type        jsdoc/require-param-type
  230:1   warning  Missing JSDoc @param "billingContact" type   jsdoc/require-param-type
  231:1   warning  Missing JSDoc @param "shippingContact" type  jsdoc/require-param-type
  336:22  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  631:4   warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  658:4   warning  ES2015 'Promise' class is forbidden          es-x/no-promise

/src/repo/amazon_gateway/amazon.js
   14:23  warning  Use a regular expression literal instead of the 'RegExp' constructor  prefer-regex-literals
   39:14  warning  Found non-literal argument to RegExp Constructor                      security/detect-non-literal-regexp
  268:8   warning  Selector extensions are not allowed                                   no-jquery/no-sizzle

/src/repo/dlocal_gateway/forms/dlocal.js
  306:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/modules/iframe.liberator.js
  1:10  warning  'self' is already defined as a built-in global variable  no-redeclare

/src/repo/modules/js/ext.donationInterface.errorLog.js
  10:26  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/modules/js/ext.donationInterface.forms.js
    4:1   warning  Missing JSDoc @param "$" type        jsdoc/require-param-type
    5:1   warning  Missing JSDoc @param "mw" type       jsdoc/require-param-type
   74:25  warning  Selector extensions are not allowed  no-jquery/no-sizzle
  105:1   warning  The type 'result' is undefined       jsdoc/no-undefined-types
  249:8   warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/modules/js/ext.donationInterface.jaVariant02.js
  8:1  warning  Missing JSDoc @param "mw" type  jsdoc/require-param-type
  9:1  warning  Missing JSDoc @param "$" type   jsdoc/require-param-type

/src/repo/modules/js/ext.donationInterface.monthlyConvert.js
  26:49  warning  'currency' is already declared in the upper scope on line 3 column 3  no-shadow
  34:39  warning  'currency' is already declared in the upper scope on line 3 column 3  no-shadow

/src/repo/modules/js/ext.donationInterface.validation.js
   7:1   warning  Missing JSDoc @param "$" type                                    jsdoc/require-param-type
   8:1   warning  Missing JSDoc @param "mw" type                                   jsdoc/require-param-type
  40:35  warning  'i' is already declared in the upper scope on line 39 column 45  no-shadow

/src/repo/modules/validate_input.js
    1:1   warning  Missing JSDoc @return declaration                                                    jsdoc/require-returns
  106:27  warning  'value' is already declared in the upper scope on line 83 column 6                   no-shadow
  108:14  warning  All possible message keys should be documented. See https://w.wiki/4r9a for details  mediawiki/msg-doc
  114:32  warning  'i' is already declared in the upper scope on line 86 column 3                       no-shadow
  135:24  warning  Found non-literal argument to RegExp Constructor                                     security/detect-non-literal-regexp
  180:14  warning  Found non-literal argument to RegExp Constructor                                     security/detect-non-literal-regexp

✖ 35 problems (0 errors, 35 warnings)


--- end ---
$ ./node_modules/.bin/eslint amazon_gateway/amazon.js modules/js/ext.donationInterface.errorLog.js modules/js/ext.donationInterface.jaVariant02.js modules/js/ext.donationInterface.employerAutoComplete.js ./Gruntfile.js ingenico_gateway/forms/js/ingenico.js modules/js/ext.donationInterface.monthlyConvert_010.js modules/js/ext.donationInterface.monthlyConvertMultiplier.js modules/iframe.liberator.js modules/js/ext.donationInterface.employerExplainAlt.js adyen_gateway/forms/adyen.js braintree_gateway/forms/braintree.js modules/js/skinOverride.js modules/js/ext.donationInterface.monthlyConvertButtonFlip.js modules/js/ext.donationInterface.forms.js modules/js/ext.donationInterface.emailPreferences.js modules/js/ext.donationInterface.validation.js modules/js/ext.donationInterface.alwaysRedirect.js modules/js/ext.donationInterface.recurUpgrade.js paypal_ec_gateway/forms/js/paypal.js ./package-lock.json ./package.json modules/js/ext.donationInterface.employerExplain.js modules/js/ext.donationInterface.monthlyConvert.js ./extension.json modules/js/ext.donationInterface.monthlyConvert_011.js modules/js/ext.donationInterface.monthlyConvert_003.js ./composer.json modules/validate_input.js dlocal_gateway/forms/dlocal.js -f json
--- stdout ---
[{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/adyen_gateway/forms/adyen.js","messages":[{"ruleId":"jsdoc/require-returns-type","severity":1,"message":"Missing JSDoc @return type.","line":23,"column":1,"nodeType":"Block","endLine":23,"endColumn":1},{"ruleId":"es-x/no-promise","severity":1,"message":"ES2015 'Promise' class is forbidden.","line":73,"column":23,"nodeType":"Identifier","messageId":"forbidden","endLine":73,"endColumn":30},{"ruleId":"es-x/no-promise","severity":1,"message":"ES2015 'Promise' class is forbidden.","line":155,"column":23,"nodeType":"Identifier","messageId":"forbidden","endLine":155,"endColumn":30},{"ruleId":"es-x/no-promise","severity":1,"message":"ES2015 'Promise' class is forbidden.","line":215,"column":34,"nodeType":"Identifier","messageId":"forbidden","endLine":215,"endColumn":41},{"ruleId":"es-x/no-promise","severity":1,"message":"ES2015 'Promise' class is forbidden.","line":219,"column":14,"nodeType":"Identifier","messageId":"forbidden","endLine":219,"endColumn":21},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"extraData\" type.","line":229,"column":1,"nodeType":"Block","endLine":229,"endColumn":1},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"billingContact\" type.","line":230,"column":1,"nodeType":"Block","endLine":230,"endColumn":1},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"shippingContact\" type.","line":231,"column":1,"nodeType":"Block","endLine":231,"endColumn":1},{"ruleId":"es-x/no-promise","severity":1,"message":"ES2015 'Promise' class is forbidden.","line":336,"column":22,"nodeType":"Identifier","messageId":"forbidden","endLine":336,"endColumn":29},{"ruleId":"es-x/no-promise","severity":1,"message":"ES2015 'Promise' class is forbidden.","line":631,"column":4,"nodeType":"Identifier","messageId":"forbidden","endLine":631,"endColumn":11},{"ruleId":"es-x/no-promise","severity":1,"message":"ES2015 'Promise' class is forbidden.","line":658,"column":4,"nodeType":"Identifier","messageId":"forbidden","endLine":658,"endColumn":11}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/* global AdyenCheckout, Promise */\n( function ( $, mw ) {\n\t// promise objects are for Apple Pay - see comments below\n\tvar checkout, onSubmit, authPromise, submitPromise,\n\t\tconfigFromServer = mw.config.get( 'adyenConfiguration' ),\n\t\tpayment_method = $( '#payment_method' ).val(),\n\t\tcountry = $( '#country' ).val(),\n\t\tlanguage = $( '#language' ).val(),\n\t\t// This is the old-style Google Pay integration type currently active on\n\t\t// our account. Older versions of the Adyen JS SDK treated the 'googlepay'\n\t\t// component type as the old GPay integration, but for newer versions of\n\t\t// the GPay SDK we need to explicitly specify 'paywithgoogle' to get tokens\n\t\t// that work with the old-style integration. At some point we should upgrade\n\t\t// to the new interaction, but that will require coordinating an update to\n\t\t// this constant with an update to our account.\n\t\tGOOGLEPAY_COMPONENT_TYPE = 'paywithgoogle';\n\n\t/**\n\t * Get extra configuration values for specific payment types\n\t *\n\t * @param {string} type Adyen-side name of component type\n\t * @param {Object} checkoutConfig The config object used to instantiate the Adyen Checkout object\n\t * @return Object\n\t */\n\tfunction getComponentConfig( type, checkoutConfig ) {\n\t\tvar config = {};\n\t\tswitch ( type ) {\n\t\t\tcase 'card':\n\t\t\t\t// Note: Debug messages are only sent and logged server-side if\n\t\t\t\t// $wgDonationInterfaceLogDebug (or $wgAdyenCheckoutGatewayLogDebug) is true\n\n\t\t\t\tconfig.onBrand = function ( brandInfo ) {\n\t\t\t\t\tvar message = brandInfo.brand ?\n\t\t\t\t\t\t'onBrand returned brand: ' + brandInfo.brand :\n\t\t\t\t\t\t'onBrand returned: ' + JSON.stringify( brandInfo );\n\t\t\t\t\tmw.donationInterface.forms.addDebugMessage( message );\n\t\t\t\t};\n\n\t\t\t\tconfig.onBinLookup = function ( binLookupInfo ) {\n\t\t\t\t\tvar message = binLookupInfo.detectedBrands && binLookupInfo.detectedBrands.length > 0 ?\n\t\t\t\t\t\t'onBinLookup returned detected brands: ' + JSON.stringify( binLookupInfo.detectedBrands ) :\n\t\t\t\t\t\t'onBinLookup returned: ' + JSON.stringify( binLookupInfo );\n\t\t\t\t\tmw.donationInterface.forms.addDebugMessage( message );\n\t\t\t\t};\n\n\t\t\t\tconfig.showBrandsUnderCardNumber = false;\n\t\t\t\treturn config;\n\n\t\t\tcase 'ach':\n\t\t\tcase 'ideal':\n\t\t\tcase 'onlineBanking_CZ':\n\t\t\t\t// for cc, CZ bank transfers, and ideal, additional config is optional\n\t\t\t\treturn config;\n\n\t\t\tcase 'applepay':\n\t\t\t\t// for applepay, additional config is required\n\t\t\t\tvar amount = {},\n\t\t\t\t\tcurrency = $( '#currency' ).val(),\n\t\t\t\t\tamount_value = $( '#amount' ).val();\n\t\t\t\tamount.currency = currency;\n\t\t\t\tamount.value = amountInMinorUnits( amount_value, currency );\n\t\t\t\tconfig.amount = amount;\n\t\t\t\tconfig.countryCode = country;\n\t\t\t\tconfig.requiredBillingContactFields = [\n\t\t\t\t\t'name',\n\t\t\t\t\t'postalAddress'\n\t\t\t\t];\n\t\t\t\tconfig.requiredShippingContactFields = [\n\t\t\t\t\t'name',\n\t\t\t\t\t'email'\n\t\t\t\t];\n\n\t\t\t\tauthPromise = new Promise( function ( authResolve, authReject ) {\n\t\t\t\t\tconfig.onAuthorized = function ( resolve, reject, event ) {\n\t\t\t\t\t\tvar bContact = event.payment.billingContact,\n\t\t\t\t\t\t\tsContact = event.payment.shippingContact,\n\t\t\t\t\t\t\textraData = {};\n\t\t\t\t\t\textraData = getBestApplePayContactName( extraData, bContact, sContact );\n\t\t\t\t\t\textraData.postal_code = bContact.postalCode;\n\t\t\t\t\t\textraData.state_province = bContact.administrativeArea;\n\t\t\t\t\t\textraData.city = bContact.locality;\n\t\t\t\t\t\tif ( bContact.addressLines.length > 0 ) {\n\t\t\t\t\t\t\textraData.street_address = bContact.addressLines[ 0 ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\textraData.email = sContact.emailAddress;\n\t\t\t\t\t\textraData.payment_submethod = mapAppleNetworkToSubmethod( event.payment.token.paymentMethod.network );\n\t\t\t\t\t\t// We will combine this contact data with a token from the\n\t\t\t\t\t\t// onSubmit event after both events have fired.\n\t\t\t\t\t\tauthResolve( extraData );\n\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t} );\n\t\t\t\t// For Apple Pay show the branded button with 'Donate with 🍎Pay'\n\t\t\t\t// text as opposed to our standard blue Donate button\n\t\t\t\tconfig.showPayButton = true;\n\t\t\t\tconfig.buttonType = 'donate';\n\t\t\t\t// When the donor clicks the donate button, this event is fired with\n\t\t\t\t// a validationUrl provided by Apple. We have to make a server-side\n\t\t\t\t// request to get a big blob of Apple Pay session data, then send it\n\t\t\t\t// via the resolve function back to the component, which apparently\n\t\t\t\t// sends it back to the native widget via completeMerchantValidation.\n\t\t\t\t// https://developer.apple.com/documentation/apple_pay_on_the_web/apple_pay_js_api/providing_merchant_validation\n\t\t\t\tconfig.onValidateMerchant = function ( resolve, reject, validationUrl ) {\n\t\t\t\t\tvar api = new mw.Api();\n\t\t\t\t\tapi.post( {\n\t\t\t\t\t\taction: 'di_applesession_adyen',\n\t\t\t\t\t\tvalidation_url: validationUrl,\n\t\t\t\t\t\twmf_token: $( '#wmf_token' ).val()\n\t\t\t\t\t} ).then( function ( data ) {\n\t\t\t\t\t\tif ( data.result && data.result.errors ) {\n\t\t\t\t\t\t\tmw.donationInterface.validation.showErrors( data.result.errors );\n\t\t\t\t\t\t\treject();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve( data.session );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t};\n\n\t\t\t\treturn config;\n\n\t\t\tcase GOOGLEPAY_COMPONENT_TYPE:\n\t\t\t\t// for googlepay, additional config is required\n\t\t\t\tvar g_amount = {},\n\t\t\t\t\tg_currency = $( '#currency' ).val(),\n\t\t\t\t\tg_amount_value = $( '#amount' ).val(),\n\t\t\t\t\tlanguagesSupportedByGPayButton = [\n\t\t\t\t\t\t'ar', 'bg', 'ca', 'cs', 'da', 'de', 'en', 'el', 'es', 'et', 'fi', 'fr', 'hr', 'id', 'it', 'ja',\n\t\t\t\t\t\t'ko', 'ms', 'nl', 'no', 'pl', 'pt', 'ru', 'sk', 'sl', 'sr', 'sv', 'th', 'tr', 'uk', 'zh'\n\t\t\t\t\t], baseLanguageCode = checkoutConfig.locale.slice( 0, 2 );\n\t\t\t\tg_amount.currency = g_currency;\n\t\t\t\tg_amount.value = amountInMinorUnits( g_amount_value, g_currency );\n\t\t\t\tconfig.amount = g_amount;\n\t\t\t\tconfig.countryCode = country;\n\t\t\t\tconfig.environment = configFromServer.environment.toUpperCase();\n\t\t\t\tconfig.showPayButton = true;\n\t\t\t\t// When we are showing the form in a language for which Google Pay has no\n\t\t\t\t// translations of their button text, use the plain 'GPay' button rather\n\t\t\t\t// than the 'Donate with GPay' button.\n\t\t\t\tif ( languagesSupportedByGPayButton.indexOf( baseLanguageCode ) === -1 ) {\n\t\t\t\t\tconfig.buttonType = 'plain';\n\t\t\t\t} else {\n\t\t\t\t\tconfig.buttonType = 'donate';\n\t\t\t\t}\n\t\t\t\tconfig.emailRequired = true;\n\t\t\t\tconfig.billingAddressRequired = true;\n\t\t\t\tconfig.allowedCardNetworks = configFromServer.googleAllowedNetworks;\n\t\t\t\tconfig.billingAddressParameters = {\n\t\t\t\t\tformat: 'FULL'\n\t\t\t\t};\n\t\t\t\t// called gatewayMerchantId but actually our account name with Adyen\n\t\t\t\tconfig.gatewayMerchantId = configFromServer.merchantAccountName;\n\t\t\t\tconfig.merchantId = configFromServer.googleMerchantId;\n\n\t\t\t\tauthPromise = new Promise( function ( authResolve ) {\n\t\t\t\t\tconfig.onAuthorized = function ( response ) {\n\t\t\t\t\t\tvar bContact = response.paymentMethodData.info.billingAddress,\n\t\t\t\t\t\t\textraData = {};\n\t\t\t\t\t\textraData.postal_code = bContact.postalCode;\n\t\t\t\t\t\textraData.state_province = bContact.administrativeArea;\n\t\t\t\t\t\textraData.city = bContact.locality;\n\t\t\t\t\t\textraData.street_address = bContact.address1;\n\t\t\t\t\t\textraData.email = response.email;\n\t\t\t\t\t\textraData.full_name = bContact.name;\n\t\t\t\t\t\textraData.payment_submethod = mapAdyenSubmethod(\n\t\t\t\t\t\t\tresponse.paymentMethodData.info.cardNetwork.toLowerCase()\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// We will combine this contact data with a token from the\n\t\t\t\t\t\t// onSubmit event after both events have fired.\n\t\t\t\t\t\tauthResolve( extraData );\n\t\t\t\t\t};\n\t\t\t\t} );\n\t\t\t\treturn config;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'Component type not found' );\n\t\t}\n\t}\n\n\t/**\n\t * Given an amount in major currency units, e.g. dollars, returns the\n\t * amount in minor units for the currency, e.g. cents. For non-fractional\n\t * currencies just rounds the amount to the nearest whole number.\n\t *\n\t * @param {number} amount\n\t * @param {string} currency\n\t * @return {number} amount in minor units for specified currency\n\t */\n\tfunction amountInMinorUnits( amount, currency ) {\n\t\tvar threeDecimals = mw.config.get( 'DonationInterfaceThreeDecimalCurrencies' ),\n\t\t\tnoDecimals = mw.config.get( 'DonationInterfaceNoDecimalCurrencies' );\n\n\t\tif ( noDecimals.indexOf( currency ) !== -1 ) {\n\t\t\treturn Math.round( amount );\n\t\t}\n\t\tif ( threeDecimals.indexOf( currency ) !== -1 ) {\n\t\t\treturn Math.round( amount * 1000 );\n\t\t}\n\t\treturn Math.round( amount * 100 );\n\t}\n\n\t/**\n\t * Set up Adyen Checkout object\n\t *\n\t * @param {Object} config requires clientKey, environment, locale,\n\t *  and paymentMethodsResponse\n\t * @return {AdyenCheckout}\n\t */\n\tfunction getCheckout( config ) {\n\t\tconfig.onSubmit = onSubmit;\n\t\tconfig.onAdditionalDetails = onAdditionalDetails;\n\t\tconfig.onError = onError;\n\t\tconfig.showPayButton = false;\n\t\tvar checkoutObject = new AdyenCheckout( config );\n\t\tif ( checkoutObject instanceof Promise ) {\n\t\t\treturn checkoutObject;\n\t\t}\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\t\t\tresolve( checkoutObject );\n\t\t} );\n\t}\n\n\t/**\n\t * Try to obtain the \"best\" name from the available contact info sent back by Apple pay\n\t *\n\t * @see https://developer.apple.com/documentation/apple_pay_on_the_web/applepaypaymentrequest/2216120-requiredbillingcontactfields\n\t * @see https://developer.apple.com/documentation/apple_pay_on_the_web/applepaypaymentcontact\n\t * @param extraData\n\t * @param billingContact\n\t * @param shippingContact\n\t * @return {*}\n\t */\n\tfunction getBestApplePayContactName( extraData, billingContact, shippingContact ) {\n\t\tvar first_name, last_name;\n\n\t\tif ( billingContact && billingContact.givenName && billingContact.givenName.length > 1 ) {\n\t\t\tfirst_name = billingContact.givenName;\n\t\t\tif ( billingContact.familyName && billingContact.familyName.length > 1 ) {\n\t\t\t\tlast_name = billingContact.familyName;\n\t\t\t}\n\t\t}\n\n\t\tif ( first_name && !last_name ) {\n\t\t\t// suspected 'dad' scenario so use shipping contact\n\t\t\tif ( shippingContact && shippingContact.givenName && shippingContact.givenName.length > 1 ) {\n\t\t\t\tfirst_name = shippingContact.givenName;\n\t\t\t\tif ( shippingContact.familyName && shippingContact.familyName.length > 1 ) {\n\t\t\t\t\tlast_name = shippingContact.familyName;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\textraData.first_name = first_name;\n\t\textraData.last_name = last_name;\n\t\treturn extraData;\n\t}\n\n\tfunction mapAppleNetworkToSubmethod( network ) {\n\t\tnetwork = network.toLowerCase();\n\t\tswitch ( network ) {\n\t\t\tcase 'amex':\n\t\t\tcase 'discover':\n\t\t\tcase 'jcb':\n\t\t\tcase 'visa':\n\t\t\t\treturn network;\n\t\t\tcase 'cartesbancaires':\n\t\t\t\treturn 'cb';\n\t\t\tcase 'electron':\n\t\t\t\treturn 'visa-electron';\n\t\t\tcase 'mastercard':\n\t\t\t\treturn 'mc';\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\n\t/**\n\t * Get the name of the Adyen Checkout component to instantiate\n\t *\n\t * @param {string} paymentMethod our top-level payment method code\n\t * @return {string} name of Adyen Checkout component to instantiate\n\t */\n\tfunction mapPaymentMethodToComponentType( paymentMethod ) {\n\t\tswitch ( paymentMethod ) {\n\t\t\tcase 'ach':\n\t\t\t\treturn 'ach';\n\t\t\tcase 'cc':\n\t\t\t\treturn 'card';\n\t\t\tcase 'rtbt': //sepa\n\t\t\tcase 'bt':\n\t\t\t\tif ( country === 'CZ' ) {\n\t\t\t\t\treturn 'onlineBanking_CZ';\n\t\t\t\t}\n\t\t\t\treturn 'ideal';\n\t\t\tcase 'apple':\n\t\t\t\treturn 'applepay';\n\t\t\tcase 'google':\n\t\t\t\treturn GOOGLEPAY_COMPONENT_TYPE;\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'paymentMethod not found' );\n\t\t}\n\t}\n\n\t/**\n\t * TODO: should we do this mapping server-side\n\t * using SmashPig's ReferenceData?\n\t *\n\t * @param {string} adyenBrandCode Adyen-side identifier for the payment submethod\n\t * @return {string} Our identifier for the payment submethod\n\t */\n\tfunction mapAdyenSubmethod( adyenBrandCode ) {\n\t\tswitch ( adyenBrandCode ) {\n\t\t\tcase 'bijcard':\n\t\t\t\treturn 'bij';\n\t\t\tcase 'cartebancaire':\n\t\t\t\treturn 'cb';\n\t\t\tcase 'mc-debit':\n\t\t\t\treturn 'mc';\n\t\t\tcase 'visadankort':\n\t\t\t\treturn 'visa';\n\t\t\tcase 'visadebit':\n\t\t\tcase 'vpay':\n\t\t\t\treturn 'visa-debit';\n\t\t\tcase 'visabeneficial':\n\t\t\t\treturn 'visa-beneficial';\n\t\t\tcase 'visaelectron':\n\t\t\t\treturn 'visa-electron';\n\t\t\tcase 'mastercard':\n\t\t\t\treturn 'mc';\n\t\t\tdefault:\n\t\t\t\treturn adyenBrandCode;\n\t\t}\n\t}\n\n\tsubmitPromise = new Promise( function ( submitResolve, submitReject ) {\n\t\tonSubmit = function ( state, component ) {\n\t\t\tvar extraData = {};\n\t\t\t// Submit to our server, unless it's Apple Pay, which submits in\n\t\t\t// the onAuthorized handler.\n\t\t\tif ( mw.donationInterface.validation.validate() && state.isValid ) {\n\t\t\t\tswitch ( payment_method ) {\n\t\t\t\t\tcase 'ach':\n\t\t\t\t\t\textraData = {\n\t\t\t\t\t\t\tencrypted_bank_account_number: state.data.paymentMethod.encryptedBankAccountNumber,\n\t\t\t\t\t\t\tencrypted_bank_location_id: state.data.paymentMethod.encryptedBankLocationId,\n\t\t\t\t\t\t\tfull_name: state.data.paymentMethod.ownerName,\n\t\t\t\t\t\t\tbank_account_type: $( '#bank_account_type' ).val(),\n\t\t\t\t\t\t\t// below are billing address, optional but good to have for civi\n\t\t\t\t\t\t\tsupplemental_address_1: state.data.billingAddress.houseNumberOrName,\n\t\t\t\t\t\t\tcountry: state.data.billingAddress.country,\n\t\t\t\t\t\t\tstreet_address: state.data.billingAddress.street,\n\t\t\t\t\t\t\tpostal_code: state.data.billingAddress.postalCode,\n\t\t\t\t\t\t\tcity: state.data.billingAddress.city,\n\t\t\t\t\t\t\tstate_province: state.data.billingAddress.stateOrProvince\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'rtbt':\n\t\t\t\t\t\tif ( state.data.paymentMethod.type === 'ideal' ) {\n\t\t\t\t\t\t\textraData = {\n\t\t\t\t\t\t\t\t// issuer is bank chosen from dropdown\n\t\t\t\t\t\t\t\tissuer_id: state.data.paymentMethod.issuer,\n\t\t\t\t\t\t\t\tpayment_submethod: 'rtbt_ideal'\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bt':\n\t\t\t\t\t\textraData = {\n\t\t\t\t\t\t\t// issuer is bank chosen from dropdown\n\t\t\t\t\t\t\tissuer_id: state.data.paymentMethod.issuer\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cc':\n\t\t\t\t\t\textraData = {\n\t\t\t\t\t\t\tencrypted_card_number: state.data.paymentMethod.encryptedCardNumber,\n\t\t\t\t\t\t\tencrypted_expiry_month: state.data.paymentMethod.encryptedExpiryMonth,\n\t\t\t\t\t\t\tencrypted_expiry_year: state.data.paymentMethod.encryptedExpiryYear,\n\t\t\t\t\t\t\tencrypted_security_code: state.data.paymentMethod.encryptedSecurityCode,\n\t\t\t\t\t\t\t// The code should be available in state.data.paymentMethod.brand, but\n\t\t\t\t\t\t\t// sometimes it's not there. We can usually still find it via component.\n\t\t\t\t\t\t\tpayment_submethod: mapAdyenSubmethod(\n\t\t\t\t\t\t\t\tstate.data.paymentMethod.brand || component.state.brand\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif ( state.data.browserInfo ) {\n\t\t\t\t\t\t\textraData.color_depth = state.data.browserInfo.colorDepth;\n\t\t\t\t\t\t\textraData.java_enabled = state.data.browserInfo.javaEnabled;\n\t\t\t\t\t\t\textraData.screen_height = state.data.browserInfo.screenHeight;\n\t\t\t\t\t\t\textraData.screen_width = state.data.browserInfo.screenWidth;\n\t\t\t\t\t\t\textraData.time_zone_offset = state.data.browserInfo.timeZoneOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'google':\n\t\t\t\t\t\tsubmitResolve( state.data.paymentMethod.googlePayToken );\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'apple':\n\t\t\t\t\t\t// Resolve the submit promise with the Apple Pay token and bail out - we\n\t\t\t\t\t\t// also need to wait for the onAuthorized event with contact data.\n\t\t\t\t\t\tsubmitResolve( state.data.paymentMethod.applePayToken );\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Allow other scripts (e.g. variants) to provide more data to submit\n\t\t\t\tif ( typeof mw.donationInterface.getExtraData === 'function' ) {\n\t\t\t\t\t$.extend( extraData, mw.donationInterface.getExtraData() );\n\t\t\t\t}\n\n\t\t\t\tmw.donationInterface.forms.callDonateApi(\n\t\t\t\t\thandleApiResult, extraData, 'di_donate_adyen'\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t} );\n\n\tfunction handleApiResult( result ) {\n\t\tif ( result.isFailed ) {\n\t\t\tmw.donationInterface.validation.showErrors( {\n\t\t\t\tgeneral: mw.msg( 'donate_interface-error-msg-general' )\n\t\t\t} );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( result.formData && Object.keys( result.formData ).length > 0 ) {\n\t\t\t// FIXME: reconstructing the raw result from the API\n\t\t\t// which has been normalized down to just these two\n\t\t\t// fields. Should we just pass the raw Adyen API result\n\t\t\t// back to the front end? Seems like we would only want\n\t\t\t// a rawResult property on the front-end donation API\n\t\t\t// response when we are damn sure it's sanitized.\n\t\t\tcheckout.createFromAction( {\n\t\t\t\tpaymentMethodType: 'scheme',\n\t\t\t\turl: result.redirect,\n\t\t\t\tdata: result.formData,\n\t\t\t\tmethod: 'POST',\n\t\t\t\ttype: 'redirect'\n\t\t\t} ).mount( '#action-container' );\n\n\t\t// canShowModal() is just a sanity check to see if the required DOM elements\n\t\t// are there.\n\t\t} else if ( mw.monthlyConvert && mw.monthlyConvert.canShowModal() ) {\n\t\t\tmw.monthlyConvert.init();\n\t\t} else if ( result.redirect ) {\n\t\t\tdocument.location.replace( result.redirect );\n\t\t} else {\n\t\t\tdocument.location.replace( mw.config.get( 'DonationInterfaceThankYouPage' ) );\n\t\t}\n\t}\n\n\tfunction onAdditionalDetails( state, dropin ) {\n\t\t// Handle 3D secure\n\t}\n\n\t// T292571 try catch the adyen error, see if any connection been blocked, e.g. iframe\n\tfunction onError( error ) {\n\t\t// Ignore blank string - that means a previous error was cleared up\n\t\tif ( typeof error.error === 'string' && error.error === '' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( typeof error.error === 'string' && error.error.slice( 0, 8 ) === 'error.va' ) {\n\t\t\t// T349600 Log validation error codes only if sf-cc-num.02 donate_interface-error-msg-card-number-do-not-match-card-brand)\n\t\t\t// with date time and time zone for adyen to investigate their card validation js issue\n\t\t\tif ( error.error === 'error.va.sf-cc-num.02' ) {\n\t\t\t\terror.error = 'Adyen error: ' + error.error + ' on ' + new Date().toString();\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\t// handle component error\n\t\t\tmw.donationInterface.validation.showErrors( {\n\t\t\t\tgeneral: mw.msg( 'donate_interface-error-msg-general' )\n\t\t\t} );\n\t\t}\n\t\tthrow error;\n\t}\n\n\tfunction setLocaleAndTranslations( config, localeFromServer ) {\n\t\t// Adyen supports the locales listed below, according to\n\t\t// https://docs.adyen.com/online-payments/web-components/localization-components#supported-languages\n\t\tvar adyenSupportedLocale = [\n\t\t\t'zh-CN', 'zh-TW', 'hr-HR', 'cs-CZ',\n\t\t\t'da-DK', 'nl-NL', 'en-US', 'fi-FI',\n\t\t\t'fr-FR', 'de-DE', 'el-GR', 'hu-HU',\n\t\t\t'it-IT', 'ja-JP', 'ko-KR', 'no-NO',\n\t\t\t'pl-PL', 'pt-BR', 'ro-RO', 'ru-RU',\n\t\t\t'sk-SK', 'sl-SL', 'es-ES', 'sv-SE'\n\t\t], baseLocaleFromServer = localeFromServer.slice( 0, 2 );\n\n\t\t// We support Norwegian Bokmal (nb) but Adyen's components just support the generic 'no' Norwegian code\n\t\tif ( baseLocaleFromServer === 'nb' ) {\n\t\t\tconfig.locale = 'no-NO';\n\t\t} else {\n\t\t\tconfig.locale = localeFromServer;\n\t\t}\n\n\t\tconfig.translations = {};\n\t\t// Check if donor's language is unsupported by Adyen and we need to provide our own customized translation\n\t\t// Adyen supports ar as Arabic - International and doesn't check the country part\n\t\tif ( baseLocaleFromServer !== 'ar' && adyenSupportedLocale.indexOf( config.locale ) === -1 ) {\n\t\t\tconfig.translations[ config.locale ] = {\n\t\t\t\t//title\n\t\t\t\t'creditCard.numberField.title': mw.msg( 'donate_interface-credit-card-number' ),\n\t\t\t\t'creditCard.expiryDateField.title': mw.msg( 'donate_interface-credit-card-expiration' ),\n\t\t\t\t'creditCard.cvcField.title': mw.msg( 'donate_interface-cvv' ),\n\t\t\t\t//placeholder\n\t\t\t\t'creditCard.expiryDateField.placeholder': mw.msg( 'donate_interface-expiry-date-field-placeholder' ),\n\t\t\t\t'creditCard.cvcField.placeholder.3digits': mw.msg( 'donate_interface-cvv-placeholder-3-digits' ),\n\t\t\t\t'creditCard.cvcField.placeholder.4digits': mw.msg( 'donate_interface-cvv-placeholder-4-digits' ),\n\t\t\t\t//error\n\t\t\t\t'creditCard.numberField.invalid': mw.msg( 'donate_interface-error-msg-invalid-card-number' ),\n\t\t\t\t'creditCard.expiryDateField.invalid': mw.msg( 'donate_interface-error-msg-expiry-date-field-invalid' ),\n\t\t\t\t'error.va.gen.01': mw.msg( 'donate_interface-error-msg-incomplete-field' ),\n\t\t\t\t'error.va.gen.02': mw.msg( 'donate_interface-error-msg-field-not-valid' ),\n\t\t\t\t'error.va.sf-cc-num.01': mw.msg( 'donate_interface-error-msg-invalid-card-number' ),\n\t\t\t\t'error.va.sf-cc-num.02': mw.msg( 'donate_interface-error-msg-card-number-do-not-match-card-brand' ),\n\t\t\t\t'error.va.sf-cc-num.03': mw.msg( 'donate_interface-error-msg-unsupported-card-entered' ),\n\t\t\t\t'error.va.sf-cc-dat.01': mw.msg( 'donate_interface-error-msg-card-too-old' ),\n\t\t\t\t'error.va.sf-cc-dat.02': mw.msg( 'donate_interface-error-msg-date-too-far-in-the-future' )\n\t\t\t};\n\t\t} else if ( config.locale === 'nl-NL' ) {\n\t\t\tconfig.translations[ config.locale ] = {\n\t\t\t\t'idealIssuer.selectField.placeholder': mw.msg( 'donate_interface-rtbt-issuer_id' )\n\t\t\t};\n\t\t} else if ( language === 'ja' ) {\n\t\t\tconfig.translations[ config.locale ] = {\n\t\t\t\t'creditCard.expiryDateField.placeholder': mw.msg( 'donate_interface-expiry-date-field-placeholder' )\n\t\t\t};\n\t\t} else {\n\t\t\tconfig.translations[ config.locale ] = {};\n\t\t}\n\n\t\t// Allow other scripts (e.g. variants) to provide more translations to the Adyen components\n\t\tif ( mw.donationInterface.extraTranslations ) {\n\t\t\t$.extend( config.translations[ config.locale ], mw.donationInterface.extraTranslations );\n\t\t}\n\t}\n\n\t/**\n\t * Runs as soon as the external Adyen checkout script is loaded\n\t */\n\tfunction setup() {\n\t\tvar component_type,\n\t\t\tconfig,\n\t\t\tcontainerName = 'component-container',\n\t\t\toldShowErrors,\n\t\t\tcheckoutPromise;\n\n\t\tif ( !configFromServer ) {\n\t\t\t// If the configuration has not been passed from the server, we are likely on the\n\t\t\t// ResultSwitcher page and have just been loaded incidentally to make a form for\n\t\t\t// a backdrop of the monthly convert popup. As the rest of this function is only\n\t\t\t// needed to set up payment widgets which will not be needed here, just quit.\n\t\t\t// It might be better to stop loading adyen.js in that situation, but that's a\n\t\t\t// bigger refactor than we want to do right now.\n\t\t\treturn;\n\t\t}\n\n\t\tcomponent_type = mapPaymentMethodToComponentType( payment_method );\n\n\t\t// Drop in the adyen components placeholder container\n\t\t$( '.submethods' ).before(\n\t\t\t'<div id=\"' + containerName + '\" />'\n\t\t).before(\n\t\t\t'<div id=\"action-container\" />'\n\t\t);\n\n\t\t// add name placeholder for ja JP\n\t\tif ( language === 'ja' ) {\n\t\t\t$( '#last_name' ).attr( 'placeholder', '鈴木' );\n\t\t\t$( '#first_name' ).attr( 'placeholder', '太郎' );\n\t\t}\n\n\t\t// Override validation's showErrors function to add error\n\t\t// highlights to the outer div around the secure field iframe.\n\t\t// FIXME: cleaner object-oriented JS with inheritance would\n\t\t// make this prettier. See https://phabricator.wikimedia.org/T293287\n\t\toldShowErrors = mw.donationInterface.validation.showErrors;\n\t\tmw.donationInterface.validation.showErrors = function ( errors ) {\n\t\t\tvar adyenFieldName;\n\t\t\t$.each( errors, function ( field ) {\n\t\t\t\tadyenFieldName = false;\n\t\t\t\tif ( field === 'card_num' || field === 'encrypted_card_number' ) {\n\t\t\t\t\tadyenFieldName = 'encryptedCardNumber';\n\t\t\t\t} else if ( field === 'encrypted_expiry_month' || field === 'encrypted_expiry_year' ) {\n\t\t\t\t\tadyenFieldName = 'encryptedExpiryDate';\n\t\t\t\t} else if ( field === 'cvv' ) {\n\t\t\t\t\tadyenFieldName = 'encryptedSecurityCode';\n\t\t\t\t}\n\t\t\t\tif ( adyenFieldName ) {\n\t\t\t\t\t$( 'span[data-cse=' + adyenFieldName + ']' )\n\t\t\t\t\t\t.closest( '.adyen-checkout__input-wrapper' )\n\t\t\t\t\t\t.addClass( 'errorHighlight' );\n\t\t\t\t}\n\t\t\t} );\n\t\t\toldShowErrors( errors );\n\t\t};\n\n\t\t// Copy values to leave the mw.config setting untouched\n\t\tconfig = {\n\t\t\tclientKey: configFromServer.clientKey,\n\t\t\tenvironment: configFromServer.environment,\n\t\t\tpaymentMethodsResponse: configFromServer.paymentMethodsResponse\n\t\t};\n\n\t\tsetLocaleAndTranslations( config, configFromServer.locale );\n\n\t\tcheckoutPromise = getCheckout( config );\n\t\tcheckoutPromise.then( function ( checkoutObject ) {\n\t\t\tcheckout = checkoutObject;\n\t\t\tcreateAndMountComponent( config, component_type, containerName );\n\t\t} );\n\t}\n\n\tfunction createAndMountComponent( config, component_type, containerName ) {\n\t\tvar component_config = getComponentConfig( component_type, config ),\n\t\t\tcomponent = checkout.create( component_type, component_config );\n\n\t\tif ( component_type === GOOGLEPAY_COMPONENT_TYPE ) {\n\t\t\tcomponent.isAvailable().then( function () {\n\t\t\t\tcomponent.mount( '#' + containerName );\n\t\t\t} ).catch( function () {\n\t\t\t\tmw.donationInterface.validation.showErrors( {\n\t\t\t\t\tgeneral: mw.message(\n\t\t\t\t\t\t'donate_interface-error-msg-google_pay_unsupported',\n\t\t\t\t\t\tmw.config.get( 'DonationInterfaceOtherWaysURL' )\n\t\t\t\t\t).plain()\n\t\t\t\t} );\n\t\t\t} );\n\t\t\t// For Google Pay, we need contact data from the onAuthorized event and token\n\t\t\t// data from the onSubmit event before we can make our MediaWiki API call.\n\t\t\tPromise.all( [ submitPromise, authPromise ] ).then( function ( values ) {\n\t\t\t\tvar extraData = values[ 1 ];\n\t\t\t\textraData.payment_token = values[ 0 ];\n\t\t\t\tmw.donationInterface.forms.callDonateApi(\n\t\t\t\t\thandleApiResult, extraData, 'di_donate_adyen'\n\t\t\t\t);\n\t\t\t} ).catch( function ( err ) {\n\t\t\t\tmw.donationInterface.validation.showErrors( {\n\t\t\t\t\tgeneral: mw.msg( 'donate_interface-error-msg-general' )\n\t\t\t\t} );\n\t\t\t\t// Let error bubble up to window.onerror handler so the errorLog\n\t\t\t\t// module sends it to our client-side logging endpoint.\n\t\t\t\tthrow err;\n\t\t\t} );\n\t\t} else if ( component_type === 'applepay' ) {\n\t\t\tcomponent.isAvailable().then( function () {\n\t\t\t\tcomponent.mount( '#' + containerName );\n\t\t\t} ).catch( function () {\n\t\t\t\tmw.donationInterface.validation.showErrors( {\n\t\t\t\t\tgeneral: mw.message(\n\t\t\t\t\t\t'donate_interface-error-msg-apple_pay_unsupported',\n\t\t\t\t\t\tmw.config.get( 'DonationInterfaceOtherWaysURL' )\n\t\t\t\t\t).plain()\n\t\t\t\t} );\n\t\t\t} );\n\t\t\t// For Apple Pay, we need contact data from the onAuthorized event and token\n\t\t\t// data from the onSubmit event before we can make our MediaWiki API call.\n\t\t\tPromise.all( [ submitPromise, authPromise ] ).then( function ( values ) {\n\t\t\t\tvar extraData = values[ 1 ];\n\t\t\t\textraData.payment_token = values[ 0 ];\n\t\t\t\tmw.donationInterface.forms.callDonateApi(\n\t\t\t\t\thandleApiResult, extraData, 'di_donate_adyen'\n\t\t\t\t);\n\t\t\t} ).catch( function ( err ) {\n\t\t\t\tmw.donationInterface.validation.showErrors( {\n\t\t\t\t\tgeneral: mw.msg( 'donate_interface-error-msg-general' )\n\t\t\t\t} );\n\t\t\t\t// Let error bubble up to window.onerror handler so the errorLog\n\t\t\t\t// module sends it to our client-side logging endpoint.\n\t\t\t\tthrow err;\n\t\t\t} );\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tcomponent.mount( '#' + containerName );\n\t\t\t} catch ( err ) {\n\t\t\t\tmw.donationInterface.validation.showErrors( {\n\t\t\t\t\tgeneral: mw.msg( 'donate_interface-error-msg-general' )\n\t\t\t\t} );\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\t// For everything except Apple and google\n\t\t\t// Pay, show our standard 'Donate' button\n\t\t\t$( '#paymentSubmit' ).show();\n\t\t\t$( '#paymentSubmitBtn' ).click( mw.util.debounce( function ( evt ) {\n\t\t\t\tcomponent.submit( evt );\n\t\t\t}, 100 ) );\n\t\t}\n\t}\n\n\t/**\n\t * On documentready we create a script tag and wire it up to run setup as soon as it\n\t * is loaded, or to show an error message if the external script can't be loaded.\n\t * The script should already be mostly or completely preloaded at this point, thanks\n\t * to a <link rel=preload> we add in AdyenCheckoutGateway::addGatewaySpecificResources\n\t */\n\n\tfunction loadScript( type ) {\n\t\tvar scriptNode = document.createElement( 'script' );\n\t\tscriptNode.onerror = function () {\n\t\t\tmw.donationInterface.validation.showErrors(\n\t\t\t\t{ general: 'Could not load payment provider Javascript. Please reload or try again later.' }\n\t\t\t);\n\t\t};\n\t\tif ( type === 'adyen' ) {\n\t\t\tscriptNode.onload = setup;\n\t\t\tscriptNode.crossOrigin = 'anonymous';\n\t\t\tscriptNode.integrity = configFromServer.script.integrity;\n\t\t\tscriptNode.src = configFromServer.script.src;\n\t\t} else {\n\t\t\tscriptNode.src = configFromServer.googleScript;\n\t\t}\n\n\t\tdocument.body.append( scriptNode );\n\t}\n\n\t$( function () {\n\t\tif ( payment_method === 'google' ) {\n\t\t\tloadScript( 'google' );\n\t\t}\n\t\tloadScript( 'adyen' );\n\t} );\n} )( jQuery, mediaWiki );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/amazon_gateway/amazon.js","messages":[{"ruleId":"prefer-regex-literals","severity":1,"message":"Use a regular expression literal instead of the 'RegExp' constructor.","line":14,"column":23,"nodeType":"NewExpression","messageId":"unexpectedRegExp","endLine":14,"endColumn":44,"suggestions":[{"messageId":"replaceWithLiteral","fix":{"range":[598,619],"text":"/^Atza/"},"desc":"Replace with an equivalent regular expression literal."}]},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":39,"column":14,"nodeType":"NewExpression","endLine":39,"endColumn":35},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":268,"column":8,"nodeType":"CallExpression","endLine":268,"endColumn":45}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*global amazon:true, OffAmazonPayments:true*/\n( function ( $, mw ) {\n\tvar clientId = mw.config.get( 'wgAmazonGatewayClientID' ),\n\t\tsellerId = mw.config.get( 'wgAmazonGatewaySellerID' ),\n\t\tsandbox = mw.config.get( 'wgAmazonGatewaySandbox' ),\n\t\treturnUrl = mw.config.get( 'wgAmazonGatewayReturnURL' ),\n\t\twidgetScript = mw.config.get( 'wgAmazonGatewayWidgetScript' ),\n\t\tloginScript = mw.config.get( 'wgAmazonGatewayLoginScript' ),\n\t\tfailPage = mw.config.get( 'wgAmazonGatewayFailPage' ),\n\t\tisRecurring = $( '#recurring' ).val(),\n\t\tloggedIn = false,\n\t\tloginError,\n\t\taccessToken,\n\t\tvalidTokenPattern = new RegExp( '^Atza' ),\n\t\tbillingAgreementId,\n\t\torderReferenceId,\n\t\trecurConsentGranted = false,\n\t\tcardSelected = false,\n\t\tcardSelectTimeout,\n\t\t// If no card selected after this long, show link to other ways to give\n\t\t// in case the donor has no cards registered with Amazon\n\t\tCARD_SELECT_DELAY = 5000;\n\n\t$( function () {\n\t\t// Add a couple divs to hold the widgets\n\t\t$( '.submethods' ).before(\n\t\t\t'<div id=\"consentWidget\" />' +\n\t\t\t'<div id=\"walletWidget\" />' +\n\t\t\t'<div id=\"amazonLogin\" />'\n\t\t);\n\t\t// Set the click handler\n\t\t$( '#paymentSubmitBtn' ).click( submitPayment );\n\t} );\n\n\t// Adapted from Amazon documentation, will get parameters from fragment as\n\t// well as querystring and accepts Amazon's custom delimiters\n\tfunction getURLParameter( name, source ) {\n\t\tvar pattern = '[?&#]' + name + '=([^&;#]*)',\n\t\t\tmatches = new RegExp( pattern ).exec( source ) || [ '', '' ],\n\t\t\tvalue = matches[ 1 ].replace( /\\+/g, '%20' );\n\n\t\treturn decodeURIComponent( value ) || null;\n\t}\n\n\tfunction loadScript( url ) {\n\t\tvar a = document.createElement( 'script' );\n\t\ta.type = 'text/javascript';\n\t\ta.async = true;\n\t\ta.src = url;\n\t\tdocument.head.appendChild( a );\n\t}\n\n\tfunction redirectToLogin() {\n\t\t$( '#overlay' ).show();\n\t\tvar loginOptions = {\n\t\t\tscope: 'payments:widget',\n\t\t\tpopup: false\n\t\t};\n\t\tamazon.Login.authorize( loginOptions, returnUrl );\n\t}\n\n\tfunction addErrorMessage( message ) {\n\t\t$( '#topError' ).append(\n\t\t\t$( '<p class=\"error\">' + message + '</p>' )\n\t\t);\n\t\t$( '#errorReference' )\n\t\t\t.removeClass( 'errorMsgHide' )\n\t\t\t.addClass( 'errorMsg' );\n\t}\n\n\tfunction reloadPage() {\n\t\tvar qsParams = $( '#payment-form' ).serializeArray();\n\t\tdocument.location.replace( mw.util.getUrl( 'Special:AmazonGateway', qsParams ) );\n\t}\n\n\tfunction showErrorAndLoginButton( message ) {\n\t\tif ( message ) {\n\t\t\taddErrorMessage( message );\n\t\t}\n\t\tOffAmazonPayments.Button(\n\t\t\t'amazonLogin',\n\t\t\tsellerId,\n\t\t\t{\n\t\t\t\ttype: 'PwA',\n\t\t\t\tcolor: 'Gold',\n\t\t\t\tsize: 'large',\n\t\t\t\tauthorization: reloadPage\n\t\t\t}\n\t\t);\n\t}\n\n\tfunction tokenExpired() {\n\t\t// Re-create widget so it displays timeout error message\n\t\tcreateWalletWidget();\n\t\tshowErrorAndLoginButton();\n\t}\n\n\taccessToken = getURLParameter( 'access_token', location.hash );\n\tloginError = getURLParameter( 'error', location.search );\n\n\t// This will be called as soon as the login script is loaded\n\twindow.onAmazonLoginReady = function () {\n\n\t\tamazon.Login.setClientId( clientId );\n\t\tamazon.Login.setUseCookie( true );\n\t\tamazon.Login.setSandboxMode( sandbox );\n\t\tif ( !loggedIn ) {\n\t\t\tif ( loginError ) {\n\t\t\t\tshowErrorAndLoginButton(\n\t\t\t\t\tgetURLParameter( 'error_description', location.search )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tredirectToLogin();\n\t\t\t}\n\t\t}\n\t};\n\n\twindow.onAmazonPaymentsReady = function () {\n\t\tvar tokenLifetime;\n\t\tif ( loggedIn ) {\n\t\t\ttokenLifetime = parseInt( getURLParameter( 'expires_in', location.hash ), 10 );\n\t\t\tcreateWalletWidget();\n\t\t\tsetTimeout( tokenExpired, tokenLifetime * 1000 );\n\t\t}\n\t};\n\n\tif ( typeof accessToken === 'string' && accessToken.match( validTokenPattern ) ) {\n\t\t// Payment widgets need this cookie\n\t\tdocument.cookie = 'amazon_Login_accessToken=' + accessToken + ';secure';\n\t\tloggedIn = true;\n\t\tloadScript( widgetScript ); // This will load the login script for you\n\t} else {\n\t\tif ( loginError ) {\n\t\t\t// Load the full widget script to display a button\n\t\t\tloadScript( widgetScript );\n\t\t} else {\n\t\t\t// The first time around, only load the login script.\n\t\t\tloadScript( loginScript );\n\t\t}\n\t}\n\n\tfunction showOtherWaysLink() {\n\t\tvar url = mw.config.get( 'wgAmazonGatewayOtherWaysURL' ),\n\t\t\ttext = mw.message( 'donate_interface-otherways-short' );\n\t\taddErrorMessage( '<a href=\"' + url + '\">' + text + '</a>' );\n\t}\n\n\tfunction setSubmitVisibility() {\n\t\tvar show = true;\n\t\tif ( !cardSelected ) {\n\t\t\tshow = false;\n\t\t}\n\t\tif ( isRecurring && !recurConsentGranted ) {\n\t\t\tshow = false;\n\t\t}\n\t\tif ( show ) {\n\t\t\t$( '#paymentSubmit' ).show();\n\t\t} else {\n\t\t\t$( '#paymentSubmit' ).hide();\n\t\t}\n\t}\n\n\tfunction createWalletWidget() {\n\t\tvar params = {\n\t\t\tsellerId: sellerId,\n\t\t\tonReady: function ( billingAgreement ) {\n\t\t\t\tif ( !cardSelected ) {\n\t\t\t\t\tcardSelectTimeout = setTimeout( showOtherWaysLink, CARD_SELECT_DELAY );\n\t\t\t\t}\n\t\t\t\tif ( !billingAgreementId ) {\n\t\t\t\t\tbillingAgreementId = billingAgreement.getAmazonBillingAgreementId();\n\t\t\t\t\tif ( isRecurring ) {\n\t\t\t\t\t\tcreateConsentWidget();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tagreementType: isRecurring ? 'BillingAgreement' : 'OrderReference',\n\t\t\tonOrderReferenceCreate: function ( orderReference ) {\n\t\t\t\tif ( orderReferenceId ) {\n\t\t\t\t\t// Redisplaying for an existing order, no need to continue\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\torderReferenceId = orderReference.getAmazonOrderReferenceId();\n\t\t\t},\n\t\t\tonPaymentSelect: function () {\n\t\t\t\tif ( !cardSelected ) {\n\t\t\t\t\tcardSelected = true;\n\t\t\t\t\tsetSubmitVisibility();\n\t\t\t\t}\n\t\t\t\tif ( cardSelectTimeout ) {\n\t\t\t\t\tclearTimeout( cardSelectTimeout );\n\t\t\t\t\tcardSelectTimeout = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdesign: {\n\t\t\t\tdesignMode: 'responsive'\n\t\t\t},\n\t\t\tonError: function ( error ) {\n\t\t\t\t// Error message appears directly in widget\n\t\t\t\tshowErrorAndLoginButton();\n\t\t\t}\n\t\t};\n\t\t// If we are refreshing the widget to display a correctable error,\n\t\t// we need to set the Amazon order reference ID for continuity\n\t\tif ( orderReferenceId ) {\n\t\t\tparams.amazonOrderReferenceId = orderReferenceId;\n\t\t}\n\t\tif ( billingAgreementId ) {\n\t\t\tparams.amazonBillingAgreementId = billingAgreementId;\n\t\t}\n\t\tnew OffAmazonPayments.Widgets.Wallet( params ).bind( 'walletWidget' );\n\t}\n\n\tfunction handleConsentStatus( billingAgreementConsentStatus ) {\n\t\t// getConsentStatus returns a string for some reason\n\t\trecurConsentGranted =\n\t\t\t( billingAgreementConsentStatus.getConsentStatus() === 'true' );\n\t\tsetSubmitVisibility();\n\t}\n\n\tfunction createConsentWidget() {\n\t\tvar params = {\n\t\t\tsellerId: sellerId,\n\t\t\tamazonBillingAgreementId: billingAgreementId,\n\t\t\tdesign: {\n\t\t\t\tdesignMode: 'responsive'\n\t\t\t},\n\t\t\tonReady: handleConsentStatus,\n\t\t\tonConsent: handleConsentStatus,\n\t\t\tonError: function ( error ) {\n\t\t\t\tshowErrorAndLoginButton();\n\t\t\t}\n\t\t};\n\t\t$( '#consentWidget' ).show();\n\t\tnew OffAmazonPayments.Widgets.Consent( params ).bind( 'consentWidget' );\n\t}\n\n\tfunction handleErrors( errors ) {\n\t\tvar code,\n\t\t\trefreshWallet = false;\n\n\t\tfor ( code in errors ) {\n\t\t\tif ( !Object.prototype.hasOwnProperty.call( errors, code ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( code === 'token-mismatch' ) {\n\t\t\t\t// Session has expired, we need to reload the whole page.\n\t\t\t\t// FIXME: something nicer than an alert box\n\t\t\t\talert( errors[ code ] );\n\t\t\t\treloadPage();\n\t\t\t}\n\t\t\taddErrorMessage( errors[ code ] );\n\t\t\tif ( code === 'InvalidPaymentMethod' ) {\n\t\t\t\t// Card declined, but they can try another\n\t\t\t\trefreshWallet = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( refreshWallet ) {\n\t\t\t// Redisplay the widget to show an error and let the donor pick a different card\n\t\t\tcardSelected = false;\n\t\t\tsetSubmitVisibility();\n\t\t\tcreateWalletWidget();\n\t\t}\n\t}\n\n\tfunction lockDonationAmount() {\n\t\tif ( $( '#amount_input' ).is( ':visible' ) ) {\n\t\t\t$( '#amount_input' ).hide();\n\t\t\t$( '#selected-amount' )\n\t\t\t\t.text( $( '#amount' ).val() + ' ' + $( '#currency' ).val() )\n\t\t\t\t.show();\n\t\t}\n\t}\n\n\tfunction submitPayment() {\n\t\tif ( !mw.donationInterface.validation.validateAmount() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( !cardSelected ) {\n\t\t\tshowOtherWaysLink();\n\t\t\treturn;\n\t\t}\n\t\tif ( isRecurring && !recurConsentGranted ) {\n\t\t\t//TODO: error message\n\t\t\treturn;\n\t\t}\n\t\t$( '#topError' ).html( '' );\n\t\t$( '#errorReference' )\n\t\t\t.removeClass( 'errorMsg' )\n\t\t\t.addClass( 'errorMsgHide' );\n\t\t$( '#overlay' ).show();\n\t\tlockDonationAmount();\n\t\tvar postdata = {\n\t\t\taction: 'di_amazon_bill',\n\t\t\tformat: 'json',\n\t\t\trecurring: isRecurring,\n\t\t\tamount: $( '#amount' ).val(),\n\t\t\tcurrency: $( '#currency' ).val(),\n\t\t\twmf_token: $( '#wmf_token' ).val()\n\t\t};\n\n\t\tif ( isRecurring ) {\n\t\t\tpostdata.billingAgreementId = billingAgreementId;\n\t\t} else {\n\t\t\tpostdata.orderReferenceId = orderReferenceId;\n\t\t}\n\n\t\t$.ajax( {\n\t\t\turl: mw.util.wikiScript( 'api' ),\n\t\t\tdata: postdata,\n\t\t\tdataType: 'json',\n\t\t\ttype: 'POST',\n\t\t\tsuccess: function ( data ) {\n\t\t\t\tif ( data.errors ) {\n\t\t\t\t\t$( '#overlay' ).hide();\n\t\t\t\t\thandleErrors( data.errors );\n\t\t\t\t} else if ( data.redirect ) {\n\t\t\t\t\tlocation.href = data.redirect;\n\t\t\t\t} else {\n\t\t\t\t\tlocation.href = failPage;\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function () {\n\t\t\t\tlocation.href = failPage;\n\t\t\t}\n\t\t} );\n\t}\n} )( jQuery, mediaWiki );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/braintree_gateway/forms/braintree.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/dlocal_gateway/forms/dlocal.js","messages":[{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":306,"column":12,"nodeType":"NewExpression","endLine":306,"endColumn":97}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*global dlocal:true*/\n( function ( $, mw ) {\n\tvar country = $( '#country' ).val(),\n\t\textraData = {},\n\t\tisRecurring = !!$( '#recurring' ).val(),\n\t\tisIndia = ( country === 'IN' );\n\n\tfunction handleApiResult( result ) {\n\t\tif ( result.isFailed ) {\n\t\t\tmw.donationInterface.validation.showErrors( {\n\t\t\t\tgeneral: mw.msg( 'donate_interface-error-msg-general' )\n\t\t\t} );\n\t\t} else if ( mw.monthlyConvert && mw.monthlyConvert.canShowModal() ) {\n\t\t\tmw.monthlyConvert.init();\n\t\t} else if ( result.redirect ) {\n\t\t\tdocument.location.replace( result.redirect );\n\t\t} else {\n\t\t\tdocument.location.replace( mw.config.get( 'DonationInterfaceThankYouPage' ) );\n\t\t}\n\t}\n\n\tfunction showPaymentSubmit() {\n\t\t$( '#paymentSubmit' ).show();\n\t}\n\n\tfunction setupCardForm() {\n\t\tvar dlocalInstance = dlocal( mw.config.get( 'wgDlocalSmartFieldApiKey' ) ),\n\t\t\tfields = dlocalInstance.fields( {\n\t\t\t\tlocale: mapLang( $( '#language' ).val() ),\n\t\t\t\tcountry: country\n\t\t\t} ),\n\t\t\t// Custom styling can be passed to options when creating a Smart Field.\n\t\t\tcommonStyle = getCardCommonStyle(),\n\t\t\tcardField,\n\t\t\tcardFieldError = false,\n\t\t\tcardFieldSupportError = false,\n\t\t\tcardFieldEmpty = true,\n\t\t\texpirationField,\n\t\t\texpirationFieldError = false,\n\t\t\texpirationFieldEmpty = true,\n\t\t\tcvvField,\n\t\t\tcvvFieldError = false,\n\t\t\tcvvFieldEmpty = true;\n\n\t\tinsertBrazilRecurringAdvice();\n\t\taddCardFieldsToErrorDisplay();\n\n\t\t// create card fields and add events\n\t\tcardField = fields.create( 'pan', {\n\t\t\tstyle: commonStyle,\n\t\t\tplaceholder: '4111 1111 1111 1111'\n\t\t} );\n\t\taddCardFieldEvents();\n\n\t\texpirationField = fields.create( 'expiration', {\n\t\t\tstyle: commonStyle,\n\t\t\tplaceholder: mw.msg( 'donate_interface-expiry-date-field-placeholder' )\n\t\t} );\n\t\taddExpirationFieldEvents();\n\n\t\tcvvField = fields.create( 'cvv', {\n\t\t\tstyle: commonStyle,\n\t\t\tplaceholder: '123',\n\t\t\tmaskInput: true\n\t\t} );\n\t\taddCvvFieldEvents();\n\n\t\t// Show our standard 'Donate' button\n\t\tshowPaymentSubmit();\n\t\t// Set the click handler\n\t\t// Using debounce to prevent the programmatic trigger of multiple instances of the submit function\n\t\t$( '#paymentSubmitBtn' ).click( mw.util.debounce( handleCardSubmitClick, 100 ) );\n\n\t\t// Drop in the dlocal card components placeholder\n\t\tinsertCardComponentContainers();\n\n\t\tcardField.mount( document.getElementById( 'cardNumber' ) );\n\t\texpirationField.mount( document.getElementById( 'expiration' ) );\n\t\tcvvField.mount( document.getElementById( 'cvv' ) );\n\n\t\tfunction addCardFieldEvents() {\n\t\t\tcardField.addEventListener( 'change', function ( event ) {\n\t\t\t\tcardFieldError = !!event.error;\n\t\t\t\tif ( event.error ) {\n\t\t\t\t\t$( '#cardNumberErrorMsg' ).text( mw.msg( 'donate_interface-error-msg-unsupported-card-entered' ) );\n\t\t\t\t} else {\n\t\t\t\t\t$( '#cardNumberErrorMsg' ).text( '' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tcardField.on( 'blur', function ( event ) {\n\t\t\t\tcardFieldEmpty = event.empty;\n\t\t\t} );\n\n\t\t\tcardField.on( 'brand', function ( event ) {\n\t\t\t\t// after input 6 number, ready to check bin\n\t\t\t\tif ( event.brand ) {\n\t\t\t\t\tdlocalInstance.getBinInformation( cardField ).then( function ( res ) {\n\t\t\t\t\t\tvar binInfoCardBrand = res.brand;\n\t\t\t\t\t\tvar cardBrand = mw.config.get( 'codeMap' )[ binInfoCardBrand ];\n\t\t\t\t\t\tif ( cardBrand !== undefined ) {\n\t\t\t\t\t\t\tcardFieldSupportError = false;\n\t\t\t\t\t\t\textraData.payment_submethod = cardBrand;\n\t\t\t\t\t\t\t$( '#cardNumberErrorMsg' ).text( '' );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcardFieldSupportError = true;\n\t\t\t\t\t\t\t$( '#credit-card-wrapper' ).addClass( 'DlocalField--invalid' );\n\t\t\t\t\t\t\t$( '#cardNumberErrorMsg' ).text( mw.msg( 'donate_interface-error-msg-unsupported-card-entered' ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ).catch( function ( error ) {\n\t\t\t\t\t\t// Suppress bin lookup error.\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tfunction addExpirationFieldEvents() {\n\t\t\texpirationField.addEventListener( 'change', function ( event ) {\n\t\t\t\texpirationFieldError = !!event.error;\n\t\t\t\tif ( event.error ) {\n\t\t\t\t\t$( '#expirationErrorMsg' ).text( mw.msg( 'donate_interface-error-msg-card-too-old' ) );\n\t\t\t\t} else {\n\t\t\t\t\t$( '#expirationErrorMsg' ).text( '' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\texpirationField.on( 'blur', function ( event ) {\n\t\t\t\texpirationFieldEmpty = event.empty;\n\t\t\t} );\n\t\t}\n\n\t\tfunction addCvvFieldEvents() {\n\t\t\tcvvField.addEventListener( 'change', function ( event ) {\n\t\t\t\tcvvFieldError = !!event.error;\n\t\t\t\tif ( event.error ) {\n\t\t\t\t\t$( '#cvvErrorMsg' ).text( mw.msg( 'donate_interface-error-msg-invalid-cvv-format' ) );\n\t\t\t\t} else {\n\t\t\t\t\t$( '#cvvErrorMsg' ).text( '' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tcvvField.on( 'blur', function ( event ) {\n\t\t\t\tcvvFieldEmpty = event.empty;\n\t\t\t} );\n\t\t}\n\n\t\tfunction validateInputs() {\n\t\t\tvar formValid = mw.donationInterface.validation.validate(),\n\t\t\t\tcvvFieldHasErrors = cvvFieldError || cvvFieldEmpty,\n\t\t\t\tcardFieldHasErrors = cardFieldError || cardFieldEmpty || cardFieldSupportError,\n\t\t\t\texpFieldHasErrors = expirationFieldError || expirationFieldEmpty,\n\t\t\t\terrors = {};\n\n\t\t\tif ( !formValid || cvvFieldHasErrors || cardFieldHasErrors || expFieldHasErrors ) {\n\t\t\t\tif ( cardFieldHasErrors ) {\n\t\t\t\t\tif ( cardFieldEmpty ) {\n\t\t\t\t\t\terrors.cardNumber = mw.msg( 'donate_interface-error-msg-card-num' );\n\t\t\t\t\t} else if ( cardFieldSupportError ) {\n\t\t\t\t\t\terrors.cardNumber = mw.msg( 'donate_interface-error-msg-unsupported-card-entered' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors.cardNumber = mw.msg( 'donate_interface-error-msg-invalid-card-number' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( cvvFieldHasErrors ) {\n\t\t\t\t\tif ( cvvFieldEmpty ) {\n\t\t\t\t\t\terrors.cvv = mw.msg( 'donate_interface-error-msg-cvv' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors.cvv = mw.msg( 'donate_interface-error-msg-invalid-cvv-format' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( expFieldHasErrors ) {\n\t\t\t\t\tif ( expirationFieldEmpty ) {\n\t\t\t\t\t\terrors.expiration = mw.msg( 'donate_interface-error-msg-expiration' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors.expiration = mw.msg( 'donate_interface-error-msg-card-too-old' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmw.donationInterface.validation.showErrors( errors );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tfunction handleCardSubmitClick( event ) {\n\t\t\tif ( $( this ).is( ':disabled' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tmw.donationInterface.forms.disable();\n\n\t\t\tif ( validateInputs() ) {\n\t\t\t\tdlocalInstance.createToken( cardField, {\n\t\t\t\t\tname: $( '#first_name' ).val() + ' ' + $( '#last_name' ).val()\n\t\t\t\t} ).then( function ( result ) {\n\t\t\t\t\t// Send the token to your server.\n\t\t\t\t\textraData.fiscal_number = $( '#fiscal_number' ).val();\n\t\t\t\t\textraData.payment_token = result.token;\n\t\t\t\t\tmw.donationInterface.forms.callDonateApi(\n\t\t\t\t\t\thandleApiResult,\n\t\t\t\t\t\textraData,\n\t\t\t\t\t\t'di_donate_dlocal'\n\t\t\t\t\t);\n\t\t\t\t} ).catch( function ( result ) {\n\t\t\t\t\tif ( result.error ) {\n\t\t\t\t\t\tmw.donationInterface.validation.showErrors( {\n\t\t\t\t\t\t\tgeneral: mw.msg( 'donate_interface-error-msg-general' )\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Helper functions for card form setup that do not need to be inside the setup function's scope\n\tfunction insertBrazilRecurringAdvice() {\n\t\tif ( country === 'BR' && isRecurring ) {\n\t\t\t$( '.submethods' ).before( $( '<p>' +\n\t\t\t\tmw.msg( 'donate_interface-monthly-only-credit' ) +\n\t\t\t\t'</p>' ) );\n\t\t}\n\t}\n\n\t// https://docs.dlocal.com/reference/the-dlocal-object#dlocalfieldsoptions\n\t// Supported values are: es, en, pt, zh, cv, tr.\n\tfunction mapLang( wikiLang ) {\n\t\tif ( wikiLang === 'es-419' ) {\n\t\t\treturn 'es';\n\t\t} else if ( [ 'es', 'en', 'pt', 'zh', 'cv', 'tr' ].indexOf( wikiLang ) !== -1 ) {\n\t\t\treturn wikiLang;\n\t\t} else {\n\t\t\t// todo: maybe display an error, or just default en?\n\t\t\treturn 'en';\n\t\t}\n\t}\n\n\tfunction addCardFieldsToErrorDisplay() {\n\t\tvar oldShowErrors = mw.donationInterface.validation.showErrors;\n\t\tmw.donationInterface.validation.showErrors = function ( errors ) {\n\t\t\tmw.donationInterface.forms.enable();\n\t\t\tvar dLocalFields = [ 'cardNumber', 'expiration', 'cvv' ];\n\t\t\t$.each( errors, function ( field ) {\n\t\t\t\tif ( dLocalFields.indexOf( field ) !== -1 ) {\n\t\t\t\t\t$( '#' + field ).find( '.DlocalField' ).addClass( 'DlocalField--invalid' );\n\t\t\t\t\t$( '#' + field + 'ErrorMsg' ).text( errors[ field ] );\n\t\t\t\t\tdelete errors[ field ];\n\t\t\t\t}\n\t\t\t} );\n\t\t\toldShowErrors( errors );\n\t\t};\n\t}\n\n\tfunction insertCardComponentContainers() {\n\t\t$( '.submethods' ).before(\n\t\t\t'<div>' +\n\t\t\t'<label for=\"cardNumber\">' + mw.message( 'donate_interface-donor-card-num' ) + '</label>' +\n\t\t\t'<div id=\"cardNumber\" ></div>' +\n\t\t\t'<span class=\"DlocalField--invalid-text\" id=\"cardNumberErrorMsg\" />' +\n\t\t\t'</div>' +\n\t\t\t'<div>' +\n\t\t\t'<div class=\"halfwidth\">' +\n\t\t\t'<label for=\"expiration\">' + mw.message( 'donate_interface-donor-expiration' ) + '</label>' +\n\t\t\t'<div id=\"expiration\" ></div>' +\n\t\t\t'<span class=\"DlocalField--invalid-text\" id=\"expirationErrorMsg\"></span>' +\n\t\t\t'</div>' +\n\t\t\t'<div class=\"halfwidth\">' +\n\t\t\t'<label for=\"cvv\">' + mw.message( 'donate_interface-cvv' ) + '</label>' +\n\t\t\t'<div id=\"cvv\"></div>' +\n\t\t\t'<span class=\"DlocalField--invalid-text\" id=\"cvvErrorMsg\"></span>' +\n\t\t\t'</div>' +\n\t\t\t'</div>'\n\t\t);\n\t}\n\n\tfunction getCardCommonStyle() {\n\t\treturn {\n\t\t\tbase: {\n\t\t\t\tfontSize: '14px',\n\t\t\t\t\tfontFamily: 'sans-serif',\n\t\t\t\t\tlineHeight: '40px',\n\t\t\t\t\tfontSmoothing: 'antialiased',\n\t\t\t\t\tfontWeight: '500',\n\t\t\t\t\tcolor: 'rgb(0, 17, 44)',\n\t\t\t\t\t'::placeholder': {\n\t\t\t\t\tcolor: 'rgb(185, 196, 201)'\n\t\t\t\t}\n\t\t\t},\n\t\t\tfocus: {\n\t\t\t\ticonColor: '#adbfd3',\n\t\t\t\t\t'::placeholder': {\n\t\t\t\t\tcolor: '#adbfd3'\n\t\t\t\t}\n\t\t\t},\n\t\t\tautofilled: {\n\t\t\t\tcolor: '#000000'\n\t\t\t},\n\t\t\tinvalid: {\n\t\t\t\tcolor: '#f00'\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction setupNonCardForm() {\n\t\tvar upiRecurringIsOnDemand = mw.config.get( 'isOnDemand' ),\n\t\t\tisDirectPaymentFlow = mw.config.get( 'isDirectPaymentFlow' ),\n\t\t\t// 'paytmwallet' submethod should be treated as the same for upi\n\t\t\tisUpi = new RegExp( '\\\\b' + $( 'input[name=payment_submethod]:checked' ).val() + '\\\\b', 'i' ).test( 'upi paytmwallet' ); // i is case insensitive\n\n\t\tif ( isUpi && isRecurring && upiRecurringIsOnDemand ) {\n\t\t\t// If we are using the ONDEMAND charge frequency, add a note to reassure donors\n\t\t\t// that we will only charge them once a month\n\t\t\t$( '.submethods' ).after( $( '<p>' +\n\t\t\t\tmw.msg( 'donate_interface-charge-monthly-only' ) +\n\t\t\t\t'</p>' ) );\n\t\t}\n\n\t\tif ( isDirectPaymentFlow ) {\n\t\t\t// Show our standard 'Donate' button\n\t\t\tshowPaymentSubmit();\n\t\t\t// only non-recurring upi is direct, and it must IN and bt, so no needs to check those two val\n\t\t\tif ( isUpi && !isRecurring ) {\n\t\t\t\taddUpiDirectFlowInputField();\n\t\t\t\t// Set the click handler\n\t\t\t\t$( '#paymentSubmitBtn' ).click( mw.util.debounce( handleUpiDirectSubmitClick, 100 ) );\n\t\t\t}\n\t\t} else {\n\t\t\t// Redirect flow\n\t\t\t$( '.submethods' ).after(\n\t\t\t\t$( '<p id=\"redirect-explanation\">' + mw.message( 'donate_interface-redirect-explanation' ) + '</p>' )\n\t\t\t);\n\t\t\tif ( isUpi && !isRecurring ) {\n\t\t\t\t// Redirected one-time UPI payments have an optional phone number field. Add an explanation.\n\t\t\t\t$( '#phone' ).after(\n\t\t\t\t\t$( '<p class=\"explanation\">' + mw.message( 'donate_interface-donor-phone-explain-in' ) + '</p>' )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Support functions for non-card form setup\n\tfunction addUpiDirectFlowInputField() {\n\t\t$( '.submethods' ).before(\n\t\t\t$( '<label for=\"upi_id\">' +\n\t\t\t\tmw.msg( 'donate_interface-bt-upi_id' ) +\n\t\t\t\t'</label>' +\n\t\t\t\t'<input value=\"\" name=\"upi_id\" id=\"upi_id\" />' ) );\n\t}\n\n\tfunction handleUpiDirectSubmitClick( event ) {\n\t\tif ( $( this ).is( ':disabled' ) ) {\n\t\t\treturn;\n\t\t}\n\t\tevent.preventDefault();\n\t\t// Disable submit btn when submitting\n\t\tmw.donationInterface.forms.disable();\n\t\t// get verify\n\t\textraData.fiscal_number = $( '#fiscal_number' ).val();\n\t\textraData.upi_id = $( '#upi_id' ).val();\n\t\tmw.donationInterface.forms.callDonateApi(\n\t\t\thandleApiResult,\n\t\t\textraData,\n\t\t\t'di_donate_dlocal'\n\t\t);\n\t}\n\n\t/**\n\t *  On document ready we create a script tag and wire it up to run setup as soon as it\n\t *  is loaded, or to show an error message if the external script can't be loaded.\n\t *  The script should already be mostly or completely preloaded at this point, thanks\n\t *  to a <link rel=preload> we add in DlocalGateway::execute\n\t */\n\t$( function () {\n\t\tif ( isIndia ) {\n\t\t\t$( '#fiscal_number' ).after(\n\t\t\t\t$( '<input type=\"hidden\" value=\"Mumbai\" name=\"city\" id=\"city\">' +\n\t\t\t\t\t'<p style=\"font-size: 10px\">' + mw.msg( 'donate_interface-donor-fiscal_number-explain-option-in' ) +\n\t\t\t\t\t'</p>' )\n\t\t\t);\n\t\t}\n\t\t// only cc load smart field script and submit button, others show redirect with continue button\n\t\tif ( $( '#payment_method' ).val() === 'cc' ) {\n\t\t\tvar scriptNode = document.createElement( 'script' );\n\t\t\tscriptNode.onload = setupCardForm;\n\t\t\tscriptNode.onerror = function () {\n\t\t\t\tmw.donationInterface.validation.showErrors(\n\t\t\t\t\t{ general: 'Could not load payment provider Javascript. Please reload or try again later.' }\n\t\t\t\t);\n\t\t\t};\n\t\t\tscriptNode.src = mw.config.get( 'dlocalScript' );\n\t\t\tdocument.body.append( scriptNode );\n\t\t} else {\n\t\t\tsetupNonCardForm();\n\t\t}\n\t} );\n} )( jQuery, mediaWiki );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/ingenico_gateway/forms/js/ingenico.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/iframe.liberator.js","messages":[{"ruleId":"no-redeclare","severity":1,"message":"'self' is already defined as a built-in global variable.","line":1,"column":10,"nodeType":"Block","messageId":"redeclaredAsBuiltin","endLine":1,"endColumn":14}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*global self:false */\n$( function () {\n\t// we're going to immediately redirect.\n\t// Hide the page contents (skin, mostly) so it doesn't appear in the iframe while we're waiting for the reload.\n\tjQuery( 'body' ).children().attr( 'style', 'display:none' );\n} );\ntop.location = self.document.location + '&liberated=1';\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.alwaysRedirect.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.emailPreferences.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.employerAutoComplete.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.employerExplain.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.employerExplainAlt.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.errorLog.js","messages":[{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":10,"column":26,"nodeType":"NewExpression","endLine":10,"endColumn":59}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function ( $, mw ) {\n\tvar apiAction = mw.config.get( 'ClientErrorLogAction', 'logPaymentsFormError' ),\n\t\tignorePatterns = mw.config.get( 'wgDonationInterfaceClientErrorLogIgnorePatterns' ),\n\t\tignoreRegexes = [];\n\twindow.onerror = function ( message, file, line, col, error ) {\n\t\tvar i, postdata;\n\t\tfor ( i = 0; i < ignorePatterns.length; i++ ) {\n\t\t\tif ( ignoreRegexes.length <= i ) {\n\t\t\t\t// turn patterns into regexes the first time through\n\t\t\t\tignoreRegexes[ i ] = new RegExp( ignorePatterns[ i ] );\n\t\t\t}\n\t\t\tif ( message.match( ignoreRegexes[ i ] ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tpostdata = {\n\t\t\taction: apiAction,\n\t\t\tmessage: message,\n\t\t\tfile: file,\n\t\t\tline: line,\n\t\t\tcol: col,\n\t\t\tuserAgent: navigator.userAgent\n\t\t};\n\t\tif ( error && error.stack ) {\n\t\t\tpostdata.stack = error.stack;\n\t\t}\n\t\t$.ajax( {\n\t\t\turl: mw.util.wikiScript( 'api' ),\n\t\t\tdata: postdata,\n\t\t\tdataType: 'json',\n\t\t\ttype: 'POST'\n\t\t} );\n\t};\n} )( jQuery, mediaWiki );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.forms.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"$\" type.","line":4,"column":1,"nodeType":"Block","endLine":4,"endColumn":1},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"mw\" type.","line":5,"column":1,"nodeType":"Block","endLine":5,"endColumn":1},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":74,"column":25,"nodeType":"CallExpression","endLine":74,"endColumn":67},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'result' is undefined.","line":105,"column":1,"nodeType":"Block","endLine":105,"endColumn":1},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":249,"column":8,"nodeType":"CallExpression","endLine":249,"endColumn":62}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Core functionality for DonationInterface forms\n *\n * @param $\n * @param mw\n */\n( function ( $, mw ) {\n\tvar di = mw.donationInterface; // Defined in ext.donationInterface.validation.js\n\n\t// Common helper functions\n\tfunction disablePaymentSubmitButton() {\n\t\t$( '#paymentSubmitBtn' ).prop( 'disabled', true );\n\t\t$( '#paymentSubmitBtn' ).removeClass( 'enabled' ).addClass( 'disabled' );\n\t}\n\n\tfunction enablePaymentSubmitButton() {\n\t\t$( '#paymentSubmitBtn' ).prop( 'disabled', false );\n\t\t$( '#paymentSubmitBtn' ).removeClass( 'disabled' ).addClass( 'enabled' );\n\t}\n\n\t/**\n\t * Disable all interaction with the form, including buttons.\n\t * Usually done by drawing a semi-opaque overlay.\n\t */\n\tfunction disableForm() {\n\t\t$( '#overlay' ).show();\n\t\tdisablePaymentSubmitButton();\n\t}\n\n\t/**\n\t * Mark all form input fields disabled. This can be used to indicate that\n\t * no revision to donor info is possible after a card iframe is opened.\n\t */\n\tfunction disableInput() {\n\t\t$( '[type=text], [type=number], [type=email], select' ).each( function () {\n\t\t\t$( this ).attr( 'disabled', true );\n\t\t} );\n\t}\n\n\t/**\n\t * Makes a form disabled with disableForm usable again.\n\t */\n\tfunction enableForm() {\n\t\t$( '#overlay' ).hide();\n\t\tenablePaymentSubmitButton();\n\t}\n\n\t/**\n\t * Re-enable input fields disabled with disableInput.\n\t */\n\tfunction enableInput() {\n\t\t$( '[type=text], [type=number], [type=email] select' ).each( function () {\n\t\t\t$( this ).removeAttr( 'disabled' );\n\t\t} );\n\t}\n\n\t/**\n\t * Submit a basic form.\n\t */\n\tfunction submitForm() {\n\t\tdi.forms.disable();\n\t\tdi.forms.clean();\n\t\t$( '#payment-form' )[ 0 ].submit();\n\t}\n\n\tfunction cleanInput() {\n\t\t// Trim all the trimmable inputs\n\t\t$( '[type=text], [type=number], [type=email]' ).each( function () {\n\t\t\t$( this ).val( $.trim( this.value ) );\n\t\t} );\n\t}\n\n\tfunction resetSubmethod() {\n\t\tvar $submethodInput = $( 'input:radio[name=payment_submethod]' );\n\t\tif ( $submethodInput.length > 1 ) {\n\t\t\t$submethodInput.prop( 'checked', false );\n\t\t}\n\t}\n\n\t/**\n\t * Get a trinary value from a checkbox that may exist, falling back\n\t *  to a querystring value.\n\t *  '0' = checkbox shown and not checked, or 0 on querystring\n\t *  '1' = checkbox shown and checked, or 1 on querystring\n\t *  '' = checkbox not shown, querystring value missing\n\t *\n\t * @return {string}\n\t */\n\tfunction getOptIn() {\n\t\tvar val, $element = $( 'input[name=opt_in]:checked' );\n\t\tif ( $element.length === 1 ) {\n\t\t\tval = $element.val();\n\t\t} else {\n\t\t\tval = mw.util.getParamValue( 'opt_in' );\n\t\t\tif ( val === null ) {\n\t\t\t\tval = '';\n\t\t\t}\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t * Call the generic donation API and handle errors or execute a callback\n\t *\n\t * @param {function(result)} successCallback will be called with response's 'result' property\n\t * @param {Array} extraData will be merged into the data collected from the form\n\t * @param {string} action action param to pass to MW API, defaults to 'donate'\n\t */\n\tfunction callDonateApi( successCallback, extraData, action ) {\n\t\tdi.forms.disable();\n\t\tdi.forms.clean();\n\t\t$( '#topError' ).html( '' );\n\t\t$( '#errorReference' )\n\t\t\t.removeClass( 'errorMsg' )\n\t\t\t.addClass( 'errorMsgHide' );\n\t\t$( '#paymentContinueBtn' ).removeClass( 'enabled' );\n\n\t\tvar sendData,\n\t\t\tpaymentSubmethod;\n\n\t\tif ( typeof $( 'input[name=\"payment_submethod\"]:checked' ).val() === 'undefined' ) {\n\t\t\tpaymentSubmethod = '';\n\t\t} else {\n\t\t\tpaymentSubmethod = $( 'input[name=\"payment_submethod\"]:checked' ).val().toLowerCase();\n\t\t}\n\n\t\tsendData = {\n\t\t\taction: action || 'donate',\n\t\t\tgateway: $( '#gateway' ).val(),\n\t\t\tcontact_id: $( '#contact_id' ).val(),\n\t\t\tcontact_hash: $( '#contact_hash' ).val(),\n\t\t\tcurrency: $( '#currency' ).val(),\n\t\t\tamount: $( '#amount' ).val(),\n\t\t\tfirst_name: $( '#first_name' ).val(),\n\t\t\tlast_name: $( '#last_name' ).val(),\n\t\t\tstreet_address: $( '#street_address' ).val(),\n\t\t\tcity: $( '#city' ).val(),\n\t\t\tstate_province: $( '#state_province' ).val(),\n\t\t\tpostal_code: $( '#postal_code' ).val(),\n\t\t\tphone: $( '#phone' ).val(),\n\t\t\temail: $( '#email' ).val(),\n\t\t\tcountry: $( '#country' ).val(),\n\t\t\tpayment_method: $( '#payment_method' ).val(),\n\t\t\tlanguage: $( '#language' ).val(),\n\t\t\tpayment_submethod: paymentSubmethod,\n\t\t\tprocessor_form: $( '#processor_form' ).val(),\n\t\t\tissuer_id: $( '#issuer_id' ).val(),\n\t\t\tutm_source: $( '#utm_source' ).val(),\n\t\t\tutm_campaign: $( '#utm_campaign' ).val(),\n\t\t\tutm_medium: $( '#utm_medium' ).val(),\n\t\t\treferrer: $( '#referrer' ).val(),\n\t\t\trecurring: $( '#recurring' ).val(),\n\t\t\tvariant: $( '#variant' ).val(),\n\t\t\twmf_token: $( '#wmf_token' ).val(),\n\t\t\topt_in: getOptIn(),\n\t\t\temployer: $( '#employer' ).val(),\n\t\t\temployer_id: $( '#employer_id' ).val(),\n\t\t\tformat: 'json'\n\t\t};\n\n\t\tif ( extraData ) {\n\t\t\t$.extend( sendData, extraData );\n\t\t}\n\n\t\t// If debug logging is enabled and there are debug messages, send them.\n\t\tif ( mw.config.get( 'wgDonationInterfaceLogDebug' ) &&\n\t\t\tdi.forms.debugMessages.length > 0 ) {\n\t\t\tsendData.debug_messages = di.forms.debugMessages.join( '\\n' );\n\t\t}\n\n\t\t$.ajax( {\n\t\t\turl: mw.util.wikiScript( 'api' ),\n\t\t\tdata: sendData,\n\t\t\tdataType: 'json',\n\t\t\ttype: 'POST',\n\t\t\tsuccess: function ( data ) {\n\t\t\t\tif ( typeof data.error !== 'undefined' ) {\n\t\t\t\t\t// FIXME alert sux\n\t\t\t\t\talert( mw.msg( 'donate_interface-error-msg-general' ) );\n\t\t\t\t\t// Show continue button in 2nd section if it exists\n\t\t\t\t\t$( '#paymentContinue' ).show();\n\t\t\t\t} else if ( typeof data.result !== 'undefined' ) {\n\t\t\t\t\tif ( data.result.errors ) {\n\t\t\t\t\t\tmw.donationInterface.validation.showErrors( data.result.errors );\n\t\t\t\t\t\t// Show continue button in 2nd section if it exists\n\t\t\t\t\t\t$( '#paymentContinue' ).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsuccessCallback( data.result );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function ( xhr ) {\n\t\t\t\t// FIXME too\n\t\t\t\talert( mw.msg( 'donate_interface-error-msg-general' ) );\n\t\t\t},\n\t\t\tcomplete: function () {\n\t\t\t\tdi.forms.enable();\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction isIframe() {\n\t\tvar payment_method = $( '#payment_method' ).val();\n\n\t\tswitch ( payment_method ) {\n\t\tcase 'cc':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// FIXME: move function declarations into object\n\tdi.forms = {\n\t\tdisable: disableForm,\n\t\tdisableInput: disableInput,\n\t\tenable: enableForm,\n\t\tenableInput: enableInput,\n\t\tclean: cleanInput,\n\t\t// Gateways with more complex form submission can overwrite this\n\t\t// property with their own submission function.\n\t\tsubmit: submitForm,\n\t\tcallDonateApi: callDonateApi,\n\t\tisIframe: isIframe,\n\t\tresetSubmethod: resetSubmethod,\n\t\tgetOptIn: getOptIn,\n\t\tdebugMessages: [],\n\t\taddDebugMessage: function ( message ) {\n\t\t\tdi.forms.debugMessages.push( message );\n\t\t}\n\t};\n\n\t$( function () {\n\n\t\tvar $emailDiv = $( '#email' ).closest( 'div' ),\n\t\t\temailExplainMessage = mw.msg( 'donate_interface-email-explain' ),\n\t\t\toptInValue = mw.donationInterface.forms.getOptIn(),\n\t\t\thasSetClientVariablesError = mw.config.get( 'DonationInterfaceSetClientVariablesError' );\n\n\t\tif ( hasSetClientVariablesError ) {\n\t\t\tlocation.assign( mw.config.get( 'DonationInterfaceFailUrl' ) );\n\t\t\treturn;\n\t\t}\n\n\t\t$( '#first_name' ).focus();\n\n\t\t// If submethods are visible, and a submethod is already selected on\n\t\t// page load, clear it.\n\t\tif ( $( 'input[name=\"payment_submethod\"]:checked:visible' ).length > 0 ) {\n\t\t\tdi.forms.resetSubmethod();\n\t\t}\n\n\t\t// Submit on submethod click if valid, otherwise clear submethod selection.\n\t\t$( 'input[name=\"payment_submethod\"]' ).on( 'click', function () {\n\t\t\tif ( di.validation.validate() ) {\n\t\t\t\tdi.forms.submit();\n\t\t\t} else {\n\t\t\t\tdi.forms.resetSubmethod();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\n\t\t// Some forms show a 'continue' button when validation errors are found\n\t\t// server-side on the initial submit. When shown, it should validate\n\t\t// and submit the form.\n\t\t$( '#paymentContinueBtn' ).on( 'click', function () {\n\t\t\tif ( di.validation.validate() ) {\n\t\t\t\tdi.forms.submit();\n\t\t\t}\n\t\t} );\n\n\t\t// Only load employer autocomplete js when the employer field is visible\n\t\tif ( $( '#employer' ).length ) {\n\t\t\tmw.loader.load( 'ext.donationInterface.employerAutoComplete' );\n\t\t}\n\n\t\t// Magic to hopefully disable the spinner in case we are returned to this\n\t\t// page via the Back button.\n\t\t$( window ).on(\n\t\t\t'unload', function () {\n\t\t\t\t// wrapped in case it is overwritten\n\t\t\t\tdi.forms.enable();\n\t\t\t\tdi.forms.enableInput();\n\t\t\t}\n\t\t);\n\n\t\tfunction showEmailExplain() {\n\t\t\t$emailDiv.after( '<div id=\"email_explain\">' + emailExplainMessage + '</div>' );\n\t\t}\n\n\t\tif ( optInValue === '0' ) {\n\t\t\tshowEmailExplain();\n\t\t}\n\t} );\n} )( jQuery, mediaWiki );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.jaVariant02.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"mw\" type.","line":8,"column":1,"nodeType":"Block","endLine":8,"endColumn":1},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"$\" type.","line":9,"column":1,"nodeType":"Block","endLine":9,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Experiment to determine whether different placeholder text and extra name\n * fields improve donation rates in Japan. Once tests are concluded and optimal\n * text is decided, please make the optimal text standard and delete this and\n * the extension.json module configuration for ext.donationInterface.jaVariant02\n * and ext.donationInterface.adyenCheckoutWithJaVariant02.\n *\n * @param mw\n * @param $\n */\n\n( function ( mw, $ ) {\n\tmw.donationInterface = mw.donationInterface || {};\n\tmw.donationInterface.getExtraData = function () {\n\t\treturn {\n\t\t\tfirst_name_phonetic: $( '#first_name_phonetic' ).val(),\n\t\t\tlast_name_phonetic: $( '#last_name_phonetic' ).val()\n\t\t};\n\t};\n} )( mediaWiki, jQuery );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.monthlyConvert.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'currency' is already declared in the upper scope on line 3 column 3.","line":26,"column":49,"nodeType":"Identifier","messageId":"noShadow","endLine":26,"endColumn":57},{"ruleId":"no-shadow","severity":1,"message":"'currency' is already declared in the upper scope on line 3 column 3.","line":34,"column":39,"nodeType":"Identifier","messageId":"noShadow","endLine":34,"endColumn":47}],"suppressedMessages":[{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeOut","line":171,"column":6,"nodeType":"CallExpression","endLine":175,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeIn","line":172,"column":7,"nodeType":"CallExpression","endLine":172,"endColumn":38,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeIn","line":173,"column":7,"nodeType":"CallExpression","endLine":173,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeOut","line":180,"column":6,"nodeType":"CallExpression","endLine":180,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeOut","line":181,"column":6,"nodeType":"CallExpression","endLine":183,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeIn","line":182,"column":7,"nodeType":"CallExpression","endLine":182,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function ( $, mw ) {\n\tvar mc = {},\n\t\tcurrency,\n\t\toriginalAmount,\n\t\t// These config vars are set in GatewayPage::setClientVariables\n\t\ttyUrl = mw.config.get( 'wgDonationInterfaceThankYouUrl' ),\n\t\t// This is set to the ask amounts for the selected currency, or null\n\t\t// if there are no amounts set for it.\n\t\tconvertAmounts = mw.config.get( 'wgDonationInterfaceMonthlyConvertAmounts' );\n\n\tmc.getConvertAsk = function ( amount ) {\n\t\tvar i,\n\t\t\tnumAmounts;\n\t\tif ( !convertAmounts ) {\n\t\t\treturn 0;\n\t\t}\n\t\tnumAmounts = convertAmounts.length;\n\t\tfor ( i = 0; i < numAmounts; i++ ) {\n\t\t\tif ( amount <= convertAmounts[ i ][ 0 ] ) {\n\t\t\t\treturn convertAmounts[ i ][ 1 ];\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t};\n\n\tmc.setConvertAsk = function ( suggestedAmount, currency, locale ) {\n\t\tvar convertAmountFormatted = mc.formatAmount(\n\t\t\tsuggestedAmount, currency, locale\n\t\t);\n\t\t$( '.mc-convert-ask' ).text( convertAmountFormatted );\n\t\t$( '.mc-modal-screen' ).show();\n\t};\n\n\tmc.formatAmount = function ( amount, currency, locale ) {\n\t\tvar formattedAmount;\n\n\t\ttry {\n\t\t\tformattedAmount = amount.toLocaleString(\n\t\t\t\tlocale,\n\t\t\t\t{\n\t\t\t\t\tcurrency: currency,\n\t\t\t\t\tstyle: 'currency'\n\t\t\t\t}\n\t\t\t);\n\t\t} catch ( e ) {\n\t\t\t// Assume a two decimal place currency for fallback\n\t\t\tformattedAmount = currency + ' ' + amount.toFixed( 2 );\n\t\t}\n\t\treturn formattedAmount;\n\t};\n\n\tmc.postMonthlyConvertDonate = function ( amount, declineMonthlyConvert ) {\n\t\tvar sendData = {\n\t\t\taction: 'di_recurring_convert',\n\t\t\tformat: 'json',\n\t\t\tgateway: $( '#gateway' ).val(),\n\t\t\twmf_token: $( '#wmf_token' ).val(),\n\t\t\tamount: amount\n\t\t},\n\t\t\turl;\n\t\tif ( declineMonthlyConvert ) {\n\t\t\tsendData.declineMonthlyConvert = declineMonthlyConvert;\n\t\t}\n\t\t$.ajax( {\n\t\t\turl: mw.util.wikiScript( 'api' ),\n\t\t\tdata: sendData,\n\t\t\tdataType: 'json',\n\t\t\ttype: 'POST',\n\t\t\tsuccess: function ( data ) {\n\t\t\t\tif ( data && !data.error && data.result && !data.result.errors ) {\n\t\t\t\t\turl = new mw.Uri( tyUrl );\n\t\t\t\t\tif ( !declineMonthlyConvert ) {\n\t\t\t\t\t\turl = url.extend( { recurringConversion: 1 } );\n\t\t\t\t\t}\n\t\t\t\t\tdocument.location.assign( url.toString() );\n\t\t\t\t} else {\n\t\t\t\t\t// FIXME - alert sux. Not much donor can do at this point.\n\t\t\t\t\t// We should let 'em know the recurring conversion failed\n\t\t\t\t\t// but the initial donation worked, then show them the thank\n\t\t\t\t\t// you page.\n\t\t\t\t\tif ( !declineMonthlyConvert ) {\n\t\t\t\t\t\talert( mw.msg( 'donate_interface-monthly-convert-error' ) );\n\t\t\t\t\t}\n\t\t\t\t\tdocument.location.assign( tyUrl );\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function () {\n\t\t\t\t// FIXME too\n\t\t\t\tif ( !declineMonthlyConvert ) {\n\t\t\t\t\talert( mw.msg( 'donate_interface-monthly-convert-error' ) );\n\t\t\t\t}\n\t\t\t\tdocument.location.assign( tyUrl );\n\t\t\t}\n\t\t} );\n\t};\n\n\t// TODO Unify logic for determining whether or not to show monthly convert. This\n\t// is just a sanity check to see if the required DOM elements are there.\n\tmc.canShowModal = function () {\n\t\treturn $( '.mc-modal-screen' ).length > 0;\n\t};\n\tmc.init = function () {\n\t\tvar presetAmount,\n\t\t\tlocale = $( '#language' ).val() + '-' + $( '#country' ).val();\n\t\toriginalAmount = +$( '#amount' ).val();\n\t\tcurrency = $( '#currency' ).val();\n\t\tpresetAmount = mc.presetAmount || mc.getConvertAsk( originalAmount );\n\t\tif ( presetAmount === 0 && tyUrl !== null ) {\n\t\t\t// They're donating in an unsupported currency, or are\n\t\t\t// outside of the range where it makes sense to ask for\n\t\t\t// a monthly donation. Just send them to the TY page.\n\t\t\tdocument.location.assign( tyUrl );\n\t\t} else {\n\t\t\tmc.setConvertAsk(\n\t\t\t\tpresetAmount,\n\t\t\t\tcurrency,\n\t\t\t\tlocale\n\t\t\t);\n\t\t\t$( '.mc-no-button, .mc-close' ).on( 'click keypress', function ( e ) {\n\t\t\t\tif ( e.which === 13 || e.type === 'click' ) {\n\t\t\t\t\tmc.postMonthlyConvertDonate( presetAmount, true );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t$( '.mc-yes-button' ).on( 'click keypress', function ( e ) {\n\t\t\t\tif ( e.which === 13 || e.type === 'click' ) {\n\t\t\t\t\tmc.postMonthlyConvertDonate( presetAmount );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t$( '.mc-donate-monthly-button' ).on( 'click keypress', function ( e ) {\n\t\t\t\tif ( e.which === 13 || e.type === 'click' ) {\n\t\t\t\t\tvar $otherAmountField = $( '#mc-other-amount-input' ),\n\t\t\t\t\t\totherAmount = +$otherAmountField.val(),\n\t\t\t\t\t\trates = mw.config.get( 'wgDonationInterfaceCurrencyRates' ),\n\t\t\t\t\t\trate,\n\t\t\t\t\t\tminUsd = mw.config.get( 'wgDonationInterfacePriceFloor' ),\n\t\t\t\t\t\tminLocal,\n\t\t\t\t\t\tformattedMin,\n\t\t\t\t\t\t$smallAmountMessage;\n\n\t\t\t\t\tif ( rates[ currency ] ) {\n\t\t\t\t\t\trate = rates[ currency ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\trate = 1;\n\t\t\t\t\t}\n\t\t\t\t\tminLocal = minUsd * rate;\n\t\t\t\t\tif ( otherAmount < minLocal ) {\n\t\t\t\t\t\tformattedMin = mc.formatAmount(\n\t\t\t\t\t\t\tminLocal, currency, locale\n\t\t\t\t\t\t);\n\t\t\t\t\t\t$otherAmountField.addClass( 'errorHighlight' );\n\t\t\t\t\t\t$smallAmountMessage = $( '#mc-error-smallamount' );\n\t\t\t\t\t\t$smallAmountMessage.text(\n\t\t\t\t\t\t\t$smallAmountMessage.text().replace( '$1', formattedMin )\n\t\t\t\t\t\t);\n\t\t\t\t\t\t$( '#mc-error-largeamount' ).hide();\n\t\t\t\t\t\t$smallAmountMessage.show();\n\t\t\t\t\t} else if ( otherAmount > originalAmount ) {\n\t\t\t\t\t\t$otherAmountField.addClass( 'errorHighlight' );\n\t\t\t\t\t\t$( '#mc-error-smallamount' ).hide();\n\t\t\t\t\t\t$( '#mc-error-largeamount' ).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$( '.mc-error' ).hide();\n\t\t\t\t\t\t$otherAmountField.removeClass( 'errorHighlight' );\n\t\t\t\t\t\tmc.postMonthlyConvertDonate( otherAmount );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\t/* eslint-disable no-jquery/no-fade */\n\t\t\t$( '.mc-diff-amount-link' ).on( 'click keypress', function ( e ) {\n\t\t\t\tif ( e.which === 13 || e.type === 'click' ) {\n\t\t\t\t\t$( '.mc-choice' ).fadeOut( function () {\n\t\t\t\t\t\t$( '.mc-edit-amount' ).fadeIn();\n\t\t\t\t\t\t$( '.mc-back' ).fadeIn();\n\t\t\t\t\t\t$( '.mc-other-amount-input' ).focus();\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t$( '.mc-back' ).on( 'click keypress', function ( e ) {\n\t\t\t\tif ( e.which === 13 || e.type === 'click' ) {\n\t\t\t\t\t$( '.mc-back' ).fadeOut();\n\t\t\t\t\t$( '.mc-edit-amount' ).fadeOut( function () {\n\t\t\t\t\t\t$( '.mc-choice' ).fadeIn();\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t/* eslint-enable no-jquery/no-fade */\n\t\t}\n\n\t};\n\t$( function () {\n\t\tif ( mw.config.get( 'showMConStartup' ) ) {\n\t\t\tmc.init();\n\t\t}\n\t} );\n\tmw.monthlyConvert = mc;\n} )( jQuery, mediaWiki );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.monthlyConvertButtonFlip.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.monthlyConvertMultiplier.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.monthlyConvert_003.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.monthlyConvert_010.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.monthlyConvert_011.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.recurUpgrade.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/ext.donationInterface.validation.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"$\" type.","line":7,"column":1,"nodeType":"Block","endLine":7,"endColumn":1},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"mw\" type.","line":8,"column":1,"nodeType":"Block","endLine":8,"endColumn":1},{"ruleId":"no-shadow","severity":1,"message":"'i' is already declared in the upper scope on line 39 column 45.","line":40,"column":35,"nodeType":"Identifier","messageId":"noShadow","endLine":40,"endColumn":36}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/* globals Mailcheck */\n/**\n * Client-side validation logic for DonationInterface\n * For starters, we just redirect to the existing global functions.\n * They should be rewritten here when we modernize the remaining forms.\n *\n * @param $\n * @param mw\n */\n( function ( $, mw ) {\n\tvar di = mw.donationInterface = mw.donationInterface || {},\n\t\tcheckMail = true,\n\t\tmcDomains = Mailcheck.defaultDomains.concat( [\n\t\t\t'aim.com', 'alice.it', 'aon.at', 'bellsouth.net', 'bigpond.com',\n\t\t\t'bigpond.net.au', 'blueyonder.co.uk', 'btinternet.com',\n\t\t\t'btopenworld.com', 'charter.net', 'cox.net', 'docomo.ne.jp',\n\t\t\t'earthlink.net', 'email.it', 'embarqmail.com', 'ezweb.ne.jp',\n\t\t\t'fastwebnet.it', 'free.fr', 'frontier.com', 'gmx.at', 'gmx.de',\n\t\t\t'gmx.net', 'hetnet.nl', 'home.nl', 'i.softbank.jp', 'iinet.net.au',\n\t\t\t'inwind.it', 'juno.com', 'laposte.net', 'libero.it',\n\t\t\t'mindspring.com', 'netscape.net', 'neuf.fr', 'nifty.com',\n\t\t\t'ntlworld.com', 'o2.pl', 'online.no', 'optonline.net',\n\t\t\t'optusnet.com.au', 'orange.fr', 'pacbell.net', 'planet.nl',\n\t\t\t'q.com', 'qq.com','roadrunner.com', 'rocketmail.com',\n\t\t\t'rogers.com', 'seznam.cz', 'sfr.fr', 'shaw.ca', 'sky.com',\n\t\t\t'skynet.be', 'sympatico.ca', 'talktalk.net', 'telefonica.net',\n\t\t\t'telenet.be', 'telia.com', 'telus.net', 'tin.it',\n\t\t\t'tiscali.co.uk', 'tiscali.it', 'tpg.com.au', 'umich.edu',\n\t\t\t'uol.com.br', 'videotron.ca', 'virgilio.it', 'wanadoo.fr',\n\t\t\t'web.de', 'windstream.net', 'wp.pl', 'xs4all.nl', 'xtra.co.nz',\n\t\t\t'ybb.ne.jp', 'ymail.com', 'ziggo.nl'\n\t\t] ),\n\t\tmultiCountrySubdomains = [ 'yahoo', 'hotmail', 'outlook', 'live' ],\n\t\tcountryTlds = [\n\t\t\t'ca', 'cl', 'co.id', 'co.il', 'co.in', 'co.jp', 'co.uk', 'com.ar',\n\t\t\t'com.au', 'com.br', 'com.mx', 'com.pe', 'com.sg', 'cz', 'de', 'es',\n\t\t\t'fr', 'it', 'jp', 'kr', 'nl', 'pt', 'se'\n\t\t];\n\t$.each( multiCountrySubdomains, function ( i, subdomain ) {\n\t\t$.each( countryTlds, function ( i, countryTld ) {\n\t\t\tmcDomains.push( subdomain + '.' + countryTld );\n\t\t} );\n\t} );\n\n\tfunction showErrors( errors ) {\n\t\tvar generalErrors = [];\n\n\t\t$.each( errors, function ( field, message ) {\n\t\t\tvar $messageField = $( '#' + field + 'Msg' );\n\n\t\t\tif ( $messageField.length > 0 ) {\n\t\t\t\t$( '#' + field ).addClass( 'errorHighlight' );\n\t\t\t\t$messageField\n\t\t\t\t\t.removeClass( 'errorMsgHide' )\n\t\t\t\t\t.addClass( 'errorMsg' )\n\t\t\t\t\t.text( message );\n\t\t\t} else {\n\t\t\t\tgeneralErrors.push( message );\n\t\t\t}\n\t\t} );\n\t\tif ( generalErrors.length > 0 ) {\n\t\t\t$( '#topError' ).html(\n\t\t\t\tgeneralErrors.join( '<br/>' )\n\t\t\t);\n\t\t\t$( '#errorReference' )\n\t\t\t\t.removeClass( 'errorMsgHide' )\n\t\t\t\t.addClass( 'errorMsg' );\n\t\t}\n\t}\n\n\t/**\n\t * Are any errors currently showing, from either server-side or\n\t * client-side validation?\n\t *\n\t * @return {boolean}\n\t */\n\tfunction hasErrors() {\n\t\treturn $( '.errorMsg' ).length > 0;\n\t}\n\n\tdi.validation = {\n\t\tvalidate: function () {\n\t\t\t// This funkiness is to make sure we run all the validations and\n\t\t\t// highlight bad values, rather than short-circuiting the second\n\t\t\t// group of tests if \"&&\" detects that the first tests failed.\n\t\t\tvar results = [\n\t\t\t\t\tthis.validateAmount(),\n\t\t\t\t\tthis.validatePersonal()\n\t\t\t\t],\n\t\t\t\t// Fail if one or more tests failed.\n\t\t\t\tsuccess = ( results.indexOf( false ) === -1 );\n\n\t\t\treturn success;\n\t\t},\n\t\t// FIXME: Move global scope functions here\n\t\tvalidateAmount: window.validateAmount,\n\t\tvalidatePersonal: window.validate_personal,\n\t\tshowErrors: showErrors,\n\t\thasErrors: hasErrors\n\t};\n\n\t// Set up email error detection and correction\n\t$( document ).on( 'blur', '#email', function () {\n\t\tif ( !checkMail ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Be really conservative - only catch two letter errors\n\t\tMailcheck.domainThreshold = 2; // No way to set from opts!\n\t\t$( this ).mailcheck( {\n\t\t\ttopLevelDomains: [],\n\t\t\tdomains: mcDomains,\n\t\t\tsuggested: function ( element, suggestion ) {\n\t\t\t\tvar message = mw.msg(\n\t\t\t\t\t'donate_interface-did-you-mean',\n\t\t\t\t\tsuggestion.full\n\t\t\t\t);\n\t\t\t\t$( '#emailSuggestion' ).show();\n\t\t\t\t$( '#emailSuggestion span' ).html( message );\n\t\t\t},\n\t\t\tempty: function ( element ) {\n\t\t\t\t$( '#emailSuggestion' ).hide();\n\t\t\t}\n\t\t} );\n\t} );\n\t$( document ).on( 'click', '#emailSuggestion .correction', function () {\n\t\t$( '#email' ).val( $( this ).text() );\n\t\t$( '#emailSuggestion' ).hide();\n\t} );\n\t$( document ).on( 'click', '#emailSuggestion .close-button', function () {\n\t\tcheckMail = false; // Don't bother them again\n\t\t$( '#emailSuggestion' ).hide();\n\t} );\n} )( jQuery, mediaWiki );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/js/skinOverride.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/validate_input.js","messages":[{"ruleId":"jsdoc/require-returns","severity":1,"message":"Missing JSDoc @return declaration.","line":1,"column":1,"nodeType":"Block","endLine":4,"endColumn":4},{"ruleId":"no-shadow","severity":1,"message":"'value' is already declared in the upper scope on line 83 column 6.","line":106,"column":27,"nodeType":"Identifier","messageId":"noShadow","endLine":106,"endColumn":32},{"ruleId":"mediawiki/msg-doc","severity":1,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":108,"column":14,"nodeType":"CallExpression","endLine":108,"endColumn":64},{"ruleId":"no-shadow","severity":1,"message":"'i' is already declared in the upper scope on line 86 column 3.","line":114,"column":32,"nodeType":"Identifier","messageId":"noShadow","endLine":114,"endColumn":33},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":135,"column":24,"nodeType":"NewExpression","endLine":135,"endColumn":50},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":180,"column":14,"nodeType":"NewExpression","endLine":180,"endColumn":60}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Validate the donation amount to make sure it is formatted correctly and at least a minimum amount.\n * TODO: also validate ceiling\n */\nwindow.validateAmount = function () {\n\tvar error = true,\n\t\tamount = $( 'input[name=\"amount\"]' ).val(), // get the amount\n\t\tcurrency = '',\n\t\trates = mw.config.get( 'wgDonationInterfaceCurrencyRates' ),\n\t\tamountRules = mw.config.get( 'wgDonationInterfaceAmountRules' ),\n\t\tminimumInDonationCurrency,\n\t\tminDisplay,\n\t\tmessage = mediaWiki.msg( 'donate_interface-smallamount-error' ),\n\t\t$amountMsg = $( '#amountMsg' ),\n\t\tthreeDecimalCurrencies = [ 'BHD', 'CLF', 'IQD', 'KWD', 'LYD',\n\t\t\t'MGA', 'MRO', 'OMR', 'TND' ];\n\n\t// Check amount is at least the minimum\n\tif ( $( 'input[name=\"currency\"]' ).length ) {\n\t\tcurrency = $( 'input[name=\"currency\"]' ).val();\n\t}\n\tif ( $( 'select[name=\"currency\"]' ).length ) {\n\t\tcurrency = $( 'select[name=\"currency\"]' ).val();\n\t}\n\n\t// Normalize weird amount formats.\n\t// Don't mess with these unless you know what you're doing.\n\t/*jshint ignore:start*/\n\tamount = amount.replace( /[,.](\\d)$/, '\\:$10' );\n\tamount = amount.replace( /[,.](\\d)(\\d)$/, '\\:$1$2' );\n\tif ( threeDecimalCurrencies.indexOf( currency ) > -1 ) {\n\t\tamount = amount.replace( /[,.](\\d)(\\d)(\\d)$/, '\\:$1$2$3' );\n\t}\n\tamount = amount.replace( /[,.]/g, '' );\n\tamount = amount.replace( /:/, '.' );\n\t$( 'input[name=\"amount\"]' ).val( amount ); // set the new amount back into the form\n\t/*jshint ignore:end*/\n\n\t// Check amount is a real number, sets error as true (good) if no issues\n\terror = ( amount === null || isNaN( amount ) || amount.value <= 0 );\n\n\tif ( currency === amountRules.currency || ( typeof rates[ currency ] ) === 'undefined' ) {\n\t\tminimumInDonationCurrency = amountRules.min;\n\t} else {\n\t\t// Rates are all relative to USD, so we divide the configured minimum by its corresponding\n\t\t// rate to get the minimum in USD, then multiply by the rate of the donation currency to get\n\t\t// the minimum in the donation currency.\n\t\tminimumInDonationCurrency = amountRules.min / rates[ amountRules.currency ] * rates[ currency ];\n\t}\n\t// if we're on a new form, clear existing amount error\n\t$amountMsg.removeClass( 'errorMsg' ).addClass( 'errorMsgHide' ).text( '' );\n\tif ( ( amount < minimumInDonationCurrency ) || error ) {\n\t\t// Round to two decimal places (TODO: no decimals for some currencies)\n\t\tminDisplay = Math.round( minimumInDonationCurrency * 100 ) / 100;\n\t\tmessage = message.replace( '$1', minDisplay + ' ' + currency );\n\t\t$amountMsg.removeClass( 'errorMsgHide' ).addClass( 'errorMsg' ).text( message );\n\n\t\terror = true;\n\t\t// See if we're on a webitects accordion form\n\t\tif ( $( '#step1wrapper' ).length ) {\n\t\t\t$( '#step1wrapper' ).slideDown();\n\t\t\t$( '#paymentContinue' ).show();\n\t\t\t// If we're on an Ingenico iframe form, slide up the 3rd step to force the user to\n\t\t\t// generate a new iframe after they change the form.\n\t\t\tif ( $( '#payment iframe' ).length ) {\n\t\t\t\t$( '#step3wrapper' ).slideUp();\n\t\t\t}\n\t\t}\n\t\t$( '#other-amount' ).val( '' );\n\t\t$( '#other-amount' ).focus();\n\t}\n\treturn !error;\n};\n\n/**\n * Validates the personal information fields\n * FIXME: Bad name, this validates more than just personal info.\n * Move the good parts to ext.donationInterface.validation.js\n *\n * @return {boolean} true if no errors, false otherwise (also uses in-page error messages to notify the user)\n */\nwindow.validate_personal = function () {\n\tvar value, countryField, emailAdd, invalid, apos, dotpos, domain,\n\t\terrorsPresent = false,\n\t\t$formField,\n\t\ti,\n\t\tinvalids = [ '..', '/', '\\\\', ',', '<', '>' ],\n\t\trules = mediaWiki.config.get( 'wgDonationInterfaceValidationRules' ) || [];\n\n\tfunction clearError( field ) {\n\t\t$( '#' + field ).removeClass( 'errorHighlight' );\n\t\t$( '#' + field + 'Msg' )\n\t\t\t.removeClass( 'errorMsg' )\n\t\t\t.addClass( 'errorMsgHide' );\n\t}\n\n\tfunction setError( field, message ) {\n\t\terrorsPresent = true;\n\t\t$( '#' + field ).addClass( 'errorHighlight' );\n\t\t$( '#' + field + 'Msg' )\n\t\t\t.removeClass( 'errorMsgHide' )\n\t\t\t.addClass( 'errorMsg' )\n\t\t\t.text( message );\n\t}\n\n\tfunction isEmpty( field, value ) {\n\t\treturn !$.trim( value ) ||\n\t\t\tvalue === mediaWiki.msg( 'donate_interface-donor-' + field );\n\t}\n\n\t// Generically defined rules set by GatewayAdapter->getClientSideValidationRules\n\t$.each( rules, function ( fieldKey, ruleList ) {\n\t\tclearError( fieldKey );\n\t\t$.each( ruleList, function ( i, rule ) {\n\t\t\tvar failed = false;\n\t\t\t$formField = $( '#' + fieldKey );\n\t\t\tif ( $formField.length === 0 ) {\n\t\t\t\t// Radio button special case. First see if the group exists ...\n\t\t\t\t$formField = $( 'input[name=' + fieldKey + ']' );\n\t\t\t\tif ( $formField.length > 0 ) {\n\t\t\t\t\t// ... then filter to just the selected button\n\t\t\t\t\t$formField = $formField.filter( ':checked' );\n\t\t\t\t} else {\n\t\t\t\t\t// Field doesn't exist by id or by name\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvalue = $formField.val();\n\t\t\tif ( rule.required ) {\n\t\t\t\tif ( isEmpty( fieldKey, value ) ) {\n\t\t\t\t\tfailed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( rule.pattern && !isEmpty( fieldKey, value ) ) {\n\t\t\t\tif ( !value.match( new RegExp( rule.pattern ) ) ) {\n\t\t\t\t\tfailed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( failed ) {\n\t\t\t\tsetError( fieldKey, rule.message );\n\t\t\t}\n\t\t} );\n\t} );\n\n\t// FIXME: wouldn't $( '#country' ).val() work for both types?\n\tcountryField = document.getElementById( 'country' );\n\tif ( countryField && countryField.type === 'select-one' ) { // country is a dropdown select\n\t\tif ( !$.trim( countryField.options[ countryField.selectedIndex ].value ) ) {\n\t\t\tsetError(\n\t\t\t\t'country',\n\t\t\t\tmediaWiki.msg( 'donate_interface-error-msg-country' )\n\t\t\t);\n\t\t} else {\n\t\t\tclearError( 'country' );\n\t\t}\n\t} else { // country is a hidden or text input\n\t\tif ( !$.trim( countryField.value ) ) {\n\t\t\tsetError(\n\t\t\t\t'country',\n\t\t\t\tmediaWiki.msg( 'donate_interface-error-msg-country' )\n\t\t\t);\n\t\t} else {\n\t\t\tclearError( 'country' );\n\t\t}\n\t}\n\n\t// validate email address\n\t// FIXME: replace with regex in wgDonationInterfaceValidationRules\n\temailAdd = document.getElementById( 'email' );\n\tif (\n\t\temailAdd &&\n\t\t$.trim( emailAdd.value ) &&\n\t\temailAdd.value !== mediaWiki.msg( 'donate_interface-donor-email' )\n\t) {\n\t\tinvalid = false;\n\n        var specialCharacterRegex = [ '(^[\\\\-])|',\n        '([`!@#$%^&*()_+\\\\-=\\\\[\\\\]{};\\':\"\\\\\\\\|,.<>\\\\/?~]+$)' ];\n\n        if ( new RegExp( specialCharacterRegex.join( '' ) ).test( emailAdd.value ) ) {\n            setError(\n                'email',\n                mediaWiki.msg( 'donate_interface-error-msg-invalid-email' )\n            );\n            invalid = true;\n        }\n\t\tapos = emailAdd.value.indexOf( '@' );\n\t\tdotpos = emailAdd.value.lastIndexOf( '.' );\n\n\t\tif ( apos < 1 || dotpos - apos < 2 ) {\n\t\t\tsetError(\n\t\t\t\t'email',\n\t\t\t\tmediaWiki.msg( 'donate_interface-error-msg-invalid-email' )\n\t\t\t);\n\t\t\tinvalid = true;\n\t\t}\n\n\t\tdomain = emailAdd.value.slice( Math.max( 0, apos + 1 ) );\n\n\t\tfor ( i = 0; i < invalids.length && !invalid; i++ ) {\n\t\t\tif ( domain.indexOf( invalids[ i ] ) !== -1 ) {\n\t\t\t\tsetError(\n\t\t\t\t\t'email',\n\t\t\t\t\tmediaWiki.msg( 'donate_interface-error-msg-invalid-email' )\n\t\t\t\t);\n\t\t\t\tinvalid = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( /[0-9]$/.test( domain ) ) {\n\t\t\tsetError(\n\t\t\t\t'email',\n\t\t\t\tmediaWiki.msg( 'donate_interface-error-msg-invalid-email' )\n\t\t\t);\n\t\t}\n\t}\n\n\t// Make sure cookies are enabled\n\tdocument.cookie = 'wmf_test=1;';\n\tif ( document.cookie.indexOf( 'wmf_test=1' ) !== -1 ) {\n\t\tdocument.cookie = 'wmf_test=; expires=Thu, 01-Jan-70 00:00:01 GMT;'; // unset the cookie\n\t\tclearError( 'cookie' );\n\t} else {\n\t\terrorsPresent = true; // display error\n\t\tsetError( 'cookie', mediaWiki.msg( 'donate_interface-error-msg-cookies' ) );\n\t}\n\n\treturn !errorsPresent;\n};\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/paypal_ec_gateway/forms/js/paypal.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]

--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated stylelint-stylistic@0.4.3: This package has been deprecated in favor of @stylistic/stylelint-plugin
--- stdout ---

added 477 packages, and audited 478 packages in 6s

92 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ /usr/bin/npm test
--- stdout ---

> test
> grunt test

Running "eslint:all" (eslint) task

/src/repo/adyen_gateway/forms/adyen.js
   23:1   warning  Missing JSDoc @return type                   jsdoc/require-returns-type
   73:23  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  155:23  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  215:34  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  219:14  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  229:1   warning  Missing JSDoc @param "extraData" type        jsdoc/require-param-type
  230:1   warning  Missing JSDoc @param "billingContact" type   jsdoc/require-param-type
  231:1   warning  Missing JSDoc @param "shippingContact" type  jsdoc/require-param-type
  336:22  warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  631:4   warning  ES2015 'Promise' class is forbidden          es-x/no-promise
  658:4   warning  ES2015 'Promise' class is forbidden          es-x/no-promise

/src/repo/amazon_gateway/amazon.js
   14:23  warning  Use a regular expression literal instead of the 'RegExp' constructor  prefer-regex-literals
   39:14  warning  Found non-literal argument to RegExp Constructor                      security/detect-non-literal-regexp
  268:8   warning  Selector extensions are not allowed                                   no-jquery/no-sizzle

/src/repo/dlocal_gateway/forms/dlocal.js
  306:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/modules/iframe.liberator.js
  1:10  warning  'self' is already defined as a built-in global variable  no-redeclare

/src/repo/modules/js/ext.donationInterface.errorLog.js
  10:26  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/modules/js/ext.donationInterface.forms.js
    4:1   warning  Missing JSDoc @param "$" type        jsdoc/require-param-type
    5:1   warning  Missing JSDoc @param "mw" type       jsdoc/require-param-type
   74:25  warning  Selector extensions are not allowed  no-jquery/no-sizzle
  105:1   warning  The type 'result' is undefined       jsdoc/no-undefined-types
  249:8   warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/modules/js/ext.donationInterface.jaVariant02.js
  8:1  warning  Missing JSDoc @param "mw" type  jsdoc/require-param-type
  9:1  warning  Missing JSDoc @param "$" type   jsdoc/require-param-type

/src/repo/modules/js/ext.donationInterface.monthlyConvert.js
  26:49  warning  'currency' is already declared in the upper scope on line 3 column 3  no-shadow
  34:39  warning  'currency' is already declared in the upper scope on line 3 column 3  no-shadow

/src/repo/modules/js/ext.donationInterface.validation.js
   7:1   warning  Missing JSDoc @param "$" type                                    jsdoc/require-param-type
   8:1   warning  Missing JSDoc @param "mw" type                                   jsdoc/require-param-type
  40:35  warning  'i' is already declared in the upper scope on line 39 column 45  no-shadow

/src/repo/modules/validate_input.js
    1:1   warning  Missing JSDoc @return declaration                                                    jsdoc/require-returns
  106:27  warning  'value' is already declared in the upper scope on line 83 column 6                   no-shadow
  108:14  warning  All possible message keys should be documented. See https://w.wiki/4r9a for details  mediawiki/msg-doc
  114:32  warning  'i' is already declared in the upper scope on line 86 column 3                       no-shadow
  135:24  warning  Found non-literal argument to RegExp Constructor                                     security/detect-non-literal-regexp
  180:14  warning  Found non-literal argument to RegExp Constructor                                     security/detect-non-literal-regexp

✖ 35 problems (0 errors, 35 warnings)


Running "stylelint:all" (stylelint) task
>> Linted 13 files without errors

Running "banana:shared" (banana) task
>> 5 message directories checked.

Running "banana:email" (banana) task
>> 1 message directory checked.

Running "banana:gateways" (banana) task
>> 4 message directories checked.

Done.

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {},
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 0,
      "critical": 0,
      "total": 0
    },
    "dependencies": {
      "prod": 1,
      "dev": 477,
      "optional": 0,
      "peer": 10,
      "peerOptional": 0,
      "total": 477
    }
  }
}

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
build: Updating eslint-config-wikimedia to 0.27.0

$ git add .
--- stdout ---

--- end ---
$ git commit -F /tmp/tmprz4vkde5
--- stdout ---
[master 211bfd3] build: Updating eslint-config-wikimedia to 0.27.0
 3 files changed, 345 insertions(+), 515 deletions(-)

--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 211bfd3c0af63342d0e2f8b9815636f8e97ef311 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 15 Apr 2024 07:00:57 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.27.0

Change-Id: Icc5d2eefc0ff13b141dde72c987b7d8b2af7571d
---
 .../js/ext.donationInterface.jaVariant02.js   |   3 +
 package-lock.json                             | 855 +++++++-----------
 package.json                                  |   2 +-
 3 files changed, 345 insertions(+), 515 deletions(-)

diff --git a/modules/js/ext.donationInterface.jaVariant02.js b/modules/js/ext.donationInterface.jaVariant02.js
index e351353..19a6b61 100644
--- a/modules/js/ext.donationInterface.jaVariant02.js
+++ b/modules/js/ext.donationInterface.jaVariant02.js
@@ -4,6 +4,9 @@
  * text is decided, please make the optimal text standard and delete this and
  * the extension.json module configuration for ext.donationInterface.jaVariant02
  * and ext.donationInterface.adyenCheckoutWithJaVariant02.
+ *
+ * @param mw
+ * @param $
  */
 
 ( function ( mw, $ ) {
diff --git a/package-lock.json b/package-lock.json
index bbb1ad8..50cbe1d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,7 @@
 		"": {
 			"name": "DonationInterface",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.26.0",
+				"eslint-config-wikimedia": "0.27.0",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.11.1",
 				"grunt-contrib-watch": "1.1.0",
@@ -37,9 +37,9 @@
 			}
 		},
 		"node_modules/@babel/helper-validator-identifier": {
-			"version": "7.19.1",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
-			"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+			"version": "7.22.20",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+			"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
 			"dev": true,
 			"engines": {
 				"node": ">=6.9.0"
@@ -160,17 +160,17 @@
 			}
 		},
 		"node_modules/@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.42.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz",
+			"integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==",
 			"dev": true,
 			"dependencies": {
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20"
+				"node": ">=16"
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
@@ -188,15 +188,6 @@
 				"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
 			}
 		},
-		"node_modules/@eslint-community/eslint-utils/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==",
-			"dev": true,
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			}
-		},
 		"node_modules/@eslint-community/regexpp": {
 			"version": "4.10.0",
 			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
@@ -260,9 +251,9 @@
 			}
 		},
 		"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==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -367,9 +358,9 @@
 			"dev": true
 		},
 		"node_modules/@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+			"version": "7.5.8",
+			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+			"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
 			"dev": true
 		},
 		"node_modules/@typescript-eslint/scope-manager": {
@@ -494,18 +485,6 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			}
 		},
-		"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
-			"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/@ungap/structured-clone": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@@ -710,9 +689,9 @@
 			}
 		},
 		"node_modules/browserslist": {
-			"version": "4.22.3",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz",
-			"integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -729,8 +708,8 @@
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001580",
-				"electron-to-chromium": "^1.4.648",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			},
@@ -839,9 +818,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001583",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz",
-			"integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==",
+			"version": "1.0.30001610",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz",
+			"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==",
 			"dev": true,
 			"funding": [
 				{
@@ -926,9 +905,9 @@
 			}
 		},
 		"node_modules/ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true,
 			"funding": [
 				{
@@ -994,9 +973,9 @@
 			}
 		},
 		"node_modules/comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true,
 			"engines": {
 				"node": ">= 12.0.0"
@@ -1014,6 +993,19 @@
 			"integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
 			"dev": true
 		},
+		"node_modules/core-js-compat": {
+			"version": "3.36.1",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
+			"integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==",
+			"dev": true,
+			"dependencies": {
+				"browserslist": "^4.23.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/core-js"
+			}
+		},
 		"node_modules/core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -1359,9 +1351,9 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.656",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz",
-			"integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==",
+			"version": "1.4.736",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
+			"integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==",
 			"dev": true
 		},
 		"node_modules/emoji-regex": {
@@ -1420,16 +1412,16 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"dependencies": {
 				"@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",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -1475,10 +1467,13 @@
 			}
 		},
 		"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==",
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz",
+			"integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==",
 			"dev": true,
+			"dependencies": {
+				"semver": "^7.5.4"
+			},
 			"engines": {
 				"node": ">=12"
 			},
@@ -1487,93 +1482,36 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.27.0.tgz",
+			"integrity": "sha512-KkZ54+MUnggz17C/RCEMXQSpiiqZRF7p9fjrz4phaaeKlTrjg0B+QbM5zcDWcjGiAWaJUptHaH17+RZldadkUw==",
 			"dev": true,
 			"dependencies": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.6.1",
+				"eslint": "^8.57.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-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^27.9.0",
+				"eslint-plugin-jsdoc": "48.2.1",
 				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
+				"eslint-plugin-mediawiki": "^0.6.0",
+				"eslint-plugin-mocha": "^10.4.1",
+				"eslint-plugin-n": "^16.6.2",
 				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^51.0.1",
+				"eslint-plugin-vue": "^9.23.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.13.2"
 			}
 		},
 		"node_modules/eslint-config-wikimedia/node_modules/browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz",
+			"integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==",
 			"dev": true
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-vue": {
-			"version": "9.21.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.21.1.tgz",
-			"integrity": "sha512-XVtI7z39yOVBFJyi8Ljbn7kY9yHzznKXL02qQYn+ta63Iy4A9JFBw6o4OSB9hyD2++tVT+su9kQqetUyCCwhjw==",
-			"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.2",
-				"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/eslint-visitor-keys": {
-			"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-config-wikimedia/node_modules/vue-eslint-parser": {
-			"version": "9.4.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
-			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
-			"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": {
 			"version": "4.2.0",
 			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
@@ -1657,14 +1595,14 @@
 			}
 		},
 		"node_modules/eslint-plugin-es-x": {
-			"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==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz",
+			"integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.1.2",
 				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"eslint-compat-utils": "^0.5.0"
 			},
 			"engines": {
 				"node": "^14.18.0 || >=16.0.0"
@@ -1677,9 +1615,9 @@
 			}
 		},
 		"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==",
+			"version": "27.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
+			"integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
 			"dev": true,
 			"dependencies": {
 				"@typescript-eslint/utils": "^5.10.0"
@@ -1688,7 +1626,7 @@
 				"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0",
+				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0",
 				"eslint": "^7.0.0 || ^8.0.0",
 				"jest": "*"
 			},
@@ -1702,25 +1640,26 @@
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz",
+			"integrity": "sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==",
 			"dev": true,
 			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.42.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.0",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19"
+				"node": ">=18"
 			},
 			"peerDependencies": {
-				"eslint": "^7.0.0 || ^8.0.0"
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": {
@@ -1735,6 +1674,16 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
+		"node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+			"dev": true,
+			"dependencies": {
+				"spdx-exceptions": "^2.1.0",
+				"spdx-license-ids": "^3.0.0"
+			}
+		},
 		"node_modules/eslint-plugin-json-es": {
 			"version": "1.5.7",
 			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
@@ -1748,22 +1697,13 @@
 				"eslint": ">= 7"
 			}
 		},
-		"node_modules/eslint-plugin-json-es/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==",
-			"dev": true,
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			}
-		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.6.0.tgz",
+			"integrity": "sha512-a2Zm18N5nPyflBajM2ZWATxucIpYPEmOSjFzUR1OBH3hAL0GY9fx1mpezEwzqAQ862d+kPkolgQOzktnZe8nKA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			},
 			"peerDependencies": {
@@ -1771,12 +1711,13 @@
 			}
 		},
 		"node_modules/eslint-plugin-mocha": {
-			"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==",
+			"version": "10.4.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.2.tgz",
+			"integrity": "sha512-cur4dVYnSEWTBwdqIBQFxa/9siAhesu0TX+lbJ4ClE9j0eNMNe6BSx3vkFFNz6tGoveyMyELFXa30f3fvuAVDg==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			},
 			"engines": {
@@ -1836,16 +1777,16 @@
 			}
 		},
 		"node_modules/eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
 				"requireindex": "^1.2.0"
 			},
 			"engines": {
-				"node": "12.x || 14.x || >=16.0.0"
+				"node": "^16.0.0 || ^18.0.0 || >=20.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-security": {
@@ -1858,26 +1799,26 @@
 			}
 		},
 		"node_modules/eslint-plugin-unicorn": {
-			"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==",
+			"version": "51.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz",
+			"integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.22.20",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^2.1.4",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.34.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.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",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.5.4",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
@@ -1887,46 +1828,48 @@
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.38.0"
+				"eslint": ">=8.56.0"
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "8.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-			"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+			"version": "9.25.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz",
+			"integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-utils": "^3.0.0",
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
-				"nth-check": "^2.0.1",
-				"postcss-selector-parser": "^6.0.9",
-				"semver": "^7.3.5",
-				"vue-eslint-parser": "^8.0.1"
+				"nth-check": "^2.1.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.2",
+				"xml-name-validator": "^4.0.0"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^14.17.0 || >=16.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.24.12",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
+			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
 			"dev": true,
 			"engines": {
-				"node": ">=12.0.0"
+				"node": "^16.13 || >=18"
 			}
 		},
 		"node_modules/eslint-plugin-yml": {
-			"version": "1.12.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.12.2.tgz",
-			"integrity": "sha512-hvS9p08FhPT7i/ynwl7/Wt7ke7Rf4P2D6fT8lZlL43peZDTsHtH2A0SIFQ7Kt7+mJ6if6P+FX3iJhMkdnxQwpg==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.4.0",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -1941,21 +1884,6 @@
 				"eslint": ">=6.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-yml/node_modules/eslint-compat-utils": {
-			"version": "0.4.1",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.4.1.tgz",
-			"integrity": "sha512-5N7ZaJG5pZxUeNNJfUchurLVrunD1xJvyg5kYOIVF8kg1f3ajTikmAu/5fZ9w100omNPOoMjngRszh/Q/uFGMg==",
-			"dev": true,
-			"dependencies": {
-				"semver": "^7.5.4"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"peerDependencies": {
-				"eslint": ">=6.0.0"
-			}
-		},
 		"node_modules/eslint-scope": {
 			"version": "7.2.2",
 			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
@@ -1990,15 +1918,27 @@
 				"eslint": ">=5"
 			}
 		},
-		"node_modules/eslint-visitor-keys": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-			"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+		"node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+			"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
 			"dev": true,
 			"engines": {
 				"node": ">=10"
 			}
 		},
+		"node_modules/eslint-visitor-keys": {
+			"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/argparse": {
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -2017,18 +1957,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/eslint/node_modules/eslint-visitor-keys": {
-			"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/find-up": {
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -2143,18 +2071,6 @@
 				"url": "https://opencollective.com/eslint"
 			}
 		},
-		"node_modules/espree/node_modules/eslint-visitor-keys": {
-			"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/esprima": {
 			"version": "4.0.1",
 			"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
@@ -4404,9 +4320,9 @@
 			}
 		},
 		"node_modules/regexp-tree": {
-			"version": "0.1.24",
-			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz",
-			"integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==",
+			"version": "0.1.27",
+			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
+			"integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
 			"dev": true,
 			"bin": {
 				"regexp-tree": "bin/regexp-tree"
@@ -4581,9 +4497,9 @@
 			"dev": true
 		},
 		"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==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"dependencies": {
 				"lru-cache": "^6.0.0"
@@ -5538,21 +5454,21 @@
 			}
 		},
 		"node_modules/vue-eslint-parser": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-			"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
+			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
 			"dev": true,
 			"dependencies": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
+				"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.5"
+				"semver": "^7.3.6"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^14.17.0 || >=16.0.0"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/mysticatea"
@@ -5561,18 +5477,6 @@
 				"eslint": ">=6.0.0"
 			}
 		},
-		"node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
-			"version": "3.4.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
-			"integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
-			"dev": true,
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://opencollective.com/eslint"
-			}
-		},
 		"node_modules/websocket-driver": {
 			"version": "0.7.0",
 			"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
@@ -5713,10 +5617,13 @@
 			"dev": true
 		},
 		"node_modules/yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
+			"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
 			"dev": true,
+			"bin": {
+				"yaml": "bin.mjs"
+			},
 			"engines": {
 				"node": ">= 14"
 			}
@@ -5738,18 +5645,6 @@
 				"url": "https://github.com/sponsors/ota-meshi"
 			}
 		},
-		"node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": {
-			"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/yargs": {
 			"version": "16.2.0",
 			"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -5807,9 +5702,9 @@
 			}
 		},
 		"@babel/helper-validator-identifier": {
-			"version": "7.19.1",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
-			"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+			"version": "7.22.20",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+			"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
 			"dev": true
 		},
 		"@babel/highlight": {
@@ -5864,12 +5759,12 @@
 			"requires": {}
 		},
 		"@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.42.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz",
+			"integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==",
 			"dev": true,
 			"requires": {
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			}
@@ -5881,14 +5776,6 @@
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^3.3.0"
-			},
-			"dependencies": {
-				"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==",
-					"dev": true
-				}
 			}
 		},
 		"@eslint-community/regexpp": {
@@ -5941,9 +5828,9 @@
 			}
 		},
 		"@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true
 		},
 		"@humanwhocodes/config-array": {
@@ -6026,9 +5913,9 @@
 			"dev": true
 		},
 		"@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+			"version": "7.5.8",
+			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+			"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
 			"dev": true
 		},
 		"@typescript-eslint/scope-manager": {
@@ -6104,14 +5991,6 @@
 			"requires": {
 				"@typescript-eslint/types": "5.62.0",
 				"eslint-visitor-keys": "^3.3.0"
-			},
-			"dependencies": {
-				"eslint-visitor-keys": {
-					"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
-				}
 			}
 		},
 		"@ungap/structured-clone": {
@@ -6276,13 +6155,13 @@
 			}
 		},
 		"browserslist": {
-			"version": "4.22.3",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz",
-			"integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001580",
-				"electron-to-chromium": "^1.4.648",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			}
@@ -6357,9 +6236,9 @@
 			}
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001583",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz",
-			"integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==",
+			"version": "1.0.30001610",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz",
+			"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==",
 			"dev": true
 		},
 		"chalk": {
@@ -6414,9 +6293,9 @@
 			}
 		},
 		"ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true
 		},
 		"clean-regexp": {
@@ -6467,9 +6346,9 @@
 			"dev": true
 		},
 		"comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true
 		},
 		"concat-map": {
@@ -6484,6 +6363,15 @@
 			"integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
 			"dev": true
 		},
+		"core-js-compat": {
+			"version": "3.36.1",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
+			"integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==",
+			"dev": true,
+			"requires": {
+				"browserslist": "^4.23.0"
+			}
+		},
 		"core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -6738,9 +6626,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.656",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz",
-			"integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==",
+			"version": "1.4.736",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
+			"integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==",
 			"dev": true
 		},
 		"emoji-regex": {
@@ -6787,16 +6675,16 @@
 			"dev": true
 		},
 		"eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"requires": {
 				"@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",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -6844,12 +6732,6 @@
 					"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
 					"dev": true
 				},
-				"eslint-visitor-keys": {
-					"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
-				},
 				"find-up": {
 					"version": "5.0.0",
 					"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -6917,78 +6799,44 @@
 			}
 		},
 		"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==",
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz",
+			"integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==",
 			"dev": true,
-			"requires": {}
+			"requires": {
+				"semver": "^7.5.4"
+			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.27.0.tgz",
+			"integrity": "sha512-KkZ54+MUnggz17C/RCEMXQSpiiqZRF7p9fjrz4phaaeKlTrjg0B+QbM5zcDWcjGiAWaJUptHaH17+RZldadkUw==",
 			"dev": true,
 			"requires": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.6.1",
+				"eslint": "^8.57.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-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^27.9.0",
+				"eslint-plugin-jsdoc": "48.2.1",
 				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
+				"eslint-plugin-mediawiki": "^0.6.0",
+				"eslint-plugin-mocha": "^10.4.1",
+				"eslint-plugin-n": "^16.6.2",
 				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^51.0.1",
+				"eslint-plugin-vue": "^9.23.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.13.2"
 			},
 			"dependencies": {
 				"browserslist-config-wikimedia": {
-					"version": "0.5.1",
-					"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-					"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
-					"dev": true
-				},
-				"eslint-plugin-vue": {
-					"version": "9.21.1",
-					"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.21.1.tgz",
-					"integrity": "sha512-XVtI7z39yOVBFJyi8Ljbn7kY9yHzznKXL02qQYn+ta63Iy4A9JFBw6o4OSB9hyD2++tVT+su9kQqetUyCCwhjw==",
-					"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.2",
-						"xml-name-validator": "^4.0.0"
-					}
-				},
-				"eslint-visitor-keys": {
-					"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==",
+					"version": "0.6.1",
+					"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz",
+					"integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==",
 					"dev": true
-				},
-				"vue-eslint-parser": {
-					"version": "9.4.2",
-					"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
-					"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
-					"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"
-					}
 				}
 			}
 		},
@@ -7047,39 +6895,40 @@
 			}
 		},
 		"eslint-plugin-es-x": {
-			"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==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz",
+			"integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.1.2",
 				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"eslint-compat-utils": "^0.5.0"
 			}
 		},
 		"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==",
+			"version": "27.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
+			"integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
 			"dev": true,
 			"requires": {
 				"@typescript-eslint/utils": "^5.10.0"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz",
+			"integrity": "sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==",
 			"dev": true,
 			"requires": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.42.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.0",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"dependencies": {
 				"escape-string-regexp": {
@@ -7087,6 +6936,16 @@
 					"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
 					"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
 					"dev": true
+				},
+				"spdx-expression-parse": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+					"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+					"dev": true,
+					"requires": {
+						"spdx-exceptions": "^2.1.0",
+						"spdx-license-ids": "^3.0.0"
+					}
 				}
 			}
 		},
@@ -7098,33 +6957,26 @@
 			"requires": {
 				"eslint-visitor-keys": "^3.3.0",
 				"espree": "^9.3.1"
-			},
-			"dependencies": {
-				"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==",
-					"dev": true
-				}
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.6.0.tgz",
+			"integrity": "sha512-a2Zm18N5nPyflBajM2ZWATxucIpYPEmOSjFzUR1OBH3hAL0GY9fx1mpezEwzqAQ862d+kPkolgQOzktnZe8nKA==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			}
 		},
 		"eslint-plugin-mocha": {
-			"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==",
+			"version": "10.4.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.2.tgz",
+			"integrity": "sha512-cur4dVYnSEWTBwdqIBQFxa/9siAhesu0TX+lbJ4ClE9j0eNMNe6BSx3vkFFNz6tGoveyMyELFXa30f3fvuAVDg==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			}
 		},
@@ -7166,9 +7018,9 @@
 			"requires": {}
 		},
 		"eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -7185,71 +7037,62 @@
 			}
 		},
 		"eslint-plugin-unicorn": {
-			"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==",
+			"version": "51.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz",
+			"integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.22.20",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^2.1.4",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.34.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.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",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.5.4",
 				"strip-indent": "^3.0.0"
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "8.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-			"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+			"version": "9.25.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz",
+			"integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==",
 			"dev": true,
 			"requires": {
-				"eslint-utils": "^3.0.0",
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
-				"nth-check": "^2.0.1",
-				"postcss-selector-parser": "^6.0.9",
-				"semver": "^7.3.5",
-				"vue-eslint-parser": "^8.0.1"
+				"nth-check": "^2.1.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.2",
+				"xml-name-validator": "^4.0.0"
 			}
 		},
 		"eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.24.12",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
+			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
 			"dev": true
 		},
 		"eslint-plugin-yml": {
-			"version": "1.12.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.12.2.tgz",
-			"integrity": "sha512-hvS9p08FhPT7i/ynwl7/Wt7ke7Rf4P2D6fT8lZlL43peZDTsHtH2A0SIFQ7Kt7+mJ6if6P+FX3iJhMkdnxQwpg==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.4.0",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
-			},
-			"dependencies": {
-				"eslint-compat-utils": {
-					"version": "0.4.1",
-					"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.4.1.tgz",
-					"integrity": "sha512-5N7ZaJG5pZxUeNNJfUchurLVrunD1xJvyg5kYOIVF8kg1f3ajTikmAu/5fZ9w100omNPOoMjngRszh/Q/uFGMg==",
-					"dev": true,
-					"requires": {
-						"semver": "^7.5.4"
-					}
-				}
 			}
 		},
 		"eslint-scope": {
@@ -7269,12 +7112,20 @@
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^2.0.0"
+			},
+			"dependencies": {
+				"eslint-visitor-keys": {
+					"version": "2.1.0",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+					"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+					"dev": true
+				}
 			}
 		},
 		"eslint-visitor-keys": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-			"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+			"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": {
@@ -7286,14 +7137,6 @@
 				"acorn": "^8.9.0",
 				"acorn-jsx": "^5.3.2",
 				"eslint-visitor-keys": "^3.4.1"
-			},
-			"dependencies": {
-				"eslint-visitor-keys": {
-					"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
-				}
 			}
 		},
 		"esprima": {
@@ -8987,9 +8830,9 @@
 			}
 		},
 		"regexp-tree": {
-			"version": "0.1.24",
-			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz",
-			"integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==",
+			"version": "0.1.27",
+			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
+			"integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
 			"dev": true
 		},
 		"regjsparser": {
@@ -9112,9 +8955,9 @@
 			"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==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"requires": {
 				"lru-cache": "^6.0.0"
@@ -9864,26 +9707,18 @@
 			}
 		},
 		"vue-eslint-parser": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-			"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
+			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
 			"dev": true,
 			"requires": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
+				"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.5"
-			},
-			"dependencies": {
-				"eslint-visitor-keys": {
-					"version": "3.4.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
-					"integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
-					"dev": true
-				}
+				"semver": "^7.3.6"
 			}
 		},
 		"websocket-driver": {
@@ -9989,9 +9824,9 @@
 			"dev": true
 		},
 		"yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
+			"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
 			"dev": true
 		},
 		"yaml-eslint-parser": {
@@ -10003,14 +9838,6 @@
 				"eslint-visitor-keys": "^3.0.0",
 				"lodash": "^4.17.21",
 				"yaml": "^2.0.0"
-			},
-			"dependencies": {
-				"eslint-visitor-keys": {
-					"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
-				}
 			}
 		},
 		"yargs": {
diff --git a/package.json b/package.json
index 9471e12..9d5cfbe 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,7 @@
 		"url": "https://gerrit.wikimedia.org/r/p/mediawiki/extensions/DonationInterface.git"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.26.0",
+		"eslint-config-wikimedia": "0.27.0",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.11.1",
 		"grunt-contrib-watch": "1.1.0",
-- 
2.39.2


--- end ---
Source code is licensed under the AGPL.