mediawiki/extensions/ContentTranslation (main)

sourcepatches
From ba2d0b5b5683809ce50b26d7188ade5e89ecc014 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 15 Apr 2024 06:01:18 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.27.0

Change-Id: I340e3b5977a5f20defd7b0b2a6ba70148566e60e
---
 ...xt.cx.entrypoints.uls.relevantlanguages.js |   2 +
 package-lock.json                             | 614 +++++++++---------
 package.json                                  |   2 +-
 3 files changed, 300 insertions(+), 318 deletions(-)

diff --git a/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages.js b/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages.js
index 6dbd843..1ff8471 100644
--- a/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages.js
+++ b/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages.js
@@ -139,6 +139,7 @@
 				/**
 				 * This variable stores an array of language codes. These language codes are
 				 * the content languages of the "relevant" wikis, from which the current article is missing.
+				 *
 				 * @type {string[]}
 				 */
 				const missingRelevantLanguages = [];
@@ -158,6 +159,7 @@
 					 * language for this wiki is "nb".
 					 * - for "nb" language code, "wikiDomainCode" will be "no", and the content
 					 * language for this wiki is also "nb".
+					 *
 					 * @type {string}
 					 */
 					const wikiContentLanguage = siteMapper.getLanguageCodeForWikiDomain( wikiDomainCode );
diff --git a/package-lock.json b/package-lock.json
index f9bc842..7d9dd6e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,7 +14,7 @@
 				"@wdio/mocha-framework": "7.16.3",
 				"@wdio/spec-reporter": "7.16.3",
 				"dotenv": "^16.3.1",
-				"eslint-config-wikimedia": "0.26.0",
+				"eslint-config-wikimedia": "0.27.0",
 				"grunt-banana-checker": "0.11.1",
 				"pre-commit": "^1.2.2",
 				"stylelint-config-wikimedia": "0.16.1",
@@ -308,17 +308,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": {
@@ -369,9 +369,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"
@@ -982,9 +982,9 @@
 			}
 		},
 		"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/@types/stack-utils": {
@@ -3379,9 +3379,9 @@
 			"dev": true
 		},
 		"node_modules/browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -3398,8 +3398,8 @@
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			},
@@ -3411,9 +3411,9 @@
 			}
 		},
 		"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/buffer": {
@@ -3777,9 +3777,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001579",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz",
-			"integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==",
+			"version": "1.0.30001610",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz",
+			"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==",
 			"dev": true,
 			"funding": [
 				{
@@ -4075,9 +4075,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"
@@ -4156,6 +4156,19 @@
 				"safe-buffer": "~5.1.0"
 			}
 		},
+		"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.2",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -5592,9 +5605,9 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.643",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.643.tgz",
-			"integrity": "sha512-QHscvvS7gt155PtoRC0dR2ilhL8E9LHhfTQEq1uD5AL0524rBLAwpAREFH06f87/e45B9XkR6Ki5dbhbCsVEIg==",
+			"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": {
@@ -5708,16 +5721,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",
@@ -5763,10 +5776,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"
 			},
@@ -5775,28 +5791,28 @@
 			}
 		},
 		"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-plugin-compat": {
@@ -5821,14 +5837,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"
@@ -5841,9 +5857,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"
@@ -5852,7 +5868,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": "*"
 			},
@@ -5866,25 +5882,36 @@
 			}
 		},
 		"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/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": {
@@ -5901,69 +5928,26 @@
 			}
 		},
 		"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": {
 				"eslint": ">=5.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-mediawiki/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==",
-			"dev": true,
-			"dependencies": {
-				"eslint-utils": "^3.0.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"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
-			}
-		},
-		"node_modules/eslint-plugin-mediawiki/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==",
-			"dev": true,
-			"dependencies": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
-				"esquery": "^1.4.0",
-				"lodash": "^4.17.21",
-				"semver": "^7.3.5"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/mysticatea"
-			},
-			"peerDependencies": {
-				"eslint": ">=6.0.0"
-			}
-		},
 		"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": {
@@ -6011,16 +5995,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": {
@@ -6033,26 +6017,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": {
@@ -6062,47 +6046,63 @@
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.38.0"
+				"eslint": ">=8.56.0"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/ci-info": {
+			"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": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/sibiraj-s"
+				}
+			],
+			"engines": {
+				"node": ">=8"
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "9.20.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.1.tgz",
-			"integrity": "sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==",
+			"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-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.4.0",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"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"
+				"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"
@@ -6117,21 +6117,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",
@@ -11021,9 +11006,9 @@
 			}
 		},
 		"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"
@@ -13087,10 +13072,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"
 			}
@@ -13529,12 +13517,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"
 			}
@@ -13572,9 +13560,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
 		},
 		"@faker-js/faker": {
@@ -14076,9 +14064,9 @@
 			}
 		},
 		"@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
 		},
 		"@types/stack-utils": {
@@ -15962,21 +15950,21 @@
 			"dev": true
 		},
 		"browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"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.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			}
 		},
 		"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
 		},
 		"buffer": {
@@ -16237,9 +16225,9 @@
 			}
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001579",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz",
-			"integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==",
+			"version": "1.0.30001610",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz",
+			"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==",
 			"dev": true
 		},
 		"caseless": {
@@ -16445,9 +16433,9 @@
 			"peer": 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
 		},
 		"compress-commons": {
@@ -16519,6 +16507,15 @@
 				}
 			}
 		},
+		"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.2",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -17608,9 +17605,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.643",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.643.tgz",
-			"integrity": "sha512-QHscvvS7gt155PtoRC0dR2ilhL8E9LHhfTQEq1uD5AL0524rBLAwpAREFH06f87/e45B9XkR6Ki5dbhbCsVEIg==",
+			"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": {
@@ -17696,16 +17693,16 @@
 			}
 		},
 		"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",
@@ -17753,35 +17750,37 @@
 			}
 		},
 		"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"
 			}
 		},
 		"eslint-plugin-compat": {
@@ -17800,39 +17799,52 @@
 			}
 		},
 		"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": {
+				"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"
+					}
+				}
 			}
 		},
 		"eslint-plugin-json-es": {
@@ -17846,53 +17858,23 @@
 			}
 		},
 		"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"
-			},
-			"dependencies": {
-				"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==",
-					"dev": true,
-					"requires": {
-						"eslint-utils": "^3.0.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"
-					}
-				},
-				"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==",
-					"dev": true,
-					"requires": {
-						"debug": "^4.3.2",
-						"eslint-scope": "^7.0.0",
-						"eslint-visitor-keys": "^3.1.0",
-						"espree": "^9.0.0",
-						"esquery": "^1.4.0",
-						"lodash": "^4.17.21",
-						"semver": "^7.3.5"
-					}
-				}
 			}
 		},
 		"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"
 			}
 		},
@@ -17923,9 +17905,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",
@@ -17942,72 +17924,70 @@
 			}
 		},
 		"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"
+			},
+			"dependencies": {
+				"ci-info": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+					"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+					"dev": true
+				}
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "9.20.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.1.tgz",
-			"integrity": "sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==",
+			"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-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.4.0",
+				"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": {
@@ -21662,9 +21642,9 @@
 			}
 		},
 		"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"
@@ -23220,9 +23200,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": {
diff --git a/package.json b/package.json
index a2b8513..10c5d8f 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,7 @@
 		"@wdio/mocha-framework": "7.16.3",
 		"@wdio/spec-reporter": "7.16.3",
 		"dotenv": "^16.3.1",
-		"eslint-config-wikimedia": "0.26.0",
+		"eslint-config-wikimedia": "0.27.0",
 		"grunt-banana-checker": "0.11.1",
 		"pre-commit": "^1.2.2",
 		"stylelint-config-wikimedia": "0.16.1",
-- 
2.39.2

$ date
--- stdout ---
Mon Apr 15 05:57:18 UTC 2024

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-ContentTranslation.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 ---
5c19f5fd14d5e4c1db2f459164b8021fe2a4ce2f refs/heads/master

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "mwbot": {
      "name": "mwbot",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "request"
      ],
      "effects": [
        "wdio-mediawiki"
      ],
      "range": ">=0.1.6",
      "nodes": [
        "node_modules/mwbot"
      ],
      "fixAvailable": false
    },
    "request": {
      "name": "request",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096727,
          "name": "request",
          "dependency": "request",
          "title": "Server-Side Request Forgery in Request",
          "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
          "severity": "moderate",
          "cwe": [
            "CWE-918"
          ],
          "cvss": {
            "score": 6.1,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
          },
          "range": "<=2.88.2"
        },
        "tough-cookie"
      ],
      "effects": [
        "mwbot"
      ],
      "range": "*",
      "nodes": [
        "node_modules/request"
      ],
      "fixAvailable": false
    },
    "tough-cookie": {
      "name": "tough-cookie",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096643,
          "name": "tough-cookie",
          "dependency": "tough-cookie",
          "title": "tough-cookie Prototype Pollution vulnerability",
          "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3",
          "severity": "moderate",
          "cwe": [
            "CWE-1321"
          ],
          "cvss": {
            "score": 6.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"
          },
          "range": "<4.1.3"
        }
      ],
      "effects": [
        "request"
      ],
      "range": "<4.1.3",
      "nodes": [
        "node_modules/tough-cookie"
      ],
      "fixAvailable": false
    },
    "wdio-mediawiki": {
      "name": "wdio-mediawiki",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "mwbot"
      ],
      "effects": [],
      "range": "*",
      "nodes": [
        "node_modules/wdio-mediawiki"
      ],
      "fixAvailable": false
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 4,
      "high": 0,
      "critical": 0,
      "total": 4
    },
    "dependencies": {
      "prod": 1,
      "dev": 1084,
      "optional": 42,
      "peer": 199,
      "peerOptional": 0,
      "total": 1084
    }
  }
}

--- 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: 41 installs, 0 updates, 0 removals
  - Locking composer/installers (v2.2.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 dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
  - Locking doctrine/deprecations (1.1.3)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking firebase/php-jwt (v6.10.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 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 phpstan/phpdoc-parser (1.28.0)
  - Locking psr/container (2.0.2)
  - Locking psr/log (2.0.0)
  - Locking sabre/event (5.1.4)
  - Locking squizlabs/php_codesniffer (3.8.1)
  - Locking symfony/console (v5.4.36)
  - Locking symfony/deprecation-contracts (v3.4.0)
  - 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-php73 (v1.29.0)
  - Locking symfony/polyfill-php80 (v1.29.0)
  - Locking symfony/service-contracts (v3.4.2)
  - Locking symfony/string (v6.4.4)
  - Locking tysonandre/var_representation_polyfill (0.1.3)
  - Locking webmozart/assert (1.11.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 41 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Installing composer/installers (v2.2.0): Extracting archive
  - Installing squizlabs/php_codesniffer (3.8.1): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
  - Installing composer/pcre (3.1.3): Extracting archive
  - Installing firebase/php-jwt (v6.10.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 symfony/polyfill-mbstring (v1.29.0): 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 (v6.4.4): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing symfony/service-contracts (v3.4.2): Extracting archive
  - Installing symfony/polyfill-php73 (v1.29.0): Extracting archive
  - Installing symfony/deprecation-contracts (v3.4.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 (2.0.0): 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 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
  0/38 [>---------------------------]   0%
 23/38 [================>-----------]  60%
 37/38 [===========================>]  97%
 38/38 [============================] 100%
4 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
17 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 har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated stylelint-stylistic@0.4.3: This package has been deprecated in favor of @stylistic/stylelint-plugin
--- stdout ---

added 1083 packages, and audited 1084 packages in 27s

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

4 moderate severity vulnerabilities

Some issues need review, and may require choosing
a different dependency.

Run `npm audit` for details.

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

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

--- end ---
$ ./node_modules/.bin/eslint . --fix
--- stdout ---

/src/repo/modules/dashboard/mw.cx.DashboardList.js
  127:7  warning  'language' is already declared in the upper scope on line 122 column 13  no-shadow

/src/repo/modules/entrypoints/ext.cx.entrypoints.mffrequentlanguages.js
  148:1  warning  The type 'LanguageSearcher' is undefined  jsdoc/no-undefined-types

/src/repo/modules/entrypoints/ext.cx.entrypoints.recentedit/RecentEditEntrypointInvitation.vue
   8:7  warning  Don't use 'v-text'  vue/no-v-text
  32:6  warning  Don't use 'v-text'  vue/no-v-text
  61:7  warning  Don't use 'v-text'  vue/no-v-text
  66:6  warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/entrypoints/ext.cx.entrypoints.recenttranslation/RecentTranslationEntrypointDialog.vue
   7:10  warning  Don't use 'v-text'  vue/no-v-text
  16:6   warning  Don't use 'v-text'  vue/no-v-text
  22:6   warning  Don't use 'v-text'  vue/no-v-text
  33:7   warning  Don't use 'v-text'  vue/no-v-text
  37:12  warning  Don't use 'v-text'  vue/no-v-text
  38:11  warning  Don't use 'v-text'  vue/no-v-text
  41:12  warning  Don't use 'v-text'  vue/no-v-text
  42:11  warning  Don't use 'v-text'  vue/no-v-text
  46:12  warning  Don't use 'v-text'  vue/no-v-text
  47:11  warning  Don't use 'v-text'  vue/no-v-text
  57:13  warning  Don't use 'v-text'  vue/no-v-text
  64:8   warning  Don't use 'v-text'  vue/no-v-text
  78:7   warning  Don't use 'v-text'  vue/no-v-text
  86:13  warning  Don't use 'v-text'  vue/no-v-text
  90:7   warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages/CxUlsEntrypoint.vue
  30:6  warning  Don't use 'v-text'  vue/no-v-text
  40:5  warning  Don't use 'v-text'  vue/no-v-text
  68:7  warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/mw.cx.TargetArticle.js
  356:1  warning  The type 'publishErrorCaptcha' is undefined  jsdoc/no-undefined-types

/src/repo/modules/mw.cx.init.Translation.js
  131:1  warning  Syntax error in type: Promise<[Object, mw.cx.dm.DraftTranslationDTO|null]>  jsdoc/valid-types

/src/repo/modules/stats/ext.cx.stats.js
  617:55  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  629:55  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  641:49  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  662:58  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  674:58  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  686:52  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  698:55  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  718:55  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  727:55  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  736:49  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  757:58  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  766:58  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  775:52  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  784:55  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow

/src/repo/modules/ui/mw.cx.ui.ArticleColumn.js
  17:1  warning  Duplicate @param "config.sectionTitle"  jsdoc/check-param-names

/src/repo/modules/ui/mw.cx.ui.SourceColumn.js
  6:1  warning  @param path declaration ("config.siteMapper") appears before any real parameter  jsdoc/check-param-names

/src/repo/modules/ui/widgets/mw.cx.ui.CategoryTagItemWidget.js
  65:1  warning  The type 'mouseenter' is undefined  jsdoc/no-undefined-types
  74:1  warning  The type 'mouseleave' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ui/widgets/mw.cx.ui.PageSelectorWidget.js
  219:31  warning  'pages' is already declared in the upper scope on line 184 column 71  no-shadow

/src/repo/modules/ui/widgets/mw.cx.ui.PageTitleWidget.js
  157:1  warning  The type 'enter' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ui/widgets/mw.cx.ui.SectionTitleWidget.js
  99:1  warning  The type 'enter' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-cx/dm/mixins/ve.dm.CXLintableNode.js
  52:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/modules/ve-cx/init/ve.init.mw.CXTarget.js
  590:1  warning  Missing JSDoc @return type  jsdoc/require-returns-type

/src/repo/tests/selenium/componentobjects/DesktopEditor.js
  43:2  warning  Missing JSDoc @return declaration  jsdoc/require-returns

/src/repo/tests/selenium/utils/ElementAction.js
  90:1  warning  Expected @param names to be "selector, attribute". Got "attribute, selector"  jsdoc/check-param-names
  90:1  warning  Missing JSDoc @param "attribute" type                                         jsdoc/require-param-type

✖ 52 problems (0 errors, 52 warnings)


--- end ---
$ ./node_modules/.bin/eslint . -f json
--- stdout ---
[{"filePath":"/src/repo/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/.stylelintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/base/ext.cx.model.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/base/mw.cx.SiteMapper.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/cache/mw.cx.ApiResponseCache.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/cache/mw.cx.CategoryCache.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/cache/mw.cx.NamespaceCache.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/cache/mw.cx.TitlePairCache.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dashboard/ext.cx.dashboard.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'event_type' is not in camel case.","line":113,"column":5,"nodeType":"Identifier","messageId":"notCamelCase","endLine":113,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'event_source' is not in camel case.","line":115,"column":5,"nodeType":"Identifier","messageId":"notCamelCase","endLine":115,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'content_translation_session_position' is not in camel case.","line":117,"column":5,"nodeType":"Identifier","messageId":"notCamelCase","endLine":117,"endColumn":41,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'translation_source_language' is not in camel case.","line":119,"column":5,"nodeType":"Identifier","messageId":"notCamelCase","endLine":119,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'translation_target_language' is not in camel case.","line":121,"column":5,"nodeType":"Identifier","messageId":"notCamelCase","endLine":121,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'access_method' is not in camel case.","line":123,"column":5,"nodeType":"Identifier","messageId":"notCamelCase","endLine":123,"endColumn":18,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'translation_type' is not in camel case.","line":125,"column":5,"nodeType":"Identifier","messageId":"notCamelCase","endLine":125,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":281,"column":49,"nodeType":"ObjectExpression","endLine":289,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":415,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":422,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dashboard/ext.cx.logevent.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'translation_type' is not in camel case.","line":99,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":99,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'wiki_db' is not in camel case.","line":101,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":101,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'access_method' is not in camel case.","line":103,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":103,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_name' is not in camel case.","line":105,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":105,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'web_session_id' is not in camel case.","line":107,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":107,"endColumn":18,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'web_pageview_id' is not in camel case.","line":109,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":109,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_is_anonymous' is not in camel case.","line":111,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":111,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'content_translation_session_id' is not in camel case.","line":113,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":113,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_global_edit_count' is not in camel case.","line":124,"column":11,"nodeType":"Identifier","messageId":"notCamelCase","endLine":124,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_global_edit_count_bucket' is not in camel case.","line":126,"column":11,"nodeType":"Identifier","messageId":"notCamelCase","endLine":126,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dashboard/ext.cx.recommendtool.client.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dashboard/mw.cx.DashboardList.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'language' is already declared in the upper scope on line 122 column 13.","line":127,"column":7,"nodeType":"Identifier","messageId":"noShadow","endLine":127,"endColumn":15}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * @copyright See AUTHORS.txt\n * @license GPL-2.0-or-later\n */\n'use strict';\n\n/**\n * @class\n * @constructor\n * @abstract\n *\n * @param {jQuery} $container The container for this suggestion list\n * @param {mw.cx.SiteMapper} siteMapper\n */\nmw.cx.DashboardList = function ( $container, siteMapper ) {\n\tthis.$container = $container;\n\tthis.siteMapper = siteMapper;\n\n\tthis.$headerContainer = null;\n\tthis.$listContainer = null;\n\tthis.$loadingIndicatorSpinner = null;\n\tthis.languageFilter = null;\n\tthis.pendingRequests = 0;\n\tthis.active = false;\n\n\tthis.init();\n\tthis.listen();\n};\n\n/* Initialization */\n\nOO.initClass( mw.cx.DashboardList );\n\n/* Static properties */\n\nmw.cx.DashboardList.static.lostSessionTitle = OO.ui.deferMsg( 'cx-lost-session' );\nmw.cx.DashboardList.static.lostSessionMessage = OO.ui.deferMsg( 'cx-lost-session-dashboard' );\n\n/* Static methods */\n\n/**\n * Display the modal dialog that lets the user know session has expired.\n * Login button is provided and no other action can be taken before user logs in again.\n */\nmw.cx.DashboardList.static.showLoginDialog = function () {\n\tOO.ui.getWindowManager().openWindow( 'message', {\n\t\ttitle: this.lostSessionTitle,\n\t\tmessage: this.lostSessionMessage,\n\t\tactions: [\n\t\t\t{ action: 'login', label: mw.msg( 'login' ), flags: [ 'primary', 'progressive' ] }\n\t\t]\n\t} ).closed.then( function () {\n\t\tlocation.href = mw.cx.getLoginHref();\n\t} );\n};\n\n/* Methods */\n\nmw.cx.DashboardList.prototype.show = function () {\n\tthis.active = true;\n\tthis.$listContainer.show();\n};\n\nmw.cx.DashboardList.prototype.hide = function () {\n\tthis.active = false;\n\tthis.$listContainer.hide();\n};\n\nmw.cx.DashboardList.prototype.init = function ( languageFilterConfig ) {\n\tthis.languageFilter = new mw.cx.ui.LanguageFilter( $.extend( {\n\t\tonSourceLanguageChange: this.applyFilters.bind( this ),\n\t\tonTargetLanguageChange: this.applyFilters.bind( this )\n\t}, languageFilterConfig ) );\n\n\tthis.$loadingIndicatorSpinner = $( '<div>' )\n\t\t.addClass( 'cx-dashboardlist__loading-indicator' )\n\t\t.append( mw.cx.widgets.spinner() );\n\n\tthis.$listContainer = $( '<div>' );\n\tthis.$container.append( this.$listContainer );\n};\n\nmw.cx.DashboardList.prototype.listen = function () {\n\t$( window ).on( 'scroll', OO.ui.throttle( this.scrollHandler.bind( this ), 250 ) );\n};\n\nmw.cx.DashboardList.prototype.scrollHandler = function () {\n\tif ( !this.active ) {\n\t\treturn;\n\t}\n\n\tthis.onScroll();\n};\n\n/**\n * Get the details for pages with given titles.\n *\n * @param {string} language The language of the title.\n * @param {string[]} titles Title\n * @return {jQuery.Promise}\n */\nmw.cx.DashboardList.prototype.getPageDetails = function ( language, titles ) {\n\treturn this.siteMapper.getApi( language ).get( {\n\t\taction: 'query',\n\t\ttitles: titles,\n\t\tprop: this.getPageProps(),\n\t\tpiprop: 'thumbnail',\n\t\tpilimit: 50, // maximum\n\t\tpithumbsize: 100,\n\t\tredirects: true\n\t} );\n\n\t// TODO: Handle continue\n};\n\n/**\n * Show a title image and description based on source title.\n *\n * @param {Object} list\n */\nmw.cx.DashboardList.prototype.showTitleDetails = function ( list ) {\n\tvar apply, language, processPageDetails,\n\t\tqueries = {},\n\t\tmap = {};\n\n\tlist.forEach( function ( item ) {\n\t\tvar language = this.siteMapper.getWikiDomainCode( item.sourceLanguage ),\n\t\t\ttitle = item.sourceTitle || item.title;\n\n\t\tqueries[ language ] = queries[ language ] || [];\n\t\tqueries[ language ].push( title );\n\n\t\t// So that we can easily find the element in the callback\n\t\t// Same source title might be translated to multiple languages.\n\t\tmap[ title ] = map[ title ] || [];\n\t\tmap[ title ].push( item );\n\t}, this );\n\n\tapply = function ( page ) {\n\t\tif ( !map[ page.title ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tmap[ page.title ].forEach( function ( item ) {\n\t\t\tif ( page.thumbnail ) {\n\t\t\t\titem.$image\n\t\t\t\t\t.removeClass( 'oo-ui-icon-article' )\n\t\t\t\t\t.addClass( 'mw-no-invert' )\n\t\t\t\t\t.css( 'background-image', 'url(' + page.thumbnail.source + ')' );\n\t\t\t}\n\n\t\t\tif ( page.description ) {\n\t\t\t\titem.$desc.text( page.description ).show();\n\t\t\t}\n\t\t} );\n\t};\n\n\tprocessPageDetails = function ( response ) {\n\t\tvar pageId, page,\n\t\t\tredirects = response.query.redirects || [],\n\t\t\tredirectsTo = {},\n\t\t\tpages = response.query.pages;\n\n\t\tredirects.forEach( function ( redirect ) {\n\t\t\tredirectsTo[ redirect.to ] = redirect.from;\n\t\t} );\n\n\t\tfor ( pageId in pages ) {\n\t\t\tpage = pages[ pageId ];\n\t\t\tpage.title = redirectsTo[ page.title ] || page.title;\n\t\t\tapply( page );\n\t\t}\n\t};\n\n\tfor ( language in queries ) {\n\t\tthis.getPageDetails( language, queries[ language ] ).done( processPageDetails );\n\t}\n};\n\n/* Abstract methods */\n\n/**\n * Page properties which need to be fetched in this.getPageDetails\n *\n * @method\n * @abstract\n * @return {string[]}\n */\nmw.cx.DashboardList.prototype.getPageProps = null;\n\n/**\n * @method\n * @abstract\n */\nmw.cx.DashboardList.prototype.applyFilters = null;\n\n/**\n * @method\n * @abstract\n */\nmw.cx.DashboardList.prototype.onScroll = null;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dashboard/mw.cx.SuggestionList.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-slide","severity":2,"message":"Prefer CSS transitions to .slideUp","line":590,"column":4,"nodeType":"CallExpression","endLine":592,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":925,"column":2,"nodeType":"CallExpression","endLine":925,"endColumn":81,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":927,"column":2,"nodeType":"CallExpression","endLine":927,"endColumn":86,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dashboard/mw.cx.TranslationList.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dm/mw.cx.dm.DraftTranslationDTO.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dm/mw.cx.dm.PageTitleModel.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dm/mw.cx.dm.SectionState.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dm/mw.cx.dm.SectionTitleModel.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dm/mw.cx.dm.Translation.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dm/mw.cx.dm.TranslationIssue.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dm/mw.cx.dm.WikiPage.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/dm/mw.cx.dm.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.betafeature.init.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.contributions.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":36,"column":35,"nodeType":"ObjectExpression","endLine":42,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":80,"column":4,"nodeType":"ObjectExpression","endLine":89,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":98,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":98,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.contributionsmenu.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.languagesearcher.init.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.languagesearcher.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.mffrequentlanguages.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'LanguageSearcher' is undefined.","line":148,"column":1,"nodeType":"Block","endLine":148,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function () {\n\t/**\n\t * @param {{ lang: string, autonym: string, dir: string }[]} sxMissingFrequentLanguages array of missing frequent languages\n\t * @return {HTMLDivElement}\n\t */\n\tfunction createPanelTextElement( sxMissingFrequentLanguages ) {\n\t\tvar missingLanguagesPanelTextElement = document.createElement( 'div' );\n\t\tmissingLanguagesPanelTextElement.className = 'cx-entrypoint-missing-frequent-languages__text';\n\n\t\tvar missingFrequentLanguagesCount = sxMissingFrequentLanguages.length;\n\t\t// This method is only called when frequent, missing and SX-enabled languages DO exist,\n\t\t// so the length is guaranteed to be greater than 0\n\t\tif ( missingFrequentLanguagesCount === 1 ) {\n\t\t\tmissingLanguagesPanelTextElement.innerHTML = mw.message(\n\t\t\t\t'sx-missing-languages-entrypoint-panel-text-one-missing',\n\t\t\t\tsxMissingFrequentLanguages[ 0 ].autonym\n\t\t\t).parse();\n\t\t} else if ( missingFrequentLanguagesCount === 2 ) {\n\t\t\tmissingLanguagesPanelTextElement.innerHTML = mw.message(\n\t\t\t\t'sx-missing-languages-entrypoint-panel-text-two-missing',\n\t\t\t\tsxMissingFrequentLanguages[ 0 ].autonym,\n\t\t\t\tsxMissingFrequentLanguages[ 1 ].autonym\n\t\t\t).parse();\n\t\t} else {\n\t\t\t// more than two frequent languages that are enabled for\n\t\t\t// Section Translation are missing\n\t\t\tmissingLanguagesPanelTextElement.innerHTML = mw.message(\n\t\t\t\t'sx-missing-languages-entrypoint-panel-text-more-missing',\n\t\t\t\tsxMissingFrequentLanguages[ 0 ].autonym,\n\t\t\t\tsxMissingFrequentLanguages[ 1 ].autonym\n\t\t\t).parse();\n\t\t}\n\n\t\tvar languageSpans = missingLanguagesPanelTextElement.getElementsByTagName( 'span' );\n\t\tfor ( var i = 0; i < languageSpans.length; i++ ) {\n\t\t\tlanguageSpans[ i ].setAttribute( 'lang', sxMissingFrequentLanguages[ i ].lang );\n\t\t\tlanguageSpans[ i ].setAttribute( 'dir', sxMissingFrequentLanguages[ i ].dir );\n\t\t}\n\n\t\treturn missingLanguagesPanelTextElement;\n\t}\n\n\tfunction createArrowIcon() {\n\t\tvar span = document.createElement( 'span' );\n\t\tspan.className = 'cx-entrypoint-missing-frequent-languages__icon mw-ui-icon';\n\t\treturn span;\n\t}\n\n\t/**\n\t * This method creates and returns an H3 header element that contains the entrypoint banner.\n\t * The returned element should strictly be an H3 element, so that this banner element is hidden,\n\t * along with the other H3 header elements inside mobile Language Searcher, when a search query\n\t * exists inside the mobile Language Searcher search input. This is required so that we avoid to\n\t * display multiple SX entrypoints at the same time (https://phabricator.wikimedia.org/T298032#7844926).\n\t *\n\t * @param {{ lang: string, autonym: string, dir: string }[]} sxMissingFrequentLanguages array of missing frequent languages\n\t * @return {HTMLHeadingElement}\n\t */\n\tfunction createMissingLanguagesPanel( sxMissingFrequentLanguages ) {\n\t\t// Wrap the banner inside an h3 element, so that it is hidden along with other h3 elements inside mobile\n\t\t// Language Searcher, when a search query exists inside the Language Searcher search input.\n\t\tvar missingLanguagesPanelContainer = document.createElement( 'h3' );\n\t\tmissingLanguagesPanelContainer.className = 'cx-entrypoint-missing-frequent-languages-container';\n\n\t\tvar missingLanguagesPanel = document.createElement( 'a' );\n\t\tmissingLanguagesPanel.className = 'cx-entrypoint-missing-frequent-languages';\n\n\t\tvar missingLanguagesPanelText = createPanelTextElement( sxMissingFrequentLanguages );\n\t\tvar missingLanguagesPanelIcon = createArrowIcon();\n\t\tmissingLanguagesPanel.appendChild( missingLanguagesPanelText );\n\t\tmissingLanguagesPanel.appendChild( missingLanguagesPanelIcon );\n\n\t\tvar siteMapper = new mw.cx.SiteMapper();\n\t\tmissingLanguagesPanel.href = siteMapper.getCXUrl(\n\t\t\tmw.config.get( 'wgPageName' ),\n\t\t\tnull,\n\t\t\tsiteMapper.getCurrentWikiLanguageCode(),\n\t\t\tsxMissingFrequentLanguages[ 0 ].lang,\n\t\t\t{ campaign: 'mffrequentlanguages', sx: true }\n\t\t);\n\n\t\tmissingLanguagesPanelContainer.appendChild( missingLanguagesPanel );\n\t\treturn missingLanguagesPanelContainer;\n\t}\n\n\t/**\n\t * @param {Object} frequentLanguages object containing the frequently used languages (codes)\n\t * mapped to their respective frequency\n\t * @param {string|undefined} deviceLanguage the device language (can be a variant too, e.g. en-gb)\n\t * @return {{autonym: string, lang: string, dir: string}[]} array of objects representing languages, ordered by their frequency\n\t */\n\tfunction getMissingFrequentLanguages( frequentLanguages, deviceLanguage ) {\n\t\tvar targetedLanguages,\n\t\t\tdeviceParentLanguage,\n\t\t\tindex;\n\n\t\t/** @type {{lang: string, frequency: number}[]} */\n\t\ttargetedLanguages = Object.keys( frequentLanguages ).map( function ( languageCode ) {\n\t\t\treturn { lang: languageCode, frequency: frequentLanguages[ languageCode ] };\n\t\t} ).sort( function ( a, b ) {\n\t\t\treturn b.frequency - a.frequency;\n\t\t} );\n\n\t\t// add device language/variant and parent device language (if exist) on top of this list\n\t\tif ( deviceLanguage ) {\n\t\t\tindex = deviceLanguage.indexOf( '-' );\n\t\t\tif ( index !== -1 ) {\n\t\t\t\tdeviceParentLanguage = deviceLanguage.slice( 0, index );\n\t\t\t}\n\n\t\t\ttargetedLanguages = targetedLanguages.filter( function ( language ) {\n\t\t\t\treturn language.lang !== deviceLanguage && language.lang !== deviceParentLanguage;\n\t\t\t} );\n\t\t\tif ( deviceParentLanguage ) {\n\t\t\t\ttargetedLanguages.unshift( { lang: deviceParentLanguage } );\n\t\t\t}\n\t\t\ttargetedLanguages.unshift( { lang: deviceLanguage } );\n\t\t}\n\t\t// Remove current wiki language from targetedLanguages\n\t\ttargetedLanguages = targetedLanguages.filter( function ( language ) {\n\t\t\treturn language.lang !== mw.config.get( 'wgContentLanguage' );\n\t\t} );\n\t\t/**\n\t\t * @type {{lang: string, autonym: string, dir: string}[]} missingSXLanguages array containing the\n\t\t * enabled language codes for SX that are missing for the specific article\n\t\t */\n\t\tvar missingSXLanguages = mw.config.get( 'wgSectionTranslationMissingLanguages', [] );\n\t\treturn missingSXLanguages.filter( function ( missingSXLanguage ) {\n\t\t\treturn targetedLanguages.some( function ( targetLanguage ) {\n\t\t\t\treturn missingSXLanguage.lang === targetLanguage.lang;\n\t\t\t} );\n\t\t} );\n\t}\n\n\t/**\n\t * Copied from MobileFrontend/src/mobile.languages.structured/util.js\n\t *\n\t * @return {Object} object containing the frequently used languages (codes)\n\t * mapped to their respective frequency (e.g. { en: 3, el: 5 })\n\t */\n\tfunction getFrequentlyUsedLanguages() {\n\t\tvar languageMap = mw.storage.get( 'langMap' );\n\n\t\treturn languageMap ? JSON.parse( languageMap ) : {};\n\t}\n\n\tmw.hook( 'mobileFrontend.languageSearcher.onOpen' ).add(\n\t\t/** @param {LanguageSearcher} languageSearcher */\n\t\tfunction ( languageSearcher ) {\n\t\t\tvar frequentLanguages = getFrequentlyUsedLanguages(),\n\t\t\t\tdeviceLanguage = languageSearcher.options.deviceLanguage;\n\n\t\t\tvar sxMissingFrequentLanguages = getMissingFrequentLanguages( frequentLanguages, deviceLanguage );\n\t\t\tif ( !sxMissingFrequentLanguages.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar missingLanguagesPanel = createMissingLanguagesPanel( sxMissingFrequentLanguages );\n\t\t\tlanguageSearcher.addBanner( missingLanguagesPanel.outerHTML );\n\t\t}\n\t);\n}() );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.newarticle.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.newarticle.veloader.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.newbytranslation.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.newbytranslation.mobile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.recentedit/RecentEditEntrypointInvitation.vue","messages":[{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":8,"column":7,"nodeType":"VAttribute","messageId":"unexpected","endLine":8,"endColumn":70},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":32,"column":6,"nodeType":"VAttribute","messageId":"unexpected","endLine":32,"endColumn":116},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":61,"column":7,"nodeType":"VAttribute","messageId":"unexpected","endLine":61,"endColumn":103},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":66,"column":6,"nodeType":"VAttribute","messageId":"unexpected","endLine":72,"endColumn":7}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"<template>\n\t<section v-if=\"showPanel\" class=\"sx-recent-edit-entrypoint\">\n\t\t<div class=\"sx-recent-edit-entrypoint__top-banner row pa-4\">\n\t\t\t<div class=\"col\">\n\t\t\t\t<div class=\"row sx-recent-edit-entrypoint__top-banner__header\">\n\t\t\t\t\t<h5\n\t\t\t\t\t\tclass=\"col\"\n\t\t\t\t\t\tv-text=\"$i18n( 'sx-recent-edit-entrypoint-top-banner-header' )\"\n\t\t\t\t\t></h5>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"sx-recent-edit-entrypoint__top-banner__close-icon col shrink\"\n\t\t\t\t\t\t@click=\"closeInvite\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t:width=\"size\"\n\t\t\t\t\t\t\t\t:height=\"size\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<g :fill=\"iconColor\">\n\t\t\t\t\t\t\t\t\t<path :d=\"closeIconPath\" />\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<p\n\t\t\t\t\tclass=\"sx-recent-edit-entrypoint__top-banner__content\"\n\t\t\t\t\tv-text=\"$i18n( 'sx-recent-edit-entrypoint-top-banner-content', sourceLanguageAutonym, targetLanguageAutonym )\"\n\t\t\t\t></p>\n\t\t\t</div>\n\t\t</div>\n\t\t<hr class=\"sx-recent-edit-entrypoint__separation-line\">\n\t\t<a\n\t\t\tclass=\"sx-recent-edit-entrypoint__invitation row pa-4\"\n\t\t\t:href=\"sxUrl\"\n\t\t>\n\t\t\t<div class=\"sx-recent-edit-entrypoint__invitation__icon col shrink\">\n\t\t\t\t<span>\n\t\t\t\t\t<svg\n\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t:width=\"size\"\n\t\t\t\t\t\t:height=\"size\"\n\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<g :fill=\"iconColor\">\n\t\t\t\t\t\t\t<path :d=\"plusIconPath\" />\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</svg>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div class=\"col\">\n\t\t\t\t<div class=\"row sx-recent-edit-entrypoint__invitation__header\">\n\t\t\t\t\t<h5\n\t\t\t\t\t\tclass=\"col\"\n\t\t\t\t\t\tv-text=\"$i18n( 'sx-recent-edit-entrypoint-invitation-button-label', firstMissingEditedSection )\"\n\t\t\t\t\t></h5>\n\t\t\t\t</div>\n\t\t\t\t<p\n\t\t\t\t\tclass=\"sx-recent-edit-entrypoint__invitation__details\"\n\t\t\t\t\tv-text=\"\n\t\t\t\t\t\t$i18n(\n\t\t\t\t\t\t\t'sx-recent-edit-entrypoint-invitation-button-details',\n\t\t\t\t\t\t\tmissingSectionLength,\n\t\t\t\t\t\t\ttargetLanguageAutonym\n\t\t\t\t\t\t)\n\t\t\t\t\t\"\n\t\t\t\t></p>\n\t\t\t</div>\n\t\t</a>\n\t</section>\n</template>\n\n<script>\n// @vue/component\nmodule.exports = {\n\tcompilerOptions: { whitespace: 'condense' },\n\tname: 'RecentEditEntrypointInvitation',\n\tprops: {\n\t\t/**\n\t\t * @type {{ language: string, page: string, sections: Array }}\n\t\t */\n\t\trecentEdit: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tvalidator: function ( edit ) {\n\t\t\t\treturn edit.language && edit.page && edit.sections;\n\t\t\t}\n\t\t},\n\t\tmissingSections: {\n\t\t\ttype: Object,\n\t\t\trequired: true\n\t\t},\n\t\thiddenInvitationStorageKey: {\n\t\t\ttype: String,\n\t\t\trequired: true\n\t\t}\n\t},\n\tdata: function () {\n\t\treturn {\n\t\t\tsize: 20,\n\t\t\tplusIconPath: 'M11 9V4H9v5H4v2h5v5h2v-5h5V9z',\n\t\t\tcloseIconPath: 'M4.34 2.93l12.73 12.73-1.41 1.41L2.93 4.35z M17.07 4.34L4.34 17.07l-1.41-1.41L15.66 2.93z',\n\t\t\ticonColor: 'currentColor',\n\t\t\tshowPanel: true,\n\t\t\tsiteMapper: new mw.cx.SiteMapper()\n\t\t};\n\t},\n\tcomputed: {\n\t\tfirstMissingEditedSection: function () {\n\t\t\tconst sourceMissingSections = Object.keys( this.missingSections );\n\t\t\tconst editedSections = ( this.recentEdit && this.recentEdit.sections ) || [];\n\n\t\t\tfor ( let i = 0; i < sourceMissingSections.length; i++ ) {\n\t\t\t\tconst missingSection = sourceMissingSections[ i ];\n\t\t\t\tif ( editedSections.indexOf( missingSection ) > -1 ) {\n\t\t\t\t\treturn missingSection;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tmissingSectionLength: function () {\n\t\t\treturn Object.keys( this.missingSections ).length;\n\t\t},\n\t\tsourceLanguage: function () {\n\t\t\treturn this.recentEdit && this.recentEdit.language;\n\t\t},\n\t\tsourceTitle: function () {\n\t\t\treturn this.recentEdit && this.recentEdit.page;\n\t\t},\n\t\ttargetLanguage: function () {\n\t\t\treturn this.siteMapper.getCurrentWikiLanguageCode();\n\t\t},\n\t\tsourceLanguageAutonym: function () {\n\t\t\treturn $.uls.data.getAutonym( this.sourceLanguage );\n\t\t},\n\t\ttargetLanguageAutonym: function () {\n\t\t\treturn $.uls.data.getAutonym( this.targetLanguage );\n\t\t},\n\t\tsxUrl: function () {\n\t\t\treturn this.siteMapper.getCXUrl(\n\t\t\t\tthis.sourceTitle,\n\t\t\t\t'',\n\t\t\t\tthis.sourceLanguage,\n\t\t\t\tthis.targetLanguage,\n\t\t\t\t{ sx: true }\n\t\t\t);\n\t\t}\n\t},\n\tmethods: {\n\t\tcloseInvite: function () {\n\t\t\tthis.showPanel = false;\n\t\t\tconst hiddenInvitations = mw.storage.getObject( this.hiddenInvitationStorageKey ) || [];\n\t\t\thiddenInvitations.push( {\n\t\t\t\tlanguage: this.sourceLanguage,\n\t\t\t\tpage: this.sourceTitle,\n\t\t\t\tsection: this.firstMissingEditedSection\n\t\t\t} );\n\t\t\tmw.storage.setObject( this.hiddenInvitationStorageKey, hiddenInvitations );\n\t\t}\n\t}\n};\n</script>\n\n<style lang=\"less\">\n// Copy variables from '@wikimedia/codex-design-tokens/theme-wikimedia-ui.css'.\n@background-color-base: #fff;\n@background-color-progressive-subtle: #eaf3ff;\n@color-base: #202122;\n@color-progressive: #36c;\n@color-subtle: #54595d;\n\n.sx-recent-edit-entrypoint {\n\twidth: 100%;\n\tposition: fixed;\n\tbottom: 0;\n\tbackground: @background-color-base;\n\tbox-shadow: 0 -1px 2px rgba( 0, 0, 0, 0.25 );\n\n\t.row {\n\t\tbox-sizing: border-box;\n\t\tdisplay: flex;\n\t\tflex: 0 1 auto;\n\t\tflex-wrap: wrap;\n\t}\n\n\t.col {\n\t\tflex-basis: 0;\n\t\tflex-grow: 1;\n\t\tmax-width: 100%;\n\t}\n\n\t.pa-4 {\n\t\tpadding: 16px;\n\t}\n\n\t.shrink {\n\t\tflex-grow: 0 !important;\n\t\tflex-shrink: 1 !important;\n\t}\n\n\t&__top-banner {\n\t\t&__header {\n\t\t\tfont-weight: 600;\n\t\t\tcolor: @color-base;\n\t\t}\n\n\t\t&__close-icon {\n\t\t\tcursor: pointer;\n\t\t}\n\n\t\t&__content {\n\t\t\tmargin-top: 8px;\n\t\t\tfont-size: 14px;\n\t\t\tcolor: @color-base;\n\t\t}\n\t}\n\n\t&__separation-line {\n\t\tmargin: 0;\n\t\tborder-top: 0;\n\t\tcolor: #eaecf0;\n\t}\n\n\t&__invitation {\n\t\tcursor: pointer;\n\n\t\t&:hover {\n\t\t\tbackground: @background-color-progressive-subtle;\n\t\t}\n\n\t\t&__icon {\n\t\t\tmargin-right: 8px;\n\t\t\tcolor: @color-progressive;\n\t\t}\n\n\t\t&__header {\n\t\t\tfont-weight: 600;\n\t\t\tcolor: @color-progressive;\n\t\t}\n\n\t\t&__details {\n\t\t\tmargin-top: 4px;\n\t\t\tfont-size: 14px;\n\t\t\tcolor: @color-subtle;\n\t\t}\n\t}\n}\n</style>\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"vue/component-tags-order","replacedBy":["block-order"]},{"ruleId":"vue/no-invalid-model-keys","replacedBy":["valid-model-definition"]},{"ruleId":"vue/v-on-function-call","replacedBy":["v-on-handler-style"]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.recentedit/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.recenttranslation/RecentTranslationEntrypointDialog.vue","messages":[{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":7,"column":10,"nodeType":"VAttribute","messageId":"unexpected","endLine":7,"endColumn":76},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":16,"column":6,"nodeType":"VAttribute","messageId":"unexpected","endLine":16,"endColumn":84},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":22,"column":6,"nodeType":"VAttribute","messageId":"unexpected","endLine":22,"endColumn":89},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":33,"column":7,"nodeType":"VAttribute","messageId":"unexpected","endLine":33,"endColumn":83},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":37,"column":12,"nodeType":"VAttribute","messageId":"unexpected","endLine":37,"endColumn":105},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":38,"column":11,"nodeType":"VAttribute","messageId":"unexpected","endLine":38,"endColumn":105},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":41,"column":12,"nodeType":"VAttribute","messageId":"unexpected","endLine":41,"endColumn":99},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":42,"column":11,"nodeType":"VAttribute","messageId":"unexpected","endLine":42,"endColumn":99},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":46,"column":12,"nodeType":"VAttribute","messageId":"unexpected","endLine":46,"endColumn":105},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":47,"column":11,"nodeType":"VAttribute","messageId":"unexpected","endLine":47,"endColumn":105},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":57,"column":13,"nodeType":"VAttribute","messageId":"unexpected","endLine":57,"endColumn":90},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":64,"column":8,"nodeType":"VAttribute","messageId":"unexpected","endLine":64,"endColumn":111},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":78,"column":7,"nodeType":"VAttribute","messageId":"unexpected","endLine":78,"endColumn":89},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":86,"column":13,"nodeType":"VAttribute","messageId":"unexpected","endLine":86,"endColumn":95},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":90,"column":7,"nodeType":"VAttribute","messageId":"unexpected","endLine":90,"endColumn":38}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":15,"fixableErrorCount":0,"fixableWarningCount":0,"source":"<template>\n\t<div v-if=\"showDialog\" class=\"sx-recent-translation-dialog\">\n\t\t<div class=\"sx-recent-translation-dialog__overlay\"></div>\n\t\t<div class=\"sx-recent-translation-dialog__shell\">\n\t\t\t<div class=\"sx-recent-translation-dialog__header row\">\n\t\t\t\t<div class=\"sx-recent-translation-dialog__header-text col\">\n\t\t\t\t\t<h3 v-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-header' )\"></h3>\n\t\t\t\t</div>\n\t\t\t\t<span class=\"sx-recent-translation-dialog__header-close-icon\" @click=\"closeDialog\"></span>\n\t\t\t</div>\n\t\t\t<div v-if=\"missingSections.length > 0\" class=\"sx-recent-translation-dialog__action-switches row\">\n\t\t\t\t<button\n\t\t\t\t\tclass=\"sx-recent-translation-dialog__action-switch\"\n\t\t\t\t\t:class=\"{ 'sx-recent-translation-dialog__action-switch--enabled': isReviewSelected }\"\n\t\t\t\t\t@click=\"selectedOption = 'review'\"\n\t\t\t\t\tv-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-review-switch-text' )\"\n\t\t\t\t></button>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"sx-recent-translation-dialog__action-switch\"\n\t\t\t\t\t:class=\"{ 'sx-recent-translation-dialog__action-switch--enabled': isAddSelected }\"\n\t\t\t\t\t@click=\"selectedOption = 'add'\"\n\t\t\t\t\tv-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-add-section-switch-text' )\"\n\t\t\t\t></button>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tref=\"content\"\n\t\t\t\tclass=\"sx-recent-translation-dialog__content\"\n\t\t\t\t:style=\"contentStyle\"\n\t\t\t>\n\t\t\t\t<div v-show=\"isReviewSelected\" class=\"sx-recent-translation-dialog__review-tab\">\n\t\t\t\t\t<p\n\t\t\t\t\t\tclass=\"sx-recent-translation-dialog__review-lead-text\"\n\t\t\t\t\t\tv-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-review-lead-text' )\"\n\t\t\t\t\t></p>\n\t\t\t\t\t<ol class=\"sx-recent-translation-dialog__review-list\">\n\t\t\t\t\t\t<li class=\"sx-recent-translation-dialog__review-list-item\">\n\t\t\t\t\t\t\t<h4 v-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-natural-contents-list-item-header' )\"></h4>\n\t\t\t\t\t\t\t<p v-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-natural-contents-list-item-details' )\"></p>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"sx-recent-translation-dialog__review-list-item\">\n\t\t\t\t\t\t\t<h4 v-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-references-list-item-header' )\"></h4>\n\t\t\t\t\t\t\t<p v-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-references-list-item-details' )\">\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"sx-recent-translation-dialog__review-list-item\">\n\t\t\t\t\t\t\t<h4 v-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-compare-original-list-item-header' )\"></h4>\n\t\t\t\t\t\t\t<p v-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-compare-original-list-item-details' )\">\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ol>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"sx-recent-translation-dialog__edit-button cdx-button cdx-button--action-progressive cdx-button--weight-primary\"\n\t\t\t\t\t\t@click=\"openVE\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"sx-recent-translation-dialog__edit-icon cdx-button__icon\">\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span v-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-edit-button-label' )\"></span>\n\t\t\t\t\t</button>\n\t\t\t\t\t<div class=\"sx-recent-translation-dialog__original-page-link row\">\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"sx-recent-translation-dialog__original-page-anchor col\"\n\t\t\t\t\t\t\t:href=\"originalPageUrl\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\tv-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-original-page-anchor', sourceLanguageAutonym )\"\n\t\t\t\t\t\t></a>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"sx-recent-translation-dialog__original-page-icon-anchor col shrink\"\n\t\t\t\t\t\t\t:href=\"originalPageUrl\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span class=\"sx-recent-translation-dialog__original-page-icon\"></span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div v-show=\"isAddSelected\" class=\"sx-recent-translation-dialog__add-sections-tab\">\n\t\t\t\t\t<p\n\t\t\t\t\t\tclass=\"sx-recent-translation-dialog__add-sections-tab__lead-text\"\n\t\t\t\t\t\tv-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-add-sections-lead-text' )\"\n\t\t\t\t\t></p>\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href=\"sxUrl\"\n\t\t\t\t\t\tclass=\"sx-recent-translation-dialog__translate-button cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--action-progressive cdx-button--weight-primary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"sx-recent-translation-dialog__language-icon cdx-button__icon\">\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span v-text=\"$i18n( 'sx-recent-translation-entrypoint-dialog-translate-button-label' )\"></span>\n\t\t\t\t\t</a>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"sx-recent-translation-dialog__translate-secondary-notice\"\n\t\t\t\t\t\tv-text=\"translateSecondaryText\"\n\t\t\t\t\t></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nconst siteMapper = new mw.cx.SiteMapper();\n\n// @vue/component\nmodule.exports = {\n\tcompilerOptions: { whitespace: 'condense' },\n\tname: 'RecentTranslationEntrypointDialog',\n\tdata: function () {\n\t\treturn {\n\t\t\tshowDialog: true,\n\t\t\tcontentHeight: 0,\n\t\t\tmissingSections: [],\n\t\t\tselectedOption: 'review',\n\t\t\tsourceLanguage: mw.config.get( 'wgSectionTranslationSourceLanguage' ),\n\t\t\tsourceTitle: mw.config.get( 'wgSectionTranslationSourceTitle' ),\n\t\t\ttargetLanguage: siteMapper.getCurrentWikiLanguageCode()\n\t\t};\n\t},\n\tcomputed: {\n\t\tcontentStyle: function () {\n\t\t\treturn {\n\t\t\t\t'min-height': String( this.contentHeight ) + 'px'\n\t\t\t};\n\t\t},\n\t\tisReviewSelected: function () {\n\t\t\treturn this.selectedOption === 'review';\n\t\t},\n\t\tisAddSelected: function () {\n\t\t\treturn this.selectedOption === 'add';\n\t\t},\n\t\toriginalPageUrl: function () {\n\t\t\treturn siteMapper.getPageUrl(\n\t\t\t\tthis.sourceLanguage,\n\t\t\t\tthis.sourceTitle\n\t\t\t);\n\t\t},\n\t\tsourceLanguageAutonym: function () {\n\t\t\treturn $.uls.data.getAutonym( this.sourceLanguage );\n\t\t},\n\t\ttranslateSecondaryText: function () {\n\t\t\tswitch ( this.missingSections.length ) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn this.$i18n( 'sx-recent-translation-entrypoint-dialog-translate-notice-text-one-missing', this.missingSections[ 0 ] );\n\t\t\t\tcase 2:\n\t\t\t\t\treturn this.$i18n( 'sx-recent-translation-entrypoint-dialog-translate-notice-text-two-missing', this.missingSections[ 0 ], this.missingSections[ 1 ] );\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.$i18n( 'sx-recent-translation-entrypoint-dialog-translate-notice-text-more-missing', this.missingSections[ 0 ], this.missingSections[ 1 ] );\n\t\t\t}\n\t\t},\n\t\tsxUrl: function () {\n\t\t\treturn siteMapper.getCXUrl(\n\t\t\t\tthis.sourceTitle,\n\t\t\t\tnull,\n\t\t\t\tthis.sourceLanguage,\n\t\t\t\tthis.targetLanguage,\n\t\t\t\t{ campaign: 'mfrecenttranslation', sx: true }\n\t\t\t);\n\t\t}\n\t},\n\tmethods: {\n\t\tcloseDialog: function () {\n\t\t\tthis.showDialog = false;\n\t\t},\n\t\topenVE: function () {\n\t\t\tconst router = require( 'mediawiki.router' );\n\t\t\trouter.navigate( '/editor/all' );\n\t\t\tthis.closeDialog();\n\t\t},\n\t\tgetSectionSuggestions: function () {\n\t\t\tconst cxServerParams = [\n\t\t\t\tthis.sourceTitle,\n\t\t\t\tthis.sourceLanguage,\n\t\t\t\tthis.targetLanguage\n\t\t\t].map( ( param ) => encodeURIComponent( param ) );\n\n\t\t\tconst cxServerSectionSuggestionApiUrl = siteMapper.getCXServerUrl(\n\t\t\t\t'/suggest/sections/' + cxServerParams.join( '/' )\n\t\t\t);\n\n\t\t\tfetch( cxServerSectionSuggestionApiUrl )\n\t\t\t\t.then( ( response ) =>\n\t\t\t\t\tresponse.ok ?\n\t\t\t\t\t\tresponse.json() :\n\t\t\t\t\t\tPromise.reject( new Error( 'Failed to load data from server' ) )\n\t\t\t\t)\n\t\t\t\t.then( ( suggestionResult ) => {\n\t\t\t\t\tif ( suggestionResult.sections ) {\n\t\t\t\t\t\tthis.missingSections = Object.keys( suggestionResult.sections.missing );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}\n\t},\n\tmounted: function () {\n\t\tthis.$nextTick( () => {\n\t\t\tthis.contentHeight = Math.max( this.contentHeight, this.$refs.content.clientHeight );\n\t\t} );\n\t\tthis.getSectionSuggestions();\n\t}\n};\n</script>\n\n<style lang=\"less\">\n@import \"mediawiki.skin.variables.less\";\n\n.sx-recent-translation-dialog {\n\tdisplay: flex;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\talign-items: center;\n\tjustify-content: center;\n\tz-index: 100;\n\n\t.row {\n\t\tbox-sizing: border-box;\n\t\tdisplay: flex;\n\t\tflex: 0 1 auto;\n\t\tflex-wrap: wrap;\n\t}\n\n\t.col {\n\t\tflex-basis: 0;\n\t\tflex-grow: 1;\n\t\tmax-width: 100%;\n\t}\n\n\t.shrink {\n\t\tflex-grow: 0 !important;\n\t\tflex-shrink: 1 !important;\n\t}\n\n\tp {\n\t\tcolor: @color-base;\n\t\tfont-weight: @font-weight-light;\n\t}\n\n\t&__overlay {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-color: rgba( 0, 0, 0, 0.5 );\n\t}\n\n\t&__shell {\n\t\tbackground-color: @background-color-base;\n\t\tposition: relative;\n\t\tmax-width: 400px;\n\t\tmargin: 0 12px;\n\t}\n\n\t&__header {\n\t\tpadding: 12px;\n\n\t\t&-close-icon {\n\t\t\tcursor: pointer;\n\t\t\t.cdx-mixin-css-icon(@cdx-icon-close);\n\t\t}\n\n\t\th3 {\n\t\t\tpadding: 0;\n\t\t\tfont-size: 16px;\n\t\t}\n\t}\n\n\t&__action-switches {\n\t\tpadding: 0 16px;\n\t\tbackground-color: @background-color-interactive-subtle;\n\t\tborder-top: @border-style-base @border-width-base #eaecf0;\n\t\tborder-bottom: @border-style-base @border-width-base #eaecf0;\n\t}\n\n\t&__action-switch {\n\t\tpadding: 12px 0;\n\t\tfont-weight: bold;\n\n\t\tborder-bottom: solid 3px;\n\t\t&--enabled {\n\t\t\tborder-bottom-color: @color-base;\n\t\t}\n\n\t\t&:not(&--enabled) {\n\t\t\tborder-bottom-color: transparent;\n\t\t}\n\n\t\t&:not( :last-of-type ) {\n\t\t\t[ dir='ltr' ] & {\n\t\t\t\tmargin-right: 16px;\n\t\t\t}\n\n\t\t\t[ dir='rtl' ] & {\n\t\t\t\tmargin-left: 16px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__content {\n\t\tpadding: 16px;\n\t\tbox-sizing: border-box;\n\t}\n\n\t&__review-tab {\n\t\theight: 100%;\n\t}\n\n\t& &__review-lead-text {\n\t\tmargin: 0 0 20px 0;\n\t}\n\n\t& &__review-list {\n\t\t// reset list numbering\n\t\tcounter-reset: review-list-counter;\n\t\tlist-style: none;\n\t\tpadding-left: 0;\n\t\tposition: relative;\n\n\t\t&-item {\n\t\t\t[ dir='ltr' ] & {\n\t\t\t\tpadding-left: 20px;\n\t\t\t}\n\n\t\t\t[ dir='rtl' ] & {\n\t\t\t\tpadding-right: 20px;\n\t\t\t}\n\t\t\t// Increase counter for each item\n\t\t\tcounter-increment: review-list-counter;\n\t\t\tlist-style-type: none;\n\t\t\tposition: relative;\n\t\t\tmargin-bottom: 16px;\n\t\t\t// Styles for list number\n\t\t\t&::before {\n\t\t\t\tfont-family: sans-serif;\n\t\t\t\tcontent: counter( review-list-counter ) '.';\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tfont-weight: bold;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t}\n\n\t\t\th4 {\n\t\t\t\tpadding: 0;\n\t\t\t\tfont-size: 16px;\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\n\t\t\tp {\n\t\t\t\tfont-size: 14px;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& &__edit-button {\n\t\tmargin-top: 20px;\n\n\t\t[ dir='ltr' ] & {\n\t\t\tmargin-left: 12px;\n\t\t}\n\n\t\t[ dir='rtl' ] & {\n\t\t\tmargin-right: 12px;\n\t\t}\n\t}\n\n\t& &__translate-button {\n\t\tmargin-top: 24px;\n\t}\n\n\t&__edit-icon {\n\t\t.cdx-mixin-css-icon( @cdx-icon-edit, @param-is-button-icon: true );\n\t\tmargin-right: 8px;\n\t}\n\n\t&__language-icon {\n\t\t.cdx-mixin-css-icon( @cdx-icon-language, @param-is-button-icon: true );\n\t\tmargin-right: 8px;\n\t}\n\n\t&__original-page {\n\t\t&-link {\n\t\t\tmargin-top: 20px;\n\t\t\tmargin-bottom: 8px;\n\n\t\t\t[ dir='ltr' ] & {\n\t\t\t\tmargin-left: 8px;\n\t\t\t}\n\n\t\t\t[ dir='rtl' ] & {\n\t\t\t\tmargin-right: 8px;\n\t\t\t}\n\t\t}\n\n\t\t&-anchor {\n\t\t\tfont-weight: 600;\n\t\t\tcolor: @color-progressive;\n\t\t}\n\n\t\t&-icon {\n\t\t\t.cdx-mixin-css-icon( @cdx-icon-link-external );\n\t\t}\n\t}\n\n\t&__add-sections-tab {\n\t\theight: 100%;\n\n\t\t& &__lead-text {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\n\t&__translate-secondary-notice {\n\t\tmargin-top: 16px;\n\t\tcolor: @color-subtle;\n\t\tfont-size: 14px;\n\t}\n}\n</style>\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"vue/component-tags-order","replacedBy":["block-order"]},{"ruleId":"vue/no-invalid-model-keys","replacedBy":["valid-model-definition"]},{"ruleId":"vue/v-on-function-call","replacedBy":["v-on-handler-style"]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.recenttranslation/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages/CxUlsEntrypoint.vue","messages":[{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":30,"column":6,"nodeType":"VAttribute","messageId":"unexpected","endLine":30,"endColumn":64},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":40,"column":5,"nodeType":"VAttribute","messageId":"unexpected","endLine":40,"endColumn":64},{"ruleId":"vue/no-v-text","severity":1,"message":"Don't use 'v-text'.","line":68,"column":7,"nodeType":"VAttribute","messageId":"unexpected","endLine":68,"endColumn":38}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"<template>\n\t<div\n\t\tv-show=\"showPanel\"\n\t\tclass=\"cx-uls-entrypoint\"\n\t>\n\t\t<div class=\"cx-uls-entrypoint__header row\">\n\t\t\t<div class=\"col shrink\">\n\t\t\t\t<button class=\"cx-uls-entrypoint__close-button\" @click.stop=\"close\">\n\t\t\t\t\t<span>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t:width=\"size\"\n\t\t\t\t\t\t\t:height=\"size\"\n\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<g :fill=\"iconColor\">\n\t\t\t\t\t\t\t\t<path :d=\"previousIconPath\" />\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div class=\"col grow\">\n\t\t\t\t<h5\n\t\t\t\t\tclass=\"cx-uls-entrypoint__header-title\"\n\t\t\t\t\t:lang=\"sourceLanguage\"\n\t\t\t\t\t:dir=\"getDir( sourceLanguage )\"\n\t\t\t\t\tv-text=\"$i18n( 'cx-uls-relevant-languages-panel-header' )\"\n\t\t\t\t>\n\t\t\t\t</h5>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cx-uls-entrypoint__body\">\n\t\t\t<p\n\t\t\t\tclass=\"cx-uls-entrypoint__body__message\"\n\t\t\t\t:lang=\"sourceLanguage\"\n\t\t\t\t:dir=\"getDir( sourceLanguage )\"\n\t\t\t\tv-text=\"$i18n( 'cx-uls-relevant-languages-panel-message' )\"\n\t\t\t>\n\t\t\t</p>\n\t\t\t<div class=\"cx-uls-entrypoint__body__translation-links row\">\n\t\t\t\t<a\n\t\t\t\t\tv-for=\"language in slicedLanguages\"\n\t\t\t\t\t:key=\"'link-' + language\"\n\t\t\t\t\tclass=\"cx-uls-entrypoint__body__translation-link\"\n\t\t\t\t\t:href=\"getCXUrlByTargetLanguage( language )\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"cx-uls-entrypoint__body__translation-link-icon\">\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t:width=\"size\"\n\t\t\t\t\t\t\t:height=\"size\"\n\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<g :fill=\"iconColor\">\n\t\t\t\t\t\t\t\t<path :d=\"plusIconPath\" />\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"cx-uls-entrypoint__body__translation-link-text\"\n\t\t\t\t\t\t:lang=\"language\"\n\t\t\t\t\t\t:dir=\"getDir( language )\"\n\t\t\t\t\t\tv-text=\"getAutonym( language )\"\n\t\t\t\t\t></span>\n\t\t\t\t</a>\n\t\t\t\t<a\n\t\t\t\t\tclass=\"cx-uls-entrypoint__body__translation-link\"\n\t\t\t\t\t:href=\"getCXUrlByTargetLanguage( slicedLanguages[0] )\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"cx-uls-entrypoint__body__translation-link-icon\">\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t:width=\"size\"\n\t\t\t\t\t\t\t:height=\"size\"\n\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<g :fill=\"iconColor\">\n\t\t\t\t\t\t\t\t<path :d=\"ellipsisIconPath\" />\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</span>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nconst Vue = require( 'vue' );\n\n// @vue/component\nmodule.exports = {\n\tcompilerOptions: { whitespace: 'condense' },\n\tname: 'CxUlsEntrypoint',\n\tprops: {\n\t\tlanguages: {\n\t\t\ttype: Array,\n\t\t\trequired: true\n\t\t},\n\t\tonClose: {\n\t\t\ttype: Function,\n\t\t\trequired: true\n\t\t}\n\t},\n\tsetup: ( props ) => {\n\t\tconst showPanel = Vue.ref( true );\n\t\tconst siteMapper = new mw.cx.SiteMapper();\n\t\tconst slicedLanguages = Vue.computed( () => props.languages.slice( 0, 2 ) );\n\n\t\tconst close = () => {\n\t\t\tshowPanel.value = false;\n\t\t\tprops.onClose();\n\t\t};\n\n\t\tconst sourceLanguage = siteMapper.getCurrentWikiLanguageCode();\n\n\t\tconst getCXUrlByTargetLanguage = ( targetLanguage ) => {\n\t\t\tconst sourceTitle = mw.config.get( 'wgTitle' );\n\n\t\t\treturn siteMapper.getCXUrl(\n\t\t\t\tsourceTitle,\n\t\t\t\t'',\n\t\t\t\tsourceLanguage,\n\t\t\t\ttargetLanguage || null,\n\t\t\t\t{ campaign: 'ulsmissinglanguages' }\n\t\t\t);\n\t\t};\n\n\t\treturn {\n\t\t\tclose,\n\t\t\tellipsisIconPath: 'M 19,10 a 2,2 0 0 1 -2,2 2,2 0 0 1 -2,-2 2,2 0 0 1 2,-2 2,2 0 0 1 2,2 M 5,10 A 2,2 0 0 1 3,12 2,2 0 0 1 1,10 2,2 0 0 1 3,8 2,2 0 0 1 5,10 m 7,0 a 2,2 0 0 1 -2,2 2,2 0 0 1 -2,-2 2,2 0 0 1 2,-2 2,2 0 0 1 2,2',\n\t\t\tgetDir: $.uls.data.getDir,\n\t\t\tgetAutonym: $.uls.data.getAutonym,\n\t\t\ticonColor: 'currentColor',\n\t\t\tplusIconPath: 'M11 9V4H9v5H4v2h5v5h2v-5h5V9z',\n\t\t\tpreviousIconPath: 'M5.83 9l5.58-5.58L10 2l-8 8 8 8 1.41-1.41L5.83 11H18V9z',\n\t\t\tgetCXUrlByTargetLanguage,\n\t\t\tshowPanel,\n\t\t\tsize: 20,\n\t\t\tslicedLanguages,\n\t\t\tsourceLanguage\n\t\t};\n\t}\n};\n</script>\n\n<style lang=\"less\">\n@import 'mediawiki.skin.variables.less';\n\n.cx-uls-entrypoint {\n\tborder: @border-base;\n\tcolor: @color-base;\n\n\t&--hidden {\n\t\tdisplay: none;\n\t}\n\n\t.row {\n\t\tbox-sizing: border-box;\n\t\tdisplay: flex;\n\t\tflex: 0 1 auto;\n\t\tflex-wrap: wrap;\n\t}\n\n\t.col {\n\t\tflex-basis: 0;\n\t\tflex-grow: 1;\n\t\tmax-width: 100%;\n\t}\n\n\t.shrink {\n\t\tflex-grow: 0 !important;\n\t\tflex-shrink: 1 !important;\n\t}\n\n\tbutton {\n\t\tcursor: pointer;\n\t}\n\n\t&__header {\n\t\talign-items: center;\n\t\tpadding: 12px;\n\t\tborder-bottom: @border-base;\n\n\t\t&-title {\n\t\t\tfont-size: 16px;\n\t\t\tpadding-block: 0;\n\t\t\tpadding-inline: 8px;\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\n\t&__close-button {\n\t\tbackground: none;\n\t\tborder: none;\n\t\talign-self: center;\n\t}\n\n\t&__body {\n\t\tpadding: 16px;\n\n\t\t&__message {\n\t\t\tmargin: 0;\n\t\t\tpadding-bottom: 8px;\n\t\t\tpadding-inline: 8px;\n\t\t\tline-height: 1.4;\n\t\t}\n\n\t\t&__translation-links {\n\t\t\talign-items: baseline;\n\t\t\tpadding-inline: 8px;\n\t\t}\n\n\t\t&__translation-link {\n\t\t\tpadding: 4px;\n\t\t\tbackground: none;\n\t\t\tborder: none;\n\t\t\talign-items: center;\n\t\t\tdisplay: flex;\n\t\t\t// set color to \"inherit\", so that the CX links have the same color as the rest of the text body (@color-base)\n\t\t\tcolor: inherit;\n\n\t\t\t&-icon {\n\t\t\t\t// set display to \"flex\", so that the height of the outer span is equal to the icon height (20px)\n\t\t\t\tdisplay: flex;\n\t\t\t\tpadding-inline-end: 4px;\n\t\t\t}\n\n\t\t\t&-text {\n\t\t\t\tfont-size: 16px;\n\t\t\t\tmargin-inline-end: 4px;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"vue/component-tags-order","replacedBy":["block-order"]},{"ruleId":"vue/no-invalid-model-keys","replacedBy":["valid-model-definition"]},{"ruleId":"vue/v-on-function-call","replacedBy":["v-on-handler-style"]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.interlanguagelink.init.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Unexpected 'var' declaration in the global scope, wrap in an IIFE for a local variable, assign as global property for a global variable.","line":9,"column":5,"nodeType":"VariableDeclarator","messageId":"globalNonLexicalBinding","endLine":9,"endColumn":35,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-implicit-globals","severity":2,"message":"Unexpected function declaration in the global scope, wrap in an IIFE for a local variable, assign as global property for a global variable.","line":17,"column":1,"nodeType":"FunctionDeclaration","messageId":"globalNonLexicalBinding","endLine":22,"endColumn":2,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-implicit-globals","severity":2,"message":"Unexpected function declaration in the global scope, wrap in an IIFE for a local variable, assign as global property for a global variable.","line":34,"column":1,"nodeType":"FunctionDeclaration","messageId":"globalNonLexicalBinding","endLine":75,"endColumn":2,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-implicit-globals","severity":2,"message":"Unexpected function declaration in the global scope, wrap in an IIFE for a local variable, assign as global property for a global variable.","line":77,"column":1,"nodeType":"FunctionDeclaration","messageId":"globalNonLexicalBinding","endLine":91,"endColumn":2,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-implicit-globals","severity":2,"message":"Unexpected function declaration in the global scope, wrap in an IIFE for a local variable, assign as global property for a global variable.","line":93,"column":1,"nodeType":"FunctionDeclaration","messageId":"globalNonLexicalBinding","endLine":111,"endColumn":2,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.interlanguagelink.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/entrypoints/ext.cx.uls.quick.actions.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/eventlogging/ext.cx.eventlogging.campaigns.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/eventlogging/ext.cx.eventlogging.translation.js","messages":[],"suppressedMessages":[{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":109,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":109,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/eventlogging/legacy/ext.cx.eventlogging.translation.js","messages":[],"suppressedMessages":[{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":145,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":145,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/mw.cx.MachineTranslationManager.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/mw.cx.MachineTranslationService.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/mw.cx.MwApiRequestManager.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/mw.cx.TargetArticle.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'publishErrorCaptcha' is undefined.","line":356,"column":1,"nodeType":"Block","endLine":356,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Target Article for CX - Validation, Publishing, Success and Error handling.\n *\n * @copyright See AUTHORS.txt\n * @license GPL-2.0-or-later\n *\n * @param {mw.cx.dm.Translation} translation\n * @param {ve.init.mw.CXTarget} veTarget\n * @param {Object} config Translation configuration\n * @param {mw.cx.SiteMapper} config.siteMapper SiteMapper instance\n */\nmw.cx.TargetArticle = function MWCXTargetArticle( translation, veTarget, config ) {\n\tthis.translation = translation;\n\tthis.veTarget = veTarget;\n\tthis.config = config;\n\tthis.siteMapper = config.siteMapper;\n\tthis.sourceTitle = translation.getSourceTitle();\n\tthis.sourceLanguage = translation.getSourceLanguage();\n\tthis.targetLanguage = translation.getTargetLanguage();\n\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Properties\n\tthis.captcha = null;\n\tthis.captchaDialog = null;\n};\n\n/* Inheritance */\n\nOO.mixinClass( mw.cx.TargetArticle, OO.EventEmitter );\n\n/* Events */\n\n/**\n * @event publishCancel\n *\n * User canceled the publishing process.\n */\n\n/**\n * @event publishSuccess\n *\n * Translation is successfully published.\n */\n\n/**\n * @event captchaCancel\n *\n * User exited the captcha dialog.\n */\n\n/**\n * @event publishError\n *\n * Error occurred during publishing.\n * @param {OO.ui.Error} error\n */\n\n/* Static Methods */\n\n/**\n * Clean up the input document by removing CX specific markup and attributes.\n *\n * @param {HTMLDocument} doc\n * @return {HTMLDocument} Cleaned up document.\n */\nmw.cx.TargetArticle.static.getCleanedupContent = function ( doc ) {\n\tArray.prototype.forEach.call( doc.body.querySelectorAll( 'article, section, [data-segmentid]' ), function ( segment ) {\n\t\tconst parent = segment.parentNode;\n\t\t// move all children out of the element\n\t\twhile ( segment.firstChild ) {\n\t\t\tparent.insertBefore( segment.firstChild, segment );\n\t\t}\n\t\tsegment.remove();\n\t} );\n\n\t// Remove all unadapted links except the ones that are explicitly marked as missing.\n\t// Refer ve.ui.CXLinkContextItem#createRedLink\n\tArray.prototype.forEach.call( doc.querySelectorAll( '.cx-link' ), function ( link ) {\n\t\tconst dataCX = JSON.parse( link.getAttribute( 'data-cx' ) || '{}' );\n\t\tif ( dataCX.adapted === false && OO.getProp( dataCX, 'targetTitle', 'missing' ) !== true ) {\n\t\t\t// Replace the link with its inner content.\n\t\t\tlink.replaceWith( link.innerHTML );\n\t\t} else {\n\t\t\t[ 'data-linkid', 'class', 'title', 'id' ].forEach( function ( attr ) {\n\t\t\t\tlink.removeAttribute( attr );\n\t\t\t} );\n\t\t}\n\t} );\n\n\t// Remove empty references. Such references are initially marked as unadapted and CX data\n\t// is reset upon editing, so we check if reference is still marked as unadapted.\n\tArray.prototype.forEach.call( doc.querySelectorAll( '.mw-ref' ), function ( element ) {\n\t\tconst dataCX = JSON.parse( element.getAttribute( 'data-cx' ) || '{}' );\n\n\t\tif ( dataCX.adapted === false ) {\n\t\t\telement.parentNode.removeChild( element );\n\t\t}\n\t} );\n\n\t// Remove all pathological transclusions if any. Transclusion without any definition can cause\n\t// Parsoid errors and hence failing the whole publishing workflow.\n\t// Example `<span typeof=\"mw:Transclusion\" data-mw=\"{}\" data-cx=\"[{&quot;adapted&quot;:false}]\" id=\"mwCH0\"></span>`\n\t// These are not necessarily generated by CX adaptation, but resulted form editing workflow.\n\tArray.prototype.forEach.call( doc.querySelectorAll( '[typeof=\"mw:Transclusion\"]' ), function ( element ) {\n\t\tconst dataMw = JSON.parse( element.getAttribute( 'data-mw' ) || '{}' );\n\n\t\tif ( !dataMw.parts ) {\n\t\t\telement.parentNode.removeChild( element );\n\t\t}\n\t} );\n\n\t// Remove all data-cx attributes. It is irrelevant for publish, reduces the HTML size.\n\tArray.prototype.forEach.call( doc.querySelectorAll( '[data-cx]' ), function ( element ) {\n\t\telement.removeAttribute( 'data-cx' );\n\t} );\n\n\t// Remove all id attributes from table cells, div tags that are assigned by cxserver.\n\tArray.prototype.forEach.call(\n\t\tdoc.querySelectorAll( 'tr[id], td[id], th[id], table[id], tbody[id], thead[id], div[id]' ), function ( element ) {\n\t\t\telement.removeAttribute( 'id' );\n\t\t}\n\t);\n\n\treturn doc;\n};\n\n/* Methods */\n\n/**\n * Publish the translated content to target wiki.\n *\n * @param {boolean} hasIssues True if translation being published has some issues.\n * @param {boolean} hasTooMuchUnmodifiedText Whether article being published\n * should be added to high MT tracking category.\n */\nmw.cx.TargetArticle.prototype.publish = function ( hasIssues, hasTooMuchUnmodifiedText ) {\n\tthis.getContent( true ).then( function ( html ) {\n\t\tconst apiParams = {\n\t\t\tassert: 'user',\n\t\t\taction: 'cxpublish',\n\t\t\tfrom: this.sourceLanguage,\n\t\t\tto: this.targetLanguage,\n\t\t\tsourcetitle: this.sourceTitle,\n\t\t\ttitle: this.getTargetTitle(),\n\t\t\thtml,\n\t\t\tcategories: this.getTargetCategories( hasTooMuchUnmodifiedText ),\n\t\t\tpublishtags: this.getTags( hasTooMuchUnmodifiedText ),\n\t\t\twpCaptchaId: this.captcha && this.captcha.id,\n\t\t\twpCaptchaWord: this.captcha && this.captcha.input.getValue(),\n\t\t\tcxversion: 2\n\t\t};\n\n\t\t// Check for title conflicts\n\t\tthis.checkForPublishAnyway( this.getTargetTitle(), hasIssues ).then( function () {\n\t\t\treturn new mw.Api().postWithToken( 'csrf', apiParams, {\n\t\t\t\t// A bigger timeout since publishing after converting html to wikitext\n\t\t\t\t// parsoid is not a fast operation.\n\t\t\t\ttimeout: 100 * 1000 // in milliseconds\n\t\t\t} ).then( this.publishSuccess.bind( this ), this.publishFail.bind( this ) );\n\t\t}.bind( this ), function () {\n\t\t\tthis.emit( 'publishCancel' );\n\t\t}.bind( this ) );\n\t}.bind( this ) );\n};\n\n/**\n * Publish the translated section to target wiki\n */\nmw.cx.TargetArticle.prototype.publishSection = function () {\n\tthis.getContent( false ).then( function ( html ) {\n\t\tconst isSandbox = this.veTarget.getPublishNamespace() === mw.config.get( 'wgNamespaceIds' ).user;\n\t\tconst params = {\n\t\t\tassert: 'user',\n\t\t\taction: 'cxpublishsection',\n\t\t\ttitle: this.getTargetTitle(),\n\t\t\thtml,\n\t\t\tsourcetitle: this.sourceTitle,\n\t\t\tsourcerevid: this.translation.sourceWikiPage.getRevision(),\n\t\t\tsourcesectiontitle: this.translation.sourceWikiPage.getSectionTitle(),\n\t\t\ttargetsectiontitle: this.veTarget.translationView.targetColumn.getTitle(),\n\t\t\tsourcelanguage: this.sourceLanguage,\n\t\t\ttargetlanguage: this.targetLanguage,\n\t\t\tissandbox: isSandbox,\n\t\t\tsectiontranslationid: this.translation.getSectionTranslationId()\n\t\t};\n\n\t\tif ( this.captcha ) {\n\t\t\tparams.captchaid = this.captcha.id;\n\t\t\tparams.captchaword = this.captcha.input.getValue();\n\t\t}\n\n\t\treturn new mw.Api()\n\t\t\t.postWithToken( 'csrf', params )\n\t\t\t.then( this.publishSuccess.bind( this ), this.publishFail.bind( this ) );\n\n\t}.bind( this ) );\n};\n\n/**\n * Publish success handler\n *\n * @param {Object} response Response object from the publishing api\n * @param {Object} jqXHR\n * @return {null|jQuery.Promise}\n */\nmw.cx.TargetArticle.prototype.publishSuccess = function ( response, jqXHR ) {\n\tconst publishAction = this.translation.isSectionTranslation() ? 'cxpublishsection' : 'cxpublish';\n\tconst publishResult = response[ publishAction ];\n\n\tif ( publishResult.result === 'success' ) {\n\t\tthis.translation.setTargetURL( publishResult.targeturl );\n\t\treturn this.publishComplete( publishResult.targettitle || null );\n\t}\n\n\tif ( publishResult.edit.captcha ) {\n\t\t// If there is a captcha challenge, get the solution and retry.\n\t\treturn this.loadCaptchaDialog().then(\n\t\t\tthis.showErrorCaptcha.bind( this, publishResult.edit.captcha )\n\t\t);\n\t}\n\n\t// Any other failure\n\treturn this.publishFail( '', publishResult, publishResult, jqXHR );\n};\n\n/**\n * @param {string|null} apiTargetTitle\n * @fires publishSuccess\n */\nmw.cx.TargetArticle.prototype.publishComplete = function ( apiTargetTitle ) {\n\tthis.captcha = null;\n\tthis.emit( 'publishSuccess', apiTargetTitle );\n};\n\n/**\n * Publish failure handler\n *\n * The 'messageOrFailObjOrData' parameter could be a string explaining the error,\n * or an object with textStatus, exception and jqXHR keys (but jqXHR can be missing),\n * or equal to data. If data is present, jqXHR is also present. See T176704.\n *\n * @param {string} errorCode\n * @param {string|Object} messageOrFailObjOrData Error message (string), or object with textStatus,\n *   exception and (optionally) jqXHR, or equal to data\n * @param {Object} [data] Data returned by api.php\n * @param {Object} [jqXHR] jQuery XHR object\n */\nmw.cx.TargetArticle.prototype.publishFail = function ( errorCode, messageOrFailObjOrData, data, jqXHR ) {\n\tif ( !data ) {\n\t\tif ( errorCode === 'ok-but-empty' ) {\n\t\t\tthis.showPublishError( mw.msg( 'cx-publish-error-empty' ) );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.showErrorException( messageOrFailObjOrData );\n\t\treturn;\n\t}\n\n\t// Event logging\n\tmw.hook( 'mw.cx.translation.publish.error' ).fire(\n\t\tthis.sourceLanguage,\n\t\tthis.targetLanguage,\n\t\tthis.sourceTitle,\n\t\tthis.getTargetTitle(),\n\t\tdata\n\t);\n\n\tconst editError = data.error;\n\tif ( editError ) {\n\t\t// Handle spam blacklist error (either from core or from Extension:SpamBlacklist)\n\t\t// Example of API result - https://phabricator.wikimedia.org/P8991\n\t\tif ( editError.code === 'spamblacklist' ) {\n\t\t\tthis.showPublishError(\n\t\t\t\tmw.msg( 'cx-publish-error-spam-blacklist', editError.info ),\n\t\t\t\teditError.info\n\t\t\t);\n\t\t\treturn;\n\t\t} else if ( editError.code.indexOf( 'abusefilter' ) === 0 ) {\n\t\t\t// Handle Abuse Filter errors.\n\t\t\tthis.showPublishError(\n\t\t\t\tmw.msg( 'cx-publish-error-abuse-filter', editError.abusefilter.description ),\n\t\t\t\teditError.info\n\t\t\t);\n\t\t\treturn;\n\t\t} else if ( editError.code === 'invalidtitle' ) {\n\t\t\tthis.showPublishError(\n\t\t\t\tmw.msg( 'title-invalid-characters', this.getTargetTitle() ),\n\t\t\t\tJSON.stringify( editError )\n\t\t\t);\n\t\t\treturn;\n\t\t} else if ( editError.code === 'badtoken' || editError.code === 'assertuserfailed' ) {\n\t\t\tthis.showUnrecoverablePublishError(\n\t\t\t\tmw.msg( 'cx-lost-session-publish' ),\n\t\t\t\tJSON.stringify( editError )\n\t\t\t);\n\t\t\treturn;\n\t\t} else if ( editError.code === 'titleblacklist-forbidden' ) {\n\t\t\tthis.showPublishError( mw.msg( 'cx-publish-error-title-blacklist' ), JSON.stringify( editError ) );\n\t\t\treturn;\n\t\t} else if ( editError.code === 'readonly' ) {\n\t\t\tthis.showUnrecoverablePublishError( mw.msg( 'cx-publish-error-readonly' ), editError.readonlyreason );\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst editResult = data.edit;\n\t// Handle captcha\n\t// Captcha \"errors\" usually aren't errors. We simply don't know about them ahead of time,\n\t// so we save once, then (if required) we get an error with a captcha back and try again after\n\t// the user solved the captcha.\n\tif ( editResult && editResult.captcha && (\n\t\teditResult.captcha.type === 'image' ||\n\t\teditResult.captcha.type === 'simple' ||\n\t\teditResult.captcha.type === 'math' ||\n\t\teditResult.captcha.type === 'question'\n\t) ) {\n\t\tthis.loadCaptchaDialog().then( this.showErrorCaptcha.bind( this, editResult ) );\n\t\treturn;\n\t}\n\n\t// Handle (other) unknown and/or unrecoverable errors\n\tthis.showErrorUnknown( editResult, data, jqXHR );\n};\n\n/**\n * Load captcha dialog dependency dynamically, since captcha dialog is rarely shown.\n *\n * @return {jQuery}\n */\nmw.cx.TargetArticle.prototype.loadCaptchaDialog = function () {\n\treturn mw.loader.using( 'mw.cx.ui.CaptchaDialog' ).then( this.setupCaptchaDialog.bind( this ) );\n};\n\nmw.cx.TargetArticle.prototype.setupCaptchaDialog = function () {\n\tif ( this.captchaDialog ) {\n\t\t// Dialog is already set up\n\t\treturn;\n\t}\n\n\tthis.captchaDialog = new mw.cx.ui.CaptchaDialog();\n\tconst publishAction = this.translation.isSectionTranslation() ? 'publishSection' : 'publish';\n\n\tthis.captchaDialog.connect( this, {\n\t\tpublish: publishAction,\n\t\tcancel: 'onCaptchaCancel'\n\t} );\n\tOO.ui.getWindowManager().addWindows( [ this.captchaDialog ] );\n};\n\n/**\n * Handle captcha challenge error\n *\n * @param {Object} apiResult publishing API result\n * @fires publishErrorCaptcha\n */\nmw.cx.TargetArticle.prototype.showErrorCaptcha = function ( apiResult ) {\n\tif ( this.captcha ) {\n\t\tthis.captchaDialog.showErrors( mw.msg( 'cx-captcha-dialog-error' ) );\n\t}\n\n\tthis.captcha = {\n\t\tinput: this.captchaDialog.input,\n\t\tid: apiResult.id\n\t};\n\n\tif ( apiResult.type === 'image' ) {\n\t\t// FancyCaptcha\n\t\t// Based on FancyCaptcha::getFormInformation() (https://git.io/v6mml) and\n\t\t// ext.confirmEdit.fancyCaptcha.js in the ConfirmEdit extension.\n\t\tmw.loader.load( 'ext.confirmEdit.fancyCaptcha' );\n\t\tthis.captchaDialog.setFancyCaptcha( apiResult.url );\n\t} else if ( apiResult.type === 'simple' || apiResult.type === 'math' ) {\n\t\t// SimpleCaptcha and MathCaptcha\n\t\tthis.captchaDialog.setCaptcha( 'captcha-create', apiResult.question, apiResult.mime );\n\t} else if ( apiResult.type === 'question' ) {\n\t\t// QuestyCaptcha\n\t\tthis.captchaDialog.setCaptcha( 'questycaptcha-create', apiResult.question, apiResult.mime );\n\t} else {\n\t\tmw.log.error( '[CX] Unsupported captcha type: ' + apiResult.type );\n\t\t// At this point, we encountered unknown or unsupported captcha type, or ConfirmEdit is\n\t\t// malfunctioning in some fashion. User is stuck at this point and cannot publish,\n\t\t// but we can at least unblock the UI and show the error message.\n\t\tthis.onCaptchaCancel();\n\t\tthis.showUnrecoverablePublishError( mw.msg( 'cx-captcha-unsupported-type' ) );\n\t\treturn;\n\t}\n\n\tOO.ui.getWindowManager().openWindow( 'cxCaptcha' );\n};\n\n/**\n * @fires captchaCancel\n */\nmw.cx.TargetArticle.prototype.onCaptchaCancel = function () {\n\tthis.captcha = null;\n\tthis.emit( 'captchaCancel' );\n};\n\n/**\n * Show an error based on an exception+textStatus object\n *\n * @param {Object} failObj Object from the rejection params of mw.Api, with exception and textStatus\n */\nmw.cx.TargetArticle.prototype.showErrorException = function ( failObj ) {\n\tlet errorMsg = failObj.exception || failObj.textStatus;\n\n\tif ( errorMsg instanceof Error ) {\n\t\terrorMsg = errorMsg.toString();\n\t}\n\n\tif ( errorMsg ) {\n\t\tthis.showUnrecoverablePublishError( errorMsg, errorMsg );\n\t} else {\n\t\tthis.showErrorUnknown( null, null, failObj.jqXHR );\n\t}\n};\n\n/**\n * Handle unknown publish error\n *\n * @method\n * @param {Object} editResult\n * @param {Object|null} data API response data\n * @param {Object} jqXHR\n */\nmw.cx.TargetArticle.prototype.showErrorUnknown = function ( editResult, data, jqXHR ) {\n\tconst errorMsg = ( editResult && editResult.info ) || ( data && data.error && data.error.info ),\n\t\terrorCode = ( editResult && editResult.code ) || ( data && data.error && data.error.code );\n\tlet unknown = 'Unknown error';\n\n\tif ( jqXHR && jqXHR.status !== 200 ) {\n\t\tunknown += ', HTTP status ' + data.xhr.status;\n\t}\n\n\tconst errorDetails = errorMsg || errorCode || unknown;\n\tthis.showUnrecoverablePublishError(\n\t\tmw.msg( 'cx-publish-error-unknown', errorDetails ),\n\t\terrorDetails\n\t);\n};\n\n/**\n * Show publish process error message\n *\n * @method\n * @param {string|jQuery|Node[]} msg Message content (string of HTML, jQuery object or array of\n *  Node objects)\n * @param {string} [errorLog]\n * @param {boolean} [allowReapply=true] Whether or not to allow the user to reapply.\n *  Reset when swapping panels. Assumed to be true unless explicitly set to false.\n *\n * @fires publishError\n */\nmw.cx.TargetArticle.prototype.showPublishError = function ( msg, errorLog, allowReapply ) {\n\tthis.emit( 'publishError', new OO.ui.Error( msg, { recoverable: allowReapply } ) );\n\n\tif ( !errorLog ) {\n\t\treturn;\n\t}\n\n\tmw.log.error( '[CX] Publishing failed ' + errorLog );\n};\n\n/**\n * Show publish error which doesn't allow reapply.\n *\n * @param {string|jQuery|Node[]} msg Message content (string of HTML, jQuery object or array of\n *  Node objects)\n * @param {string} [errorLog]\n */\nmw.cx.TargetArticle.prototype.showUnrecoverablePublishError = function ( msg, errorLog ) {\n\tthis.showPublishError( msg, errorLog, false );\n};\n\n/**\n * Get content for publishing\n *\n * @param {boolean} deflate Whether the content should be deflated\n * @return {jQuery.Promise} Promise which resolves with content for publishing, may be deflated\n */\nmw.cx.TargetArticle.prototype.getContent = function ( deflate ) {\n\tconst doc = this.veTarget.getSurface().getDom();\n\tconst cleanupHtml = mw.libs.ve.targetSaver.getHtml( this.constructor.static.getCleanedupContent( doc ) );\n\n\tif ( deflate ) {\n\t\treturn mw.loader.using( 'mediawiki.deflate' ).then( function () {\n\t\t\treturn mw.deflate( cleanupHtml );\n\t\t} );\n\t} else {\n\t\treturn $.Deferred().resolve( cleanupHtml ).promise();\n\t}\n};\n\n/**\n * Check to see if \"Publish anyway\" dialog needs to be displayed, in case of\n * page with the given title already existing or translation having issues.\n *\n * @param {string} pageTitle The title to check\n * @param {boolean} hasIssues Whether the translation has issues\n * @return {jQuery.Promise}\n */\nmw.cx.TargetArticle.prototype.checkForPublishAnyway = function ( pageTitle, hasIssues ) {\n\t// CAPTCHA check may occur as a response to the request to publish the translation.\n\t// If that happens, we can and should skip these checks to avoid showing\n\t// \"Publish anyway\" dialog again if the target page already exists.\n\tif ( this.captcha ) {\n\t\treturn $.Deferred().resolve().promise();\n\t}\n\n\treturn ve.init.platform.linkCache.get( pageTitle ).then( function ( result ) {\n\t\tconst targetExists = !result.missing;\n\n\t\tlet title, message;\n\t\tif ( hasIssues && targetExists ) {\n\t\t\ttitle = mw.msg( 'cx-publishing-dialog-title' );\n\t\t\tmessage = mw.msg( 'cx-overwriting-with-issues' );\n\t\t} else if ( hasIssues && !targetExists ) {\n\t\t\ttitle = mw.msg( 'cx-publishing-with-issues-dialog-title' );\n\t\t\tmessage = mw.msg( 'cx-publishing-with-issues-dialog-message' );\n\t\t} else if ( !hasIssues && targetExists ) {\n\t\t\ttitle = mw.msg( 'cx-publishing-dialog-title' );\n\t\t\tmessage = mw.msg( 'cx-publishing-dialog-sub-title' );\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.showDialog( title, message );\n\t}.bind( this ) );\n};\n\n/**\n * Display the dialog which asks the user to \"publish anyway\", in spite of some problems.\n *\n * @param {string} title Title for the publishing dialog.\n * @param {string} message Main message of the publishing dialog.\n * @return {jQuery.Promise}\n */\nmw.cx.TargetArticle.prototype.showDialog = function ( title, message ) {\n\tconst windowManager = OO.ui.getWindowManager(),\n\t\tmessageDialog = windowManager.getWindow( 'message' );\n\n\treturn messageDialog.then( function ( win ) {\n\t\twin.message.$element.css( 'white-space', 'pre-line' );\n\n\t\treturn windowManager.openWindow( win, {\n\t\t\ttitle: title,\n\t\t\tmessage: message,\n\t\t\tactions: [\n\t\t\t\t{ action: 'publish', label: mw.msg( 'cx-publishing-dialog-publish-anyway-button' ), flags: 'primary' },\n\t\t\t\t{ action: 'cancel', label: mw.msg( 'cx-draft-cancel-button-label' ), flags: 'safe' }\n\t\t\t]\n\t\t} ).closed.then( function ( data ) {\n\t\t\tif ( !data || data.action === 'cancel' ) {\n\t\t\t\treturn $.Deferred().reject();\n\t\t\t}\n\t\t} );\n\t} );\n};\n\n/**\n * Get current target title from translation data model.\n * Not the translation title can be changed by translator at any point of translation.\n *\n * @return {string} target title\n */\nmw.cx.TargetArticle.prototype.getTargetTitle = function () {\n\treturn this.translation.getTargetTitle();\n};\n\n/**\n * Get the categories for the article to be published\n *\n * @param {boolean} hasTooMuchUnmodifiedText True if high MT tracking category should be added.\n * @return {string[]}\n */\nmw.cx.TargetArticle.prototype.getTargetCategories = function ( hasTooMuchUnmodifiedText ) {\n\tconst maintenanceCategoryMsg = 'cx-unreviewed-translation-category';\n\n\tconst targetCategories = this.translation.getTargetCategories();\n\tconst index = targetCategories.indexOf( maintenanceCategoryMsg );\n\n\tif ( hasTooMuchUnmodifiedText ) {\n\t\t// Avoid duplicates.\n\t\tif ( index < 0 ) {\n\t\t\t// Note that we are adding the msg as an indicator that\n\t\t\t// this article need the tracking category. The prefixing\n\t\t\t// of appropriate namespace and category title localization\n\t\t\t// is done at publish api backend.\n\t\t\ttargetCategories.push( maintenanceCategoryMsg );\n\t\t}\n\t} else if ( index >= 0 ) {\n\t\t// Make sure to remove if maintenanceCategoryMsg is already in targetCategories\n\t\ttargetCategories.splice( index, 1 );\n\t}\n\n\treturn targetCategories;\n};\n\n/**\n * Get the tags for the article to be published.\n * API accepts multiple values separated by '|'\n *\n * @param {boolean} hasTooMuchUnmodifiedText\n * @return {string}\n */\nmw.cx.TargetArticle.prototype.getTags = function ( hasTooMuchUnmodifiedText ) {\n\tconst query = new mw.Uri().query,\n\t\tcampaignConfig = mw.config.get( 'wgContentTranslationCampaigns' );\n\tlet tagString = OO.getProp( campaignConfig, query.campaign, 'edittag' ) || '';\n\n\tif ( hasTooMuchUnmodifiedText ) {\n\t\tif ( tagString ) {\n\t\t\ttagString += '|';\n\t\t}\n\t\ttagString += 'contenttranslation-high-unmodified-mt-text';\n\t}\n\n\treturn tagString;\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/mw.cx.TranslationController.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/mw.cx.TranslationTracker.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/mw.cx.init.Translation.js","messages":[{"ruleId":"jsdoc/valid-types","severity":1,"message":"Syntax error in type: Promise<[Object, mw.cx.dm.DraftTranslationDTO|null]>","line":131,"column":1,"nodeType":"Block","endLine":131,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nmw.cx.init = {};\n\n/**\n * This class loads translation documents (source and target) and sets up the main views and models.\n *\n * @copyright See AUTHORS.txt\n * @license GPL-2.0-or-later\n *\n * @class\n * @param {mw.cx.dm.WikiPage} sourceWikiPage\n * @param {mw.cx.dm.WikiPage} targetWikiPage\n * @param {Object} config Standard services TODO not optional so should not be called config\n * @cfg {mw.cx.SiteMapper} siteMapper\n * @cfg {string} [campaign] String indicating which CTA was used to start this translation\n */\nmw.cx.init.Translation = function MwCXInitTranslation( sourceWikiPage, targetWikiPage, config ) {\n\tthis.sourceWikiPage = sourceWikiPage;\n\tthis.targetWikiPage = targetWikiPage;\n\n\t// BC with other code\n\tthis.config = config;\n\tthis.config.sourceTitle = sourceWikiPage.getTitle();\n\tthis.config.sourceLanguage = sourceWikiPage.getLanguage();\n\tthis.config.sourceRevision = sourceWikiPage.getRevision();\n\tthis.config.sourceSectionTitle = sourceWikiPage.getSectionTitle();\n\n\tthis.config.targetTitle = targetWikiPage.getTitle();\n\tthis.config.targetLanguage = targetWikiPage.getLanguage();\n\tthis.config.targetSectionTitle = targetWikiPage.getSectionTitle();\n\n\tthis.mainNamespaceId = mw.config.get( 'wgNamespaceIds' )[ '' ];\n\tthis.userNamespaceId = mw.config.get( 'wgNamespaceIds' ).user;\n\n\t// @var {ve.init.mw.CXTarget}\n\tthis.veTarget = null;\n\t// @var {mw.cx.dm.Translation}\n\tthis.translationModel = null;\n\t// @var {mw.cx.TranslationController}\n\tthis.translationController = null;\n\t// @var {mw.cx.ui.TranslationView}\n\tthis.translationView = null;\n};\n\n/**\n * Initialize translation.\n */\nmw.cx.init.Translation.prototype.init = function () {\n\tif ( mw.user.isAnon() ) {\n\t\tmw.hook( 'mw.cx.error.anonuser' ).fire();\n\t\treturn;\n\t}\n\tif ( this.config.campaign ) {\n\t\tmw.hook( 'mw.cx.cta.accept' ).fire(\n\t\t\tthis.config.campaign,\n\t\t\tthis.sourceWikiPage.getLanguage(),\n\t\t\tthis.targetWikiPage.getLanguage()\n\t\t);\n\t}\n\tthis.translationView = new mw.cx.ui.TranslationView( this.config );\n\tthis.veTarget = ve.init.mw.targetFactory.create( 'cx', this.translationView, this.config );\n\t// Paint the initial UI.\n\tthis.attachToDOM( this.veTarget );\n\n\tthis.veTarget.connect( this, { namespaceChange: 'onNamespaceChange' } );\n\n\t// TODO: Use mw.libs.ve.targetLoader.loadModules instead of manually getting the plugin\n\t// modules and manually initializing the platform\n\tconst platformPromise = new ve.init.mw.Platform().initialize();\n\tconst translationPromise = this.fetchTranslationData();\n\tconst pluginModules = mw.config.get( 'wgVisualEditorConfig' ).pluginModules;\n\tconst modulePromise = mw.loader.using( [ 'mw.cx.visualEditor' ].concat( pluginModules ) );\n\n\tPromise.all( [ translationPromise, modulePromise, platformPromise ] )\n\t\t.then( ( [ [ sourcePageContent, draft ] ] ) => {\n\t\t\t// Set the link cache for source language\n\t\t\tve.init.platform.sourceLinkCache = new ve.init.mw.LinkCache(\n\t\t\t\tthis.config.siteMapper.getApi( this.sourceWikiPage.getLanguage() )\n\t\t\t);\n\n\t\t\t// Set the link cache for target language\n\t\t\tve.init.platform.linkCache = new ve.init.mw.LinkCache(\n\t\t\t\tthis.config.siteMapper.getApi( this.targetWikiPage.getLanguage() )\n\t\t\t);\n\n\t\t\tthis.sourceWikiPage.setRevision( sourcePageContent.revision );\n\n\t\t\treturn this.initTranslationModel( sourcePageContent.segmentedContent, draft ).then( ( translationModel ) => {\n\t\t\t\tthis.translationModel = translationModel;\n\n\t\t\t\tif ( draft ) {\n\t\t\t\t\ttranslationModel.setSavedTranslation( draft );\n\t\t\t\t}\n\n\t\t\t\t// Initialize translation controller\n\t\t\t\tthis.translationController = new mw.cx.TranslationController(\n\t\t\t\t\ttranslationModel, this.veTarget, this.config.siteMapper, this.config\n\t\t\t\t);\n\n\t\t\t\tthis.veTarget.setTranslation( translationModel );\n\n\t\t\t\tthis.checkIfUserCanPublish();\n\t\t\t\tif ( translationModel.isChangedSignificantly() ) {\n\t\t\t\t\tthis.addChangedSignificantlyIssue( translationModel );\n\t\t\t\t}\n\n\t\t\t\tif ( translationModel.isSectionTranslation() ) {\n\t\t\t\t\tthis.translationView.markSectionTranslation();\n\t\t\t\t} else {\n\t\t\t\t\ttranslationModel.initCategories(\n\t\t\t\t\t\tthis.processCategories( sourcePageContent.categories )\n\t\t\t\t\t);\n\t\t\t\t\tconst categoryUI = new mw.cx.ui.Categories( translationModel, this.config );\n\t\t\t\t\tthis.translationView.showCategories( categoryUI );\n\t\t\t\t}\n\t\t\t\tif ( draft ) {\n\t\t\t\t\tmw.hook( 'mw.cx.draft.restored' ).fire();\n\t\t\t\t}\n\t\t\t\tmw.log( '[CX] Translation initialized successfully' );\n\t\t\t} );\n\t\t} )\n\t\t.catch( () => this.initializationError() );\n\n\tthis.addFeedbackLink();\n};\n\n/**\n * Fetch all data necessary to start a translation.\n *\n * @return {Promise<[Object, mw.cx.dm.DraftTranslationDTO|null]>}\n */\nmw.cx.init.Translation.prototype.fetchTranslationData = function () {\n\tmw.log( '[CX] Fetching Source page...' );\n\tconst sourcePageFetchPromise = this.fetchSourcePageContent(\n\t\tthis.sourceWikiPage,\n\t\tthis.targetWikiPage.getLanguage(),\n\t\tthis.config.siteMapper\n\t).catch( ( error ) => this.fetchSourcePageContentError( error.status ) );\n\n\tmw.log( '[CX] Checking existing translation...' );\n\tconst draftFetchPromise = this.fetchDraftTranslation(\n\t\tthis.sourceWikiPage.getTitle(),\n\t\tthis.sourceWikiPage.getLanguage(),\n\t\tthis.targetWikiPage.getLanguage(),\n\t\tthis.sourceWikiPage.getSectionTitle()\n\t)\n\t\t.then( ( { translation, conflict } ) => this.fetchDraftTranslationSuccess( translation, conflict ) )\n\t\t.catch( () => this.fetchDraftTranslationError() );\n\n\treturn Promise.all( [ sourcePageFetchPromise, draftFetchPromise ] );\n};\n\n/**\n * Create translation model object. If latest revision causes any user translations to be lost,\n * load the original revision used when translation was started.\n *\n * @param {string} sourceHtml\n * @param {mw.cx.dm.DraftTranslationDTO|null} [draft] Saved translation if any.\n * @return {Promise}\n */\nmw.cx.init.Translation.prototype.initTranslationModel = function ( sourceHtml, draft ) {\n\tconst translationUnits = draft && draft.translationUnits;\n\n\tconst targetDom = mw.cx.dm.Translation.static.getSourceDom(\n\t\tsourceHtml,\n\t\tthis.sourceWikiPage.getSectionTitle(),\n\t\ttrue,\n\t\ttranslationUnits,\n\t\tthis.sourceWikiPage.getLanguage()\n\t);\n\n\tlet numberOfUnrestoredSections = 0;\n\tfor ( const translationUnitId in translationUnits ) {\n\t\tif ( !translationUnits[ translationUnitId ].restored ) {\n\t\t\tnumberOfUnrestoredSections++;\n\t\t}\n\t}\n\n\t// If no translated section was lost, create source DOM and return early\n\t// This should cover initial start of translation, when there's no draft at all.\n\tif ( numberOfUnrestoredSections < 1 ) {\n\t\tconst sourceDom = mw.cx.dm.Translation.static.getSourceDom( sourceHtml, this.sourceWikiPage.getSectionTitle() );\n\n\t\tconst translationModel = new mw.cx.dm.Translation( this.sourceWikiPage, this.targetWikiPage, sourceDom, targetDom );\n\t\treturn Promise.resolve( translationModel );\n\t}\n\n\t// Update revision of source page\n\tthis.sourceWikiPage.setRevision( draft.sourceRevisionId );\n\n\treturn this.fetchSourcePageContent(\n\t\tthis.sourceWikiPage,\n\t\tthis.targetWikiPage.getLanguage(),\n\t\tthis.config.siteMapper\n\t)\n\t\t.then( ( sourcePageContent ) => {\n\t\t\t// Reset restoration status for all translation units\n\t\t\tfor ( const id in translationUnits ) {\n\t\t\t\ttranslationUnits[ id ].restored = false;\n\t\t\t}\n\n\t\t\tconst updatedSourceHtml = sourcePageContent.segmentedContent;\n\t\t\tconst updatedSourceDom = mw.cx.dm.Translation.static.getSourceDom( updatedSourceHtml, this.sourceWikiPage.getSectionTitle() );\n\t\t\tconst updatedTargetDom = mw.cx.dm.Translation.static.getSourceDom(\n\t\t\t\tupdatedSourceHtml,\n\t\t\t\tthis.sourceWikiPage.getSectionTitle(),\n\t\t\t\ttrue,\n\t\t\t\ttranslationUnits,\n\t\t\t\tthis.sourceWikiPage.getLanguage()\n\t\t\t);\n\n\t\t\tconst updatedTranslationModel = new mw.cx.dm.Translation( this.sourceWikiPage, this.targetWikiPage, updatedSourceDom, updatedTargetDom );\n\t\t\tupdatedTranslationModel.setChangedSignificantly( true );\n\n\t\t\tlet uri = new mw.Uri();\n\t\t\t// Append revision number to URL\n\t\t\turi = uri.extend( { revision: draft.sourceRevisionId } );\n\t\t\twindow.history.pushState( null, document.title, uri.toString() );\n\n\t\t\treturn updatedTranslationModel;\n\n\t\t} )\n\t\t.catch( ( error ) => this.fetchSourcePageContentError( error.status ) );\n};\n\n/**\n * Initialization error handler\n */\nmw.cx.init.Translation.prototype.initializationError = function () {\n\t// Any error in the above deferreds is critical\n\tthis.translationView.showMessage( 'error', mw.msg( 'cx-init-critical-error' ) );\n\t// Nothing happens beyond this. Some internal error happened.\n\tmw.log.error( '[CX] Translation initialization failed.' );\n};\n\n/**\n * Attach the translation view to DOM.\n *\n * @private\n * @param {ve.init.mw.CXTarget} veTarget\n */\nmw.cx.init.Translation.prototype.attachToDOM = function ( veTarget ) {\n\t$( 'body' ).append( veTarget.$element );\n};\n\n/**\n * Fetch the source page content from cxserver.\n *\n * @private\n * @param {mw.cx.dm.WikiPage} wikiPage\n * @param {string} targetLanguage\n * @param {mw.cx.SiteMapper} siteMapper\n * @return {Promise}\n */\nmw.cx.init.Translation.prototype.fetchSourcePageContent = function ( wikiPage, targetLanguage, siteMapper ) {\n\tconst fetchParams = {\n\t\t$sourcelanguage: siteMapper.getWikiDomainCode( wikiPage.getLanguage() ),\n\t\t$targetlanguage: targetLanguage,\n\t\t// Manual normalisation to avoid redirects on spaces but not to break namespaces\n\t\t$title: wikiPage.getTitle().replace( / /g, '_' )\n\t};\n\n\tlet apiURL = '/page/$sourcelanguage/$targetlanguage/$title';\n\n\t// If revision is requested, load that revision of page.\n\tif ( wikiPage.getRevision() ) {\n\t\tfetchParams.$revision = wikiPage.getRevision();\n\t\tapiURL += '/$revision';\n\t}\n\n\tconst fetchPageUrl = siteMapper.getCXServerUrl( apiURL, fetchParams );\n\n\treturn fetch( fetchPageUrl ).then( ( response ) => {\n\t\tif ( !response.ok ) {\n\t\t\treturn Promise.reject( response );\n\t\t}\n\n\t\treturn response.json();\n\t} );\n};\n\nmw.cx.init.Translation.prototype.fetchSourcePageContentError = function ( status ) {\n\tif ( status === 404 ) {\n\t\tmw.hook( 'mw.cx.error' ).fire(\n\t\t\tmw.msg(\n\t\t\t\t'cx-error-page-not-found',\n\t\t\t\tthis.sourceWikiPage.getTitle(),\n\t\t\t\t$.uls.data.getAutonym( this.sourceWikiPage.getLanguage() )\n\t\t\t)\n\t\t);\n\t} else {\n\t\tmw.hook( 'mw.cx.error' ).fire( mw.msg( 'cx-error-server-connection' ) );\n\t}\n};\n\n/**\n * Given a source title, a source language and a target language, this method\n * fetches the draft translation information. It always returns a promise that\n * resolves to an object containing two properties: \"translation\" and \"conflict\".\n *\n * If a corresponding draft exists for the current user, the \"translation\" property\n * above is an object containing the draft translation fields, and the \"conflict\"\n * property is null.\n * If no draft translation is found, the API checks for conflicting translations,\n * i.e. translations for the same title and language pair, started by other users\n * within the last 24 hours. If such conflicting translation is found, the \"conflict\"\n * property will be an object containing the name and the gender of the last translator\n * of a conflicting translation, and the \"translation\" property is null.\n * If no draft and no conflict found, this translation will be started as a new translation.\n *\n * @private\n * @param {string} sourceTitle\n * @param {string} sourceLanguage\n * @param {string} targetLanguage\n * @param {string|null} sourceSectionTitle\n * @return {Promise<{translation: mw.cx.dm.DraftTranslationDTO|null, conflict: { name: string, gender: string }|null}>}\n */\nmw.cx.init.Translation.prototype.fetchDraftTranslation = function (\n\tsourceTitle,\n\tsourceLanguage,\n\ttargetLanguage,\n\tsourceSectionTitle\n) {\n\treturn new Promise( ( resolve, reject ) => {\n\t\tconst params = {\n\t\t\taction: 'query',\n\t\t\tlist: 'contenttranslation',\n\t\t\tusecase: 'desktop-editor-draft',\n\t\t\tsourcetitle: sourceTitle,\n\t\t\tfrom: sourceLanguage,\n\t\t\tto: targetLanguage,\n\t\t\tformatversion: 2\n\t\t};\n\n\t\tif ( sourceSectionTitle ) {\n\t\t\tparams.sourcesectiontitle = sourceSectionTitle;\n\t\t}\n\t\tconst jQueryPromise = new mw.Api().get( params ).then( ( response ) => {\n\t\t\tconst payload = response.query && response.query.contenttranslation;\n\n\t\t\tlet conflict = null;\n\t\t\tif ( payload && payload.hasConflicts ) {\n\t\t\t\tconflict = {\n\t\t\t\t\tname: payload.translatorName,\n\t\t\t\t\tgender: payload.translatorGender\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttranslation: payload && new mw.cx.dm.DraftTranslationDTO( payload.translation ),\n\t\t\t\tconflict\n\t\t\t};\n\t\t} );\n\n\t\tjQueryPromise\n\t\t\t.then( ( translation ) => resolve( translation ) )\n\t\t\t.fail( ( errorCode, details ) => reject( { errorCode, details } ) );\n\t} );\n};\n\n/**\n * Check whether an existing draft can be used.\n *\n * @private\n * @param {mw.cx.dm.DraftTranslationDTO|null} draft\n * @param {{ name: string, gender: string}|null} conflict\n * @return {Promise<mw.cx.dm.DraftTranslationDTO|null>} Draft or null.\n */\nmw.cx.init.Translation.prototype.fetchDraftTranslationSuccess = function ( draft, conflict ) {\n\t// Do not allow two users to start a draft at the same time. The API only returns\n\t// a conflict (providing the conflicting translator's name and gender, if this is the case.\n\tif ( conflict ) {\n\t\tmw.log( '[CX] Existing translation in last 24 hours by another translator found.' );\n\t\tthis.translationView.showConflictWarning( conflict.name, conflict.gender );\n\t\t// Stop further processing\n\t\treturn Promise.resolve( null );\n\t}\n\n\tif ( !draft ) {\n\t\t// No draft exists\n\t\tmw.log( '[CX] No existing translation found' );\n\t\treturn Promise.resolve( null );\n\t}\n\n\t// Don't restore deleted drafts\n\tif ( draft.status === 'deleted' ) {\n\t\tmw.log( '[CX] Existing translation found. But it is a deleted one.' );\n\t\treturn Promise.resolve( null );\n\t}\n\n\treturn Promise.resolve( draft );\n};\n\nmw.cx.init.Translation.prototype.fetchDraftTranslationError = function () {\n\t// XXX\n\tmw.hook( 'mw.cx.error' ).fire( 'Unable to fetch draft information.' );\n\tmw.log( '[CX]', arguments );\n};\n\n/**\n * Process fetched categories to create mapping of source category and target category or null, if\n * there is no adapted target category.\n *\n * @param {Array} fetchedCategories\n * @return {Object} Array of categories transformed into object of\n * sourceTitle:targetTitle property-value pairs\n */\nmw.cx.init.Translation.prototype.processCategories = function ( fetchedCategories ) {\n\tconst categories = {};\n\tlet length = fetchedCategories.length;\n\n\twhile ( length-- ) {\n\t\tconst category = fetchedCategories[ length ];\n\t\tcategories[ category.sourceTitle ] = category.targetTitle || null;\n\t}\n\n\treturn categories;\n};\n\nmw.cx.init.Translation.prototype.addFeedbackLink = function () {\n\tconst feedback = new OO.ui.ButtonWidget( {\n\t\tlabel: mw.msg( 'cx-feedback-link' ),\n\t\ticon: 'speechBubbles',\n\t\thref: '//www.mediawiki.org/wiki/Talk:Content_translation',\n\t\ttarget: '_blank',\n\t\tframed: false,\n\t\tclasses: [ 'cx-feedback-link' ],\n\t\tflags: [ 'progressive' ]\n\t} );\n\tthis.translationView.addItems( [ feedback ] );\n};\n\nmw.cx.init.Translation.prototype.addChangedSignificantlyIssue = function ( translationModel ) {\n\tthis.translationView.showViewIssuesMessage(\n\t\tmw.msg( 'cx-infobar-old-version' ), 'old-version', 'warning'\n\t);\n\n\tconst diff = this.config.siteMapper.getPageUrl(\n\t\ttranslationModel.getSourceLanguage(),\n\t\ttranslationModel.getSourceTitle(),\n\t\t{\n\t\t\ttype: 'revision',\n\t\t\tdiff: 'cur',\n\t\t\toldid: translationModel.getSourceRevisionId()\n\t\t}\n\t);\n\n\tconst translationIssuesParams = {\n\t\ttitle: mw.msg( 'cx-tools-linter-old-revision' ),\n\t\tresolvable: true\n\t};\n\n\tif ( !translationModel.hasBeenPublished() ) {\n\t\ttranslationIssuesParams.additionalButtons = [\n\t\t\t{\n\t\t\t\ticon: 'reload',\n\t\t\t\tlabel: mw.msg( 'cx-tools-linter-old-revision-label' ),\n\t\t\t\taction: this.restartTranslation.bind( this )\n\t\t\t}\n\t\t];\n\t}\n\n\ttranslationModel.addUnattachedIssues( [\n\t\tnew mw.cx.dm.TranslationIssue(\n\t\t\t'old-version', // Issue name\n\t\t\tmw.message( 'cx-tools-linter-old-revision-message', diff ), // Message body\n\t\t\ttranslationIssuesParams\n\t\t)\n\t] );\n};\n\nmw.cx.init.Translation.prototype.restartTranslation = function () {\n\tOO.ui.getWindowManager().openWindow( 'message', {\n\t\ttitle: mw.msg( 'cx-tools-linter-restart-translation-title' ),\n\t\tmessage: mw.msg( 'cx-tools-linter-restart-translation-message' ),\n\t\tactions: [\n\t\t\t{ action: 'restart', label: mw.msg( 'cx-tools-linter-old-revision-label' ), flags: [ 'primary', 'destructive' ] },\n\t\t\t{ action: 'cancel', label: mw.msg( 'cx-tools-linter-restart-translation-cancel' ), flags: 'safe' }\n\t\t]\n\t} ).closed.then( function ( data ) {\n\t\tif ( !data || data.action !== 'restart' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sourceLanguage = this.translationModel.getSourceLanguage();\n\t\tconst targetLanguage = this.translationModel.getTargetLanguage();\n\t\tconst sourceTitle = this.translationModel.getSourceTitle();\n\t\tconst apiParams = {\n\t\t\tassert: 'user',\n\t\t\taction: 'cxdelete',\n\t\t\tfrom: sourceLanguage,\n\t\t\tto: targetLanguage,\n\t\t\tsourcetitle: sourceTitle\n\t\t};\n\n\t\treturn new mw.Api().postWithToken( 'csrf', apiParams ).done( function () {\n\t\t\tconst uri = new mw.Uri();\n\t\t\tdelete uri.query.revision;\n\n\t\t\tthis.config.siteMapper.setCXToken( sourceLanguage, targetLanguage, sourceTitle );\n\n\t\t\tlocation.href = uri.getRelativePath();\n\t\t}.bind( this ) );\n\t}.bind( this ) );\n};\n\nmw.cx.init.Translation.prototype.isUserAllowedToPublishToMainNamespace = function () {\n\tlet publishConfig = ( mw.config.get( 'wgContentTranslationPublishRequirements' ) || [] ).userGroups;\n\n\tif ( typeof publishConfig === 'string' ) {\n\t\tpublishConfig = [ publishConfig ];\n\t}\n\n\tif ( !Array.isArray( publishConfig ) ) {\n\t\tmw.log.error( 'Publish requirement config should be of type array or string' );\n\t\treturn true;\n\t}\n\n\tconst userGroups = mw.config.get( 'wgUserGroups' ) || [];\n\treturn publishConfig.some( ( userGroup ) => userGroups.indexOf( userGroup ) > -1 );\n};\n\nmw.cx.init.Translation.prototype.checkIfUserCanPublish = function () {\n\tif ( this.veTarget.getPublishNamespace() !== this.mainNamespaceId ) {\n\t\treturn;\n\t}\n\n\tif ( !this.isUserAllowedToPublishToMainNamespace() ) {\n\t\tthis.displayCannotPublishError();\n\t}\n};\n\n/**\n * Display the error when user cannot publish into main namespace.\n */\nmw.cx.init.Translation.prototype.displayCannotPublishError = function () {\n\tthis.translationView.showViewIssuesMessage(\n\t\tmw.msg( 'cx-infobar-cannot-publish' ), 'cannot-publish', 'error'\n\t);\n\n\t// User isn't allowed to publish, display the information in the issue card.\n\tthis.translationModel.resolveIssueByName( 'cannot-publish' );\n\tthis.translationModel.addUnattachedIssues( [\n\t\tnew mw.cx.dm.TranslationIssue(\n\t\t\t'cannot-publish', // Issue name\n\t\t\tmw.message( 'cx-tools-linter-cannot-publish-message' ), // message body\n\t\t\t{\n\t\t\t\ttitle: mw.msg( 'cx-tools-linter-cannot-publish-title' ),\n\t\t\t\ttype: 'error',\n\t\t\t\thelp: 'https://en.wikipedia.org/wiki/Wikipedia:Content_translation_tool',\n\t\t\t\tresolvable: true,\n\t\t\t\tactionIcon: 'article',\n\t\t\t\tactionLabel: mw.msg( 'cx-tools-linter-cannot-publish-action-label' ),\n\t\t\t\taction: this.switchToUserNamespace.bind( this )\n\t\t\t}\n\t\t)\n\t] );\n};\n\nmw.cx.init.Translation.prototype.switchToUserNamespace = function () {\n\tconst popup = new OO.ui.PopupWidget( {\n\t\t$content: $( '<p>' ).text( mw.msg( 'cx-publish-destination-namespace-changed' ) ),\n\t\tpadded: true,\n\t\tautoClose: true\n\t} );\n\n\tthis.veTarget.publishToolbar\n\t\t.getToolGroupByName( 'publish' )\n\t\t.findItemFromData( 'publishSettings' )\n\t\t.$element.append( popup.$element );\n\tpopup.toggle( true );\n\n\tthis.translationModel.resolveIssueByName( 'cannot-publish' );\n\tthis.translationView.clearMessages();\n\tthis.veTarget.onPublishNamespaceChange( this.userNamespaceId );\n};\n\nmw.cx.init.Translation.prototype.onNamespaceChange = function ( namespaceId ) {\n\tthis.checkIfUserCanPublish();\n\n\tif ( this.mainNamespaceId !== namespaceId ) {\n\t\tthis.translationModel.resolveIssueByName( 'cannot-publish' );\n\t\tthis.translationView.removeMessage( 'cannot-publish' );\n\t}\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/mw.cx.init.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/publish/ext.cx.wikibase.link.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/source/mw.cx.SelectedSourcePage.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":357,"column":3,"nodeType":"CallExpression","endLine":357,"endColumn":82,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/source/mw.cx.SelectedSourcePageDialog.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/source/mw.cx.SourcePageSelector.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-slide","severity":2,"message":"Prefer CSS transitions to .slideDown","line":200,"column":2,"nodeType":"CallExpression","endLine":200,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-slide","severity":2,"message":"Prefer CSS transitions to .slideDown","line":209,"column":2,"nodeType":"CallExpression","endLine":209,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/stats/ext.cx.stats.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 612 column 7.","line":617,"column":55,"nodeType":"Identifier","messageId":"noShadow","endLine":617,"endColumn":59},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 612 column 7.","line":629,"column":55,"nodeType":"Identifier","messageId":"noShadow","endLine":629,"endColumn":59},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 612 column 7.","line":641,"column":49,"nodeType":"Identifier","messageId":"noShadow","endLine":641,"endColumn":53},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 657 column 7.","line":662,"column":58,"nodeType":"Identifier","messageId":"noShadow","endLine":662,"endColumn":62},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 657 column 7.","line":674,"column":58,"nodeType":"Identifier","messageId":"noShadow","endLine":674,"endColumn":62},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 657 column 7.","line":686,"column":52,"nodeType":"Identifier","messageId":"noShadow","endLine":686,"endColumn":56},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 657 column 7.","line":698,"column":55,"nodeType":"Identifier","messageId":"noShadow","endLine":698,"endColumn":59},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 714 column 7.","line":718,"column":55,"nodeType":"Identifier","messageId":"noShadow","endLine":718,"endColumn":59},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 714 column 7.","line":727,"column":55,"nodeType":"Identifier","messageId":"noShadow","endLine":727,"endColumn":59},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 714 column 7.","line":736,"column":49,"nodeType":"Identifier","messageId":"noShadow","endLine":736,"endColumn":53},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 752 column 12.","line":757,"column":58,"nodeType":"Identifier","messageId":"noShadow","endLine":757,"endColumn":62},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 752 column 12.","line":766,"column":58,"nodeType":"Identifier","messageId":"noShadow","endLine":766,"endColumn":62},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 752 column 12.","line":775,"column":52,"nodeType":"Identifier","messageId":"noShadow","endLine":775,"endColumn":56},{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 752 column 12.","line":784,"column":55,"nodeType":"Identifier","messageId":"noShadow","endLine":784,"endColumn":59}],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":194,"column":6,"nodeType":"CallExpression","endLine":196,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":649,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":653,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":706,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":710,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":744,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":748,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":792,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":796,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":14,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * ContentTranslation Stats\n *\n * @copyright See AUTHORS.txt\n * @license GPL-2.0-or-later\n */\n( function () {\n\t'use strict';\n\n\t/* global Chart:false */\n\n\tfunction CXStats( $container, options ) {\n\t\tthis.$container = $container;\n\t\tthis.sitemapper = options.siteMapper;\n\t\tthis.sourceTargetModel = {};\n\t\tthis.targetSourceModel = {};\n\t\tthis.totalTranslationTrend = null;\n\t\tthis.languageTranslationTrend = null;\n\t\tthis.$highlights = null;\n\t\tthis.$graph = null;\n\t\tthis.chartOptions = {};\n\t}\n\n\tCXStats.prototype.init = function () {\n\t\tvar self = this,\n\t\t\t$spinner;\n\n\t\t$spinner = mw.cx.widgets.spinner();\n\t\tthis.$highlights = $( '<div>' ).addClass( 'cx-stats-highlights' );\n\t\tthis.$container.append( $spinner, this.$highlights );\n\n\t\t$.when(\n\t\t\tthis.getCXTrends(),\n\t\t\tthis.getCXTrends( mw.config.get( 'wgContentLanguage' ) ),\n\t\t\tthis.getCXStats()\n\t\t).done( function ( totalTrend, languageTrend, stats ) {\n\t\t\t// Remove spinner\n\t\t\t$spinner.remove();\n\n\t\t\tself.totalTranslationTrend = totalTrend.translations || [];\n\t\t\tself.totalDraftTrend = totalTrend.drafts || [];\n\t\t\tself.languageTranslationTrend = languageTrend.translations || [];\n\t\t\tself.languageDraftTrend = languageTrend.drafts || [];\n\t\t\tself.languageDeletionTrend = languageTrend.deletions || [];\n\t\t\tself.transformJsonToModel( stats[ 0 ].query.contenttranslationstats );\n\t\t\t// Now render them all\n\t\t\tself.renderHighlights();\n\t\t\tself.render();\n\t\t} );\n\n\t\tthis.chartOptions = {\n\t\t\tscales: {\n\t\t\t\txAxes: [\n\t\t\t\t\t{\n\t\t\t\t\t\tticks: {\n\t\t\t\t\t\t\tcallback: function ( value ) {\n\t\t\t\t\t\t\t\treturn moment( value ).format( 'L' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tyAxes: [\n\t\t\t\t\t{\n\t\t\t\t\t\tticks: {\n\t\t\t\t\t\t\tcallback: function ( value ) {\n\t\t\t\t\t\t\t\treturn mw.language.convertNumber( Number( value ) );\n\t\t\t\t\t\t\t}\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\ttooltips: {\n\t\t\t\tcallbacks: {\n\t\t\t\t\tlabel: function ( tooltipItem, data ) {\n\t\t\t\t\t\tvar convertedValue = mw.language.convertNumber( Number( tooltipItem.yLabel ) );\n\t\t\t\t\t\treturn data.datasets[ tooltipItem.datasetIndex ].label + ': ' + convertedValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n\t/**\n\t * Render the boxes at the top with the most interesting recent data.\n\t */\n\tCXStats.prototype.renderHighlights = function () {\n\t\tvar getTrend, info, infoLanguage, localLanguage,\n\t\t\t$total, $weeklyStats,\n\t\t\tweekLangTrendText, weekTrendText, weekTrendClass,\n\t\t\t$parenthesizedTrend, $trendInLanguage,\n\t\t\tfmt = mw.language.convertNumber; // Shortcut\n\n\t\tgetTrend = function ( data ) {\n\t\t\tvar thisWeek, total, trend,\n\t\t\t\toneWeekAgoDelta, twoWeeksAgoDelta;\n\n\t\t\tif ( data.length < 3 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthisWeek = data.length - 1;\n\n\t\t\ttotal = data[ thisWeek ].count;\n\n\t\t\toneWeekAgoDelta = data[ thisWeek - 1 ].delta;\n\t\t\ttwoWeeksAgoDelta = data[ thisWeek - 2 ].delta;\n\n\t\t\tif ( twoWeeksAgoDelta ) {\n\t\t\t\ttrend = Math.round( ( oneWeekAgoDelta - twoWeeksAgoDelta ) / twoWeeksAgoDelta * 100 );\n\t\t\t} else {\n\t\t\t\ttrend = oneWeekAgoDelta ? 100 : 0;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttotal: total,\n\t\t\t\ttrend: trend,\n\t\t\t\tlastWeek: oneWeekAgoDelta\n\t\t\t};\n\t\t};\n\n\t\tlocalLanguage = $.uls.data.getAutonym( mw.config.get( 'wgContentLanguage' ) );\n\t\tinfo = getTrend( this.totalTranslationTrend );\n\t\tinfoLanguage = getTrend( this.languageTranslationTrend );\n\n\t\tif ( !info || !infoLanguage ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$total = $( '<div>' )\n\t\t\t.addClass( 'cx-stats-box' )\n\t\t\t.append(\n\t\t\t\t$( '<div>' )\n\t\t\t\t\t.addClass( 'cx-stats-box__title' )\n\t\t\t\t\t.text( mw.msg( 'cx-stats-total-published' ) ),\n\t\t\t\t$( '<div>' )\n\t\t\t\t\t.addClass( 'cx-stats-box__total' )\n\t\t\t\t\t.text( fmt( info.total ) ),\n\t\t\t\t$( '<div>' )\n\t\t\t\t\t.addClass( 'cx-stats-box__localtotal' )\n\t\t\t\t\t.text( mw.msg(\n\t\t\t\t\t\t'cx-stats-local-published-number',\n\t\t\t\t\t\tfmt( infoLanguage.total ),\n\t\t\t\t\t\tfmt( localLanguage )\n\t\t\t\t\t) )\n\t\t\t);\n\n\t\tweekLangTrendText = mw.msg( 'percent', fmt( infoLanguage.trend ) );\n\t\tif ( infoLanguage.trend >= 0 ) {\n\t\t\t// Add the plus sign to make clear that it's an increase\n\t\t\tweekLangTrendText = '+' + weekLangTrendText;\n\t\t}\n\n\t\tweekTrendText = mw.msg( 'percent', fmt( info.trend ) );\n\t\tif ( info.trend >= 0 ) {\n\t\t\t// Add the plus sign to make clear that it's an increase\n\t\t\tweekTrendText = '+' + weekTrendText;\n\t\t\tweekTrendClass = 'cx-stats-trend-increase';\n\t\t} else {\n\t\t\tweekTrendClass = 'cx-stats-trend-decrease';\n\t\t}\n\n\t\t$parenthesizedTrend = $( '<span>' )\n\t\t\t// This is needed to show the plus or minus sign on the correct side\n\t\t\t.prop( 'dir', 'ltr' )\n\t\t\t.text( weekLangTrendText );\n\t\t$trendInLanguage = $( '<div>' )\n\t\t\t.addClass( 'cx-stats-box__localtotal' )\n\t\t\t.text( mw.msg(\n\t\t\t\t'cx-stats-local-published',\n\t\t\t\tfmt( infoLanguage.lastWeek ),\n\t\t\t\tlocalLanguage,\n\t\t\t\t'$3'\n\t\t\t) );\n\t\t$trendInLanguage.html( $trendInLanguage.html().replace(\n\t\t\t'$3',\n\t\t\t$parenthesizedTrend.get( 0 ).outerHTML\n\t\t) );\n\n\t\t$weeklyStats = $( '<div>' )\n\t\t\t.addClass( 'cx-stats-box' )\n\t\t\t.append(\n\t\t\t\t$( '<div>' )\n\t\t\t\t\t.addClass( 'cx-stats-box__title' )\n\t\t\t\t\t.text( mw.msg( 'cx-stats-weekly-published' ) ),\n\t\t\t\t$( '<div>' ).append(\n\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t.addClass( 'cx-stats-box__total' )\n\t\t\t\t\t\t.text( fmt( info.lastWeek ) ),\n\t\t\t\t\t// nbsp is needed for separation between the numbers.\n\t\t\t\t\t// Without it the numbers appear in the wrong order in RTL environments.\n\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t.text( '\\u00A0' ),\n\t\t\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t.prop( 'dir', 'ltr' )\n\t\t\t\t\t\t.addClass( 'cx-stats-box__trend ' + weekTrendClass )\n\t\t\t\t\t\t.text( weekTrendText )\n\t\t\t\t),\n\t\t\t\t$trendInLanguage\n\t\t\t);\n\n\t\tthis.$highlights.append( $total, $weeklyStats );\n\t};\n\n\tCXStats.prototype.render = function () {\n\t\tvar self = this;\n\n\t\tthis.$cumulativeGraph = $( '<canvas>' ).attr( {\n\t\t\tid: 'cxcumulative',\n\t\t\twidth: this.$container.width() - 200, // Leave a 200px margin buffer to avoid overflow\n\t\t\theight: 400\n\t\t} );\n\n\t\tthis.$languageCumulativeGraph = $( '<canvas>' ).attr( {\n\t\t\tid: 'cxlangcumulative',\n\t\t\twidth: this.$container.width() - 200, // Leave a 200px margin buffer to avoid overflow\n\t\t\theight: 400\n\t\t} );\n\n\t\tthis.$translationTrendBarChart = $( '<canvas>' ).attr( {\n\t\t\tid: 'cxtrendchart',\n\t\t\twidth: this.$container.width() - 200, // Leave a 200px margin buffer to avoid overflow\n\t\t\theight: 400\n\t\t} );\n\n\t\tthis.$langTranslationTrendBarChart = $( '<canvas>' ).attr( {\n\t\t\tid: 'cxlangtrendchart',\n\t\t\twidth: this.$container.width() - 200, // Leave a 200px margin buffer to avoid overflow\n\t\t\theight: 400\n\t\t} );\n\n\t\tthis.$container.append( $( '<h2>' ).text( mw.msg( 'cx-stats-all-translations-title' ) ) );\n\t\tthis.createTabs(\n\t\t\t'cx-graph-total', [\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-cumulative-tab-title' ),\n\t\t\t\t\tid: 'global-translations',\n\t\t\t\t\tcontent: $( '<div>' )\n\t\t\t\t\t\t.addClass( 'cx-stats-graph cx-stats-cumulative-total' )\n\t\t\t\t\t\t.append( this.$cumulativeGraph ),\n\t\t\t\t\tonVisible: function () {\n\t\t\t\t\t\tself.drawCumulativeGraph( 'count' );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-weekly-trend-tab-title' ),\n\t\t\t\t\tid: 'global-translations-weekly',\n\t\t\t\t\tcontent: $( '<div>' )\n\t\t\t\t\t\t.addClass( 'cx-stats-graph cx-stats-trend-total' )\n\t\t\t\t\t\t.append( this.$translationTrendBarChart ),\n\t\t\t\t\tonVisible: function () {\n\t\t\t\t\t\tself.drawTranslationTrend();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t);\n\n\t\tthis.$container.append( $( '<h2>' ).text( mw.msg(\n\t\t\t'cx-trend-translations-to',\n\t\t\t$.uls.data.getAutonym( mw.config.get( 'wgContentLanguage' ) )\n\t\t) ) );\n\t\tthis.createTabs(\n\t\t\t'cx-graph-language', [\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-cumulative-tab-title' ),\n\t\t\t\t\tid: 'language-translations',\n\t\t\t\t\tcontent: $( '<div>' )\n\t\t\t\t\t\t.addClass( 'cx-stats-graph cx-stats-cumulative-lang' )\n\t\t\t\t\t\t.append( this.$languageCumulativeGraph ),\n\t\t\t\t\tonVisible: function () {\n\t\t\t\t\t\tself.drawLanguageCumulativeGraph( 'count' );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-weekly-trend-tab-title' ),\n\t\t\t\t\tid: 'language-translations-weekly',\n\t\t\t\t\tcontent: $( '<div>' )\n\t\t\t\t\t\t.addClass( 'cx-stats-graph cx-stats-trend-lang' )\n\t\t\t\t\t\t.append( this.$langTranslationTrendBarChart ),\n\t\t\t\t\tonVisible: function () {\n\t\t\t\t\t\tself.drawLangTranslationTrend();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t);\n\n\t\tthis.$container.append( $( '<h2>' ).text( mw.msg( 'cx-stats-published-translations-title' ) ) );\n\t\tthis.createTabs(\n\t\t\t'cx-stats-published', [\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-published-target-source' ),\n\t\t\t\t\tid: 'published-from',\n\t\t\t\t\tcontent: this.drawTranslationsChart( 'to', 'published', 'count' )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-published-source-target' ),\n\t\t\t\t\tid: 'published-to',\n\t\t\t\t\tcontent: this.drawTranslationsChart( 'from', 'published', 'count' )\n\t\t\t\t}\n\t\t\t],\n\t\t\ttrue\n\t\t);\n\n\t\tthis.$container.append( $( '<h2>' ).text( mw.msg( 'cx-stats-draft-translations-title' ) ) );\n\t\tthis.createTabs(\n\t\t\t'cx-stats-draft', [\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-draft-target-source' ),\n\t\t\t\t\tid: 'drafted-from',\n\t\t\t\t\tcontent: this.drawTranslationsChart( 'to', 'draft', 'count' )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-draft-source-target' ),\n\t\t\t\t\tid: 'drafted-to',\n\t\t\t\t\tcontent: this.drawTranslationsChart( 'from', 'draft', 'count' )\n\t\t\t\t}\n\t\t\t],\n\t\t\ttrue\n\t\t);\n\n\t\tthis.$container.append( $( '<h2>' ).text( mw.msg( 'cx-stats-published-translators-title' ) ) );\n\t\tthis.createTabs(\n\t\t\t'cx-stats-translators', [\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-published-target-source' ),\n\t\t\t\t\tid: 'translators-from',\n\t\t\t\t\tcontent: this.drawTranslationsChart( 'to', 'published', 'translators' )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: mw.msg( 'cx-stats-published-source-target' ),\n\t\t\t\t\tid: 'translators-to',\n\t\t\t\t\tcontent: this.drawTranslationsChart( 'from', 'published', 'translators' )\n\t\t\t\t}\n\t\t\t],\n\t\t\ttrue\n\t\t);\n\t};\n\n\t/**\n\t * Create a tabbed container for holding related stats.\n\t *\n\t * @param {string} tabGroupId Tab group id\n\t * @param {Object[]} items\n\t * @param {boolean} expandable\n\t */\n\tCXStats.prototype.createTabs = function ( tabGroupId, items, expandable ) {\n\t\tvar $tabContainer, i, $tabs, $expand, tabToShow = 0;\n\n\t\t$tabContainer = $( '<div>' ).addClass( 'cx-stats-tabs-container' );\n\t\t$tabs = $( '<ul>' ).addClass( 'cx-stats-tabs' );\n\t\t$tabContainer.append( $tabs );\n\t\tthis.$container.append( $tabContainer );\n\t\tfor ( i = 0; i < items.length; i++ ) {\n\t\t\titems[ i ].$tab = $( '<li>' )\n\t\t\t\t.addClass( 'cx-stats-tabs-tabtitle' )\n\t\t\t\t.attr( 'about', tabGroupId + 'tab-' + i )\n\t\t\t\t.attr( 'data-itemid', i )\n\t\t\t\t.attr( 'id', items[ i ].id )\n\t\t\t\t.text( items[ i ].title );\n\t\t\titems[ i ].$content = items[ i ].content\n\t\t\t\t.attr( 'id', tabGroupId + 'tab-' + i )\n\t\t\t\t.addClass( 'cx-stats-tabs-tab-content cx-stats-tabs-collapsed' );\n\n\t\t\t$tabs.append( items[ i ].$tab );\n\t\t\t$tabContainer.append( items[ i ].$content );\n\n\t\t\tif ( location.hash === '#' + items[ i ].id ) {\n\t\t\t\ttabToShow = i;\n\t\t\t\t$( 'html, body' ).animate( {\n\t\t\t\t\tscrollTop: items[ i ].$tab.offset().top\n\t\t\t\t}, 500 );\n\t\t\t}\n\t\t}\n\n\t\titems[ tabToShow ].$tab.addClass( 'cx-stats-tabs-current' );\n\t\titems[ tabToShow ].$content.addClass( 'cx-stats-tabs-current' );\n\t\tif ( items[ tabToShow ].onVisible ) {\n\t\t\titems[ tabToShow ].onVisible.apply( this );\n\t\t\titems[ tabToShow ].onVisible = null;\n\t\t}\n\n\t\t// Click handler for tabs\n\t\t$tabs.find( 'li' ).on( 'click', function () {\n\t\t\tvar onVisible,\n\t\t\t\t$this = $( this ),\n\t\t\t\ttabId = $( this ).attr( 'about' ),\n\t\t\t\titemId = $this.data( 'itemid' );\n\n\t\t\t$tabs.find( 'li' ).removeClass( 'cx-stats-tabs-current' );\n\t\t\t$tabContainer.find( '.cx-stats-tabs-tab-content' )\n\t\t\t\t.removeClass( 'cx-stats-tabs-current' );\n\t\t\t$( this ).addClass( 'cx-stats-tabs-current' );\n\t\t\t$( '#' + tabId ).addClass( 'cx-stats-tabs-current' );\n\n\t\t\tonVisible = items[ itemId ].onVisible;\n\t\t\tif ( onVisible ) {\n\t\t\t\tonVisible.apply( this );\n\t\t\t\titems[ itemId ].onVisible = null;\n\t\t\t}\n\t\t} );\n\t\tif ( expandable ) {\n\t\t\t$expand = $( '<a>' )\n\t\t\t\t.addClass( 'cx-stats-tabs-toggle-all' )\n\t\t\t\t.text( mw.msg( 'cx-stats-tabs-expand' ) )\n\t\t\t\t.on( 'click', function () {\n\t\t\t\t\t$tabContainer\n\t\t\t\t\t\t.find( '.cx-stats-tabs-tab-content' )\n\t\t\t\t\t\t.removeClass( 'cx-stats-tabs-collapsed' );\n\t\t\t\t\t$( this ).remove();\n\t\t\t\t} );\n\t\t\t$tabContainer.append( $expand );\n\t\t}\n\t};\n\n\t/**\n\t * Sorts in descending order\n\t *\n\t * @param {Object} a\n\t * @param {Object} b\n\t * @return {number}\n\t */\n\tfunction sortByCount( a, b ) {\n\t\treturn b.count - a.count;\n\t}\n\n\t/**\n\t * Sorts in descending order\n\t *\n\t * @param {Object} a\n\t * @param {Object} b\n\t * @return {number}\n\t */\n\tfunction sortByTranslators( a, b ) {\n\t\treturn b.translators - a.translators;\n\t}\n\n\tCXStats.prototype.drawTranslationsChart = function ( direction, status, property ) {\n\t\tvar $chart, $bar, translations, $translations, model, i, j, $rows = [],\n\t\t\t$callout,\n\t\t\t$row, width, max = 0,\n\t\t\t$tail, tailWidth = 0,\n\t\t\ttail, langCode,\n\t\t\t$langCode, $autonym, $total, $rowLabelContainer,\n\t\t\tfmt = mw.language.convertNumber;\n\n\t\t$chart = $( '<div>' ).addClass( 'cx-stats-chart' );\n\n\t\tmodel = direction === 'to' ?\n\t\t\tthis.targetSourceModel[ status ].sort(\n\t\t\t\tproperty === 'count' ? sortByCount : sortByTranslators\n\t\t\t) :\n\t\t\tthis.sourceTargetModel[ status ].sort(\n\t\t\t\tproperty === 'count' ? sortByCount : sortByTranslators\n\t\t\t);\n\n\t\tfor ( i = 0; i < model.length; i++ ) {\n\t\t\t$row = $( '<div>' ).addClass( 'cx-stats-chart__row' );\n\n\t\t\t$translations = $( '<span>' ).addClass( 'cx-stats-chart__bars' );\n\t\t\ttranslations = model[ i ].translations.sort(\n\t\t\t\tproperty === 'count' ? sortByCount : sortByTranslators\n\t\t\t);\n\n\t\t\ttail = false;\n\t\t\ttailWidth = 0;\n\t\t\tmax = max || model[ 0 ][ property ];\n\n\t\t\tif (\n\t\t\t\tmax / ( Math.ceil( model[ i ][ property ] / 100 ) * 100 ) >= 10 &&\n\t\t\t\tmax >= 1000\n\t\t\t) {\n\t\t\t\tmax = Math.ceil( model[ i ][ property ] / 100 ) * 100;\n\t\t\t\t$rows.push( $( '<div>' )\n\t\t\t\t\t.addClass( 'cx-stats-chart__row cx-separator' )\n\t\t\t\t\t.text( mw.msg( 'cx-stats-grouping-title', fmt( max ) ) ) );\n\t\t\t}\n\n\t\t\t$callout = $( '<table>' ).addClass( 'cx-stats-chart__callout' );\n\t\t\tfor ( j = 0; j < translations.length; j++ ) {\n\t\t\t\twidth = ( translations[ j ][ property ] / max ) * 100;\n\t\t\t\tlangCode = translations[ j ][ ( direction === 'to' ? 'sourceLanguage' : 'targetLanguage' ) ];\n\n\t\t\t\tif ( width > 2 || j === 0 ) {\n\t\t\t\t\t// languages with more than 2% are represented in chart.\n\t\t\t\t\t$bar = $( '<span>' )\n\t\t\t\t\t\t.addClass( 'cx-stats-chart__bar' )\n\t\t\t\t\t\t.prop( {\n\t\t\t\t\t\t\tlang: 'en',\n\t\t\t\t\t\t\tdir: 'ltr'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.css( 'width', width + '%' )\n\t\t\t\t\t\t.text( langCode );\n\n\t\t\t\t\t$translations.append( $bar );\n\t\t\t\t} else {\n\t\t\t\t\ttail = true;\n\t\t\t\t\ttailWidth += width;\n\t\t\t\t}\n\n\t\t\t\t$callout.append( $( '<tr>' ).append(\n\t\t\t\t\t$( '<td>' )\n\t\t\t\t\t\t.addClass( 'cx-stats-chart__callout-count' )\n\t\t\t\t\t\t.text( fmt( translations[ j ][ property ] ) ),\n\t\t\t\t\t$( '<td>' )\n\t\t\t\t\t\t.addClass( 'cx-stats-chart__callout-lang' )\n\t\t\t\t\t\t.prop( {\n\t\t\t\t\t\t\tlang: langCode,\n\t\t\t\t\t\t\tdir: $.uls.data.getDir( langCode )\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.text( $.uls.data.getAutonym( langCode ) )\n\t\t\t\t) );\n\t\t\t}\n\n\t\t\tif ( tail ) {\n\t\t\t\t$tail = $( '<span>' )\n\t\t\t\t\t.addClass( 'cx-stats-chart__bar cx-stats-bar-tail' )\n\t\t\t\t\t.text( '…' )\n\t\t\t\t\t.css( 'width', tailWidth + '%' );\n\t\t\t\t$translations.append( $tail );\n\t\t\t}\n\n\t\t\t$translations.find( '.cx-stats-chart__bar' ).last().callout( {\n\t\t\t\ttrigger: 'hover',\n\t\t\t\tclasses: 'cx-stats-chart__callout-container',\n\t\t\t\tdirection: $.fn.callout.autoDirection( '0' ),\n\t\t\t\tcontent: $callout\n\t\t\t} );\n\n\t\t\t$langCode = $( '<span>' )\n\t\t\t\t.addClass( 'cx-stats-chart__langcode' )\n\t\t\t\t// Always Latin (like English).\n\t\t\t\t// Make sure it's aligned correctly on all screen sizes.\n\t\t\t\t.prop( {\n\t\t\t\t\tlang: 'en',\n\t\t\t\t\tdir: 'ltr'\n\t\t\t\t} )\n\t\t\t\t.text( model[ i ].language );\n\n\t\t\t$autonym = $( '<span>' )\n\t\t\t\t.addClass( 'cx-stats-chart__autonym' )\n\t\t\t\t.prop( {\n\t\t\t\t\tlang: model[ i ].language,\n\t\t\t\t\tdir: $.uls.data.getDir( model[ i ].language )\n\t\t\t\t} )\n\t\t\t\t.text( $.uls.data.getAutonym( model[ i ].language ) );\n\n\t\t\t$total = $( '<span>' )\n\t\t\t\t.addClass( 'cx-stats-chart__total' )\n\t\t\t\t.text( fmt( model[ i ][ property ] ) );\n\n\t\t\tif ( direction === 'to' ) {\n\t\t\t\t$total = $( '<a>' )\n\t\t\t\t\t.addClass( 'cx-stats-chart__total' )\n\t\t\t\t\t.prop( 'href', mw.cx.siteMapper.getPageUrl(\n\t\t\t\t\t\tmodel[ i ].language, 'Special:NewPages', {\n\t\t\t\t\t\t\ttagfilter: 'contenttranslation'\n\t\t\t\t\t\t}\n\t\t\t\t\t) )\n\t\t\t\t\t.text( fmt( model[ i ][ property ] ) );\n\t\t\t} else {\n\t\t\t\t$total = $( '<span>' )\n\t\t\t\t\t.addClass( 'cx-stats-chart__total' )\n\t\t\t\t\t.text( fmt( model[ i ][ property ] ) );\n\t\t\t}\n\n\t\t\t$rowLabelContainer = $( '<span>' )\n\t\t\t\t.addClass( 'cx-stats-chart__row-label-container' )\n\t\t\t\t.append( $langCode, $autonym, $total );\n\n\t\t\t$row.append( $rowLabelContainer, $translations );\n\n\t\t\t$rows.push( $row );\n\t\t}\n\n\t\t$chart.append( $rows );\n\n\t\treturn $chart;\n\t};\n\n\t/**\n\t * Get the Content Translation stats.\n\t *\n\t * @return {jQuery.Promise}\n\t */\n\tCXStats.prototype.getCXStats = function () {\n\t\tvar api = new mw.Api();\n\n\t\treturn api.get( {\n\t\t\taction: 'query',\n\t\t\tlist: 'contenttranslationstats'\n\t\t} );\n\t};\n\n\t/**\n\t * Get the Content Translation trend for the given target language.\n\t * Fetch the number of translations to the given language.\n\t *\n\t * @param {string} targetLanguage Target language code\n\t * @return {jQuery.Promise}\n\t */\n\tCXStats.prototype.getCXTrends = function ( targetLanguage ) {\n\t\treturn ( new mw.Api() ).get( {\n\t\t\taction: 'query',\n\t\t\tlist: 'contenttranslationlangtrend',\n\t\t\ttarget: targetLanguage\n\t\t} ).then( function ( response ) {\n\t\t\treturn response.query.contenttranslationlangtrend;\n\t\t} );\n\t};\n\n\tCXStats.prototype.drawCumulativeGraph = function ( type ) {\n\t\tvar data, ctx;\n\n\t\tctx = this.$cumulativeGraph[ 0 ].getContext( '2d' );\n\n\t\tdata = {\n\t\t\tlabels: this.totalTranslationTrend.map( function ( data ) {\n\t\t\t\treturn data.date;\n\t\t\t} ),\n\t\t\tdatasets: [\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-stats-published-translations-label' ),\n\t\t\t\t\tfill: false,\n\t\t\t\t\tborderColor: '#36c',\n\t\t\t\t\tpointBorderColor: '#36c',\n\t\t\t\t\tpointBackgroundColor: '#36c',\n\t\t\t\t\tpointHoverBackgroundColor: '#FFFFFF',\n\t\t\t\t\tpointHoverBorderColor: '#36c',\n\t\t\t\t\tdata: this.totalTranslationTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-stats-draft-translations-label' ),\n\t\t\t\t\tfill: false,\n\t\t\t\t\tborderColor: '#72777d',\n\t\t\t\t\tpointBorderColor: '#72777d',\n\t\t\t\t\tpointBackgroundColor: '#72777d',\n\t\t\t\t\tpointHoverBackgroundColor: '#FFFFFF',\n\t\t\t\t\tpointHoverBorderColor: '#72777d',\n\t\t\t\t\tdata: this.totalDraftTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\n\t\t// eslint-disable-next-line no-new\n\t\tnew Chart( ctx, {\n\t\t\ttype: 'line',\n\t\t\tdata: data,\n\t\t\toptions: this.chartOptions\n\t\t} );\n\t};\n\n\tCXStats.prototype.drawLanguageCumulativeGraph = function ( type ) {\n\t\tvar data, ctx;\n\n\t\tctx = this.$languageCumulativeGraph[ 0 ].getContext( '2d' );\n\n\t\tdata = {\n\t\t\tlabels: this.languageTranslationTrend.map( function ( data ) {\n\t\t\t\treturn data.date;\n\t\t\t} ),\n\t\t\tdatasets: [\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-stats-published-translations-label' ),\n\t\t\t\t\tfill: false,\n\t\t\t\t\tborderColor: '#36c',\n\t\t\t\t\tpointBorderColor: '#36c',\n\t\t\t\t\tpointBackgroundColor: '#36c',\n\t\t\t\t\tpointHoverBackgroundColor: '#FFFFFF',\n\t\t\t\t\tpointHoverBorderColor: '#36c',\n\t\t\t\t\tdata: this.languageTranslationTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-stats-draft-translations-label' ),\n\t\t\t\t\tfill: false,\n\t\t\t\t\tborderColor: '#72777d',\n\t\t\t\t\tpointBorderColor: '#72777d',\n\t\t\t\t\tpointBackgroundColor: '#72777d',\n\t\t\t\t\tpointHoverBackgroundColor: '#FFFFFF',\n\t\t\t\t\tpointHoverBorderColor: '#72777d',\n\t\t\t\t\tdata: this.languageDraftTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-trend-deletions' ),\n\t\t\t\t\tfill: false,\n\t\t\t\t\tborderColor: '#FF0000',\n\t\t\t\t\tpointBorderColor: '#FF0000',\n\t\t\t\t\tpointBackgroundColor: '#FF0000',\n\t\t\t\t\tpointHoverBackgroundColor: '#FFFFFF',\n\t\t\t\t\tpointHoverBorderColor: '#FF0000',\n\t\t\t\t\tdata: this.languageDeletionTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\n\t\t// eslint-disable-next-line no-new\n\t\tnew Chart( ctx, {\n\t\t\ttype: 'line',\n\t\t\tdata: data,\n\t\t\toptions: this.chartOptions\n\t\t} );\n\t};\n\n\tCXStats.prototype.drawTranslationTrend = function () {\n\t\tvar data, ctx, type = 'delta';\n\n\t\tctx = this.$translationTrendBarChart[ 0 ].getContext( '2d' );\n\t\tdata = {\n\t\t\tlabels: this.totalTranslationTrend.map( function ( data ) {\n\t\t\t\treturn data.date;\n\t\t\t} ),\n\t\t\tdatasets: [\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-stats-published-translations-label' ),\n\t\t\t\t\tborderColor: '#36c',\n\t\t\t\t\tbackgroundColor: '#36c',\n\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\tdata: this.totalTranslationTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-stats-new-draft-translations-label' ),\n\t\t\t\t\tborderColor: '#72777d',\n\t\t\t\t\tbackgroundColor: '#72777d',\n\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\tdata: this.totalDraftTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\n\t\t// eslint-disable-next-line no-new\n\t\tnew Chart( ctx, {\n\t\t\ttype: 'bar',\n\t\t\tdata: data,\n\t\t\toptions: this.chartOptions\n\t\t} );\n\t};\n\n\tCXStats.prototype.drawLangTranslationTrend = function () {\n\t\tvar ctx, data,\n\t\t\ttype = 'delta';\n\n\t\tctx = this.$langTranslationTrendBarChart[ 0 ].getContext( '2d' );\n\t\tdata = {\n\t\t\tlabels: this.languageTranslationTrend.map( function ( data ) {\n\t\t\t\treturn data.date;\n\t\t\t} ),\n\t\t\tdatasets: [\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-stats-published-translations-label' ),\n\t\t\t\t\tborderColor: '#36c',\n\t\t\t\t\tbackgroundColor: '#36c',\n\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\tdata: this.languageTranslationTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-stats-new-draft-translations-label' ),\n\t\t\t\t\tborderColor: '#72777d',\n\t\t\t\t\tbackgroundColor: '#72777d',\n\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\tdata: this.languageDraftTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: mw.msg( 'cx-trend-deletions' ),\n\t\t\t\t\tborderColor: '#FF0000',\n\t\t\t\t\tbackgroundColor: '#FF0000',\n\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\tdata: this.languageDeletionTrend.map( function ( data ) {\n\t\t\t\t\t\treturn data[ type ];\n\t\t\t\t\t} )\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\n\t\t// eslint-disable-next-line no-new\n\t\tnew Chart( ctx, {\n\t\t\ttype: 'bar',\n\t\t\tdata: data,\n\t\t\toptions: this.chartOptions\n\t\t} );\n\t};\n\n\tCXStats.prototype.transformJsonToModel = function ( records ) {\n\t\tvar i, record, language, status, count, translators,\n\t\t\tsourceLanguage, targetLanguage,\n\t\t\ttempModel,\n\t\t\thasOwn = Object.prototype.hasOwnProperty;\n\n\t\tthis.sourceTargetModel.draft = {};\n\t\tthis.targetSourceModel.draft = {};\n\t\tthis.sourceTargetModel.published = {};\n\t\tthis.targetSourceModel.published = {};\n\n\t\tfor ( i = 0; i < records.pages.length; i++ ) {\n\t\t\trecord = records.pages[ i ];\n\t\t\tstatus = record.status;\n\t\t\tsourceLanguage = record.sourceLanguage;\n\t\t\ttargetLanguage = record.targetLanguage;\n\t\t\tthis.sourceTargetModel[ status ][ sourceLanguage ] = this.sourceTargetModel[ status ][ sourceLanguage ] || [];\n\t\t\tthis.targetSourceModel[ status ][ targetLanguage ] = this.targetSourceModel[ status ][ targetLanguage ] || [];\n\t\t\tthis.sourceTargetModel[ status ][ sourceLanguage ].push( record );\n\t\t\tthis.targetSourceModel[ status ][ targetLanguage ].push( record );\n\t\t}\n\n\t\tfor ( status in this.sourceTargetModel ) {\n\t\t\ttempModel = this.sourceTargetModel[ status ];\n\t\t\tthis.sourceTargetModel[ status ] = [];\n\t\t\tfor ( language in tempModel ) {\n\t\t\t\tif ( hasOwn.call( tempModel, language ) ) {\n\t\t\t\t\tfor ( count = 0, translators = 0, i = 0; i < tempModel[ language ].length; i++ ) {\n\t\t\t\t\t\tcount += +tempModel[ language ][ i ].count;\n\t\t\t\t\t\ttranslators += +tempModel[ language ][ i ].translators;\n\t\t\t\t\t}\n\t\t\t\t\tthis.sourceTargetModel[ status ].push( {\n\t\t\t\t\t\tlanguage: language,\n\t\t\t\t\t\ttranslations: tempModel[ language ],\n\t\t\t\t\t\tcount: count,\n\t\t\t\t\t\ttranslators: translators\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttempModel = this.targetSourceModel[ status ];\n\t\t\tthis.targetSourceModel[ status ] = [];\n\t\t\tfor ( language in tempModel ) {\n\t\t\t\tif ( hasOwn.call( tempModel, language ) ) {\n\t\t\t\t\tfor ( count = 0, translators = 0, i = 0; i < tempModel[ language ].length; i++ ) {\n\t\t\t\t\t\tcount += +tempModel[ language ][ i ].count;\n\t\t\t\t\t\ttranslators += +tempModel[ language ][ i ].translators;\n\t\t\t\t\t}\n\t\t\t\t\tthis.targetSourceModel[ status ].push( {\n\t\t\t\t\t\tlanguage: language,\n\t\t\t\t\t\ttranslations: tempModel[ language ],\n\t\t\t\t\t\tcount: count,\n\t\t\t\t\t\ttranslators: translators\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t$( function () {\n\t\tvar cxLink, cxstats, $container;\n\n\t\t$container = $( '<div>' ).addClass( 'cx-stats-container' );\n\n\t\t// Set the global siteMapper for code which we cannot inject it\n\t\tmw.cx.siteMapper = new mw.cx.SiteMapper();\n\t\t$( '.mw-body-content' ).append(\n\t\t\t$( '<div>' ).addClass( 'cx-widget' ).append(\n\t\t\t\t$container\n\t\t\t)\n\t\t);\n\n\t\tcxstats = new CXStats( $container, {\n\t\t\tsiteMapper: new mw.cx.SiteMapper()\n\t\t} );\n\t\tcxstats.init();\n\n\t\tif ( !mw.user.isAnon() &&\n\t\t\tmw.config.get( 'wgContentTranslationCampaigns' ).cxstats &&\n\t\t\tmw.user.options.get( 'cx' ) !== '1'\n\t\t) {\n\t\t\tcxLink = mw.util.getUrl( 'Special:ContentTranslation', {\n\t\t\t\tcampaign: 'cxstats',\n\t\t\t\tto: mw.config.get( 'wgContentLanguage' )\n\t\t\t} );\n\n\t\t\tmw.hook( 'mw.cx.error' ).fire( mw.message( 'cx-stats-try-contenttranslation', cxLink ) );\n\t\t}\n\t} );\n}() );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tools/ext.cx.tools.validator.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tools/mw.cx.tools.InstructionsTool.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tools/mw.cx.tools.IssueTrackingTool.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":126,"column":15,"nodeType":"CallExpression","endLine":126,"endColumn":72,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tools/mw.cx.tools.TranslationTool.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tools/mw.cx.tools.TranslationToolFactory.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/translation/ext.cx.translation.conflict.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.ArticleColumn.js","messages":[{"ruleId":"jsdoc/check-param-names","severity":1,"message":"Duplicate @param \"config.sectionTitle\"","line":17,"column":1,"nodeType":"Block","endLine":17,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/**\n * Article column container\n *\n * @copyright See AUTHORS.txt\n * @license GPL-2.0-or-later\n *\n * @class\n * @abstract\n *\n * @param {Object} [config] Configuration\n * @param {string} config.title The title of the article for the column\n * @param {string|null} config.sectionTitle The title of the section for the column\n * @param {string} config.language The language of the article for the column\n * @param {mw.cx.SiteMapper} config.siteMapper SiteMapper instance\n * @param {string} [config.sectionTitle] The section title of the article for the column\n */\nmw.cx.ui.ArticleColumn = function ( config ) {\n\tvar languageLabel;\n\n\t// Configuration initialization\n\tconfig = $.extend( {}, config, {\n\t\tcontinuous: true,\n\t\tclasses: [ 'cx-column' ],\n\t\texpanded: false,\n\t\tscrollable: false\n\t} );\n\t// Parent constructor\n\tmw.cx.ui.ArticleColumn.super.call( this, config );\n\n\tthis.translation = null;\n\tthis.siteMapper = config.siteMapper;\n\tthis.language = config.language;\n\t// if this is a section translation\n\tif ( config.sectionTitle ) {\n\t\tthis.addItems( [\n\t\t\tnew OO.ui.LabelWidget( {\n\t\t\t\tlabel: config.title,\n\t\t\t\tdir: this.direction,\n\t\t\t\tclasses: [ 'cx-column-page-title' ]\n\t\t\t} )\n\t\t] );\n\t\tthis.titleWidget = new mw.cx.ui.SectionTitleWidget(\n\t\t\tnew mw.cx.dm.SectionTitleModel(),\n\t\t\t{ value: config.sectionTitle }\n\t\t);\n\t} else {\n\t\tthis.titleWidget = new mw.cx.ui.PageTitleWidget(\n\t\t\tnew mw.cx.dm.PageTitleModel(),\n\t\t\t{ value: config.title }\n\t\t);\n\t}\n\tthis.direction = $.uls.data.getDir( config.language );\n\n\tlanguageLabel = new OO.ui.LabelWidget( {\n\t\tlabel: $.uls.data.getAutonym( config.language ),\n\t\tdir: this.direction,\n\t\tclasses: [ 'cx-column-language-label' ]\n\t} );\n\n\tthis.subHeading = new OO.ui.HorizontalLayout( {\n\t\tclasses: [ 'cx-column-sub-heading' ],\n\t\titems: [ languageLabel ]\n\t} );\n\n\tthis.$element.prop( {\n\t\tlang: this.language,\n\t\tdir: this.direction\n\t} );\n\n\tthis.addItems( [ this.titleWidget, this.subHeading ] );\n\n\tthis.$content = $( '<div>' ).addClass( 'cx-column__content' );\n\tthis.$element.append( this.$content );\n};\n\n/* Setup */\n\nOO.inheritClass( mw.cx.ui.ArticleColumn, OO.ui.StackLayout );\n\n/**\n * Attach the source surface's element to the DOM\n *\n * @param {ve.ui.CXSourceSurface} surface The source surface\n */\nmw.cx.ui.ArticleColumn.prototype.attachSurface = function ( surface ) {\n\tthis.$content.empty().append( surface.$element );\n};\n\n/**\n * Set the category count UI element\n *\n * @param {jQuery} $categoryCount\n */\nmw.cx.ui.ArticleColumn.prototype.setCategoryCount = function ( $categoryCount ) {\n\tthis.$content.before( $categoryCount );\n};\n\n/**\n * Set the category list UI element\n *\n * @param {jQuery} $categoryListing\n */\nmw.cx.ui.ArticleColumn.prototype.setCategoryListing = function ( $categoryListing ) {\n\tthis.$content.after( $categoryListing );\n};\n\n/**\n * Set the translation data model\n *\n * @param {mw.cx.dm.Translation} translation\n */\nmw.cx.ui.ArticleColumn.prototype.setTranslation = function ( translation ) {\n\tthis.translation = translation;\n};\n\n/**\n * Set the main title for the column.\n *\n * @param {string} title\n */\nmw.cx.ui.ArticleColumn.prototype.setTitle = function ( title ) {\n\tthis.titleWidget.setValue( title );\n\tthis.titleWidget.validateTitle( title );\n};\n\n/**\n * Get the current main title for the column.\n *\n * @return {string}\n */\nmw.cx.ui.ArticleColumn.prototype.getTitle = function () {\n\treturn this.titleWidget.getValue();\n};\n\n/**\n * @return {mw.cx.ui.PageTitleWidget}\n */\nmw.cx.ui.ArticleColumn.prototype.getTitleWidget = function () {\n\treturn this.titleWidget;\n};\n\nmw.cx.ui.ArticleColumn.prototype.isSectionTranslation = function () {\n\treturn this.titleWidget instanceof mw.cx.ui.SectionTitleWidget;\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.CaptchaDialog.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":139,"column":22,"nodeType":"CallExpression","endLine":139,"endColumn":43,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.Categories.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.Infobar.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.LanguageFilter.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.LoginDialog.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.SourceColumn.js","messages":[{"ruleId":"jsdoc/check-param-names","severity":1,"message":"@param path declaration (\"config.siteMapper\") appears before any real parameter.","line":6,"column":1,"nodeType":"Block","endLine":6,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Source article container\n *\n * @class\n * @extends mw.cx.ui.ArticleColumn\n * @param {mw.cx.SiteMapper} config.siteMapper\n * @param {string} config.language\n * @param {string} config.title\n * @param {string|null} config.sectionTitle\n * @param {Object} [config] Configuration object\n */\nmw.cx.ui.SourceColumn = function ( config ) {\n\tvar articleLink;\n\n\t// Parent constructor\n\tmw.cx.ui.SourceColumn.super.apply( this, arguments );\n\n\tthis.$element.addClass( 'cx-column--source' );\n\n\tthis.loading = true;\n\tthis.$loadingIndicator = null;\n\n\t// Try to load Parsoid Cite styles. Silently ignored if not installed.\n\tif ( mw.loader.getState( 'ext.cite.parsoid.styles' ) !== null ) {\n\t\tmw.loader.load( 'ext.cite.parsoid.styles' );\n\t}\n\tmw.hook( 'mw.cx.error' ).add( this.removeLoadingIndicator.bind( this ) );\n\n\tthis.titleWidget\n\t\t.setReadOnly( true )\n\t\t.setValidation( null );\n\n\tvar linkHref = this.siteMapper.getPageUrl(\n\t\tthis.language,\n\t\tconfig.title,\n\t\tnull,\n\t\tconfig.sectionTitle && mw.util.escapeIdForLink( config.sectionTitle )\n\t);\n\tarticleLink = new OO.ui.ButtonWidget( {\n\t\tlabel: mw.msg( 'cx-source-view-page' ),\n\t\thref: linkHref,\n\t\ttarget: '_blank',\n\t\tclasses: [ 'cx-column-sub-heading-view-page' ],\n\t\tframed: false,\n\t\tflags: [ 'progressive' ]\n\t} );\n\n\tthis.subHeading.addItems( [ articleLink ] );\n\n\tthis.showLoadingIndicator();\n};\n\n/* Setup */\n\nOO.inheritClass( mw.cx.ui.SourceColumn, mw.cx.ui.ArticleColumn );\n\n/**\n * @param {jQuery} $translationUnit\n * @param {number} position\n */\nmw.cx.ui.SourceColumn.prototype.add = function ( $translationUnit, position ) {\n\tthis.insertAt( position, $translationUnit );\n};\n\nmw.cx.ui.SourceColumn.prototype.insertAt = function ( index, $element ) {\n\tvar lastIndex = this.$content.children().length;\n\n\tif ( index < 0 ) {\n\t\tindex = Math.max( 0, lastIndex + 1 + index );\n\t}\n\tthis.$content.append( $element );\n\tif ( index < lastIndex ) {\n\t\tthis.$content.children().eq( index ).before( this.$content.children().last() );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.SourceColumn.prototype.setTranslation = function () {\n\t// Parent method\n\tmw.cx.ui.TargetColumn.super.prototype.setTranslation.apply( this, arguments );\n\n\tthis.removeLoadingIndicator();\n};\n\nmw.cx.ui.SourceColumn.prototype.showLoadingIndicator = function () {\n\tvar $title, userLanguage, $loadingIndicatorContent,\n\t\t$loadingIndicatorSpinner;\n\n\tthis.$loadingIndicator = $( '<div>' )\n\t\t.addClass( 'cx-column__loading-indicator' );\n\n\t$title = $( '<span>' )\n\t\t.prop( {\n\t\t\tlang: this.language,\n\t\t\tdir: this.direction\n\t\t} )\n\t\t.text( this.getTitle() );\n\n\tuserLanguage = mw.config.get( 'wgUserLanguage' );\n\t$loadingIndicatorContent = $( '<div>' )\n\t\t.prop( {\n\t\t\tlang: userLanguage,\n\t\t\tdir: $.uls.data.getDir( userLanguage )\n\t\t} )\n\t\t.addClass( 'cx-column__loading-indicator--text' )\n\t\t.append( mw.message( 'cx-source-loading', $title ).parseDom() );\n\n\t$loadingIndicatorSpinner = mw.cx.widgets.spinner();\n\tthis.$loadingIndicator.append( $loadingIndicatorSpinner, $loadingIndicatorContent );\n\tthis.$element.append( this.$loadingIndicator );\n};\n\nmw.cx.ui.SourceColumn.prototype.removeLoadingIndicator = function () {\n\tthis.loading = false;\n\tthis.$loadingIndicator.remove();\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.TargetColumn.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.ToolsColumn.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.TranslationHeader.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":18,"column":74,"nodeType":"ObjectExpression","endLine":23,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.TranslationView.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/mw.cx.ui.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.CategoryInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.CategoryMultiselectWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.CategoryTagItemWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'mouseenter' is undefined.","line":65,"column":1,"nodeType":"Block","endLine":65,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'mouseleave' is undefined.","line":74,"column":1,"nodeType":"Block","endLine":74,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n* Content Translation UserInterface CategoryTagItemWidget class.\n*\n* @copyright See AUTHORS.txt\n* @license GPL-2.0-or-later\n*/\n\n'use strict';\n\n/**\n * Creates a mw.cx.ui.CategoryTagItemWidget object.\n *\n * @class\n * @extends OO.ui.TagItemWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nmw.cx.ui.CategoryTagItemWidget = function CategoryTagItemWidget( config ) {\n\t// Parent constructor\n\tmw.cx.ui.CategoryTagItemWidget.super.call( this, config );\n\n\tthis.originalDisabledState = config.disabled === true;\n\n\tthis.$element.addClass( 'mw-cx-ui-CategoryTagItemWidget' );\n\tif ( config.hideRemoveButton ) {\n\t\tthis.closeButton.$element.remove();\n\t\tthis.$element.addClass( 'mw-cx-ui-CategoryTagItemWidget--no-remove' );\n\t}\n\n\t// Events\n\tthis.$element.on( 'mouseenter', this.onMouseEnter.bind( this ) );\n\tthis.$element.on( 'mouseleave', this.onMouseLeave.bind( this ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( mw.cx.ui.CategoryTagItemWidget, OO.ui.TagItemWidget );\n\n/* Methods */\n\n/**\n * Disabling individual tag items is no longer supported in OOUI since T193571.\n * This setDisabled() method is mirror of OOUI v0.26.5, before disabling of\n * individual tag items was thrown out.\n *\n * @inheritdoc\n */\nmw.cx.ui.CategoryTagItemWidget.prototype.setDisabled = function ( state ) {\n\t// Grandparent method\n\tOO.ui.Widget.prototype.setDisabled.call( this, state );\n\n\tif ( this.closeButton ) {\n\t\tthis.closeButton.setDisabled( state );\n\t}\n\n\treturn this;\n};\n\nmw.cx.ui.CategoryTagItemWidget.prototype.restoreOriginalDisabledState = function () {\n\tthis.setDisabled( this.originalDisabledState );\n};\n\n/**\n * @fires mouseenter\n */\nmw.cx.ui.CategoryTagItemWidget.prototype.onMouseEnter = function () {\n\tif ( !this.isDisabled() ) {\n\t\tthis.emit( 'mouseenter' );\n\t}\n};\n\n/**\n * @fires mouseleave\n */\nmw.cx.ui.CategoryTagItemWidget.prototype.onMouseLeave = function () {\n\tif ( !this.isDisabled() ) {\n\t\tthis.emit( 'mouseleave' );\n\t}\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.FeatureDiscoveryWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.MessageWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.PageSelectorWidget.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'pages' is already declared in the upper scope on line 184 column 71.","line":219,"column":31,"nodeType":"Identifier","messageId":"noShadow","endLine":219,"endColumn":36}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * Content Translation UserInterface PageSelectorWidget class.\n *\n * @copyright See AUTHORS.txt\n * @license GPL-2.0-or-later\n */\n\n'use strict';\n\n/**\n * Creates an mw.cx.ui.PageSelectorWidget object.\n *\n * @class\n * @extends mw.widgets.TitleInputWidget\n *\n * @constructor\n * @param {Object} config Configuration options\n * @cfg {mw.cx.SiteMapper} siteMapper Site mapper\n * @cfg {string} [language] Source language\n */\nmw.cx.ui.PageSelectorWidget = function PageSelectorWidget( config ) {\n\tconfig = $.extend( {}, {\n\t\tnamespace: mw.config.get( 'wgNamespaceIds' )[ '' ], // Main namespace\n\t\tlimit: 5,\n\t\tshowDescriptions: true,\n\t\tshowImages: true,\n\t\tshowMissing: false,\n\t\taddQueryInput: false,\n\t\texcludeDynamicNamespaces: true,\n\t\ticon: 'search'\n\t}, config );\n\n\t// Parent constructor\n\tmw.cx.ui.PageSelectorWidget.super.call( this, config );\n\n\tthis.siteMapper = config.siteMapper;\n\tthis.language = config.language || 'en';\n\tthis.excludedNamespaces = [];\n\tif ( config.targetLanguage ) {\n\t\tthis.setTargetLanguage( config.targetLanguage );\n\t}\n\tthis.lookupChooseFirstItem = false;\n\tthis.listen();\n\n\t// Initialization\n\tthis.$element.addClass( 'mw-cx-ui-PageSelectorWidget' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( mw.cx.ui.PageSelectorWidget, mw.widgets.TitleInputWidget );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.PageSelectorWidget.prototype.initializeLookupMenuSelection = function () {\n\tvar matchingItem;\n\n\tmw.cx.ui.PageSelectorWidget.super.prototype.initializeLookupMenuSelection.apply( this, arguments );\n\n\tif ( !this.lookupChooseFirstItem ) {\n\t\treturn this;\n\t}\n\n\tmatchingItem = this.lookupMenu.findItemFromData( this.getValue() );\n\tif ( matchingItem ) {\n\t\tthis.lookupMenu.chooseItem( matchingItem );\n\t\tthis.lookupChooseFirstItem = false; // Reset to the default value\n\t}\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.PageSelectorWidget.prototype.getApi = function () {\n\treturn this.siteMapper.getApi( this.language );\n};\n\nmw.cx.ui.PageSelectorWidget.prototype.setLanguage = function ( language ) {\n\tthis.language = language;\n\tthis.setDir( $.uls.data.getDir( language ) );\n\n\t// Reset the requestCache of OO.ui.mixin.LookupElement\n\tthis.requestCache = {};\n\tthis.closeLookupMenu();\n\n\t// Reset the \"no-results\" and \"has-suggestions\" classes\n\tthis.$overlay.removeClass( 'mw-cx-ui-PageSelectorWidget--no-results' );\n\tthis.$overlay.removeClass( 'mw-cx-ui-PageSelectorWidget--has-suggestions' );\n\n\tthis.populateSuggestions();\n};\n\nmw.cx.ui.PageSelectorWidget.prototype.setTargetLanguage = function ( language ) {\n\tthis.targetLanguage = language;\n};\n\nmw.cx.ui.PageSelectorWidget.prototype.onChangeHandler = function () {\n\tthis.$overlay.removeClass( 'mw-cx-ui-PageSelectorWidget--no-results' );\n\tthis.$overlay.removeClass( 'mw-cx-ui-PageSelectorWidget--has-suggestions' );\n\n\tthis.$overlay.toggleClass(\n\t\t'mw-cx-ui-PageSelectorWidget--input', !!this.getQueryValue()\n\t);\n};\n\n/**\n * Sets value for PageSelectorWidget and input element value,\n * without emitting 'change' event, therefore not triggering network call\n *\n * @param {string} value String input for PageSelectorWidget\n */\nmw.cx.ui.PageSelectorWidget.prototype.setValueNoEmit = function ( value ) {\n\tvalue = this.cleanUpValue( value );\n\n\tif ( this.$input.val() !== value ) {\n\t\tthis.$input.val( value );\n\t}\n\n\tif ( this.value !== value ) {\n\t\tthis.value = value;\n\t}\n};\n\nmw.cx.ui.PageSelectorWidget.prototype.listen = function () {\n\t// Unbind event handlers so search results don't disappear when focus is lost\n\tthis.$input.off( 'blur' );\n\tthis.lookupMenu.onDocumentMouseDownHandler = function () {};\n\t// Disable width and height calculation for search results container\n\tthis.lookupMenu.setIdealSize = function () {};\n\n\tthis.connect( this, { change: 'onChangeHandler' } );\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.PageSelectorWidget.prototype.getOptionWidgetData = function ( title, data ) {\n\t// Parent method\n\tvar optionWidgetData = mw.cx.ui.PageSelectorWidget.super.prototype.getOptionWidgetData.apply( this, arguments );\n\n\t// Correct the URL so that it can point to the source language wiki.\n\toptionWidgetData.url = this.siteMapper.getPageUrl( this.language, title );\n\t// If item is not missing, one language is added to get actual total number of languages\n\toptionWidgetData.numOfLanguages = !data.missing && ( OO.getProp( data.originalData, 'langlinkscount' ) || 0 ) + 1;\n\toptionWidgetData.missingInTargetLanguage = !OO.getProp( data.originalData, 'langlinks' );\n\toptionWidgetData.targetLanguage = this.targetLanguage;\n\toptionWidgetData.sourceLanguage = this.language;\n\n\treturn optionWidgetData;\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.PageSelectorWidget.prototype.getApiParams = function () {\n\t// Parent method\n\tvar params = mw.cx.ui.PageSelectorWidget.super.prototype.getApiParams.apply( this, arguments );\n\n\tparams.prop.push( 'langlinks', 'langlinkscount' );\n\tparams.lllang = this.siteMapper.getWikiDomainCode( this.targetLanguage );\n\treturn params;\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.PageSelectorWidget.prototype.createOptionWidget = function ( data ) {\n\treturn new mw.cx.ui.TitleOptionWidget( data );\n};\n\n/**\n * Get option widgets and labels from the server response.\n * This method creates option widgets from suggested pages (when there is no user input) or\n * from search results (when there is user input).\n *\n * @param {Object} pages Query result\n * @return {Array} Array of OO.ui.OptionWidget menu items and mw.cx.ui.MenuLabelWidget labels\n */\nmw.cx.ui.PageSelectorWidget.prototype.getOptionsFromData = function ( pages ) {\n\tvar index, suggestionPage, page, optionsData, hasResults,\n\t\tnearbyPages = pages.nearby,\n\t\trecentEditPages = pages.recentEdits,\n\t\tpageData = {},\n\t\titems = [],\n\t\tquery = this.getQueryValue(),\n\t\tself = this;\n\n\t// If there is user input, we execute parent method, process possible no results case and return early\n\tif ( query ) {\n\t\tif ( query.indexOf( ':' ) >= 0 ) {\n\t\t\t// If query is from a non-default namespace, accept results from those namespaces.\n\t\t\t// Remove namespace preference.\n\t\t\tthis.setNamespace( null );\n\t\t} else {\n\t\t\t// Reset to default namespace preference.\n\t\t\tthis.setNamespace( mw.config.get( 'wgNamespaceIds' )[ '' ] ); // Main namespace\n\t\t}\n\t\toptionsData = mw.cx.ui.PageSelectorWidget.super.prototype.getOptionsFromData.apply( this, arguments );\n\t\thasResults = optionsData.length > 0;\n\n\t\tif ( !hasResults ) {\n\t\t\tthis.emit( 'noResults' );\n\t\t}\n\t\tthis.$overlay.toggleClass( 'mw-cx-ui-PageSelectorWidget--no-results', !hasResults );\n\n\t\treturn optionsData;\n\t}\n\n\t// When there is no user input, we display two lists with suggestions: recently edited pages and nearby pages.\n\t// We need this specific override to keep the two lists separate, and prevent sorting by page index,\n\t// which happens in parent method. Even without the sorting in parent method, since data is passed\n\t// in objects, not arrays, the two separate lists could be mixed up, since ordering in JS objects\n\t// is not guaranteed.\n\tfunction processQueryResult( pages, label ) {\n\t\tif ( !pages ) {\n\t\t\treturn false;\n\t\t}\n\n\t\titems.push( new OO.ui.MenuSectionOptionWidget( {\n\t\t\tlabel: label\n\t\t} ) );\n\n\t\tfor ( index in pages ) {\n\t\t\tsuggestionPage = pages[ index ];\n\n\t\t\tpageData[ suggestionPage.title ] = {\n\t\t\t\tdisambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,\n\t\t\t\timageUrl: OO.getProp( suggestionPage, 'thumbnail', 'source' ),\n\t\t\t\tdescription: suggestionPage.description,\n\t\t\t\toriginalData: suggestionPage\n\t\t\t};\n\n\t\t\t// Throw away pages from wrong namespaces. This can happen when 'showRedirectTargets' is true\n\t\t\t// and we encounter a cross-namespace redirect.\n\t\t\tif ( self.namespace === null || self.namespace === suggestionPage.ns ) {\n\t\t\t\tpage = pageData[ suggestionPage.title ];\n\t\t\t\titems.push( self.createOptionWidget( self.getOptionWidgetData( suggestionPage.title, page ) ) );\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\thasResults = processQueryResult(\n\t\trecentEditPages,\n\t\tmw.msg( 'cx-page-selector-widget-recent-edits-label' )\n\t);\n\thasResults = processQueryResult(\n\t\tnearbyPages,\n\t\tmw.msg( 'cx-page-selector-widget-nearby-label' )\n\t) || hasResults;\n\n\tif ( !hasResults ) {\n\t\tthis.emit( 'noResults' );\n\t}\n\tthis.$overlay.toggleClass( 'mw-cx-ui-PageSelectorWidget--no-results', !hasResults );\n\n\tif ( this.cache ) {\n\t\tthis.cache.set( pageData );\n\t}\n\n\treturn items;\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.PageSelectorWidget.prototype.getLookupRequest = function () {\n\tif ( !this.isValidNamespace( this.getQueryValue() ) ) {\n\t\treturn $.Deferred().resolve( {} ).promise();\n\t}\n\n\treturn mw.cx.ui.PageSelectorWidget.super.prototype.getLookupRequest.apply( this, arguments );\n};\n\n/**\n * Populates suggestions to display when search input field is empty.\n */\nmw.cx.ui.PageSelectorWidget.prototype.populateSuggestions = function () {\n\tvar self = this;\n\n\tif ( !this.allowSuggestionsWhenEmpty ) {\n\t\treturn;\n\t}\n\n\tthis.pushPending();\n\t$.when(\n\t\tthis.getPageDetails(),\n\t\tthis.getNearbyPages()\n\t).done( function ( recentEdits, nearby ) {\n\t\tvar recentEditPages = OO.getProp( recentEdits, 'query', 'pages' ),\n\t\t\tnearbyPages = OO.getProp( nearby, 'query', 'pages' );\n\n\t\tself.requestCache[ '' ] = {\n\t\t\tnearby: nearbyPages,\n\t\t\trecentEdits: recentEditPages\n\t\t};\n\t} ).fail( function ( error ) {\n\t\tmw.log( 'Error getting page data. ' + error );\n\t} ).always( function () {\n\t\tself.populateLookupMenu();\n\t\tself.popPending();\n\t} );\n};\n\n/**\n * Get user geolocation coordinates using GeoIP or ULSGeo cookies.\n *\n * @return {string|null}\n */\nmw.cx.ui.PageSelectorWidget.prototype.getUserCoordinates = function () {\n\tvar geoIP = mw.cookie.get( 'GeoIP', '' ), // GeoIP format: 'FI:Helsinki:60.1756:24.9342:v4'\n\t\tgeoIPCoordsMatch = geoIP && geoIP.match( /\\d+\\.?\\d*:\\d+\\.?\\d*/g ),\n\t\tgeoIPCoords = geoIPCoordsMatch && geoIPCoordsMatch[ 0 ].replace( ':', '|' ),\n\t\tulsGeo = JSON.parse( mw.cookie.get( 'ULSGeo' ) ), // Outside Wikimedia, ULS stores geolocation info in 'ULSGeo' cookie\n\t\tulsGeoCoords = ulsGeo && ( ulsGeo.latitude + '|' + ulsGeo.longitude );\n\n\treturn geoIPCoords || ulsGeoCoords;\n};\n\n/**\n * Get the thumbnail image, description and langlinks count for pages geographically close to\n * user's physical location.\n *\n * @return {jQuery.Promise}\n */\nmw.cx.ui.PageSelectorWidget.prototype.getNearbyPages = function () {\n\tvar coords = this.getUserCoordinates();\n\n\tif ( !coords ) {\n\t\t// If we can't get user coordinates, use `$.when()` to create and return resolved promise.\n\t\t// We return resolved promise, because we don't want `$.when` in populateSuggestions() method\n\t\t// to fail if we don't have valid coordinates.\n\t\treturn $.when();\n\t}\n\n\treturn this.siteMapper.getApi( this.language ).get( {\n\t\taction: 'query',\n\t\tprop: [ 'pageimages', 'description', 'langlinks', 'langlinkscount' ],\n\t\tgenerator: 'geosearch',\n\t\tpiprop: 'thumbnail',\n\t\tpithumbsize: 120,\n\t\tlllang: this.targetLanguage,\n\t\tggscoord: coords,\n\t\tggsradius: 1000, // Search radius in meters\n\t\tggslimit: 3,\n\t\tggsnamespace: mw.config.get( 'wgNamespaceIds' )[ '' ] // Main namespace\n\t} ).then( function ( data ) {\n\t\treturn data;\n\t} );\n};\n\n/**\n * Get the thumbnail image, description and langlinks count for pages with the given titles.\n *\n * @return {jQuery.Promise}\n */\nmw.cx.ui.PageSelectorWidget.prototype.getPageDetails = function () {\n\tvar self = this;\n\n\treturn this.getRecentlyEditedArticleTitles().then( function ( titles ) {\n\t\treturn self.siteMapper.getApi( self.language ).get( {\n\t\t\taction: 'query',\n\t\t\ttitles: titles,\n\t\t\tprop: [ 'pageimages', 'description', 'langlinks', 'langlinkscount' ],\n\t\t\tpiprop: 'thumbnail',\n\t\t\tpilimit: 10,\n\t\t\tpithumbsize: 120,\n\t\t\tlllang: self.targetLanguage\n\t\t} ).then( function ( data ) {\n\t\t\treturn data;\n\t\t} );\n\t}, function ( error ) {\n\t\tmw.log( 'Error getting recent edit titles. ' + error );\n\t} );\n};\n\n/**\n * Gets recently edited articles by user (using usercontribs API)\n *\n * @return {jQuery.Promise}\n */\nmw.cx.ui.PageSelectorWidget.prototype.getRecentlyEditedArticleTitles = function () {\n\tvar params, userName = mw.config.get( 'wgUserName' ),\n\t\tapi = this.siteMapper.getApi( this.language );\n\n\tparams = {\n\t\taction: 'query',\n\t\tlist: [ 'usercontribs' ],\n\t\tucuser: userName,\n\t\tuclimit: 3,\n\t\tucnamespace: mw.config.get( 'wgNamespaceIds' )[ '' ], // Main namespace\n\t\tucprop: 'title'\n\t};\n\n\treturn api.get( params ).then( function ( data ) {\n\t\tvar articles = OO.getProp( data, 'query', 'usercontribs' );\n\n\t\tif ( !articles ) {\n\t\t\treturn $.Deferred().reject( 'No recent user contributions' ).promise();\n\t\t}\n\n\t\treturn articles.map( function ( article ) {\n\t\t\treturn article.title;\n\t\t} );\n\t}, function ( error ) {\n\t\tmw.log( 'Error getting recent edits for ' + userName + '. ' + error );\n\t} );\n};\n\nmw.cx.ui.PageSelectorWidget.prototype.setExcludedNamespaces = function ( excludedNamespaces ) {\n\tthis.excludedNamespaces = excludedNamespaces;\n};\n\n/**\n * Validate the current query against excluded namespaces,\n *\n * @param {string} query\n * @return {boolean} True if validation passes. False otherwise.\n */\nmw.cx.ui.PageSelectorWidget.prototype.isValidNamespace = function ( query ) {\n\treturn query.indexOf( ':' ) < 0 ||\n\t\tthis.excludedNamespaces.every( function ( namespace ) {\n\t\t\treturn query.split( ':' )[ 0 ].replace( '_', ' ' ).toLocaleLowerCase() !==\n\t\t\tnamespace.toLocaleLowerCase();\n\t\t} );\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.PageTitleWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'enter' is undefined.","line":157,"column":1,"nodeType":"Block","endLine":157,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/**\n * Page title widget. This is the header for source and translation columns.\n * It is editable (contenteditable) for translation and readonly for source page.\n *\n * @class\n * @extends OO.ui.MultilineTextInputWidget\n * @mixins ve.ce.CXLintableNode\n * @param {mw.cx.dm.PageTitleModel} model\n * @param {Object} [config] Configuration object\n */\nmw.cx.ui.PageTitleWidget = function ( model, config ) {\n\t// Configuration initialization\n\tconfig = $.extend( config, {\n\t\tclasses: [ 'cx-pagetitle' ],\n\t\ttype: 'text',\n\t\tautosize: true\n\t} );\n\n\tthis.model = model;\n\n\t// Parent constructor\n\tmw.cx.ui.PageTitleWidget.super.call( this, config );\n\n\t// Mixin constructor\n\tve.ce.CXLintableNode.call( this );\n\n\tthis.validTitle = null;\n\n\t// Events\n\t$( this.getElementWindow() ).on(\n\t\t'resize',\n\t\tOO.ui.throttle( this.onWindowResize.bind( this ), 300 )\n\t);\n\n\tthis.getFocusableElement().off( 'focus' ).on( 'focus', this.emit.bind( this, 'focus' ) );\n\t$( document )\n\t\t.off( 'blur', '.cx-pagetitle' )\n\t\t.on( 'blur', '.cx-pagetitle', this.emit.bind( this, 'blur' ) );\n\tthis.connect( this, {\n\t\tchange: OO.ui.debounce( this.validateTitle.bind( this ), 300 )\n\t} );\n};\n\n/* Setup */\n\nOO.inheritClass( mw.cx.ui.PageTitleWidget, OO.ui.MultilineTextInputWidget );\nOO.mixinClass( mw.cx.ui.PageTitleWidget, ve.ce.CXLintableNode );\n\n/* Methods */\n\n/**\n * @return {mw.cx.dm.PageTitleModel}\n */\nmw.cx.ui.PageTitleWidget.prototype.getModel = function () {\n\treturn this.model;\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.PageTitleWidget.prototype.getFocusableElement = function () {\n\treturn this.$tabIndexed;\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.PageTitleWidget.prototype.blursEditingSurface = function () {\n\treturn true;\n};\n\nmw.cx.ui.PageTitleWidget.prototype.validateTitle = function ( value ) {\n\t// Empty array in param resolves all issues with the title\n\tthis.model.resolveTranslationIssues( [] );\n\n\tif ( !mw.Title.newFromText( value ) ) {\n\t\tthis.model.addTranslationIssues( [ value === '' ? this.getEmptyTitleError() : this.getInvalidCharacterError() ] );\n\t\treturn;\n\t}\n\n\tve.init.platform.linkCache.get( this.getValue() ).then( function ( result ) {\n\t\tif ( result.missing ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.model.addTranslationIssues( [ this.getExistingTitleWarning() ] );\n\t}.bind( this ) );\n};\n\nmw.cx.ui.PageTitleWidget.prototype.getExistingTitleWarning = function () {\n\treturn {\n\t\tname: 'existing-title',\n\t\tmessage: mw.message(\n\t\t\t'cx-tools-linter-page-exists-message',\n\t\t\t$( '<a>' ).prop( 'href', mw.util.getUrl( this.getValue() ) ).text( this.getValue() )\n\t\t),\n\t\tmessageInfo: {\n\t\t\ttitle: mw.msg( 'cx-tools-linter-page-exists' ),\n\t\t\t// FIXME: Point to the more informative page about overwriting content\n\t\t\thelp: 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages',\n\t\t\tresolvable: true\n\t\t}\n\t};\n};\n\nmw.cx.ui.PageTitleWidget.prototype.getEmptyTitleError = function () {\n\treturn {\n\t\tname: 'empty-title',\n\t\tmessage: mw.message( 'cx-tools-linter-empty-title-message' ),\n\t\tmessageInfo: {\n\t\t\ttitle: mw.msg( 'cx-tools-linter-empty-title' ),\n\t\t\t// FIXME: Link to localized help page\n\t\t\thelp: 'https://en.wikipedia.org/wiki/Wikipedia:Page_name',\n\t\t\ttype: 'error'\n\t\t}\n\t};\n};\n\nmw.cx.ui.PageTitleWidget.prototype.getInvalidCharacterError = function () {\n\tvar titleObj = mw.Title.newFromUserInput( this.getValue() ),\n\t\tmessageData = {\n\t\t\tname: 'invalid-title',\n\t\t\tmessage: mw.message( 'cx-tools-linter-invalid-character-message' ),\n\t\t\tmessageInfo: {\n\t\t\t\ttitle: mw.msg( 'cx-tools-linter-invalid-character' ),\n\t\t\t\t// FIXME: Link to localized help page\n\t\t\t\thelp: 'https://en.wikipedia.org/wiki/Wikipedia:Page_name',\n\t\t\t\ttype: 'error'\n\t\t\t}\n\t\t};\n\n\tif ( titleObj ) {\n\t\tthis.validTitle = titleObj.title.replace( /_/g, ' ' );\n\n\t\tmessageData.messageInfo = $.extend( messageData.messageInfo, {\n\t\t\tresolvable: true,\n\t\t\tactionIcon: 'trash',\n\t\t\tactionLabel: mw.msg( 'cx-tools-linter-invalid-character-action' ),\n\t\t\taction: this.fixTitle.bind( this )\n\t\t} );\n\t}\n\n\treturn messageData;\n};\n\nmw.cx.ui.PageTitleWidget.prototype.fixTitle = function () {\n\tthis.setValue( this.validTitle );\n};\n\n/**\n * Handle key press events. Disable enter key presses.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n * @fires enter If enter key is pressed and input is not multiline\n * @return {boolean}\n */\nmw.cx.ui.PageTitleWidget.prototype.onKeyPress = function ( e ) {\n\tif ( e.which === OO.ui.Keys.ENTER ) {\n\t\tthis.emit( 'enter', e );\n\t\treturn false;\n\t}\n};\n\n/**\n * Window resize handler\n */\nmw.cx.ui.PageTitleWidget.prototype.onWindowResize = function () {\n\t// We need to trick the parent adjustSize() method not to exit early\n\t// because it checks if input string has changed by comparing with\n\t// cache value. If there was no limitation here, we would just\n\t// register adjustSize() method as window resize handler.\n\tthis.valCache = null;\n\tthis.adjustSize();\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.SectionTitleWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'enter' is undefined.","line":99,"column":1,"nodeType":"Block","endLine":99,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/**\n * Section title widget. This is the header for source and translation columns.\n * It is editable (contenteditable) for translation and readonly for source section title.\n *\n * @class\n * @extends OO.ui.MultilineTextInputWidget\n * @mixins ve.ce.CXLintableNode\n * @param {mw.cx.dm.SectionTitleModel} model\n * @param {Object} [config] Configuration object\n */\nmw.cx.ui.SectionTitleWidget = function ( model, config ) {\n\t// Configuration initialization\n\tconfig = $.extend( config, {\n\t\tclasses: [ 'cx-pagetitle cx-sectiontitle' ],\n\t\ttype: 'text',\n\t\tautosize: true\n\t} );\n\n\tthis.model = model;\n\n\t// Parent constructor\n\tmw.cx.ui.SectionTitleWidget.super.call( this, config );\n\n\t// Mixin constructor\n\tve.ce.CXLintableNode.call( this );\n\n\tthis.validTitle = null;\n\n\t// Events\n\t$( this.getElementWindow() ).on(\n\t\t'resize',\n\t\tOO.ui.throttle( this.onWindowResize.bind( this ), 300 )\n\t);\n\n\tthis.getFocusableElement().off( 'focus' ).on( 'focus', this.emit.bind( this, 'focus' ) );\n\t$( document )\n\t\t.off( 'blur', '.cx-sectiontitle' )\n\t\t.on( 'blur', '.cx-sectiontitle', this.emit.bind( this, 'blur' ) );\n\tthis.connect( this, {\n\t\tchange: OO.ui.debounce( this.validateTitle.bind( this ), 300 )\n\t} );\n};\n\n/* Setup */\n\nOO.inheritClass( mw.cx.ui.SectionTitleWidget, OO.ui.MultilineTextInputWidget );\nOO.mixinClass( mw.cx.ui.SectionTitleWidget, ve.ce.CXLintableNode );\n\n/* Methods */\n\n/**\n * @return {mw.cx.dm.SectionTitleModel}\n */\nmw.cx.ui.SectionTitleWidget.prototype.getModel = function () {\n\treturn this.model;\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.SectionTitleWidget.prototype.getFocusableElement = function () {\n\treturn this.$tabIndexed;\n};\n\n/**\n * @inheritdoc\n */\nmw.cx.ui.SectionTitleWidget.prototype.blursEditingSurface = function () {\n\treturn true;\n};\n\nmw.cx.ui.SectionTitleWidget.prototype.validateTitle = function ( value ) {\n\t// Empty array in param resolves all issues with the title\n\tthis.model.resolveTranslationIssues( [] );\n\n\tif ( value === '' ) {\n\t\tthis.model.addTranslationIssues( [ this.getEmptyTitleError() ] );\n\t}\n};\n\nmw.cx.ui.SectionTitleWidget.prototype.getEmptyTitleError = function () {\n\treturn {\n\t\tname: 'empty-title',\n\t\tmessage: mw.message( 'cx-tools-linter-empty-title-message' ), // TODO: Fix this message\n\t\tmessageInfo: {\n\t\t\ttitle: mw.msg( 'cx-tools-linter-empty-title' ), // TODO: Fix this message\n\t\t\ttype: 'error'\n\t\t}\n\t};\n};\n\n/**\n * Handle key press events. Disable enter key presses.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n * @fires enter If enter key is pressed and input is not multiline\n * @return {boolean}\n */\nmw.cx.ui.SectionTitleWidget.prototype.onKeyPress = function ( e ) {\n\tif ( e.which === OO.ui.Keys.ENTER ) {\n\t\tthis.emit( 'enter', e );\n\t\treturn false;\n\t}\n};\n\n/**\n * Window resize handler\n */\nmw.cx.ui.SectionTitleWidget.prototype.onWindowResize = function () {\n\t// We need to trick the parent adjustSize() method not to exit early\n\t// because it checks if input string has changed by comparing with\n\t// cache value. If there was no limitation here, we would just\n\t// register adjustSize() method as window resize handler.\n\tthis.valCache = null;\n\tthis.adjustSize();\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.TitleOptionWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.TranslationIssueWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ui/widgets/mw.cx.ui.TranslationToolWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/util/mw.cx.util.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/mixins/ve.ce.CXLintableNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/mixins/ve.ce.CXPendingNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/ve.ce.CXBlockImageNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/ve.ce.CXImageCaptionNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/ve.ce.CXLinkAnnotation.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/ve.ce.CXPlaceholderNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/ve.ce.CXReferenceNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/ve.ce.CXSectionNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/ve.ce.CXSentenceSegmentAnnotation.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ce/ve.ce.CXTransclusionNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/mixins/ve.dm.CXLintableNode.js","messages":[{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":52,"column":12,"nodeType":"NewExpression","endLine":52,"endColumn":30}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @class\n * @abstract\n * @constructor\n */\nve.dm.CXLintableNode = function VeDmCXLintableNode() {\n\t// @var {mw.cx.dm.TranslationIssue[]}\n\tthis.translationIssues = [];\n\n\t// It is assumed that CXLintableNode will be mixed into a\n\t// node and therefore OO.EventEmitter is already available.\n};\n\n/* Methods */\n\n/**\n * @method\n * @return {string|number}\n */\nve.dm.CXLintableNode.prototype.getId = null;\n\n/**\n * @return {mw.cx.dm.Translation}\n */\nve.dm.CXLintableNode.prototype.getTranslation = function () {\n\treturn ve.init.target.getTranslation();\n};\n\n/**\n * @return {mw.cx.dm.TranslationIssue[]}\n */\nve.dm.CXLintableNode.prototype.getTranslationIssues = function () {\n\treturn this.translationIssues.filter( function ( issue ) {\n\t\treturn !issue.isSuppressed();\n\t} );\n};\n\n/**\n * Find names of all issues that have some pattern in their name.\n *\n * @param {string} name Part of a name used in a regex\n * @return {string[]} All issues with some pattern in their name\n */\nve.dm.CXLintableNode.prototype.findMatchingIssues = function ( name ) {\n\t// Prevent matching all issues when empty string is given\n\tif ( !name.length ) {\n\t\treturn [];\n\t}\n\n\t// If nothing is found, empty array is returned\n\treturn this.translationIssues.filter( function ( issue ) {\n\t\treturn ( new RegExp( name ) ).test( issue.getName() );\n\t} ).map( function ( issue ) {\n\t\treturn issue.getName();\n\t} );\n};\n\n/**\n * Find the index of issue with some name, inside issue array.\n * Names act as unique ID and there should not be duplicates.\n *\n * @param {string} name Name of the issue\n * @return {number} Index of issue or -1 if not found.\n */\nve.dm.CXLintableNode.prototype.findIssueIndex = function ( name ) {\n\tfor ( var i = 0, length = this.translationIssues.length; i < length; i++ ) {\n\t\tif ( this.translationIssues[ i ].getName() === name ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n};\n\n/**\n * @param {mw.cx.dm.TranslationIssue[]|string[]|Object[]} issues\n */\nve.dm.CXLintableNode.prototype.addTranslationIssues = function ( issues ) {\n\tif ( issues.length < 1 ) {\n\t\treturn;\n\t}\n\n\t// Load the translation issue DM module, now that it's required.\n\t// There is no use of adding this to the initial JS payload\n\tissues.map( this.processTranslationIssues ).forEach( function ( issue ) {\n\t\tvar existingIssueIndex = this.findIssueIndex( issue.name );\n\n\t\t// When issue is suppressed, emit events about the current state\n\t\tissue.setSuppressCallback( this.notify.bind( this ) );\n\n\t\tif ( existingIssueIndex > -1 ) {\n\t\t\t// Replace existing issue\n\t\t\tthis.translationIssues[ existingIssueIndex ] = issue;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.translationIssues.push( issue );\n\t}, this );\n\n\tthis.emit( 'translationIssues', this.hasErrors() );\n\tthis.getTranslation().emit( 'translationIssues', this.getId(), this.hasErrors() );\n};\n\n/**\n * Resolve issues by name:\n * - Array of strings resolves issues that have those names\n * - Empty array resolves all issues of this node\n * - Plain string is used as regex to find resolvable issues\n *\n * @param {string|string[]} names\n */\nve.dm.CXLintableNode.prototype.resolveTranslationIssues = function ( names ) {\n\tif ( Array.isArray( names ) && names.length === 0 ) {\n\t\tthis.translationIssues = [];\n\t}\n\n\tif ( typeof names === 'string' || names instanceof String ) {\n\t\tnames = this.findMatchingIssues( names );\n\t}\n\n\tnames.forEach( function ( name ) {\n\t\tvar index = this.findIssueIndex( name );\n\n\t\tif ( index > -1 ) {\n\t\t\tthis.translationIssues.splice( index, 1 );\n\t\t}\n\t}, this );\n\n\tthis.notify();\n};\n\n/**\n * Emit events about the state of issues.\n */\nve.dm.CXLintableNode.prototype.notify = function () {\n\tif ( !this.hasTranslationIssues() ) {\n\t\tthis.emit( 'allIssuesResolved' );\n\t\tthis.getTranslation().emit( 'issuesResolved', this.getId() );\n\t} else {\n\t\tthis.emit( 'translationIssues', this.hasErrors() );\n\t\tthis.getTranslation().emit( 'translationIssues', this.getId(), this.hasErrors() );\n\t}\n};\n\n/**\n * Transform the issue into mw.cx.dm.TranslationIssue object.\n *\n * @param {mw.cx.dm.TranslationIssue|string|Object} issue\n * @return {mw.cx.dm.TranslationIssue}\n */\nve.dm.CXLintableNode.prototype.processTranslationIssues = function ( issue ) {\n\tif ( issue instanceof mw.cx.dm.TranslationIssue ) {\n\t\treturn issue;\n\t}\n\n\tif ( typeof issue === 'string' || issue instanceof String ) {\n\t\treturn new mw.cx.dm.TranslationIssue( issue );\n\t}\n\n\t// If issue is object with properties name and message and optional property messageInfo\n\tif ( issue === Object( issue ) && issue.name && issue.message ) {\n\t\treturn new mw.cx.dm.TranslationIssue( issue.name, issue.message, issue.messageInfo );\n\t}\n\n\tmw.log.error( 'Lint result cannot be processed' );\n};\n\n/**\n * True if this node has at least one issue that is an error. Number of warnings is irrelevant.\n *\n * @return {boolean}\n */\nve.dm.CXLintableNode.prototype.hasErrors = function () {\n\treturn this.getTranslationIssues().some( function ( issue ) {\n\t\treturn issue.type === 'error';\n\t} );\n};\n\n/**\n * Check if this node has at least one issue.\n *\n * @return {boolean}\n */\nve.dm.CXLintableNode.prototype.hasTranslationIssues = function () {\n\treturn this.getTranslationIssues().length > 0;\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/ve.dm.CXBlockImageNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/ve.dm.CXImageCaptionNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/ve.dm.CXLinkAnnotation.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/ve.dm.CXPlaceholderNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/ve.dm.CXReferenceNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/ve.dm.CXSectionNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/ve.dm.CXSentenceSegmentAnnotation.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/ve.dm.CXTransclusionNode.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/dm/ve.dm.CXTranslationUnitModel.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/init/ve.init.mw.CXTarget.js","messages":[{"ruleId":"jsdoc/require-returns-type","severity":1,"message":"Missing JSDoc @return type.","line":590,"column":1,"nodeType":"Block","endLine":590,"endColumn":1}],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":348,"column":2,"nodeType":"CallExpression","endLine":348,"endColumn":52,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/**\n * CX Target\n *\n * @copyright See AUTHORS.txt\n * @license GPL-2.0-or-later\n *\n * @class\n * @param {mw.cx.ui.TranslationView} translationView\n * @param {Object} [config] Configuration object\n * TODO: Only pass optional parameters in config\n * @cfg {mw.cx.SiteMapper} siteMapper\n * @cfg {mw.cx.MachineTranslationManager} MTManager\n * @cfg {mw.cx.MachineTranslationService} MTService\n * TODO: toolbarConfig\n */\nve.init.mw.CXTarget = function VeInitMwCXTarget( translationView, config ) {\n\t// Configuration initialization\n\tthis.config = config = $.extend( {}, config, {\n\t\tcontinuous: true,\n\t\texpanded: false,\n\t\tscrollable: false,\n\t\tpadded: false\n\t} );\n\tconfig.toolbarConfig = $.extend(\n\t\t{ shadow: true, actions: true, floatable: false, $overlay: true },\n\t\tconfig.toolbarConfig\n\t);\n\t// Parent constructor\n\tve.init.mw.CXTarget.super.call( this, config );\n\n\tthis.MTManager = config.MTManager;\n\tthis.MTService = config.MTService;\n\tthis.siteMapper = config.siteMapper;\n\tthis.requestManager = config.requestManager;\n\n\tthis.errorsInTranslation = false;\n\n\t// @var {mw.cx.dm.Translation}\n\tthis.translation = null;\n\t// @var {mw.cx.ui.TranslationView}\n\tthis.translationView = translationView;\n\tthis.publishButton = null;\n\t// @var {string}\n\tthis.pageName = this.translationView.targetColumn.getTitle();\n\t/**\n\t * An integer holding the value of the namespace,\n\t * into which the translation will be published\n\t *\n\t * @type {number|null}\n\t */\n\tthis.publishNamespace = null;\n\t// @var {ve.ui.CXSurface}\n\tthis.sourceSurface = null;\n\t// @var {ve.ui.CXSurface}\n\tthis.targetSurface = null;\n\t// @var {Object}\n\tthis.contentSourceCache = {};\n\t// @var {Object}\n\tthis.translationRequestCache = {};\n\t// Complex dialog is the dialog with VE surface.\n\t// In order to reset the overlay classes, which move overlay, we want only the first\n\t// complex dialog to reset these classes, since complex dialogs can be nested. See T193587\n\tthis.complexDialogOpened = false;\n\tthis.contextStack = [];\n\tthis.mtToolbar = null;\n\n\tthis.$element\n\t\t.addClass( 've-init-mw-cxTarget' )\n\t\t.append( this.translationView.$element );\n\n\tthis.debounceAlignSectionPairs = OO.ui.debounce(\n\t\tthis.alignSectionPairs.bind( this ),\n\t\t500\n\t);\n\n\tthis.translationView.connect( this, {\n\t\thasTranslationIssues: 'onTranslationIssues'\n\t} );\n\n\tthis.translationView.targetColumn.connect( this, {\n\t\ttitleChange: 'onTargetTitleChange', // only emitted for article translations\n\t\tsectionTitleChange: 'onTargetSectionTitleChange' // only emitted for section translations\n\t} );\n\n\tthis.connect( this, {\n\t\tcontentChange: 'onChange',\n\t\tsurfaceReady: 'onSurfaceReady'\n\t} );\n\tmw.hook( 'mw.cx.draft.restored' ).add( this.onTranslationRestore.bind( this ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.init.mw.CXTarget, ve.init.mw.Target );\n\n/* Events */\n\n/**\n * @event targetTitleChange\n *\n * Target title of the translation has changed.\n */\n\n/**\n * @event targetSectionTitleChange\n *\n * Target section title of the translation has changed. Only used for section translations.\n */\n\n/**\n * @event publish\n *\n * User clicked on \"Publish\" button to start the publication process.\n */\n\n/**\n * @event contentChange\n *\n * Content in the document has changed.\n */\n\n/**\n * @event changeContentSource\n *\n * Some target section's content source has changed.\n * @param {number} sectionNumber\n */\n\n/**\n * @event namespaceChange\n *\n * Namespace of the target title has changed.\n * @param {number} namespaceId ID of the new namespace\n */\n\n/* Static Properties */\n\nve.init.mw.CXTarget.static.name = 'cx';\n\nve.init.mw.CXTarget.static.integrationType = 'contenttranslation';\n\nve.init.mw.CXTarget.static.publishToolbarGroups = [\n\t// Publish settings\n\t{\n\t\tname: 'publish',\n\t\tinclude: [ 'publishSettings', 'publish' ]\n\t}\n];\n\nve.init.mw.CXTarget.static.translationToolbarGroups = [\n\t{\n\t\tname: 'cx-mt',\n\t\ttype: 'menu',\n\t\tinclude: [ { group: 'mt' } ]\n\t},\n\t{\n\t\tname: 'cx-mt-set-default',\n\t\ttype: 'bar',\n\t\tinvisibleLabel: false,\n\t\tinclude: [ 'save-mt-preference' ]\n\t}\n];\n\nve.init.mw.CXTarget.static.toolbarGroups = [\n\t// History\n\t{\n\t\tname: 'history',\n\t\tinclude: [ 'undo', 'redo' ]\n\t},\n\t// Style\n\t{\n\t\tname: 'style',\n\t\tclasses: [ 've-cx-toolbar-style' ],\n\t\ttype: 'list',\n\t\ticon: 'textStyle',\n\t\ttitle: OO.ui.deferMsg( 'visualeditor-toolbar-style-tooltip' ),\n\t\tinclude: [ { group: 'textStyle' }, 'language', 'clear' ],\n\t\tforceExpand: [ 'bold', 'italic', 'clear' ],\n\t\tpromote: [ 'bold', 'italic' ],\n\t\tdemote: [ 'strikethrough', 'code', 'underline', 'language', 'clear' ]\n\t},\n\t// Link\n\t{\n\t\tname: 'link',\n\t\tclasses: [ 've-cx-toolbar-link' ],\n\t\tinclude: [ 'link' ]\n\t},\n\t// Structure\n\t{\n\t\tname: 'structure',\n\t\tclasses: [ 've-cx-toolbar-structure' ],\n\t\ttype: 'list',\n\t\ticon: 'listBullet',\n\t\ttitle: OO.ui.deferMsg( 'visualeditor-toolbar-structure' ),\n\t\tinclude: [ { group: 'structure' } ],\n\t\tdemote: [ 'outdent', 'indent' ]\n\t},\n\t// Placeholder for reference tools (e.g. Cite)\n\t{\n\t\tname: 'reference'\n\t},\n\t// Insert\n\t{\n\t\tname: 'extra',\n\t\talign: 'after',\n\t\ticon: 'ellipsis',\n\t\tlabel: '',\n\t\tindicator: null,\n\t\ttype: 'list',\n\t\ttitle: OO.ui.deferMsg( 'visualeditor-toolbar-insert' ),\n\t\tinclude: '*',\n\t\texclude: [ { group: 'format' } ],\n\t\tforceExpand: [ 'media', 'transclusion', 'insertTable', 'specialCharacter' ],\n\t\tpromote: [ 'media', 'transclusion', 'insertTable', 'specialCharacter' ]\n\t}\n];\n\n/* Methods */\n\nve.init.mw.CXTarget.prototype.setupToolbar = function ( surface ) {\n\t// Parent method\n\tve.init.mw.CXTarget.super.prototype.setupToolbar.apply( this, arguments );\n\n\tthis.publishToolbar = new ve.ui.TargetToolbar( this );\n\tthis.publishToolbar.setup( this.constructor.static.publishToolbarGroups, surface );\n\n\tthis.publishButton = this.publishToolbar.getToolGroupByName( 'publish' ).findItemFromData( 'publish' );\n\tmw.hook( 'mw.cx.progress' ).add( function ( weights ) {\n\t\tthis.publishButton.setDisabled( weights.any === 0 );\n\t}.bind( this ) );\n\n\tthis.translationView.translationHeader.$toolbar.append( this.publishToolbar.$element );\n};\n\nve.init.mw.CXTarget.prototype.unbindHandlers = function () {\n\t// Parent method\n\tve.init.mw.CXTarget.super.prototype.unbindHandlers.call( this );\n\n\t$( this.getElementWindow() ).off( 'resize', this.debounceAlignSectionPairs );\n};\n\n/**\n * Present the source article and section placeholders\n *\n * @param {mw.cx.dm.Translation} translation\n */\nve.init.mw.CXTarget.prototype.setTranslation = function ( translation ) {\n\tthis.translation = translation;\n\tconst sourceSurface = this.sourceSurface = this.createSurface(\n\t\tthis.translation.sourceDoc,\n\t\tthis.getSurfaceConfig( {\n\t\t\tclasses: [ 've-ui-cxSurface', 've-ui-cxSourceSurface', 'mw-body-content' ]\n\t\t} )\n\t);\n\tconst targetSurface = this.targetSurface = this.createSurface(\n\t\tthis.translation.targetDoc,\n\t\tthis.getSurfaceConfig( {\n\t\t\tclasses: [ 've-ui-cxSurface', 've-ui-cxTargetSurface', 'mw-body-content' ]\n\t\t} )\n\t);\n\tsourceSurface.setReadOnly( true );\n\tthis.translationView.sourceColumn.setTranslation( translation );\n\tthis.translationView.targetColumn.setTranslation( translation );\n\tthis.translationView.toolsColumn.setTranslation( translation );\n\tthis.clearSurfaces();\n\tthis.surfaces.push( targetSurface );\n\ttargetSurface.getDialogs().connect( this, {\n\t\topening: this.onDialogOpening.bind( this, targetSurface.getContext() ),\n\t\tclosing: 'onDialogClosing'\n\t} );\n\ttargetSurface.getView().connect( this, {\n\t\tfocus: [ 'onSurfaceViewFocus', targetSurface ]\n\t} );\n\tthis.setSurface( targetSurface );\n\ttargetSurface.getModel().getDocument().connect( this, {\n\t\ttransact: 'onDocumentTransact'\n\t} );\n\ttargetSurface.getView().getDocument().connect( this, {\n\t\tactivatePlaceholder: 'onDocumentActivatePlaceholder'\n\t} );\n\tthis.translationView.sourceColumn.attachSurface( sourceSurface );\n\tthis.translationView.targetColumn.attachSurface( targetSurface );\n\tsourceSurface.initialize();\n\ttargetSurface.initialize();\n\n\tthis.setupHighlighting( sourceSurface.getView().$element, targetSurface.getView().$element );\n\n\t$( this.getElementWindow() ).on( 'resize', this.debounceAlignSectionPairs );\n\t// Wait for document to render fully.\n\t// In mw.Target this happens after documentReady and a setTimeout,\n\t// but we don't use documentReady in this target.\n\tsetTimeout( this.surfaceReady.bind( this ) );\n\n\tthis.translation.connect( this, {\n\t\tsectionChange: this.debounceAlignSectionPairs,\n\t\tafterRender: this.debounceAlignSectionPairs\n\t} );\n};\n\nve.init.mw.CXTarget.prototype.setupHighlighting = function ( $sourceView, $targetView ) {\n\tconst $views = $( [ $sourceView[ 0 ], $targetView[ 0 ] ] );\n\n\t$views.on(\n\t\t{\n\t\t\tmouseenter: function () {\n\t\t\t\tif ( this.classList.contains( 'cx-sentence-highlight' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst segmentSelector = '[data-segmentid=\"_\"]'.replace( '_', this.dataset.segmentid );\n\t\t\t\t$views.find( segmentSelector ).addClass( 'cx-sentence-highlight' );\n\t\t\t},\n\t\t\tmouseleave: function () {\n\t\t\t\t$views.find( '.cx-sentence-highlight' ).removeClass( 'cx-sentence-highlight' );\n\t\t\t}\n\t\t},\n\t\t'.cx-segment'\n\t);\n\n\t$targetView.on(\n\t\t{\n\t\t\tmouseenter: function () {\n\t\t\t\tif ( this.classList.contains( 'cx-section-highlight' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst sectionNumber = mw.cx.getSectionNumberFromSectionId( this.id );\n\t\t\t\tdocument.getElementById( 'cxSourceSection' + sectionNumber )\n\t\t\t\t\t.classList.add( 'cx-section-highlight' );\n\t\t\t},\n\t\t\tmouseleave: function () {\n\t\t\t\t$views.find( '.cx-section-highlight' ).removeClass( 'cx-section-highlight' );\n\t\t\t}\n\t\t},\n\t\t'[rel=\"cx:Placeholder\"]'\n\t);\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.CXTarget.prototype.createSurface = function ( dmDoc, config ) {\n\tconst surface = new ve.ui.CXSurface( this, dmDoc, this.translationView.toolsColumn, config );\n\n\t// eslint-disable-next-line mediawiki/class-doc\n\tsurface.$element.addClass( this.protectedClasses );\n\n\t// T164790\n\tconst documentView = surface.getView().getDocument();\n\t// The following classes are used here\n\t// * mw-content-ltr\n\t// * mw-content-rtl\n\tdocumentView.getDocumentNode().$element.addClass( 'mw-parser-output mw-content-' + documentView.getDir() );\n\n\t// If configuration object has 'inDialog' param, that means surface is created for usage\n\t// inside a modal dialog. Such complex dialogs need to have access to context tools inside\n\t// tools column, so we move the overlay. Also, other, non-complex tools, shouldn't be\n\t// showing. See T193587\n\tif ( config.inDialog ) {\n\t\tsurface.getDialogs().connect( this, {\n\t\t\topening: this.onDialogOpening.bind( this, surface.getContext() ),\n\t\t\tclosing: 'onDialogClosing'\n\t\t} );\n\n\t\tif ( !this.complexDialogOpened ) {\n\t\t\tthis.toggleContextTools( true );\n\t\t\tsurface.connect( this, { destroy: [ 'toggleContextTools', false ] } );\n\t\t}\n\t}\n\n\treturn surface;\n};\n\nve.init.mw.CXTarget.prototype.surfaceReady = function () {\n\t// Parent method\n\tve.init.mw.CXTarget.super.prototype.surfaceReady.apply( this, arguments );\n\n\tthis.debounceAlignSectionPairs();\n\n\t// Wait for 300ms because of debounced section alignment and then mark target surface as ready.\n\t// This CSS class is used in order to avoid showing initial placeholder\n\t// until it is sized to match corresponding source section.\n\tsetTimeout( function () {\n\t\tthis.targetSurface.$element.addClass( 've-ui-cxTargetSurface--ready' );\n\t}.bind( this ), 300 );\n};\n\n/**\n * Toggle the tools column CSS class which hides non-context tools.\n *\n * @param {boolean} state Toggle state of tools column class\n */\nve.init.mw.CXTarget.prototype.toggleContextTools = function ( state ) {\n\tthis.complexDialogOpened = state;\n\n\tthis.translationView.toolsColumn.toolContainer.$element.toggleClass( 'cx-column-tools-container--dialog', state );\n};\n\nve.init.mw.CXTarget.prototype.getTranslation = function () {\n\treturn this.translation;\n};\n\nve.init.mw.CXTarget.prototype.onDialogOpening = function ( context, dialog ) {\n\tif ( !( dialog instanceof ve.ui.NodeDialog ) ) {\n\t\treturn;\n\t}\n\n\tthis.targetSurface.getGlobalOverlay().$element.addClass( 've-cx-ui-overlay-global' );\n\tthis.contextStack.push( context );\n\tcontext.connect( this, { afterContextChange: [ 'processContextItems', true ] } );\n\tthis.processContextItems( true );\n\n\t// We can use setSize( 'full' ) method here, and it would work for some dialogs,\n\t// like reference dialog, but VE hardcodes the size for media dialog in\n\t// ve.ui.MWMediaDialog.prototype.switchPanels.\n\t// See T198390\n\tdialog.getSize = function () {\n\t\treturn 'full';\n\t};\n\n\t// Don't cover the top header with overlay when the user is at the top of the viewport\n\t// See T193587\n\tconst headerHeight = $( 'header.cx-header' ).outerHeight();\n\tconst scrollPosition = $( this.getElementWindow() ).scrollTop();\n\n\tif ( scrollPosition === 0 ) {\n\t\tdialog.$element.css( 'top', headerHeight );\n\t} else {\n\t\tdialog.$element.css( 'top', '' );\n\t}\n};\n\nve.init.mw.CXTarget.prototype.onDialogClosing = function () {\n\tthis.processContextItems( false );\n\tthis.contextStack.pop();\n\tif ( !this.contextStack.length ) {\n\t\tthis.targetSurface.getGlobalOverlay().$element.removeClass( 've-cx-ui-overlay-global' );\n\t}\n};\n\n/**\n * Process the stack of contexts, with their context items. Stack contains contexts\n * for nested modal dialogs, e.g. opening reference dialog, for a reference that\n * has a template, and then opening the template dialog.\n *\n * The logic when dialog is opening is to hide context item(s) for all but last\n * context inside a stack. Item(s) for last context are disabled.\n *\n * On the other side, when dialog is closing, context item(s) of last context are\n * enabled and visible, while context item(s) for second-to-last context are\n * disabled and visible. Item(s) for all other contexts are just toggled invisible.\n *\n * @param {boolean} disabled True if context items need to be disabled\n */\nve.init.mw.CXTarget.prototype.processContextItems = function ( disabled ) {\n\tconst lastItem = this.contextStack.length - 1;\n\n\t// Iterate all context(s) in a stack\n\tthis.contextStack.forEach( function ( context, index ) {\n\t\t// Whether items for second to last context in a stack should be disabled.\n\t\t// Used when dialog is closing.\n\t\tconst disableSecondToLast = !disabled && index === ( lastItem - 1 );\n\n\t\tlet process;\n\t\t// If item is last (during opening) or second-to-last (during closing)\n\t\tif ( index === lastItem || disableSecondToLast ) {\n\t\t\tprocess = function ( item ) {\n\t\t\t\titem.toggle( true );\n\t\t\t\titem.setDisabled( disabled || disableSecondToLast );\n\t\t\t\t// Set disabled state for action buttons\n\t\t\t\titem.actionButtons.getItems().forEach( function ( button ) {\n\t\t\t\t\tbutton.setDisabled( disabled || disableSecondToLast );\n\t\t\t\t} );\n\t\t\t};\n\t\t} else {\n\t\t\tprocess = function ( item ) {\n\t\t\t\titem.toggle( false );\n\t\t\t};\n\t\t}\n\n\t\tcontext.getItems().forEach( process );\n\t} );\n};\n\n/**\n * @fires targetTitleChange\n */\nve.init.mw.CXTarget.prototype.onTargetTitleChange = function () {\n\tthis.pageName = this.translationView.targetColumn.getTitle();\n\tthis.updateNamespace();\n\tthis.emit( 'targetTitleChange' );\n\tthis.debounceAlignSectionPairs();\n};\n\n/**\n * @fires targetSectionTitleChange\n */\nve.init.mw.CXTarget.prototype.onTargetSectionTitleChange = function () {\n\tthis.emit( 'targetSectionTitleChange' );\n};\n\nve.init.mw.CXTarget.prototype.enablePublishButton = function () {\n\tif ( this.translation.hasTranslatedSections() ) {\n\t\tthis.publishButton.setDisabled( false );\n\t}\n};\n\n/**\n * Translation restore event handler\n *\n * @param {mw.cx.dm.Translation} translationModel\n */\nve.init.mw.CXTarget.prototype.onTranslationRestore = function () {\n\tif ( mw.Title.newFromText( this.pageName ) ) {\n\t\tthis.enablePublishButton();\n\t}\n\n\t// Update publish settings namespace choice\n\tthis.updateNamespace();\n};\n\n/**\n * Call this when translation editor is ready.\n */\nve.init.mw.CXTarget.prototype.onSurfaceReady = function () {\n\t// Update namespace tools\n\tthis.updateNamespace();\n\t// Get ready with the translation of first section.\n\tthis.prefetchTranslationForSection( 0 );\n\n\tif ( this.translation.hasTranslatedSections() ) {\n\t\tthis.targetSurface.$element.addClass( 've-ui-cxTargetSurface--non-empty' );\n\t}\n};\n\n/**\n * Call this whenever something changes in the translation that requires saving.\n */\nve.init.mw.CXTarget.prototype.onChange = function () {\n\tif ( mw.Title.newFromText( this.pageName ) && !this.errorsInTranslation ) {\n\t\tthis.publishButton.setDisabled( false );\n\t}\n\tthis.translationView.clearMessages();\n};\n\n/**\n * Target namespace change handler\n *\n * @param {number} namespaceId\n */\nve.init.mw.CXTarget.prototype.onPublishNamespaceChange = function ( namespaceId ) {\n\tthis.publishNamespace = namespaceId;\n\tconst isSectionTranslation = this.translationView.targetColumn.isSectionTranslation();\n\n\tif ( !isSectionTranslation ) {\n\t\tconst newTitle = mw.cx.getTitleForNamespace( this.pageName, namespaceId );\n\t\t// Setting title in targetColumn will take care of necessary event firing for title change.\n\t\tthis.translationView.targetColumn.setTitle( newTitle );\n\t\tmw.log( '[CX] Target title changed to ' + newTitle );\n\t}\n\n\tthis.emitNamespaceChange( namespaceId );\n};\n\n/**\n * @param {number} namespaceId\n *\n * @fires namespaceChange\n */\nve.init.mw.CXTarget.prototype.emitNamespaceChange = function ( namespaceId ) {\n\tthis.emit( 'namespaceChange', namespaceId );\n};\n\n/**\n * This method is called by \"updateNamespace\" method to override the current value\n * of \"publishNamespace\" property, based on the prefix of target title of the article.\n * It is only used for article translations, not section translations.\n */\nve.init.mw.CXTarget.prototype.setPublishNameSpaceByPageTitle = function () {\n\tconst titleObj = mw.Title.newFromText( this.pageName );\n\tthis.publishNamespace = titleObj ? titleObj.getNamespaceId() : mw.cx.getDefaultTargetNamespace();\n};\n\n/**\n * Called in several places to update the namespace based on the page title for article translations,\n * and also update the state of the tools of the \"publish\" toolbar\n *\n * @return void\n */\nve.init.mw.CXTarget.prototype.updateNamespace = function () {\n\tconst isSectionTranslation = this.translationView.targetColumn.isSectionTranslation();\n\t// this method (\"updateNamespace\") is called in several places, leading to namespace override\n\t// on several occasions (e.g. \"onPublishButtonClick\"), which can be undesired for section translations.\n\t// To avoid undesired behaviour we only limit this override to page translations.\n\tif ( !isSectionTranslation ) {\n\t\tthis.setPublishNameSpaceByPageTitle();\n\t}\n\tif ( this.publishToolbar ) {\n\t\tthis.publishToolbar.updateToolState();\n\t}\n};\n\nve.init.mw.CXTarget.prototype.getPublishNamespace = function () {\n\treturn this.publishNamespace;\n};\n\n/**\n * @fires publish\n */\nve.init.mw.CXTarget.prototype.onPublishButtonClick = function () {\n\t// Disable the trigger button\n\tthis.publishButton.setDisabled( true )\n\t\t.setTitle( mw.msg( 'cx-publish-button-publishing' ) );\n\tthis.targetSurface.setReadOnly( true );\n\tthis.translationView.contentContainer.$element.toggleClass( 'oo-ui-widget-disabled', true );\n\tthis.emit( 'publish' );\n\tthis.updateNamespace();\n};\n\nve.init.mw.CXTarget.prototype.attachToolbar = function () {\n\tthis.translationView.toolsColumn.editingToolbarContainer.$element.append(\n\t\tthis.getToolbar().$element\n\t\t\t.addClass( 'oo-ui-toolbar-narrow' ) // Quick fix to avoid overflowing toolbar.\n\t);\n\n\tve.ui.CXTranslationToolbar.static.registerTools( this.MTManager ).then( function () {\n\t\tconst mtToolbar = new ve.ui.CXTranslationToolbar();\n\t\tmtToolbar.setup( this.constructor.static.translationToolbarGroups, this.targetSurface );\n\t\tthis.translationView.toolsColumn.mtToolbarContainer.$element.append( mtToolbar.$element );\n\t\tmtToolbar.initialize();\n\t\tthis.mtToolbar = mtToolbar;\n\t}.bind( this ) );\n};\n\n/**\n * @param {ve.dm.Transaction} transaction\n * @fires contentChange\n */\nve.init.mw.CXTarget.prototype.onDocumentTransact = function ( transaction ) {\n\tthis.emit( 'contentChange' );\n\tthis.debounceAlignSectionPairs();\n\n\t/** @type {ve.dm.Document} */\n\tconst docModel = this.targetSurface.getModel().getDocument();\n\tconst changedRange = transaction.getModifiedRange( docModel, { includeInternalList: true } );\n\tif ( !changedRange ) {\n\t\treturn;\n\t}\n\tconst changedNode = docModel.getBranchNodeFromOffset( changedRange.start );\n\tlet changedSectionNode;\n\tif ( changedNode ) {\n\t\tchangedSectionNode = changedNode.findParent( ve.dm.CXSectionNode );\n\t}\n\tif ( changedSectionNode ) {\n\t\tchangedSectionNode.emitSectionChange();\n\t} else {\n\t\t// In case of references, the node affected is internal list item.\n\t\t// It is possible that the reference is used in multiple sections too.\n\t\t// Register change to all sections.\n\t\tdocModel.getNodesByType( 'cxSection' ).forEach( function ( section ) {\n\t\t\tsection.emitSectionChange();\n\t\t} );\n\t}\n};\n\nve.init.mw.CXTarget.prototype.alignSectionPairs = function () {\n\tconst sourceDocumentNode = this.sourceSurface.getView().getDocument().getDocumentNode();\n\tconst targetDocumentNode = this.targetSurface.getView().getDocument().getDocumentNode();\n\n\t// This method can be called before restoration is complete and all nodes are attached\n\t// to the DOM (e.g. via mw.cx.ui.TargetColumn#setTitle). If so, skip alignment.\n\tif (\n\t\t!document.contains( sourceDocumentNode.$element[ 0 ] ) ||\n\t\t!document.contains( targetDocumentNode.$element[ 0 ] )\n\t) {\n\t\treturn;\n\t}\n\n\tthis.translationView.alignTitles();\n\n\tconst sourceOffsetTop = sourceDocumentNode.$element.offset().top;\n\tconst targetOffsetTop = targetDocumentNode.$element.offset().top;\n\tconst documentNodeChildren = sourceDocumentNode.getChildren();\n\n\tlet articleNode;\n\tfor ( let i = 0; i < documentNodeChildren.length; i++ ) {\n\t\tif ( documentNodeChildren[ i ].getType() === 'article' ) {\n\t\t\tarticleNode = documentNodeChildren[ i ];\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ( !articleNode ) {\n\t\tmw.log.error( '[CX] Fatal: articleNode not found in documentNode' );\n\t\treturn;\n\t}\n\n\tconst alignSectionPair = this.translationView.constructor.static.alignSectionPair;\n\t// Save the scroll position. The alignment openration need to reset the heights\n\t// of sections. If the asynchronous content changes from templates happen\n\t// during that time, we will have a different scroll position at the end\n\t// of this alignment. So we lock the scroll position.\n\tconst scrollPosition = $( this.getElementWindow() ).scrollTop();\n\tarticleNode.getChildren().forEach( function ( node ) {\n\t\tlet sectionNumber;\n\t\tconst element = node.$element[ 0 ];\n\t\tconst id = element && element.id;\n\t\tconst match = id && id.match( /^cxSourceSection([0-9]+)$/ );\n\n\t\tif ( match ) {\n\t\t\tsectionNumber = +match[ 1 ];\n\t\t\talignSectionPair( sourceOffsetTop, targetOffsetTop, sectionNumber );\n\t\t} else {\n\t\t\tmw.log.warn( '[CX] Invalid source section ' + id + ' found. Alignment may go wrong' );\n\t\t}\n\t} );\n\t// Restore scroll position\n\t$( this.getElementWindow() ).scrollTop( scrollPosition );\n};\n\n/**\n * Get the jQuery element for the given source section id.\n *\n * @param {string} sectionId Section id. E.g. cxSourceSection15 or cxTargetSection15\n * @return {jQuery} Source section element\n */\nve.init.mw.CXTarget.prototype.getSourceSectionElement = function ( sectionId ) {\n\tconst sectionNumber = mw.cx.getSectionNumberFromSectionId( sectionId );\n\tconst sourceId = 'cxSourceSection' + sectionNumber;\n\treturn this.sourceSurface.$element.find( '#' + sourceId );\n};\n\n/**\n * Get the source node for the given section id. Accepts section id for source or target.\n *\n * @param {string} sectionId Section id. Example cxSourceSection15 or cxTargetSection15\n * @return {ve.dm.CXSectionNode}\n */\nve.init.mw.CXTarget.prototype.getSourceSectionNode = function ( sectionId ) {\n\treturn this.getSourceSectionElement( sectionId ).data( 'view' ).getModel();\n};\n\n/**\n * Get the translation node for the given section id. Accepts section id of source or target.\n *\n * @param  {string} sectionId Section id. Example cxSourceSection15 or cxTargetSection15\n * @return {ve.dm.CXSectionNode|null}\n */\nve.init.mw.CXTarget.prototype.getTargetSectionNode = function ( sectionId ) {\n\tconst sectionNumber = mw.cx.getSectionNumberFromSectionId( sectionId );\n\tconst targetId = 'cxTargetSection' + sectionNumber;\n\tconst view = this.targetSurface.$element.find( '#' + targetId ).data( 'view' );\n\treturn view ? view.getModel() : null;\n};\n\n/**\n * Get the content editable node for the given section number. Accepts section id for target.\n *\n * @param {string} sectionNumber Section number. Example 4, 5 etc.\n * @return {ve.ce.CXSectionNode|null}\n */\nve.init.mw.CXTarget.prototype.getTargetSectionElementFromSectionNumber = function ( sectionNumber ) {\n\tconst targetId = 'cxTargetSection' + sectionNumber;\n\tconst view = this.targetSurface.$element.find( '#' + targetId ).data( 'view' );\n\n\treturn view || null;\n};\n\n/**\n * Get the translation node for the given section number. Accepts section id of source or target.\n *\n * @param  {string} sectionNumber Section number. Example 4, 5 etc.\n * @return {ve.dm.CXSectionNode|null}\n */\nve.init.mw.CXTarget.prototype.getTargetSectionNodeFromSectionNumber = function ( sectionNumber ) {\n\tconst view = this.getTargetSectionElementFromSectionNumber( sectionNumber );\n\treturn view ? view.getModel() : null;\n};\n\n/**\n * Handle clicks for placeholder sections.\n *\n * @param {ve.ce.CXPlaceholderNode} placeholder\n */\nve.init.mw.CXTarget.prototype.onDocumentActivatePlaceholder = function ( placeholder ) {\n\tconst model = placeholder.getModel();\n\tconst cxid = model.getAttribute( 'cxid' );\n\n\tthis.targetSurface.$element.addClass( 've-ui-cxTargetSurface--non-empty' );\n\n\tmodel.emit( 'beforeTranslation' );\n\tthis.MTManager.getPreferredProvider().then( function ( provider ) {\n\t\treturn this.changeContentSource( model, null, provider );\n\t}.bind( this ) ).fail( function () {\n\t\tmw.notify( mw.msg( 'cx-auto-failed' ) );\n\t\treturn this.MTManager.getDefaultNonMTProvider().then( function ( provider ) {\n\t\t\treturn this.changeContentSource( model, null, provider );\n\t\t}.bind( this ) );\n\t}.bind( this ) ).always( function () {\n\t\tconst $sourceElement = this.getSourceSectionElement( cxid );\n\t\t$sourceElement.removeClass( 'cx-section-highlight' );\n\t\tconst sectionNode = this.getTargetSectionNode( cxid );\n\t\tif ( sectionNode ) {\n\t\t\tsectionNode.emit( 'afterTranslation' );\n\t\t\tthis.prefetchTranslationForSection( sectionNode.getSectionNumber() + 1 );\n\t\t} else {\n\t\t\tmw.log.error( '[CX] No model found after translation for ' + cxid );\n\t\t}\n\t}.bind( this ) );\n};\n\nve.init.mw.CXTarget.prototype.onPublishCancel = function () {\n\tthis.publishButton.setDisabled( false ).setTitle( mw.msg( 'cx-publish-button' ) );\n\tthis.targetSurface.setReadOnly( false );\n\tthis.updateNamespace();\n\tthis.translationView.contentContainer.$element.toggleClass( 'oo-ui-widget-disabled', false );\n};\n\nve.init.mw.CXTarget.prototype.onPublishSuccess = function ( targetTitle, targetURL ) {\n\tconst messageAttributes = {\n\t\thref: targetURL,\n\t\ttarget: '_blank'\n\t};\n\tthis.translationView.showMessage(\n\t\t'success',\n\t\tmw.message( 'cx-publish-page-success',\n\t\t\t$( '<a>' ).attr( messageAttributes ).text( targetTitle )\n\t\t)\n\t);\n\tthis.publishButton.setDisabled( true ).setTitle( mw.msg( 'cx-publish-button' ) );\n\tthis.targetSurface.setReadOnly( false );\n\tthis.updateNamespace();\n\tthis.translationView.contentContainer.$element.toggleClass( 'oo-ui-widget-disabled', false );\n};\n\nve.init.mw.CXTarget.prototype.onPublishFailure = function ( errorMessage ) {\n\tthis.translationView.showMessage( 'error', errorMessage );\n\tthis.onPublishCancel();\n};\n\n/**\n * @param {boolean} hasErrors True if any of the issues is error, false if all are warnings.\n */\nve.init.mw.CXTarget.prototype.onTranslationIssues = function ( hasErrors ) {\n\t// If there used to be errors, which are now gone, enable publish button\n\tif ( this.errorsInTranslation && !hasErrors ) {\n\t\tthis.enablePublishButton();\n\t}\n\tthis.errorsInTranslation = hasErrors;\n};\n\n/**\n * Set the section content to the given content.\n *\n * @param {ve.dm.CXSectionNode|ve.dm.CXPlaceholderNode} section Section model\n * @param {string} content\n * @param {string} source Original content source\n */\nve.init.mw.CXTarget.prototype.setSectionContent = function ( section, content, source ) {\n\tconst surfaceModel = this.getSurface().getModel();\n\tconst doc = surfaceModel.getDocument();\n\n\t/**\n\t * Fix internal list indexes for duplicated references in a newFromDocumentInsertion transaction.\n\t *\n\t * This finds references inserted by the transaction that are duplicates of references already\n\t * present in the document, and changes them to point to the existing internal list item.\n\t *\n\t * This is a super hacky way to prevent errors in VE due to name collisions for duplicated\n\t * references.\n\t *\n\t * @param {ve.dm.Transaction} refTx Transaction generated by newFromDocumentInsertion()\n\t */\n\tfunction deduplicateReferences( refTx ) {\n\t\tfor ( let o = 0; o < refTx.operations.length; o++ ) {\n\t\t\tif ( refTx.operations[ o ].type !== 'replace' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor ( let i = 0; i < refTx.operations[ o ].insert.length; i++ ) {\n\t\t\t\tconst element = refTx.operations[ o ].insert[ i ];\n\t\t\t\tif ( element.type !== 'mwReference' ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Find any existing references this reference is a duplicate of\n\t\t\t\tconst nodeGroup = doc.getInternalList().getNodeGroup( element.attributes.listGroup );\n\t\t\t\tconst kinNodes = nodeGroup && nodeGroup.keyedNodes[ element.attributes.listKey ];\n\t\t\t\tif ( kinNodes && kinNodes.length > 0 ) {\n\t\t\t\t\t// This reference is a duplicate. Point it to the existing internal list item\n\t\t\t\t\telement.attributes.listIndex = kinNodes[ 0 ].getAttribute( 'listIndex' );\n\t\t\t\t\t// Only the first reference in the group should have contentsUsed=true\n\t\t\t\t\telement.attributes.contentsUsed = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst pasteDoc = ve.dm.converter.getModelFromDom( ve.createDocumentFromHtml( content ) );\n\tconst docLen = pasteDoc.getInternalList().getListNode().getOuterRange().start;\n\n\tlet fragment = surfaceModel.getLinearFragment( section.getOuterRange(), true /* noAutoSelect */ );\n\tfragment.insertContent( [\n\t\t{ type: 'cxSection', attributes: { style: 'section', cxid: section.getSectionId(), cxsource: source } },\n\t\t// Put a temporary paragraph inside the section so the cursor has somewhere\n\t\t// sensible to go, preventing scrollCursorIntoView from triggering a jump\n\t\t{ type: 'paragraph' },\n\t\t{ type: '/paragraph' },\n\t\t{ type: '/cxSection' }\n\t] );\n\tfragment = fragment\n\t\t.collapseToStart().adjustLinearSelection( 1, 3 )\n\t\t.removeContent();\n\n\tconst tx = ve.dm.TransactionBuilder.static.newFromDocumentInsertion(\n\t\tdoc,\n\t\tfragment.getSelection().getCoveringRange().start,\n\t\tpasteDoc,\n\t\tnew ve.Range( 1, docLen - 1 )\n\t);\n\t// HACK: modify the internal list indexes of any reused references being inserted to avoid errors in VE\n\t// If we don't do this, a reused reference will bring along a second copy of its internal list item,\n\t// and VE will crash because there are two references with the same name but pointing to different\n\t// internal list items.\n\t// We have to perform these modifications after generating the transaction, because if we do it before,\n\t// our modified indexes will be corrupted by the remapping step in newFromDocumentInsertion().\n\tdeduplicateReferences( tx );\n\tconst newRange = tx.getModifiedRange( doc );\n\tsurfaceModel.change( tx, new ve.dm.LinearSelection( newRange ) );\n\n\t// Select first content offset within new content\n\tconst newCursorRange = new ve.Range( surfaceModel.getDocument().data.getNearestContentOffset( newRange.start, 1 ) );\n\tif ( newRange.containsRange( newCursorRange ) ) {\n\t\tsurfaceModel.setLinearSelection( newCursorRange );\n\t}\n\n\t// Restore scroll top\n\tconst scrollTop = this.getSurface().view.$window.scrollTop();\n\tif ( this.getSurface().view.$window.scrollTop() !== scrollTop ) {\n\t\tthis.getSurface().view.$window.scrollTop( scrollTop );\n\t\tmw.log( '[CX] Scroll position restored to ' + scrollTop );\n\t}\n};\n\n/**\n * @inheritDoc\n */\nve.init.mw.CXTarget.prototype.getContentApi = function ( doc, options ) {\n\tdoc = doc || this.targetSurface.getModel().getDocument();\n\treturn this.siteMapper.getApi( doc.getLang(), options );\n};\n\n/**\n * @inheritDoc\n */\nve.init.mw.CXTarget.prototype.getPageName = function ( doc ) {\n\tdoc = doc || this.targetSurface.getModel().getDocument();\n\treturn doc.getLang() === this.translation.getSourceLanguage() ?\n\t\tthis.translation.getSourceTitle() : this.translation.getTargetTitle();\n};\n\n/**\n * Copied from SX code: /app/src/utils/templateHelper.js\n * Given an Element node, this method returns a boolean\n * indicating whether this node is a transclusion node or not.\n *\n * @param {HTMLElement} node\n * @return {boolean}\n */\nconst isTransclusionNode = ( node ) =>\n\t!!(\n\t\tnode.attributes.about ||\n\t\t\t\t( node.attributes.typeof &&\n\t\t\t\t\t\tnode\n\t\t\t\t\t\t\t.getAttribute( 'typeof' )\n\t\t\t\t\t\t\t.match( /(^|\\s)(mw:Transclusion|mw:Placeholder)\\b/ ) )\n\t);\n\n/**\n * Copied and adjusted from SX code: /app/src/wiki/cx/models/subSection.js\n *\n * @param {HTMLElement} subSectionNode\n * @return {HTMLElement}\n */\nconst getTransclusionNode = ( subSectionNode ) => {\n\treturn Array.from( subSectionNode.children ).find( ( node ) =>\n\t\tisTransclusionNode( node )\n\t);\n};\n\n/**\n * Translate and adapt the source section for the given section id.\n *\n * @param {string} sectionId Section ID\n * @param {string} provider Machine translation privider\n * @param {boolean} noCache If true, do a fresh translation from server\n * @return {jQuery.Promise}\n */\nve.init.mw.CXTarget.prototype.translateSection = function ( sectionId, provider, noCache ) {\n\tlet mode = ve.dm.Converter.static.CLIPBOARD_MODE;\n\tconst sourceNodeModel = this.getSourceSectionNode( sectionId );\n\tconst sectionNumber = sourceNodeModel.getSectionNumber();\n\n\tlet mtRequest = OO.getProp( this.translationRequestCache, sectionNumber, provider );\n\tif ( !noCache && mtRequest ) {\n\t\treturn mtRequest;\n\t}\n\n\t// Convert DOM to node, preserving full internal list\n\t// Use clipboard mode to ensure reference body is outputted\n\tif ( OO.getProp( sourceNodeModel, 'children', 0, 'type' ) === 'mwReferencesList' ) {\n\t\t// If the section is referencelist, we don't need to have the reference body resolved in it.\n\t\t// The reflist template wrapping of mw:Extension/refs will be lost in the\n\t\t// clipboard mode too. See T220491\n\t\tmode = ve.dm.Converter.static.PARSER_MODE;\n\t}\n\n\t// TODO: Extend converter and make a new TRANSLATION mode\n\tve.dm.converter.isForTranslation = true;\n\tconst sourceNode = ve.dm.converter.getDomFromNode( sourceNodeModel, mode ).body.children[ 0 ];\n\tve.dm.converter.isForTranslation = false;\n\n\tconst transclusionNode = getTransclusionNode( sourceNode );\n\tif ( transclusionNode ) {\n\t\tsourceNode.innerHTML = transclusionNode.outerHTML;\n\t}\n\n\t/**\n\t * @param {HTMLElement} section\n\t * @return {HTMLElement}\n\t */\n\tfunction restructure( section ) {\n\t\tsection = section.cloneNode( true );\n\t\tsection.removeAttribute( 'rel' );\n\t\tsection.id = 'cxTargetSection' + sectionNumber;\n\t\t// TODO: it's horrible that id attributes get duplicated\n\t\t// $( section ).find( '[id]' ).each( function ( i, node ) {\n\t\t//  node.setAttribute( 'id', 'cx' + node.getAttribute( 'id' ) );\n\t\t// } );\n\t\treturn section;\n\t}\n\n\tmtRequest = this.MTService.translate( restructure( sourceNode ).outerHTML, provider );\n\t// Set the request in the cache\n\tOO.setProp( this.translationRequestCache, sectionNumber, provider, mtRequest );\n\n\treturn mtRequest;\n};\n\n/**\n * Change content source for given target section.\n *\n * This handles caching of previous content when switching back and forth.\n * This might be redundant with undo/redo.\n *\n * @param {ve.dm.CXSectionNode|ve.dm.CXPlaceholderNode} section\n * @param {string|null} previousProvider\n * @param {string} newProvider\n * @param {Object} options\n * @cfg {boolean} noCache Do not use cached version\n * @return {jQuery.promise}\n * @fires changeContentSource\n */\nve.init.mw.CXTarget.prototype.changeContentSource = function (\n\tsection,\n\tpreviousProvider,\n\tnewProvider,\n\toptions\n) {\n\toptions = options || {};\n\tconst cxid = section.getSectionId();\n\tve.dm.converter.isForTranslation = true;\n\tconst html = ve.dm.converter.getDomFromNode( section, ve.dm.Converter.static.CLIPBOARD_MODE ).body.children[ 0 ].outerHTML;\n\tve.dm.converter.isForTranslation = false;\n\n\tif ( previousProvider !== null ) {\n\t\tOO.setProp( this.contentSourceCache, cxid, previousProvider, html );\n\t}\n\n\tif ( !options.noCache ) {\n\t\tconst cachedContent = OO.getProp( this.contentSourceCache, cxid, newProvider );\n\n\t\tif ( cachedContent ) {\n\t\t\tthis.setSectionContent( section, cachedContent, newProvider );\n\t\t\treturn $.Deferred().resolve().promise();\n\t\t}\n\t}\n\n\treturn this.translateSection( cxid, newProvider, options.noCache ).then( function ( content ) {\n\t\tthis.setSectionContent( section, content, newProvider );\n\t\tthis.emit( 'changeContentSource', mw.cx.getSectionNumberFromSectionId( cxid ) );\n\t}.bind( this ) );\n};\n\n/**\n * Prefetch the translation for the given section. The API request is raised, and set it in the cache.\n * Nothing done with the content.\n *\n * @param {number} sectionNumber\n */\nve.init.mw.CXTarget.prototype.prefetchTranslationForSection = function ( sectionNumber ) {\n\tconst $section = this.sourceSurface.$element.find( '#cxSourceSection' + sectionNumber );\n\tif ( $section.length ) {\n\t\tthis.MTManager.getPreferredProvider().then( function ( provider ) {\n\t\t\tthis.translateSection( $section.prop( 'id' ), provider );\n\t\t}.bind( this ) );\n\t}\n};\n\n/* Registration */\n\nve.init.mw.targetFactory.register( ve.init.mw.CXTarget );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/actions/ve.ui.CXTranslationAction.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/tools/ve.ui.CXResetSectionTool.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/tools/ve.ui.CXSaveMTPreferenceTool.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXDesktopContext.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXInternalLinkAnnotationWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXLinkAnnotationInspector.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXLinkContextItem.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXPublishSettingsDialog.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXPublishSettingsTool.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXPublishTool.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXReferenceContextItem.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXReferenceDialog.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXSurface.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXTextSelectionContextItem.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXTransclusionContextItem.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXTranslationToolbar.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-cx/ui/ve.ui.CXTranslationUnitContextItem.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/widgets/callout/ext.cx.callout.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-animate","severity":2,"message":"Prefer CSS transitions to .animate","line":86,"column":4,"nodeType":"CallExpression","endLine":92,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":123,"column":4,"nodeType":"CallExpression","endLine":123,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/widgets/feedback/ext.cx.feedback.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/widgets/progressbar/ext.cx.progressbar.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/widgets/spinner/ext.cx.spinner.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/widgets/translator/ext.cx.translator.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/sql/abstractSchemaChanges/patch-cx_translations-target-title-index.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/sql/abstractSchemaChanges/patch-cx_translators-unique-to-pk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/sql/abstractSchemaChanges/patch-new-fields-to-cx_section_translations.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/sql/tables.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/qunit/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/qunit/base/mw.cx.SiteMapper.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/qunit/dm/mw.cx.dm.Translation.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/qunit/mw.cx.MachineTranslationService.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/qunit/mw.cx.TargetArticle.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/qunit/mw.cx.TranslationTracker.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/qunit/mw.cx.util.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/qunit/ui/mw.cx.ui.Infobar.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"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-spacing","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-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/componentobjects/DesktopEditor.js","messages":[{"ruleId":"jsdoc/require-returns","severity":1,"message":"Missing JSDoc @return declaration.","line":43,"column":2,"nodeType":"Block","endLine":46,"endColumn":5}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * DesktopEditor Component Object for CX browser test suite\n *\n * Contains Desktop editor related locators and actions.\n */\n\n'use strict';\nconst ElementAction = require( '../utils/ElementAction' );\nconst { faker } = require( '@faker-js/faker' );\n\nconst MT_LIST = [ 'Google', 'Elia', 'MinT', 'Yandex', 'source', 'scratch' ];\nclass DesktopEditor {\n\tgetTranslationArticle() {\n\t\treturn $( '.cx-column--translation article' );\n\t}\n\n\tgetIssuesCard() {\n\t\treturn $( '.cx-card-issues' );\n\t}\n\n\tgetPublishButton() {\n\t\treturn $( 'span.oo-ui-tool-name-publish a.oo-ui-tool-link' );\n\t}\n\n\tgetPublishWithIssuesActions() {\n\t\treturn $( '.oo-ui-messageDialog-actions' );\n\t}\n\n\tgetPublishSuccessMessage() {\n\t\treturn $( '.oo-ui-flaggedElement-success' );\n\t}\n\n\tgetPublishedArticleLink() {\n\t\treturn $( '.oo-ui-flaggedElement-success .cx-message-widget-message a' );\n\t}\n\n\twaitForArticleToLoad() {\n\t\t// Wait for the publish button to appear\n\t\treturn $( 'span.oo-ui-tool-name-publish a.oo-ui-tool-link' )\n\t\t\t.waitForDisplayed( { timeout: 15000 } );\n\t}\n\n\t/**\n\t * Make all the placeholder nodes opaque. Elements that have 0 opacity\n\t * are considered un-clickable.\n\t */\n\tmakePlaceholderSectionsVisible() {\n\t\treturn browser.executeAsync( function ( done ) {\n\t\t\tconst placeholderNodes = document\n\t\t\t\t.querySelectorAll( '.cx-column--translation section.ve-ce-cxPlaceholderNode' );\n\n\t\t\tplaceholderNodes.forEach( function ( node ) {\n\t\t\t\tnode.style.opacity = 1;\n\t\t\t} );\n\n\t\t\tdone();\n\t\t} );\n\t}\n\n\t/**\n\t * Fill random translation data for the article\n\t *\n\t * @param {number} maxSections\n\t */\n\tasync fillRandomTranslationData( maxSections ) {\n\t\tawait this.makePlaceholderSectionsVisible();\n\t\t// Select all sections\n\t\tconst $$targetSections = await this.getTranslationArticle().$$( 'section' );\n\n\t\tlet sectionCount = 0;\n\t\tfor ( const $section of $$targetSections ) {\n\t\t\tconst sectionClasses = await $section.getAttribute( 'class' );\n\t\t\tif ( sectionClasses.includes( 've-ce-cxPlaceholderNode' ) ) {\n\t\t\t\tconst isClickable = await $section.isClickable();\n\t\t\t\tif ( !isClickable ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Trigger automatic translation\n\t\t\t\tawait $section.click();\n\t\t\t\t// Wait for things to become stable!\n\t\t\t\tawait $section.waitUntil( async function () {\n\t\t\t\t\tconst classes = await this.getAttribute( 'class' );\n\t\t\t\t\treturn !classes.includes( 've-ce-cxPlaceholderNode' );\n\t\t\t\t}, {\n\t\t\t\t\ttimeout: 10000,\n\t\t\t\t\ttimeoutMsg: 'CX placeholder node did not become section node'\n\t\t\t\t} );\n\t\t\t}\n\t\t\t// Add some lorem ipsum text\n\t\t\tawait ElementAction.setInput( $section, faker.lorem.sentences( 5 ) );\n\n\t\t\tif ( sectionCount === maxSections ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t++sectionCount;\n\t\t}\n\t}\n\n\tasync setMT( mtEngine ) {\n\t\tif ( !MT_LIST.includes( mtEngine ) ) {\n\t\t\tthrow new Error( `Invalid MT engine: ${ mtEngine }; Valid values: ${ MT_LIST.join( ', ' ) }` );\n\t\t}\n\t\tconst $mtToolbar = await $( '.ve-ui-toolbar-group-cx-mt' );\n\t\tawait ( $mtToolbar ).waitForDisplayed( { timeout: 3000 } );\n\t\tawait ElementAction.doClick( $mtToolbar );\n\n\t\tconst $mtOption = await $( `.oo-ui-tool-name-${ mtEngine } .oo-ui-tool-link` );\n\t\tawait ElementAction.doClick( $mtOption );\n\t}\n\n\tasync publishTranslation() {\n\t\tconst hasIssues = await this.getIssuesCard().isDisplayed();\n\n\t\tawait ElementAction.doClick( this.getPublishButton() );\n\t\tif ( hasIssues ) {\n\t\t\t// Wait for the publish with issues dialog to appear\n\t\t\tconst $messageActions = await this.getPublishWithIssuesActions();\n\t\t\tawait $messageActions.waitForDisplayed( { timeout: 10000 } );\n\n\t\t\t// Get the second button\n\t\t\t// TODO: Improve this selector\n\t\t\tconst $buttons = await $messageActions.$$( '.oo-ui-buttonElement-button' );\n\t\t\tawait ElementAction.doClick( $buttons[ 1 ] );\n\t\t}\n\n\t\tconst $publishedArticleLink = await this.getPublishedArticleLink();\n\t\treturn await $publishedArticleLink.getAttribute( 'href' );\n\t}\n}\n\nmodule.exports = new DesktopEditor();\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/navigation-steps/DashboardSuggestion.list.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/navigation-steps/SXArticleSearch.step.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/navigation-steps/TranslationConfirmer.step.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/pageobjects/UnifiedDashboard.page.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/UnifiedDashboardNewTranslation.spec.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/UnifiedDashboardSuggestions.spec.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/utils/ElementAction.js","messages":[{"ruleId":"jsdoc/check-param-names","severity":1,"message":"Expected @param names to be \"selector, attribute\". Got \"attribute, selector\".","line":90,"column":1,"nodeType":"Block","endLine":90,"endColumn":1},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"attribute\" type.","line":90,"column":1,"nodeType":"Block","endLine":90,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * ElementActions utility object for CX / SX browser test suite\n * Copied from WikiLambda test suite.\n *\n * Contains general actions that are performed on the browser elements\n *\n * General Actions includes\n * [1] Click on the element\n * [2] Set the input\n * [3] Get the text from the selector\n * [4] Clear the input\n * [5] Get the value from the input selector\n * [6] Scroll the element into the viewport\n *\n * @copyright 2020– Abstract Wikipedia team; see AUTHORS.txt\n * @license MIT\n */\n\n'use strict';\nconst { Element: WebdriverIOElementType } = require( 'webdriverio' );\n\nclass ElementAction {\n\t/**\n\t * Wait for the element to be displayed, then click on the element\n\t *\n\t * @async\n\t * @param {Promise<WebdriverIOElementType>} selector - selector of the element to be clicked\n\t * @return {void}\n\t */\n\tasync doClick( selector ) {\n\t\tawait selector.waitForDisplayed( { timeout: 15000 } );\n\t\tawait selector.click();\n\t}\n\n\t/**\n\t * Wait for the element to be displayed and enabled, then click on the element\n\t *\n\t * @async\n\t * @param {Promise<WebdriverIOElementType>} selector - selector of the element to be clicked\n\t * @return {void}\n\t */\n\tasync doEnabledClick( selector ) {\n\t\tawait selector.waitForDisplayed();\n\t\tawait selector.waitForEnabled();\n\t\tawait selector.click();\n\t}\n\n\t/**\n\t * Wait for the element to be displayed, then set the text into the input\n\t *\n\t * @async\n\t * @param {Promise<WebdriverIOElementType>} selector - selector of the input field\n\t * @param {string} inputText - Text to enter into the input field\n\t * @return {void}\n\t */\n\tasync setInput( selector, inputText ) {\n\t\tawait selector.waitForDisplayed();\n\t\tawait selector.click();\n\t\tawait selector.setValue( inputText );\n\t}\n\n\t/**\n\t * Get the value from the input selector\n\t *\n\t * @async\n\t * @param {Promise<WebdriverIOElementType>} inputSelector\n\t * @return {Promise<string>}\n\t */\n\tasync getValue( inputSelector ) {\n\t\tawait inputSelector.waitForDisplayed();\n\t\treturn await inputSelector.getValue();\n\t}\n\n\t/**\n\t * Get the text from the selector\n\t *\n\t * @async\n\t * @param {Promise<WebdriverIOElementType>} selector\n\t * @return {Promise<string>}\n\t */\n\tasync getText( selector ) {\n\t\tawait selector.waitForDisplayed();\n\t\treturn await selector.getText();\n\t}\n\n\t/**\n\t * Get the text from the selector\n\t *\n\t * @async\n\t * @param attribute\n\t * @param {Promise<WebdriverIOElementType>} selector\n\t * @return {Promise<string>}\n\t */\n\tasync getAttribute( selector, attribute ) {\n\t\tawait selector.waitForDisplayed();\n\t\treturn await selector.getAttribute( attribute );\n\t}\n\n\t/**\n\t * WebdriverIO docs mentions that setValue should first clear the input and then\n\t * set the input. However this does not happen.\n\t * The following is a temporarily solution to clear the input.\n\t *\n\t * @async\n\t * @param {Promise<WebdriverIOElementType>} inputSelector - selector of the input field\n\t */\n\tasync clearInput( inputSelector ) {\n\t\tawait inputSelector.waitForDisplayed();\n\t\tawait inputSelector.click();\n\t\tawait inputSelector.setValue( '' );\n\t}\n\n\t/**\n\t * Scroll element into viewport\n\t *\n\t * @async\n\t * @param {Promise<WebdriverIOElementType>} selector - Selector of the element\n\t * @return {void}\n\t */\n\tasync scrollIntoView( selector ) {\n\t\tawait selector.waitForExist();\n\t\tawait selector.scrollIntoView( { block: 'center', inline: 'center' } );\n\t}\n}\n\nmodule.exports = new ElementAction();\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/utils/InterceptorService.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/utils/SelectionHelper.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/wdio.conf.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","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":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]

--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated stylelint-stylistic@0.4.3: This package has been deprecated in favor of @stylistic/stylelint-plugin
--- stdout ---

added 1083 packages, and audited 1084 packages in 27s

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

4 moderate severity vulnerabilities

Some issues need review, and may require choosing
a different dependency.

Run `npm audit` for details.

--- end ---
$ /usr/bin/npm test
--- stderr ---
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: @vue/server-renderer@3.4.19
npm WARN Found: vue@3.3.9
npm WARN node_modules/vue
npm WARN   dev vue@"3.3.9" from the root project
npm WARN   8 more (vue-demi, @vitejs/plugin-vue, @vue/server-renderer, ...)
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer vue@"3.4.19" from @vue/server-renderer@3.4.19
npm WARN node_modules/@vue/test-utils/node_modules/@vue/server-renderer
npm WARN   optional @vue/server-renderer@"^3.0.1" from @vue/test-utils@2.3.2
npm WARN   node_modules/@vue/test-utils
npm WARN 
npm WARN Conflicting peer dependency: vue@3.4.19
npm WARN node_modules/vue
npm WARN   peer vue@"3.4.19" from @vue/server-renderer@3.4.19
npm WARN   node_modules/@vue/test-utils/node_modules/@vue/server-renderer
npm WARN     optional @vue/server-renderer@"^3.0.1" from @vue/test-utils@2.3.2
npm WARN     node_modules/@vue/test-utils
npm WARN deprecated sourcemap-codec@1.4.8: Please use @jridgewell/sourcemap-codec instead
npm WARN deprecated iltorb@2.4.5: The zlib module provides APIs for brotli compression/decompression starting with Node.js v10.16.0, please use it over iltorb
PASS src/utils/publishHelper.test.js
PASS src/components/SXTranslationConfirmer/useActionPanel.test.js
PASS src/composables/useTranslationSave.test.js
PASS src/components/SXPublisher/useTranslationPublish.test.js
PASS src/composables/useSuggestionsFetch.test.js
  ● Console

    console.error
      No suggestion seed found! Suggestion fetching will fail!

      113 |     // or if no seeds were fetched from the "seeds-fetching" API
      114 |     if (!currentSeedCollection || !currentSeedCollection.seeds.length) {
    > 115 |       mw.log.error("No suggestion seed found! Suggestion fetching will fail!");
          |              ^
      116 |
      117 |       return null;
      118 |     }

      at error (src/composables/useSuggestionsFetch.js:115:14)
      at getSuggestionSeed (src/composables/useSuggestionsFetch.js:190:26)
      at Object.<anonymous> (src/composables/useSuggestionsFetch.test.js:144:5)

PASS src/components/SXSentenceSelector/tests/SubSection.test.js
[@vue/compiler-sfc] `defineProps` is a compiler macro and no longer needs to be imported.

[@vue/compiler-sfc] `defineEmits` is a compiler macro and no longer needs to be imported.

PASS src/components/SXPublisher/useEditTranslation.test.js (5.143 s)
PASS src/components/SXTranslationConfirmer/SXTranslationConfirmerActionPanel.test.js
PASS src/components/SXArticleSearch/SXArticleSearch.test.js (5.095 s)
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton class="pa-0 ms-4" weight="quiet" onClick=fn<close> > 
        at <MwCol shrink="" align="start" class="pe-4" > 
        at <MwRow class="sx-article-search__header ma-0 py-3" align="stretch" justify="start" > 
        at <SXArticleSearch ref="VTU_COMPONENT" > 
        at <VTUROOT>

      74 |
      75 | describe("SXArticleSearch component test", () => {
    > 76 |   const wrapper = mount(SXArticleSearch, {
         |                        ^
      77 |     global: {
      78 |       plugins: [mockStore, router, i18n, eventLogging, BreakpointsPlugin],
      79 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at src/components/SXArticleSearch/SXArticleSearch.test.js:76:24
      at Object.describe (src/components/SXArticleSearch/SXArticleSearch.test.js:75:1)

    console.error
      [vuex] unknown mutation type: translator/clearTranslationsByStatus

      15 |   const fetchTranslationsByStatus = async (status) => {
      16 |     let translations = await cxTranslatorApi.fetchTranslations(status);
    > 17 |     store.commit("translator/clearTranslationsByStatus", status);
         |           ^
      18 |
      19 |     translations.forEach((translation) =>
      20 |       store.commit("translator/addTranslation", translation)

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/composables/useTranslationsFetch.js:17:11)
          at async Promise.all (index 0)

    console.error
      [vuex] unknown mutation type: translator/setTranslationsLoaded

      29 |     }
      30 |
    > 31 |     store.commit("translator/setTranslationsLoaded", { status, value: true });
         |           ^
      32 |
      33 |     for (const [sourceLanguage, translations] of Object.entries(queue)) {
      34 |       store.dispatch("mediawiki/fetchPageMetadata", {

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/composables/useTranslationsFetch.js:31:11)
          at async Promise.all (index 0)

    console.error
      [vuex] unknown mutation type: translator/clearTranslationsByStatus

      15 |   const fetchTranslationsByStatus = async (status) => {
      16 |     let translations = await cxTranslatorApi.fetchTranslations(status);
    > 17 |     store.commit("translator/clearTranslationsByStatus", status);
         |           ^
      18 |
      19 |     translations.forEach((translation) =>
      20 |       store.commit("translator/addTranslation", translation)

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/composables/useTranslationsFetch.js:17:11)
          at async Promise.all (index 1)

    console.error
      [vuex] unknown mutation type: translator/setTranslationsLoaded

      29 |     }
      30 |
    > 31 |     store.commit("translator/setTranslationsLoaded", { status, value: true });
         |           ^
      32 |
      33 |     for (const [sourceLanguage, translations] of Object.entries(queue)) {
      34 |       store.dispatch("mediawiki/fetchPageMetadata", {

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/composables/useTranslationsFetch.js:31:11)
          at async Promise.all (index 1)

    console.error
      [vuex] unknown mutation type: application/setPreviousRoute

      93 | router.beforeEach((to, from, next) => {
      94 |   const store = useStore();
    > 95 |   store.commit("application/setPreviousRoute", from.name);
         |         ^
      96 |
      97 |   if (!mw.user.isAnon()) {
      98 |     userApi.assertUser().catch((error) => {

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/router/index.js:95:9)
      at node_modules/vue-router/dist/vue-router.cjs:1998:35
      at node_modules/vue-router/dist/vue-router.cjs:1970:18
      at Object.runWithContext (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3878:18)
      at runWithContext (node_modules/vue-router/dist/vue-router.cjs:3224:19)
      at node_modules/vue-router/dist/vue-router.cjs:3574:69

PASS src/utils/getInitialLanguagePair.test.js
PASS src/components/SXPublisher/useMtValidate.test.js
PASS src/components/SXPublisher/SXPublisherReviewInfo.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="pa-0 me-1" onClick=fn<goToPreviousMessage> > 
        at <MwCol key=0 class="sx-publisher__review-info__navigation-buttons justify-end" align="center" > 
        at <MwRow justify="between" class="ma-0" > 
        at <MwCol id="-label" tag="span" grow=""  ... > 
        at <MwRow key=0 class="mw-ui-message--error mw-ui-message sx-publisher__review-info ma-0 pa-4 sx-publisher__review-info--error" aria-live=null  ... > 
        at <MwMessage type="error" class="sx-publisher__review-info ma-0 pa-4 sx-publisher__review-info--error" inline=false > 
        at <SXPublisherReviewInfo publishFeedbackMessages= [
        PublishFeedbackMessage {
          text: '',
          title: '1',
          type: 'generic',
          status: 'error',
          details: null
        },
        PublishFeedbackMessage {
          text: '',
          title: '2',
          type: 'generic',
          status: 'warning',
          details: null
        },
        PublishFeedbackMessage {
          text: '',
          title: '3',
          type: 'generic',
          status: 'warning',
          details: null
        }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="pa-0 ms-1" onClick=fn<goToNextMessage> > 
        at <MwCol key=0 class="sx-publisher__review-info__navigation-buttons justify-end" align="center" > 
        at <MwRow justify="between" class="ma-0" > 
        at <MwCol id="-label" tag="span" grow=""  ... > 
        at <MwRow key=0 class="mw-ui-message--error mw-ui-message sx-publisher__review-info ma-0 pa-4 sx-publisher__review-info--error" aria-live=null  ... > 
        at <MwMessage type="error" class="sx-publisher__review-info ma-0 pa-4 sx-publisher__review-info--error" inline=false > 
        at <SXPublisherReviewInfo publishFeedbackMessages= [
        PublishFeedbackMessage {
          text: '',
          title: '1',
          type: 'generic',
          status: 'error',
          details: null
        },
        PublishFeedbackMessage {
          text: '',
          title: '2',
          type: 'generic',
          status: 'warning',
          details: null
        },
        PublishFeedbackMessage {
          text: '',
          title: '3',
          type: 'generic',
          status: 'warning',
          details: null
        }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)

PASS src/wiki/cx/models/subSection.test.js
PASS src/components/SXSentenceSelector/tests/ProposedTranslationCard.test.js
PASS src/utils/segmentedContentConverter.test.js
PASS src/store/modules/application/tests/actions/getCXServerToken.test.js
PASS src/components/SXPublisher/usePublishingComplete.test.js
PASS src/lib/mediawiki.ui/components/MWButton/MWButton.test.js
PASS src/components/SXSentenceSelector/tests/SXSentenceSelector.test.js
PASS src/components/SXArticleSearch/SearchResultsCard.test.js
PASS src/components/SXSentenceSelector/tests/ProposedTranslationActionButtons.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="sx-sentence-selector__previous-sentence-button col shrink pa-4" disabled=false  ... > 
        at <MwRow class="sx-sentence-selector__translation-action-buttons ma-0" > 
        at <ProposedTranslationActionButtons ref="VTU_COMPONENT" > 
        at <VTUROOT>

      14 |
      15 | describe("Test ProposedTranslationActionButtons SFC", () => {
    > 16 |   const wrapper = mount(ProposedTranslationActionButtons, {
         |                        ^
      17 |     global: { plugins: [i18n] },
      18 |   });
      19 |

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at src/components/SXSentenceSelector/tests/ProposedTranslationActionButtons.test.js:16:24
      at Object.describe (src/components/SXSentenceSelector/tests/ProposedTranslationActionButtons.test.js:15:1)

PASS src/store/modules/mediawiki/actions.test.js
PASS src/components/SXContentComparator/SXContentComparatorHeaderNavigation.test.js
PASS src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 0" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:20:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 1" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:20:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 2" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:20:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 3" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:20:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 0" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:38:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 1" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:38:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 2" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:38:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 3" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:38:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 0" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:48:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 1" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:48:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 2" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:48:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 3" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:48:21)

PASS src/components/SXArticleSearch/ArticleSuggestionsCard.test.js
PASS src/components/SXSentenceSelector/tests/ProposedTranslationHeader.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton class="sx-sentence-selector__proposed-translation__header-settings-button" weight="quiet" onClick=fn > 
        at <MwCol shrink="" class="pe-5" > 
        at <MwRow class="ma-0 ps-5 pb-4" > 
        at <MwCol class="sx-sentence-selector__proposed-translation__header pt-5 shrink" > 
        at <ProposedTranslationHeader ref="VTU_COMPONENT" > 
        at <VTUROOT>

      14 |   const store = createStore({ modules: { application: applicationModule } });
      15 |
    > 16 |   const wrapper = mount(ProposedTranslationHeader, {
         |                        ^
      17 |     global: { plugins: [store, i18n] },
      18 |   });
      19 |

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at src/components/SXSentenceSelector/tests/ProposedTranslationHeader.test.js:16:24
      at Object.describe (src/components/SXSentenceSelector/tests/ProposedTranslationHeader.test.js:9:1)

PASS src/components/SXTranslationConfirmer/SXTranslationConfirmerArticleInformation.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton class="px-0" weight="quiet" action="default"  ... > 
        at <MwCol shrink="" align="start" > 
        at <MwRow justify="between" class="sx-translation-confirmer__article-information__header ma-0 mb-2" > 
        at <MwCol> 
        at <MwRow class="sx-translation-confirmer__article-information ma-0 pa-4" align="stretch" justify="start" > 
        at <SXTranslationConfirmerArticleInformation ref="VTU_COMPONENT" > 
        at <VTUROOT>

      39 |
      40 | describe("SXTranslationConfirmerArticleInformation test", () => {
    > 41 |   const wrapper = mount(SXTranslationConfirmerArticleInformation, {
         |                        ^
      42 |     global: { plugins: [i18n, colors, mockStore] },
      43 |   });
      44 |

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at src/components/SXTranslationConfirmer/SXTranslationConfirmerArticleInformation.test.js:41:24
      at Object.describe (src/components/SXTranslationConfirmer/SXTranslationConfirmerArticleInformation.test.js:40:1)

PASS src/lib/mediawiki.ui/components/MWSelect/MWSelect.test.js
PASS src/utils/debounce.test.js
PASS src/utils/mtHelper.test.js
PASS src/components/SXSectionSelector/SXSectionSelectorSectionListPresent.test.js
PASS src/plugins/eventlogging/logEvent.test.js
PASS src/lib/mediawiki.ui/components/MWInput/MWInput.test.js
PASS src/components/SXArticleSearch/useSuggestedSourceLanguages.test.js
PASS src/components/SXSentenceSelector/tests/SXSentenceSelectorContentHeader.test.js
PASS src/components/SXArticleSearch/SXSearchArticleSuggestion.test.js
PASS src/utils/mtValidator.test.js
PASS src/lib/mediawiki.ui/components/MWExpandableContent/MWExpandableContent.test.js
PASS src/utils/dateHelper.test.js
PASS src/store/modules/suggestions/suggestions.test.js
PASS src/lib/mediawiki.ui/components/MWButtonGroup/MWButtonGroup.test.js
PASS src/lib/mediawiki.ui/components/MWIcon/MWIcon.test.js
PASS src/lib/mediawiki.ui/components/MWRadioGroup/MWRadioGroup.test.js
PASS src/lib/mediawiki.ui/components/MWMessage/MWMessage.test.js
PASS src/lib/mediawiki.ui/components/MWCircularProgressBar/MWCircleProgressBar.test.js
PASS src/plugins/eventlogging/translationSessionPosition.test.js
PASS src/components/SXSectionSelector/SXSectionSelectorViewArticleItem.test.js
PASS src/lib/mediawiki.ui/components/MWThumbnail/MWThumbnail.test.js
PASS src/lib/mediawiki.ui/components/MWRadioGroup/MWRadio.test.js
PASS src/lib/mediawiki.ui/components/MWCard/MWcard.test.js
PASS src/lib/mediawiki.ui/components/MWDialog/MWDialog.test.js
PASS src/lib/mediawiki.ui/components/MWBottomNavigation/MWBottomNavigation.test.js
PASS src/wiki/cx/models/sectionSuggestion.test.js
PASS src/utils/mediawikiHelper.test.js
PASS src/components/SXSentenceSelector/tests/RetryMtCard.test.js

Test Suites: 55 passed, 55 total
Tests:       143 passed, 143 total
Snapshots:   38 passed, 38 total
Time:        13.485 s
Ran all test suites.
--- stdout ---

> test
> npm run test:cx2 && npm run test:cx3


> test:cx2
> npm -s run lint

Checked 1 message directory.

/src/repo/modules/dashboard/mw.cx.DashboardList.js
  127:7  warning  'language' is already declared in the upper scope on line 122 column 13  no-shadow

/src/repo/modules/entrypoints/ext.cx.entrypoints.mffrequentlanguages.js
  148:1  warning  The type 'LanguageSearcher' is undefined  jsdoc/no-undefined-types

/src/repo/modules/entrypoints/ext.cx.entrypoints.recentedit/RecentEditEntrypointInvitation.vue
   8:7  warning  Don't use 'v-text'  vue/no-v-text
  32:6  warning  Don't use 'v-text'  vue/no-v-text
  61:7  warning  Don't use 'v-text'  vue/no-v-text
  66:6  warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/entrypoints/ext.cx.entrypoints.recenttranslation/RecentTranslationEntrypointDialog.vue
   7:10  warning  Don't use 'v-text'  vue/no-v-text
  16:6   warning  Don't use 'v-text'  vue/no-v-text
  22:6   warning  Don't use 'v-text'  vue/no-v-text
  33:7   warning  Don't use 'v-text'  vue/no-v-text
  37:12  warning  Don't use 'v-text'  vue/no-v-text
  38:11  warning  Don't use 'v-text'  vue/no-v-text
  41:12  warning  Don't use 'v-text'  vue/no-v-text
  42:11  warning  Don't use 'v-text'  vue/no-v-text
  46:12  warning  Don't use 'v-text'  vue/no-v-text
  47:11  warning  Don't use 'v-text'  vue/no-v-text
  57:13  warning  Don't use 'v-text'  vue/no-v-text
  64:8   warning  Don't use 'v-text'  vue/no-v-text
  78:7   warning  Don't use 'v-text'  vue/no-v-text
  86:13  warning  Don't use 'v-text'  vue/no-v-text
  90:7   warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages/CxUlsEntrypoint.vue
  30:6  warning  Don't use 'v-text'  vue/no-v-text
  40:5  warning  Don't use 'v-text'  vue/no-v-text
  68:7  warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/mw.cx.TargetArticle.js
  356:1  warning  The type 'publishErrorCaptcha' is undefined  jsdoc/no-undefined-types

/src/repo/modules/mw.cx.init.Translation.js
  131:1  warning  Syntax error in type: Promise<[Object, mw.cx.dm.DraftTranslationDTO|null]>  jsdoc/valid-types

/src/repo/modules/stats/ext.cx.stats.js
  617:55  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  629:55  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  641:49  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  662:58  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  674:58  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  686:52  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  698:55  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  718:55  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  727:55  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  736:49  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  757:58  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  766:58  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  775:52  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  784:55  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow

/src/repo/modules/ui/mw.cx.ui.ArticleColumn.js
  17:1  warning  Duplicate @param "config.sectionTitle"  jsdoc/check-param-names

/src/repo/modules/ui/mw.cx.ui.SourceColumn.js
  6:1  warning  @param path declaration ("config.siteMapper") appears before any real parameter  jsdoc/check-param-names

/src/repo/modules/ui/widgets/mw.cx.ui.CategoryTagItemWidget.js
  65:1  warning  The type 'mouseenter' is undefined  jsdoc/no-undefined-types
  74:1  warning  The type 'mouseleave' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ui/widgets/mw.cx.ui.PageSelectorWidget.js
  219:31  warning  'pages' is already declared in the upper scope on line 184 column 71  no-shadow

/src/repo/modules/ui/widgets/mw.cx.ui.PageTitleWidget.js
  157:1  warning  The type 'enter' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ui/widgets/mw.cx.ui.SectionTitleWidget.js
  99:1  warning  The type 'enter' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-cx/dm/mixins/ve.dm.CXLintableNode.js
  52:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/modules/ve-cx/init/ve.init.mw.CXTarget.js
  590:1  warning  Missing JSDoc @return type  jsdoc/require-returns-type

/src/repo/tests/selenium/componentobjects/DesktopEditor.js
  43:2  warning  Missing JSDoc @return declaration  jsdoc/require-returns

/src/repo/tests/selenium/utils/ElementAction.js
  90:1  warning  Expected @param names to be "selector, attribute". Got "attribute, selector"  jsdoc/check-param-names
  90:1  warning  Missing JSDoc @param "attribute" type                                         jsdoc/require-param-type

✖ 52 problems (0 errors, 52 warnings)


> test:cx3
> cd app && npm run test


> cx3@0.2.0+20240401 test
> npm install && npm -s run test:bundle && npm run lint && npm run test:unit


added 945 packages, and audited 946 packages in 34s

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

4 vulnerabilities (3 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
There are no staged changes to the dist folder in this change.

> cx3@0.2.0+20240401 lint
> eslint .


/src/repo/app/src/components/SXArticleSearch/SXArticleSearch.snap.js
  3:9  warning  Replace ``SXArticleSearch·component·test·Component·output·matches·snapshot·1`` with `⏎··`SXArticleSearch·component·test·Component·output·matches·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXPublisher/SXPublisherReviewInfo.snap.js
   3:9  warning  Replace ``SXPublisher·review·info·panel·test·should·match·snapshot·when·no·publishFeedbackMessages·exist·1`` with `⏎··`SXPublisher·review·info·panel·test·should·match·snapshot·when·no·publishFeedbackMessages·exist·1`⏎`  prettier/prettier
  66:9  warning  Replace ``SXPublisher·review·info·panel·test·should·match·snapshot·when·the·active·message·is·a·warning·1`` with `⏎··`SXPublisher·review·info·panel·test·should·match·snapshot·when·the·active·message·is·a·warning·1`⏎`    prettier/prettier

/src/repo/app/src/components/SXSectionSelector/SXSectionSelectorSectionList.snap.js
    3:9  warning  Replace ``SXSectionSelector·Section·List·Component·output·matches·snapshot·for·specified·props·with·slot·1`` with `⏎··`SXSectionSelector·Section·List·Component·output·matches·snapshot·for·specified·props·with·slot·1`⏎`          prettier/prettier
  144:9  warning  Replace ``SXSectionSelector·Section·List·Component·output·matches·snapshot·for·specified·sections·with·label·1`` with `⏎··`SXSectionSelector·Section·List·Component·output·matches·snapshot·for·specified·sections·with·label·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSectionSelector/SXSectionSelectorSectionListPresent.snap.js
  3:9  warning  Replace ``SXSectionSelector·Section·List·Component·output·matches·snapshot·1`` with `⏎··`SXSectionSelector·Section·List·Component·output·matches·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSectionSelector/SXSectionSelectorViewArticleItem.snap.js
  3:9  warning  Replace ``SXSectionSelector·View·Article·Item·Component·output·matches·snapshot·for·specified·props·1`` with `⏎··`SXSectionSelector·View·Article·Item·Component·output·matches·snapshot·for·specified·props·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSentenceSelector/tests/ProposedTranslationActionButtons.snap.js
  3:9  warning  Replace ``Test·ProposedTranslationActionButtons·SFC·Component·output·should·match·snapshot·1`` with `⏎··`Test·ProposedTranslationActionButtons·SFC·Component·output·should·match·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSentenceSelector/tests/ProposedTranslationCard.snap.js
   3:9  warning  Replace ``Test·\`ProposedTranslationCard\`·test·Component·output·matches·snapshot·1`` with `⏎··`Test·\`ProposedTranslationCard\`·test·Component·output·matches·snapshot·1`⏎`                                                                                                                                              prettier/prettier
  58:9  warning  Replace ``Test·\`ProposedTranslationCard\`·test·Should·render·Retry·MT·card·inside·proposed·translation·card·output·when·no·proposed·translation·exists·1`` with `⏎··`Test·\`ProposedTranslationCard\`·test·Should·render·Retry·MT·card·inside·proposed·translation·card·output·when·no·proposed·translation·exists·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSentenceSelector/tests/ProposedTranslationHeader.snap.js
  3:9  warning  Replace ``SXSentenceSelector·Proposed·Translation·Header·Component·output·matches·snapshot·1`` with `⏎··`SXSentenceSelector·Proposed·Translation·Header·Component·output·matches·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSentenceSelector/tests/RetryMtCard.snap.js
  3:9  warning  Replace ``SXSentenceSelector·Retry·MT·Card·Component·output·matches·snapshot·1`` with `⏎··`SXSentenceSelector·Retry·MT·Card·Component·output·matches·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXTranslationConfirmer/SXTranslationConfirmerActionPanel.snap.js
    3:9  warning  Replace ``SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·1`` with `⏎··`SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·1`⏎`                                                                                                    prettier/prettier
   94:9  warning  Replace ``SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·for·tablet·or·larger·screens·1`` with `⏎··`SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·for·tablet·or·larger·screens·1`⏎`                                          prettier/prettier
  197:9  warning  Replace ``SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·for·tablet·or·larger·screens·with·.m.·in·the·url·1`` with `⏎··`SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·for·tablet·or·larger·screens·with·.m.·in·the·url·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXTranslationConfirmer/SXTranslationConfirmerArticleInformation.snap.js
  3:9  warning  Replace ``SXTranslationConfirmerArticleInformation·test·Component·output·matches·snapshot·1`` with `⏎··`SXTranslationConfirmerArticleInformation·test·Component·output·matches·snapshot·1`⏎`  prettier/prettier

✖ 16 problems (0 errors, 16 warnings)
  0 errors and 16 warnings potentially fixable with the `--fix` option.


> cx3@0.2.0+20240401 test:unit
> jest -c config/jest/jest.config.js


--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "mwbot": {
      "name": "mwbot",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "request"
      ],
      "effects": [
        "wdio-mediawiki"
      ],
      "range": ">=0.1.6",
      "nodes": [
        "node_modules/mwbot"
      ],
      "fixAvailable": false
    },
    "request": {
      "name": "request",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096727,
          "name": "request",
          "dependency": "request",
          "title": "Server-Side Request Forgery in Request",
          "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
          "severity": "moderate",
          "cwe": [
            "CWE-918"
          ],
          "cvss": {
            "score": 6.1,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
          },
          "range": "<=2.88.2"
        },
        "tough-cookie"
      ],
      "effects": [
        "mwbot"
      ],
      "range": "*",
      "nodes": [
        "node_modules/request"
      ],
      "fixAvailable": false
    },
    "tough-cookie": {
      "name": "tough-cookie",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096643,
          "name": "tough-cookie",
          "dependency": "tough-cookie",
          "title": "tough-cookie Prototype Pollution vulnerability",
          "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3",
          "severity": "moderate",
          "cwe": [
            "CWE-1321"
          ],
          "cvss": {
            "score": 6.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"
          },
          "range": "<4.1.3"
        }
      ],
      "effects": [
        "request"
      ],
      "range": "<4.1.3",
      "nodes": [
        "node_modules/tough-cookie"
      ],
      "fixAvailable": false
    },
    "wdio-mediawiki": {
      "name": "wdio-mediawiki",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "mwbot"
      ],
      "effects": [],
      "range": "*",
      "nodes": [
        "node_modules/wdio-mediawiki"
      ],
      "fixAvailable": false
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 4,
      "high": 0,
      "critical": 0,
      "total": 4
    },
    "dependencies": {
      "prod": 1,
      "dev": 1084,
      "optional": 42,
      "peer": 199,
      "peerOptional": 0,
      "total": 1084
    }
  }
}

--- end ---
Attempting to npm audit fix
$ /usr/bin/npm audit fix --dry-run --only=dev --json
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
--- stdout ---
{
  "added": 1,
  "removed": 0,
  "changed": 0,
  "audited": 1085,
  "funding": 201,
  "audit": {
    "auditReportVersion": 2,
    "vulnerabilities": {
      "mwbot": {
        "name": "mwbot",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          "request"
        ],
        "effects": [
          "wdio-mediawiki"
        ],
        "range": ">=0.1.6",
        "nodes": [
          "node_modules/mwbot"
        ],
        "fixAvailable": false
      },
      "request": {
        "name": "request",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          {
            "source": 1096727,
            "name": "request",
            "dependency": "request",
            "title": "Server-Side Request Forgery in Request",
            "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
            "severity": "moderate",
            "cwe": [
              "CWE-918"
            ],
            "cvss": {
              "score": 6.1,
              "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
            },
            "range": "<=2.88.2"
          },
          "tough-cookie"
        ],
        "effects": [
          "mwbot"
        ],
        "range": "*",
        "nodes": [
          "node_modules/request"
        ],
        "fixAvailable": false
      },
      "tough-cookie": {
        "name": "tough-cookie",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          {
            "source": 1096643,
            "name": "tough-cookie",
            "dependency": "tough-cookie",
            "title": "tough-cookie Prototype Pollution vulnerability",
            "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3",
            "severity": "moderate",
            "cwe": [
              "CWE-1321"
            ],
            "cvss": {
              "score": 6.5,
              "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"
            },
            "range": "<4.1.3"
          }
        ],
        "effects": [
          "request"
        ],
        "range": "<4.1.3",
        "nodes": [
          "node_modules/tough-cookie"
        ],
        "fixAvailable": false
      },
      "wdio-mediawiki": {
        "name": "wdio-mediawiki",
        "severity": "moderate",
        "isDirect": true,
        "via": [
          "mwbot"
        ],
        "effects": [],
        "range": "*",
        "nodes": [
          "node_modules/wdio-mediawiki"
        ],
        "fixAvailable": false
      }
    },
    "metadata": {
      "vulnerabilities": {
        "info": 0,
        "low": 0,
        "moderate": 4,
        "high": 0,
        "critical": 0,
        "total": 4
      },
      "dependencies": {
        "prod": 1,
        "dev": 1084,
        "optional": 42,
        "peer": 199,
        "peerOptional": 0,
        "total": 1084
      }
    }
  }
}

--- end ---
{"added": 1, "removed": 0, "changed": 0, "audited": 1085, "funding": 201, "audit": {"auditReportVersion": 2, "vulnerabilities": {"mwbot": {"name": "mwbot", "severity": "moderate", "isDirect": false, "via": ["request"], "effects": ["wdio-mediawiki"], "range": ">=0.1.6", "nodes": ["node_modules/mwbot"], "fixAvailable": false}, "request": {"name": "request", "severity": "moderate", "isDirect": false, "via": [{"source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": ["CWE-918"], "cvss": {"score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"}, "range": "<=2.88.2"}, "tough-cookie"], "effects": ["mwbot"], "range": "*", "nodes": ["node_modules/request"], "fixAvailable": false}, "tough-cookie": {"name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [{"source": 1096643, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": ["CWE-1321"], "cvss": {"score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"}, "range": "<4.1.3"}], "effects": ["request"], "range": "<4.1.3", "nodes": ["node_modules/tough-cookie"], "fixAvailable": false}, "wdio-mediawiki": {"name": "wdio-mediawiki", "severity": "moderate", "isDirect": true, "via": ["mwbot"], "effects": [], "range": "*", "nodes": ["node_modules/wdio-mediawiki"], "fixAvailable": false}}, "metadata": {"vulnerabilities": {"info": 0, "low": 0, "moderate": 4, "high": 0, "critical": 0, "total": 4}, "dependencies": {"prod": 1, "dev": 1084, "optional": 42, "peer": 199, "peerOptional": 0, "total": 1084}}}}
$ /usr/bin/npm audit fix --only=dev
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
--- stdout ---

up to date, audited 1084 packages in 3s

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

# npm audit report

request  *
Severity: moderate
Server-Side Request Forgery in Request - https://github.com/advisories/GHSA-p8p7-x288-28g6
Depends on vulnerable versions of tough-cookie
No fix available
node_modules/request
  mwbot  >=0.1.6
  Depends on vulnerable versions of request
  node_modules/mwbot
    wdio-mediawiki  *
    Depends on vulnerable versions of mwbot
    node_modules/wdio-mediawiki

tough-cookie  <4.1.3
Severity: moderate
tough-cookie Prototype Pollution vulnerability - https://github.com/advisories/GHSA-72xf-g2v4-qvf3
No fix available
node_modules/tough-cookie

4 moderate severity vulnerabilities

Some issues need review, and may require choosing
a different dependency.

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

--- end ---
Verifying that tests still pass
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated stylelint-stylistic@0.4.3: This package has been deprecated in favor of @stylistic/stylelint-plugin
--- stdout ---

added 1083 packages, and audited 1084 packages in 26s

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

4 moderate severity vulnerabilities

Some issues need review, and may require choosing
a different dependency.

Run `npm audit` for details.

--- end ---
$ /usr/bin/npm test
--- stderr ---
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: @vue/server-renderer@3.4.19
npm WARN Found: vue@3.3.9
npm WARN node_modules/vue
npm WARN   dev vue@"3.3.9" from the root project
npm WARN   8 more (vue-demi, @vitejs/plugin-vue, @vue/server-renderer, ...)
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer vue@"3.4.19" from @vue/server-renderer@3.4.19
npm WARN node_modules/@vue/test-utils/node_modules/@vue/server-renderer
npm WARN   optional @vue/server-renderer@"^3.0.1" from @vue/test-utils@2.3.2
npm WARN   node_modules/@vue/test-utils
npm WARN 
npm WARN Conflicting peer dependency: vue@3.4.19
npm WARN node_modules/vue
npm WARN   peer vue@"3.4.19" from @vue/server-renderer@3.4.19
npm WARN   node_modules/@vue/test-utils/node_modules/@vue/server-renderer
npm WARN     optional @vue/server-renderer@"^3.0.1" from @vue/test-utils@2.3.2
npm WARN     node_modules/@vue/test-utils
PASS src/components/SXPublisher/useEditTranslation.test.js
PASS src/components/SXTranslationConfirmer/SXTranslationConfirmerActionPanel.test.js
PASS src/components/SXArticleSearch/SXArticleSearch.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton class="pa-0 ms-4" weight="quiet" onClick=fn<close> > 
        at <MwCol shrink="" align="start" class="pe-4" > 
        at <MwRow class="sx-article-search__header ma-0 py-3" align="stretch" justify="start" > 
        at <SXArticleSearch ref="VTU_COMPONENT" > 
        at <VTUROOT>

      74 |
      75 | describe("SXArticleSearch component test", () => {
    > 76 |   const wrapper = mount(SXArticleSearch, {
         |                        ^
      77 |     global: {
      78 |       plugins: [mockStore, router, i18n, eventLogging, BreakpointsPlugin],
      79 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at src/components/SXArticleSearch/SXArticleSearch.test.js:76:24
      at Object.describe (src/components/SXArticleSearch/SXArticleSearch.test.js:75:1)

    console.error
      [vuex] unknown mutation type: translator/clearTranslationsByStatus

      15 |   const fetchTranslationsByStatus = async (status) => {
      16 |     let translations = await cxTranslatorApi.fetchTranslations(status);
    > 17 |     store.commit("translator/clearTranslationsByStatus", status);
         |           ^
      18 |
      19 |     translations.forEach((translation) =>
      20 |       store.commit("translator/addTranslation", translation)

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/composables/useTranslationsFetch.js:17:11)
          at async Promise.all (index 0)

    console.error
      [vuex] unknown mutation type: translator/setTranslationsLoaded

      29 |     }
      30 |
    > 31 |     store.commit("translator/setTranslationsLoaded", { status, value: true });
         |           ^
      32 |
      33 |     for (const [sourceLanguage, translations] of Object.entries(queue)) {
      34 |       store.dispatch("mediawiki/fetchPageMetadata", {

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/composables/useTranslationsFetch.js:31:11)
          at async Promise.all (index 0)

    console.error
      [vuex] unknown mutation type: translator/clearTranslationsByStatus

      15 |   const fetchTranslationsByStatus = async (status) => {
      16 |     let translations = await cxTranslatorApi.fetchTranslations(status);
    > 17 |     store.commit("translator/clearTranslationsByStatus", status);
         |           ^
      18 |
      19 |     translations.forEach((translation) =>
      20 |       store.commit("translator/addTranslation", translation)

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/composables/useTranslationsFetch.js:17:11)
          at async Promise.all (index 1)

    console.error
      [vuex] unknown mutation type: translator/setTranslationsLoaded

      29 |     }
      30 |
    > 31 |     store.commit("translator/setTranslationsLoaded", { status, value: true });
         |           ^
      32 |
      33 |     for (const [sourceLanguage, translations] of Object.entries(queue)) {
      34 |       store.dispatch("mediawiki/fetchPageMetadata", {

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/composables/useTranslationsFetch.js:31:11)
          at async Promise.all (index 1)

    console.error
      [vuex] unknown mutation type: application/setPreviousRoute

      93 | router.beforeEach((to, from, next) => {
      94 |   const store = useStore();
    > 95 |   store.commit("application/setPreviousRoute", from.name);
         |         ^
      96 |
      97 |   if (!mw.user.isAnon()) {
      98 |     userApi.assertUser().catch((error) => {

      at Store.commit (node_modules/vuex/dist/vuex.cjs.js:1001:15)
      at Store.boundCommit [as commit] (node_modules/vuex/dist/vuex.cjs.js:942:19)
      at commit (src/router/index.js:95:9)
      at node_modules/vue-router/dist/vue-router.cjs:1998:35
      at node_modules/vue-router/dist/vue-router.cjs:1970:18
      at Object.runWithContext (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3878:18)
      at runWithContext (node_modules/vue-router/dist/vue-router.cjs:3224:19)
      at node_modules/vue-router/dist/vue-router.cjs:3574:69

PASS src/components/SXPublisher/useTranslationPublish.test.js
PASS src/utils/publishHelper.test.js
PASS src/components/SXTranslationConfirmer/useActionPanel.test.js
PASS src/composables/useSuggestionsFetch.test.js
  ● Console

    console.error
      No suggestion seed found! Suggestion fetching will fail!

      113 |     // or if no seeds were fetched from the "seeds-fetching" API
      114 |     if (!currentSeedCollection || !currentSeedCollection.seeds.length) {
    > 115 |       mw.log.error("No suggestion seed found! Suggestion fetching will fail!");
          |              ^
      116 |
      117 |       return null;
      118 |     }

      at error (src/composables/useSuggestionsFetch.js:115:14)
      at getSuggestionSeed (src/composables/useSuggestionsFetch.js:190:26)
      at Object.<anonymous> (src/composables/useSuggestionsFetch.test.js:144:5)

PASS src/components/SXSentenceSelector/tests/SubSection.test.js
PASS src/composables/useTranslationSave.test.js
PASS src/components/SXSentenceSelector/tests/SXSentenceSelector.test.js
PASS src/components/SXPublisher/SXPublisherReviewInfo.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="pa-0 me-1" onClick=fn<goToPreviousMessage> > 
        at <MwCol key=0 class="sx-publisher__review-info__navigation-buttons justify-end" align="center" > 
        at <MwRow justify="between" class="ma-0" > 
        at <MwCol id="-label" tag="span" grow=""  ... > 
        at <MwRow key=0 class="mw-ui-message--error mw-ui-message sx-publisher__review-info ma-0 pa-4 sx-publisher__review-info--error" aria-live=null  ... > 
        at <MwMessage type="error" class="sx-publisher__review-info ma-0 pa-4 sx-publisher__review-info--error" inline=false > 
        at <SXPublisherReviewInfo publishFeedbackMessages= [
        PublishFeedbackMessage {
          text: '',
          title: '1',
          type: 'generic',
          status: 'error',
          details: null
        },
        PublishFeedbackMessage {
          text: '',
          title: '2',
          type: 'generic',
          status: 'warning',
          details: null
        },
        PublishFeedbackMessage {
          text: '',
          title: '3',
          type: 'generic',
          status: 'warning',
          details: null
        }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="pa-0 ms-1" onClick=fn<goToNextMessage> > 
        at <MwCol key=0 class="sx-publisher__review-info__navigation-buttons justify-end" align="center" > 
        at <MwRow justify="between" class="ma-0" > 
        at <MwCol id="-label" tag="span" grow=""  ... > 
        at <MwRow key=0 class="mw-ui-message--error mw-ui-message sx-publisher__review-info ma-0 pa-4 sx-publisher__review-info--error" aria-live=null  ... > 
        at <MwMessage type="error" class="sx-publisher__review-info ma-0 pa-4 sx-publisher__review-info--error" inline=false > 
        at <SXPublisherReviewInfo publishFeedbackMessages= [
        PublishFeedbackMessage {
          text: '',
          title: '1',
          type: 'generic',
          status: 'error',
          details: null
        },
        PublishFeedbackMessage {
          text: '',
          title: '2',
          type: 'generic',
          status: 'warning',
          details: null
        },
        PublishFeedbackMessage {
          text: '',
          title: '3',
          type: 'generic',
          status: 'warning',
          details: null
        }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)

PASS src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 0" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:20:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 1" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:20:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 2" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:20:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 3" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:20:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 0" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:38:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 1" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:38:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 2" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:38:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 3" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:38:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 0" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:48:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 1" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:48:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 2" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:48:21)

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="col justify-between items-center py-3 px-4" onClick=fn<onClick> > 
        at <MwRow key="source section 3" tag="li" class="ma-0" > 
        at <SXSectionSelectorSectionList sections= [
        { sourceTitle: 'source section 0', targetTitle: 'target section 0' },
        { sourceTitle: 'source section 1', targetTitle: 'target section 1' },
        { sourceTitle: 'source section 2', targetTitle: 'target section 2' },
        { sourceTitle: 'source section 3', targetTitle: 'target section 3' }
      ] ref="VTU_COMPONENT" > 
        at <VTUROOT>

      10 |
      11 | const createWrapper = (options = {}) =>
    > 12 |   mount(SXSectionSelectorSectionList, {
         |        ^
      13 |     props: {
      14 |       sections,
      15 |     },

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:12:8)
      at Object.createWrapper (src/components/SXSectionSelector/SXSectionSelectorSectionList.test.js:48:21)

PASS src/components/SXSentenceSelector/tests/ProposedTranslationHeader.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton class="sx-sentence-selector__proposed-translation__header-settings-button" weight="quiet" onClick=fn > 
        at <MwCol shrink="" class="pe-5" > 
        at <MwRow class="ma-0 ps-5 pb-4" > 
        at <MwCol class="sx-sentence-selector__proposed-translation__header pt-5 shrink" > 
        at <ProposedTranslationHeader ref="VTU_COMPONENT" > 
        at <VTUROOT>

      14 |   const store = createStore({ modules: { application: applicationModule } });
      15 |
    > 16 |   const wrapper = mount(ProposedTranslationHeader, {
         |                        ^
      17 |     global: { plugins: [store, i18n] },
      18 |   });
      19 |

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at src/components/SXSentenceSelector/tests/ProposedTranslationHeader.test.js:16:24
      at Object.describe (src/components/SXSentenceSelector/tests/ProposedTranslationHeader.test.js:9:1)

PASS src/components/SXTranslationConfirmer/SXTranslationConfirmerArticleInformation.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton class="px-0" weight="quiet" action="default"  ... > 
        at <MwCol shrink="" align="start" > 
        at <MwRow justify="between" class="sx-translation-confirmer__article-information__header ma-0 mb-2" > 
        at <MwCol> 
        at <MwRow class="sx-translation-confirmer__article-information ma-0 pa-4" align="stretch" justify="start" > 
        at <SXTranslationConfirmerArticleInformation ref="VTU_COMPONENT" > 
        at <VTUROOT>

      39 |
      40 | describe("SXTranslationConfirmerArticleInformation test", () => {
    > 41 |   const wrapper = mount(SXTranslationConfirmerArticleInformation, {
         |                        ^
      42 |     global: { plugins: [i18n, colors, mockStore] },
      43 |   });
      44 |

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at src/components/SXTranslationConfirmer/SXTranslationConfirmerArticleInformation.test.js:41:24
      at Object.describe (src/components/SXTranslationConfirmer/SXTranslationConfirmerArticleInformation.test.js:40:1)

PASS src/components/SXSectionSelector/SXSectionSelectorSectionListPresent.test.js
PASS src/components/SXSentenceSelector/tests/ProposedTranslationCard.test.js
PASS src/components/SXArticleSearch/SXSearchArticleSuggestion.test.js
PASS src/components/SXArticleSearch/SearchResultsCard.test.js
PASS src/components/SXSentenceSelector/tests/ProposedTranslationActionButtons.test.js
  ● Console

    console.warn
      [Vue warn]: CdxButton: Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button 
        at <CdxButton weight="quiet" class="sx-sentence-selector__previous-sentence-button col shrink pa-4" disabled=false  ... > 
        at <MwRow class="sx-sentence-selector__translation-action-buttons ma-0" > 
        at <ProposedTranslationActionButtons ref="VTU_COMPONENT" > 
        at <VTUROOT>

      14 |
      15 | describe("Test ProposedTranslationActionButtons SFC", () => {
    > 16 |   const wrapper = mount(ProposedTranslationActionButtons, {
         |                        ^
      17 |     global: { plugins: [i18n] },
      18 |   });
      19 |

      at Object.warn (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:41:13)
      at Me (node_modules/@wikimedia/codex/dist/codex.cjs:1:6163)
      at $t (node_modules/@wikimedia/codex/dist/codex.cjs:1:6386)
      at setup (node_modules/@wikimedia/codex/dist/codex.cjs:1:6940)
      at callWithErrorHandling (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:156:18)
      at setupStatefulComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7277:25)
      at setupComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:7238:36)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5635:7)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at processFragment (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5548:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5061:9)
      at mountChildren (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5331:7)
      at mountElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5238:7)
      at processElement (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5203:7)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5075:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at ReactiveEffect.componentUpdateFn [as fn] (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5744:11)
      at ReactiveEffect.run (node_modules/@vue/reactivity/dist/reactivity.cjs.js:182:19)
      at instance.update (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5850:51)
      at setupRenderEffect (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5858:5)
      at mountComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5648:5)
      at processComponent (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5601:9)
      at patch (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:5087:11)
      at render (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:6368:7)
      at mount (node_modules/@vue/runtime-core/dist/runtime-core.cjs.js:3837:13)
      at Object.app.mount (node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js:1396:19)
      at mount (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:8279:18)
      at src/components/SXSentenceSelector/tests/ProposedTranslationActionButtons.test.js:16:24
      at Object.describe (src/components/SXSentenceSelector/tests/ProposedTranslationActionButtons.test.js:15:1)

PASS src/lib/mediawiki.ui/components/MWSelect/MWSelect.test.js
PASS src/components/SXSentenceSelector/tests/RetryMtCard.test.js
PASS src/components/SXSentenceSelector/tests/SXSentenceSelectorContentHeader.test.js
PASS src/lib/mediawiki.ui/components/MWMessage/MWMessage.test.js
PASS src/components/SXContentComparator/SXContentComparatorHeaderNavigation.test.js
PASS src/components/SXArticleSearch/ArticleSuggestionsCard.test.js
PASS src/lib/mediawiki.ui/components/MWBottomNavigation/MWBottomNavigation.test.js
PASS src/lib/mediawiki.ui/components/MWExpandableContent/MWExpandableContent.test.js
PASS src/lib/mediawiki.ui/components/MWInput/MWInput.test.js
PASS src/lib/mediawiki.ui/components/MWDialog/MWDialog.test.js
PASS src/lib/mediawiki.ui/components/MWRadioGroup/MWRadioGroup.test.js
PASS src/lib/mediawiki.ui/components/MWCard/MWcard.test.js
PASS src/lib/mediawiki.ui/components/MWThumbnail/MWThumbnail.test.js
PASS src/lib/mediawiki.ui/components/MWRadioGroup/MWRadio.test.js
PASS src/lib/mediawiki.ui/components/MWButton/MWButton.test.js
PASS src/lib/mediawiki.ui/components/MWButtonGroup/MWButtonGroup.test.js
PASS src/components/SXSectionSelector/SXSectionSelectorViewArticleItem.test.js
PASS src/components/SXArticleSearch/useSuggestedSourceLanguages.test.js
PASS src/lib/mediawiki.ui/components/MWIcon/MWIcon.test.js
PASS src/utils/getInitialLanguagePair.test.js
PASS src/lib/mediawiki.ui/components/MWCircularProgressBar/MWCircleProgressBar.test.js
PASS src/components/SXPublisher/usePublishingComplete.test.js
PASS src/components/SXPublisher/useMtValidate.test.js
PASS src/store/modules/application/tests/actions/getCXServerToken.test.js
PASS src/utils/segmentedContentConverter.test.js
PASS src/wiki/cx/models/subSection.test.js
PASS src/utils/dateHelper.test.js
PASS src/store/modules/mediawiki/actions.test.js
PASS src/utils/mtValidator.test.js
PASS src/wiki/cx/models/sectionSuggestion.test.js
PASS src/utils/debounce.test.js
PASS src/store/modules/suggestions/suggestions.test.js
PASS src/plugins/eventlogging/translationSessionPosition.test.js
PASS src/utils/mediawikiHelper.test.js
PASS src/plugins/eventlogging/logEvent.test.js
PASS src/utils/mtHelper.test.js

Test Suites: 55 passed, 55 total
Tests:       143 passed, 143 total
Snapshots:   38 passed, 38 total
Time:        8.231 s, estimated 12 s
Ran all test suites.
--- stdout ---

> test
> npm run test:cx2 && npm run test:cx3


> test:cx2
> npm -s run lint

Checked 1 message directory.

/src/repo/modules/dashboard/mw.cx.DashboardList.js
  127:7  warning  'language' is already declared in the upper scope on line 122 column 13  no-shadow

/src/repo/modules/entrypoints/ext.cx.entrypoints.mffrequentlanguages.js
  148:1  warning  The type 'LanguageSearcher' is undefined  jsdoc/no-undefined-types

/src/repo/modules/entrypoints/ext.cx.entrypoints.recentedit/RecentEditEntrypointInvitation.vue
   8:7  warning  Don't use 'v-text'  vue/no-v-text
  32:6  warning  Don't use 'v-text'  vue/no-v-text
  61:7  warning  Don't use 'v-text'  vue/no-v-text
  66:6  warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/entrypoints/ext.cx.entrypoints.recenttranslation/RecentTranslationEntrypointDialog.vue
   7:10  warning  Don't use 'v-text'  vue/no-v-text
  16:6   warning  Don't use 'v-text'  vue/no-v-text
  22:6   warning  Don't use 'v-text'  vue/no-v-text
  33:7   warning  Don't use 'v-text'  vue/no-v-text
  37:12  warning  Don't use 'v-text'  vue/no-v-text
  38:11  warning  Don't use 'v-text'  vue/no-v-text
  41:12  warning  Don't use 'v-text'  vue/no-v-text
  42:11  warning  Don't use 'v-text'  vue/no-v-text
  46:12  warning  Don't use 'v-text'  vue/no-v-text
  47:11  warning  Don't use 'v-text'  vue/no-v-text
  57:13  warning  Don't use 'v-text'  vue/no-v-text
  64:8   warning  Don't use 'v-text'  vue/no-v-text
  78:7   warning  Don't use 'v-text'  vue/no-v-text
  86:13  warning  Don't use 'v-text'  vue/no-v-text
  90:7   warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages/CxUlsEntrypoint.vue
  30:6  warning  Don't use 'v-text'  vue/no-v-text
  40:5  warning  Don't use 'v-text'  vue/no-v-text
  68:7  warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/mw.cx.TargetArticle.js
  356:1  warning  The type 'publishErrorCaptcha' is undefined  jsdoc/no-undefined-types

/src/repo/modules/mw.cx.init.Translation.js
  131:1  warning  Syntax error in type: Promise<[Object, mw.cx.dm.DraftTranslationDTO|null]>  jsdoc/valid-types

/src/repo/modules/stats/ext.cx.stats.js
  617:55  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  629:55  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  641:49  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  662:58  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  674:58  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  686:52  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  698:55  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  718:55  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  727:55  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  736:49  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  757:58  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  766:58  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  775:52  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  784:55  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow

/src/repo/modules/ui/mw.cx.ui.ArticleColumn.js
  17:1  warning  Duplicate @param "config.sectionTitle"  jsdoc/check-param-names

/src/repo/modules/ui/mw.cx.ui.SourceColumn.js
  6:1  warning  @param path declaration ("config.siteMapper") appears before any real parameter  jsdoc/check-param-names

/src/repo/modules/ui/widgets/mw.cx.ui.CategoryTagItemWidget.js
  65:1  warning  The type 'mouseenter' is undefined  jsdoc/no-undefined-types
  74:1  warning  The type 'mouseleave' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ui/widgets/mw.cx.ui.PageSelectorWidget.js
  219:31  warning  'pages' is already declared in the upper scope on line 184 column 71  no-shadow

/src/repo/modules/ui/widgets/mw.cx.ui.PageTitleWidget.js
  157:1  warning  The type 'enter' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ui/widgets/mw.cx.ui.SectionTitleWidget.js
  99:1  warning  The type 'enter' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-cx/dm/mixins/ve.dm.CXLintableNode.js
  52:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/modules/ve-cx/init/ve.init.mw.CXTarget.js
  590:1  warning  Missing JSDoc @return type  jsdoc/require-returns-type

/src/repo/tests/selenium/componentobjects/DesktopEditor.js
  43:2  warning  Missing JSDoc @return declaration  jsdoc/require-returns

/src/repo/tests/selenium/utils/ElementAction.js
  90:1  warning  Expected @param names to be "selector, attribute". Got "attribute, selector"  jsdoc/check-param-names
  90:1  warning  Missing JSDoc @param "attribute" type                                         jsdoc/require-param-type

✖ 52 problems (0 errors, 52 warnings)


> test:cx3
> cd app && npm run test


> cx3@0.2.0+20240401 test
> npm install && npm -s run test:bundle && npm run lint && npm run test:unit


up to date, audited 946 packages in 2s

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

4 vulnerabilities (3 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
There are no staged changes to the dist folder in this change.

> cx3@0.2.0+20240401 lint
> eslint .


/src/repo/app/src/components/SXArticleSearch/SXArticleSearch.snap.js
  3:9  warning  Replace ``SXArticleSearch·component·test·Component·output·matches·snapshot·1`` with `⏎··`SXArticleSearch·component·test·Component·output·matches·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXPublisher/SXPublisherReviewInfo.snap.js
   3:9  warning  Replace ``SXPublisher·review·info·panel·test·should·match·snapshot·when·no·publishFeedbackMessages·exist·1`` with `⏎··`SXPublisher·review·info·panel·test·should·match·snapshot·when·no·publishFeedbackMessages·exist·1`⏎`  prettier/prettier
  66:9  warning  Replace ``SXPublisher·review·info·panel·test·should·match·snapshot·when·the·active·message·is·a·warning·1`` with `⏎··`SXPublisher·review·info·panel·test·should·match·snapshot·when·the·active·message·is·a·warning·1`⏎`    prettier/prettier

/src/repo/app/src/components/SXSectionSelector/SXSectionSelectorSectionList.snap.js
    3:9  warning  Replace ``SXSectionSelector·Section·List·Component·output·matches·snapshot·for·specified·props·with·slot·1`` with `⏎··`SXSectionSelector·Section·List·Component·output·matches·snapshot·for·specified·props·with·slot·1`⏎`          prettier/prettier
  144:9  warning  Replace ``SXSectionSelector·Section·List·Component·output·matches·snapshot·for·specified·sections·with·label·1`` with `⏎··`SXSectionSelector·Section·List·Component·output·matches·snapshot·for·specified·sections·with·label·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSectionSelector/SXSectionSelectorSectionListPresent.snap.js
  3:9  warning  Replace ``SXSectionSelector·Section·List·Component·output·matches·snapshot·1`` with `⏎··`SXSectionSelector·Section·List·Component·output·matches·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSectionSelector/SXSectionSelectorViewArticleItem.snap.js
  3:9  warning  Replace ``SXSectionSelector·View·Article·Item·Component·output·matches·snapshot·for·specified·props·1`` with `⏎··`SXSectionSelector·View·Article·Item·Component·output·matches·snapshot·for·specified·props·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSentenceSelector/tests/ProposedTranslationActionButtons.snap.js
  3:9  warning  Replace ``Test·ProposedTranslationActionButtons·SFC·Component·output·should·match·snapshot·1`` with `⏎··`Test·ProposedTranslationActionButtons·SFC·Component·output·should·match·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSentenceSelector/tests/ProposedTranslationCard.snap.js
   3:9  warning  Replace ``Test·\`ProposedTranslationCard\`·test·Component·output·matches·snapshot·1`` with `⏎··`Test·\`ProposedTranslationCard\`·test·Component·output·matches·snapshot·1`⏎`                                                                                                                                              prettier/prettier
  58:9  warning  Replace ``Test·\`ProposedTranslationCard\`·test·Should·render·Retry·MT·card·inside·proposed·translation·card·output·when·no·proposed·translation·exists·1`` with `⏎··`Test·\`ProposedTranslationCard\`·test·Should·render·Retry·MT·card·inside·proposed·translation·card·output·when·no·proposed·translation·exists·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSentenceSelector/tests/ProposedTranslationHeader.snap.js
  3:9  warning  Replace ``SXSentenceSelector·Proposed·Translation·Header·Component·output·matches·snapshot·1`` with `⏎··`SXSentenceSelector·Proposed·Translation·Header·Component·output·matches·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXSentenceSelector/tests/RetryMtCard.snap.js
  3:9  warning  Replace ``SXSentenceSelector·Retry·MT·Card·Component·output·matches·snapshot·1`` with `⏎··`SXSentenceSelector·Retry·MT·Card·Component·output·matches·snapshot·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXTranslationConfirmer/SXTranslationConfirmerActionPanel.snap.js
    3:9  warning  Replace ``SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·1`` with `⏎··`SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·1`⏎`                                                                                                    prettier/prettier
   94:9  warning  Replace ``SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·for·tablet·or·larger·screens·1`` with `⏎··`SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·for·tablet·or·larger·screens·1`⏎`                                          prettier/prettier
  197:9  warning  Replace ``SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·for·tablet·or·larger·screens·with·.m.·in·the·url·1`` with `⏎··`SXTranslationConfirmer·Action·Panel·test·Component·output·matches·snapshot·for·tablet·or·larger·screens·with·.m.·in·the·url·1`⏎`  prettier/prettier

/src/repo/app/src/components/SXTranslationConfirmer/SXTranslationConfirmerArticleInformation.snap.js
  3:9  warning  Replace ``SXTranslationConfirmerArticleInformation·test·Component·output·matches·snapshot·1`` with `⏎··`SXTranslationConfirmerArticleInformation·test·Component·output·matches·snapshot·1`⏎`  prettier/prettier

✖ 16 problems (0 errors, 16 warnings)
  0 errors and 16 warnings potentially fixable with the `--fix` option.


> cx3@0.2.0+20240401 test:unit
> jest -c config/jest/jest.config.js


--- 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/tmpu90j79bg
--- stderr ---
Checked 1 message directory.

/src/repo/modules/dashboard/mw.cx.DashboardList.js
  127:7  warning  'language' is already declared in the upper scope on line 122 column 13  no-shadow

/src/repo/modules/entrypoints/ext.cx.entrypoints.mffrequentlanguages.js
  148:1  warning  The type 'LanguageSearcher' is undefined  jsdoc/no-undefined-types

/src/repo/modules/entrypoints/ext.cx.entrypoints.recentedit/RecentEditEntrypointInvitation.vue
   8:7  warning  Don't use 'v-text'  vue/no-v-text
  32:6  warning  Don't use 'v-text'  vue/no-v-text
  61:7  warning  Don't use 'v-text'  vue/no-v-text
  66:6  warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/entrypoints/ext.cx.entrypoints.recenttranslation/RecentTranslationEntrypointDialog.vue
   7:10  warning  Don't use 'v-text'  vue/no-v-text
  16:6   warning  Don't use 'v-text'  vue/no-v-text
  22:6   warning  Don't use 'v-text'  vue/no-v-text
  33:7   warning  Don't use 'v-text'  vue/no-v-text
  37:12  warning  Don't use 'v-text'  vue/no-v-text
  38:11  warning  Don't use 'v-text'  vue/no-v-text
  41:12  warning  Don't use 'v-text'  vue/no-v-text
  42:11  warning  Don't use 'v-text'  vue/no-v-text
  46:12  warning  Don't use 'v-text'  vue/no-v-text
  47:11  warning  Don't use 'v-text'  vue/no-v-text
  57:13  warning  Don't use 'v-text'  vue/no-v-text
  64:8   warning  Don't use 'v-text'  vue/no-v-text
  78:7   warning  Don't use 'v-text'  vue/no-v-text
  86:13  warning  Don't use 'v-text'  vue/no-v-text
  90:7   warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages/CxUlsEntrypoint.vue
  30:6  warning  Don't use 'v-text'  vue/no-v-text
  40:5  warning  Don't use 'v-text'  vue/no-v-text
  68:7  warning  Don't use 'v-text'  vue/no-v-text

/src/repo/modules/mw.cx.TargetArticle.js
  356:1  warning  The type 'publishErrorCaptcha' is undefined  jsdoc/no-undefined-types

/src/repo/modules/mw.cx.init.Translation.js
  131:1  warning  Syntax error in type: Promise<[Object, mw.cx.dm.DraftTranslationDTO|null]>  jsdoc/valid-types

/src/repo/modules/stats/ext.cx.stats.js
  617:55  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  629:55  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  641:49  warning  'data' is already declared in the upper scope on line 612 column 7   no-shadow
  662:58  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  674:58  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  686:52  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  698:55  warning  'data' is already declared in the upper scope on line 657 column 7   no-shadow
  718:55  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  727:55  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  736:49  warning  'data' is already declared in the upper scope on line 714 column 7   no-shadow
  757:58  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  766:58  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  775:52  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow
  784:55  warning  'data' is already declared in the upper scope on line 752 column 12  no-shadow

/src/repo/modules/ui/mw.cx.ui.ArticleColumn.js
  17:1  warning  Duplicate @param "config.sectionTitle"  jsdoc/check-param-names

/src/repo/modules/ui/mw.cx.ui.SourceColumn.js
  6:1  warning  @param path declaration ("config.siteMapper") appears before any real parameter  jsdoc/check-param-names

/src/repo/modules/ui/widgets/mw.cx.ui.CategoryTagItemWidget.js
  65:1  warning  The type 'mouseenter' is undefined  jsdoc/no-undefined-types
  74:1  warning  The type 'mouseleave' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ui/widgets/mw.cx.ui.PageSelectorWidget.js
  219:31  warning  'pages' is already declared in the upper scope on line 184 column 71  no-shadow

/src/repo/modules/ui/widgets/mw.cx.ui.PageTitleWidget.js
  157:1  warning  The type 'enter' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ui/widgets/mw.cx.ui.SectionTitleWidget.js
  99:1  warning  The type 'enter' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-cx/dm/mixins/ve.dm.CXLintableNode.js
  52:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/modules/ve-cx/init/ve.init.mw.CXTarget.js
  590:1  warning  Missing JSDoc @return type  jsdoc/require-returns-type

/src/repo/tests/selenium/componentobjects/DesktopEditor.js
  43:2  warning  Missing JSDoc @return declaration  jsdoc/require-returns

/src/repo/tests/selenium/utils/ElementAction.js
  90:1  warning  Expected @param names to be "selector, attribute". Got "attribute, selector"  jsdoc/check-param-names
  90:1  warning  Missing JSDoc @param "attribute" type                                         jsdoc/require-param-type

✖ 52 problems (0 errors, 52 warnings)
--- stdout ---
[master ba2d0b5] build: Updating eslint-config-wikimedia to 0.27.0
 3 files changed, 300 insertions(+), 318 deletions(-)

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

Change-Id: I340e3b5977a5f20defd7b0b2a6ba70148566e60e
---
 ...xt.cx.entrypoints.uls.relevantlanguages.js |   2 +
 package-lock.json                             | 614 +++++++++---------
 package.json                                  |   2 +-
 3 files changed, 300 insertions(+), 318 deletions(-)

diff --git a/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages.js b/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages.js
index 6dbd843..1ff8471 100644
--- a/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages.js
+++ b/modules/entrypoints/ext.cx.entrypoints.uls.relevantlanguages.js
@@ -139,6 +139,7 @@
 				/**
 				 * This variable stores an array of language codes. These language codes are
 				 * the content languages of the "relevant" wikis, from which the current article is missing.
+				 *
 				 * @type {string[]}
 				 */
 				const missingRelevantLanguages = [];
@@ -158,6 +159,7 @@
 					 * language for this wiki is "nb".
 					 * - for "nb" language code, "wikiDomainCode" will be "no", and the content
 					 * language for this wiki is also "nb".
+					 *
 					 * @type {string}
 					 */
 					const wikiContentLanguage = siteMapper.getLanguageCodeForWikiDomain( wikiDomainCode );
diff --git a/package-lock.json b/package-lock.json
index f9bc842..7d9dd6e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,7 +14,7 @@
 				"@wdio/mocha-framework": "7.16.3",
 				"@wdio/spec-reporter": "7.16.3",
 				"dotenv": "^16.3.1",
-				"eslint-config-wikimedia": "0.26.0",
+				"eslint-config-wikimedia": "0.27.0",
 				"grunt-banana-checker": "0.11.1",
 				"pre-commit": "^1.2.2",
 				"stylelint-config-wikimedia": "0.16.1",
@@ -308,17 +308,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": {
@@ -369,9 +369,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"
@@ -982,9 +982,9 @@
 			}
 		},
 		"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/@types/stack-utils": {
@@ -3379,9 +3379,9 @@
 			"dev": true
 		},
 		"node_modules/browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -3398,8 +3398,8 @@
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			},
@@ -3411,9 +3411,9 @@
 			}
 		},
 		"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/buffer": {
@@ -3777,9 +3777,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001579",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz",
-			"integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==",
+			"version": "1.0.30001610",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz",
+			"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==",
 			"dev": true,
 			"funding": [
 				{
@@ -4075,9 +4075,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"
@@ -4156,6 +4156,19 @@
 				"safe-buffer": "~5.1.0"
 			}
 		},
+		"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.2",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -5592,9 +5605,9 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.643",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.643.tgz",
-			"integrity": "sha512-QHscvvS7gt155PtoRC0dR2ilhL8E9LHhfTQEq1uD5AL0524rBLAwpAREFH06f87/e45B9XkR6Ki5dbhbCsVEIg==",
+			"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": {
@@ -5708,16 +5721,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",
@@ -5763,10 +5776,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"
 			},
@@ -5775,28 +5791,28 @@
 			}
 		},
 		"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-plugin-compat": {
@@ -5821,14 +5837,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"
@@ -5841,9 +5857,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"
@@ -5852,7 +5868,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": "*"
 			},
@@ -5866,25 +5882,36 @@
 			}
 		},
 		"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/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": {
@@ -5901,69 +5928,26 @@
 			}
 		},
 		"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": {
 				"eslint": ">=5.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-mediawiki/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==",
-			"dev": true,
-			"dependencies": {
-				"eslint-utils": "^3.0.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"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
-			}
-		},
-		"node_modules/eslint-plugin-mediawiki/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==",
-			"dev": true,
-			"dependencies": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
-				"esquery": "^1.4.0",
-				"lodash": "^4.17.21",
-				"semver": "^7.3.5"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/mysticatea"
-			},
-			"peerDependencies": {
-				"eslint": ">=6.0.0"
-			}
-		},
 		"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": {
@@ -6011,16 +5995,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": {
@@ -6033,26 +6017,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": {
@@ -6062,47 +6046,63 @@
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.38.0"
+				"eslint": ">=8.56.0"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/ci-info": {
+			"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": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/sibiraj-s"
+				}
+			],
+			"engines": {
+				"node": ">=8"
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "9.20.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.1.tgz",
-			"integrity": "sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==",
+			"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-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.4.0",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"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"
+				"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"
@@ -6117,21 +6117,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",
@@ -11021,9 +11006,9 @@
 			}
 		},
 		"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"
@@ -13087,10 +13072,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"
 			}
@@ -13529,12 +13517,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"
 			}
@@ -13572,9 +13560,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
 		},
 		"@faker-js/faker": {
@@ -14076,9 +14064,9 @@
 			}
 		},
 		"@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
 		},
 		"@types/stack-utils": {
@@ -15962,21 +15950,21 @@
 			"dev": true
 		},
 		"browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"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.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			}
 		},
 		"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
 		},
 		"buffer": {
@@ -16237,9 +16225,9 @@
 			}
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001579",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz",
-			"integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==",
+			"version": "1.0.30001610",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz",
+			"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==",
 			"dev": true
 		},
 		"caseless": {
@@ -16445,9 +16433,9 @@
 			"peer": 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
 		},
 		"compress-commons": {
@@ -16519,6 +16507,15 @@
 				}
 			}
 		},
+		"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.2",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -17608,9 +17605,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.643",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.643.tgz",
-			"integrity": "sha512-QHscvvS7gt155PtoRC0dR2ilhL8E9LHhfTQEq1uD5AL0524rBLAwpAREFH06f87/e45B9XkR6Ki5dbhbCsVEIg==",
+			"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": {
@@ -17696,16 +17693,16 @@
 			}
 		},
 		"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",
@@ -17753,35 +17750,37 @@
 			}
 		},
 		"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"
 			}
 		},
 		"eslint-plugin-compat": {
@@ -17800,39 +17799,52 @@
 			}
 		},
 		"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": {
+				"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"
+					}
+				}
 			}
 		},
 		"eslint-plugin-json-es": {
@@ -17846,53 +17858,23 @@
 			}
 		},
 		"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"
-			},
-			"dependencies": {
-				"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==",
-					"dev": true,
-					"requires": {
-						"eslint-utils": "^3.0.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"
-					}
-				},
-				"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==",
-					"dev": true,
-					"requires": {
-						"debug": "^4.3.2",
-						"eslint-scope": "^7.0.0",
-						"eslint-visitor-keys": "^3.1.0",
-						"espree": "^9.0.0",
-						"esquery": "^1.4.0",
-						"lodash": "^4.17.21",
-						"semver": "^7.3.5"
-					}
-				}
 			}
 		},
 		"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"
 			}
 		},
@@ -17923,9 +17905,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",
@@ -17942,72 +17924,70 @@
 			}
 		},
 		"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"
+			},
+			"dependencies": {
+				"ci-info": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+					"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+					"dev": true
+				}
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "9.20.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.1.tgz",
-			"integrity": "sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==",
+			"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-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.4.0",
+				"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": {
@@ -21662,9 +21642,9 @@
 			}
 		},
 		"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"
@@ -23220,9 +23200,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": {
diff --git a/package.json b/package.json
index a2b8513..10c5d8f 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,7 @@
 		"@wdio/mocha-framework": "7.16.3",
 		"@wdio/spec-reporter": "7.16.3",
 		"dotenv": "^16.3.1",
-		"eslint-config-wikimedia": "0.26.0",
+		"eslint-config-wikimedia": "0.27.0",
 		"grunt-banana-checker": "0.11.1",
 		"pre-commit": "^1.2.2",
 		"stylelint-config-wikimedia": "0.16.1",
-- 
2.39.2


--- end ---

composer dependencies

Dependencies
Development dependencies

npm dependencies

Development dependencies

Logs

Source code is licensed under the AGPL.