mediawiki/extensions/VisualEditor: main (log #2206437)

sourcepatches

This run took 276 seconds.

From c87db17afd64d5759292ceb56ed7de1e71f4028e Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Thu, 13 Nov 2025 15:35:06 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.32.0

The following rules are failing and were disabled:
* editcheck/modules:
  * es-x/no-iterator-prototype-some
  * es-x/no-iterator-prototype-every
  * es-x/no-iterator-prototype-reduce
  * mediawiki/no-unlabeled-buttonwidget
* modules:
  * es-x/no-iterator-prototype-some
  * es-x/no-iterator-prototype-toarray
  * es-x/no-iterator-prototype-every
  * es-x/no-iterator-prototype-reduce
  * mediawiki/no-unlabeled-buttonwidget
* modules/ve-mw/dm:
  * es-x/no-iterator-prototype-some
  * es-x/no-iterator-prototype-toarray
  * es-x/no-iterator-prototype-every
* modules/ve-mw/preinit:
  * es-x/no-iterator-prototype-every
* modules/ve-mw/tests:
  * es-x/no-iterator-prototype-toarray
  * mediawiki/no-storage

Change-Id: I7e5c7214b82c013dee2ffdae62777970391b17de
---
 editcheck/modules/.eslintrc.json     |    6 +-
 modules/.eslintrc.json               |    7 +-
 modules/ve-mw/dm/.eslintrc.json      |    5 +-
 modules/ve-mw/preinit/.eslintrc.json |    3 +-
 modules/ve-mw/tests/.eslintrc.json   |    4 +-
 package-lock.json                    | 2341 ++++++++++----------------
 package.json                         |    2 +-
 7 files changed, 884 insertions(+), 1484 deletions(-)

diff --git a/editcheck/modules/.eslintrc.json b/editcheck/modules/.eslintrc.json
index 2320d18..d5b42cf 100644
--- a/editcheck/modules/.eslintrc.json
+++ b/editcheck/modules/.eslintrc.json
@@ -4,6 +4,10 @@
 		"../../modules/.eslintrc"
 	],
 	"rules": {
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"es-x/no-iterator-prototype-some": "warn",
+		"es-x/no-iterator-prototype-every": "warn",
+		"mediawiki/no-unlabeled-buttonwidget": "warn",
+		"es-x/no-iterator-prototype-reduce": "warn"
 	}
 }
diff --git a/modules/.eslintrc.json b/modules/.eslintrc.json
index 2931d67..edb8a97 100644
--- a/modules/.eslintrc.json
+++ b/modules/.eslintrc.json
@@ -8,6 +8,11 @@
 	],
 	"rules": {
 		"no-jquery/no-append-html": "warn",
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"es-x/no-iterator-prototype-toarray": "warn",
+		"es-x/no-iterator-prototype-every": "warn",
+		"es-x/no-iterator-prototype-reduce": "warn",
+		"es-x/no-iterator-prototype-some": "warn",
+		"mediawiki/no-unlabeled-buttonwidget": "warn"
 	}
 }
diff --git a/modules/ve-mw/dm/.eslintrc.json b/modules/ve-mw/dm/.eslintrc.json
index 11f19c4..e482b80 100644
--- a/modules/ve-mw/dm/.eslintrc.json
+++ b/modules/ve-mw/dm/.eslintrc.json
@@ -12,6 +12,9 @@
 	"rules": {
 		"local/no-unsanitized-href": "off",
 		"no-jquery/no-append-html": "warn",
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"es-x/no-iterator-prototype-some": "warn",
+		"es-x/no-iterator-prototype-every": "warn",
+		"es-x/no-iterator-prototype-toarray": "warn"
 	}
 }
diff --git a/modules/ve-mw/preinit/.eslintrc.json b/modules/ve-mw/preinit/.eslintrc.json
index 99f9238..9bfa962 100644
--- a/modules/ve-mw/preinit/.eslintrc.json
+++ b/modules/ve-mw/preinit/.eslintrc.json
@@ -6,6 +6,7 @@
 		"no-jquery/no-extend": "off",
 		"no-jquery/no-deferred": "off",
 		"no-jquery/no-when": "off",
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"es-x/no-iterator-prototype-every": "warn"
 	}
 }
diff --git a/modules/ve-mw/tests/.eslintrc.json b/modules/ve-mw/tests/.eslintrc.json
index 494aabf..fa0cf09 100644
--- a/modules/ve-mw/tests/.eslintrc.json
+++ b/modules/ve-mw/tests/.eslintrc.json
@@ -20,7 +20,9 @@
 		"indent": "off",
 		"no-jquery/no-html": "off",
 		"no-jquery/no-parse-html-literal": "off",
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"mediawiki/no-storage": "warn",
+		"es-x/no-iterator-prototype-toarray": "warn"
 	},
 	"parserOptions": {
 		"ecmaVersion": 2018
diff --git a/package-lock.json b/package-lock.json
index 784f124..1efe1d4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,7 +14,7 @@
 				"@wdio/mocha-framework": "9.15.0",
 				"@wdio/spec-reporter": "9.15.0",
 				"api-testing": "1.7.1",
-				"eslint-config-wikimedia": "0.31.0",
+				"eslint-config-wikimedia": "0.32.0",
 				"eslint-plugin-local": "^4.2.2",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.13.0",
@@ -177,20 +177,19 @@
 			}
 		},
 		"node_modules/@es-joy/jsdoccomment": {
-			"version": "0.43.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
-			"integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
+			"version": "0.75.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
+			"integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
 			"dev": true,
 			"dependencies": {
-				"@types/eslint": "^8.56.5",
-				"@types/estree": "^1.0.5",
-				"@typescript-eslint/types": "^7.2.0",
+				"@types/estree": "^1.0.8",
+				"@typescript-eslint/types": "^8.46.0",
 				"comment-parser": "1.4.1",
-				"esquery": "^1.5.0",
-				"jsdoc-type-pratt-parser": "~4.0.0"
+				"esquery": "^1.6.0",
+				"jsdoc-type-pratt-parser": "~6.9.1"
 			},
 			"engines": {
-				"node": ">=16"
+				"node": ">=20.11.0"
 			}
 		},
 		"node_modules/@esbuild/aix-ppc64": {
@@ -612,9 +611,9 @@
 			}
 		},
 		"node_modules/@eslint-community/regexpp": {
-			"version": "4.10.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
-			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+			"version": "4.12.2",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+			"integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
 			"dev": true,
 			"engines": {
 				"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -1687,9 +1686,9 @@
 			}
 		},
 		"node_modules/@mdn/browser-compat-data": {
-			"version": "5.4.1",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.4.1.tgz",
-			"integrity": "sha512-rD1yrH+vrinzmdgtLjj7qeE4FmYh0VezWQaB3DqVrLSBcGtz61pqV/yCO7piJQc8XmgOIKQIF9Go3LUdS9ORHg==",
+			"version": "5.7.6",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz",
+			"integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==",
 			"dev": true
 		},
 		"node_modules/@noble/hashes": {
@@ -1842,113 +1841,6 @@
 				"eslint": ">=8.40.0"
 			}
 		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
-			"integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/types": "8.38.0",
-				"@typescript-eslint/visitor-keys": "8.38.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/types": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
-			"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
-			"integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/project-service": "8.38.0",
-				"@typescript-eslint/tsconfig-utils": "8.38.0",
-				"@typescript-eslint/types": "8.38.0",
-				"@typescript-eslint/visitor-keys": "8.38.0",
-				"debug": "^4.3.4",
-				"fast-glob": "^3.3.2",
-				"is-glob": "^4.0.3",
-				"minimatch": "^9.0.4",
-				"semver": "^7.6.0",
-				"ts-api-utils": "^2.1.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/utils": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
-			"integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
-			"dev": true,
-			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.7.0",
-				"@typescript-eslint/scope-manager": "8.38.0",
-				"@typescript-eslint/types": "8.38.0",
-				"@typescript-eslint/typescript-estree": "8.38.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
-			"integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/types": "8.38.0",
-				"eslint-visitor-keys": "^4.2.1"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/brace-expansion": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-			"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-			"dev": true,
-			"dependencies": {
-				"balanced-match": "^1.0.0"
-			}
-		},
 		"node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": {
 			"version": "4.2.1",
 			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
@@ -1978,21 +1870,6 @@
 				"url": "https://opencollective.com/eslint"
 			}
 		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/minimatch": {
-			"version": "9.0.5",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-			"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-			"dev": true,
-			"dependencies": {
-				"brace-expansion": "^2.0.1"
-			},
-			"engines": {
-				"node": ">=16 || 14 >=14.17"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/isaacs"
-			}
-		},
 		"node_modules/@stylistic/eslint-plugin/node_modules/picomatch": {
 			"version": "4.0.3",
 			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
@@ -2005,18 +1882,6 @@
 				"url": "https://github.com/sponsors/jonschlinkert"
 			}
 		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/ts-api-utils": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
-			"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=18.12"
-			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4"
-			}
-		},
 		"node_modules/@stylistic/stylelint-config": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-2.0.0.tgz",
@@ -2066,20 +1931,6 @@
 				"node": ">=0.10.0"
 			}
 		},
-		"node_modules/@stylistic/stylelint-plugin/node_modules/postcss-selector-parser": {
-			"version": "6.1.2",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
-			"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"cssesc": "^3.0.0",
-				"util-deprecate": "^1.0.2"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
 		"node_modules/@thisismanta/pessimist": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/@thisismanta/pessimist/-/pessimist-1.2.0.tgz",
@@ -2099,20 +1950,10 @@
 			"integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
 			"dev": true
 		},
-		"node_modules/@types/eslint": {
-			"version": "8.56.10",
-			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
-			"integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
-			"dev": true,
-			"dependencies": {
-				"@types/estree": "*",
-				"@types/json-schema": "*"
-			}
-		},
 		"node_modules/@types/estree": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
-			"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+			"version": "1.0.8",
+			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+			"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
 			"dev": true
 		},
 		"node_modules/@types/istanbul-lib-coverage": {
@@ -2139,12 +1980,6 @@
 				"@types/istanbul-lib-report": "*"
 			}
 		},
-		"node_modules/@types/json-schema": {
-			"version": "7.0.15",
-			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-			"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-			"dev": true
-		},
 		"node_modules/@types/linkify-it": {
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
@@ -2248,93 +2083,75 @@
 			}
 		},
 		"node_modules/@typescript-eslint/eslint-plugin": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
-			"integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+			"integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"dependencies": {
 				"@eslint-community/regexpp": "^4.10.0",
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/type-utils": "7.18.0",
-				"@typescript-eslint/utils": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/type-utils": "8.46.0",
+				"@typescript-eslint/utils": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"graphemer": "^1.4.0",
-				"ignore": "^5.3.1",
+				"ignore": "^7.0.0",
 				"natural-compare": "^1.4.0",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/parser": "^7.0.0",
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
+				"@typescript-eslint/parser": "^8.46.0",
+				"eslint": "^8.57.0 || ^9.0.0",
+				"typescript": ">=4.8.4 <6.0.0"
+			}
+		},
+		"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+			"version": "7.0.5",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+			"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+			"dev": true,
+			"engines": {
+				"node": ">= 4"
 			}
 		},
 		"node_modules/@typescript-eslint/parser": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
-			"integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+			"integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"dependencies": {
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/typescript-estree": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"debug": "^4.3.4"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-			"dev": true,
-			"optional": true,
-			"peer": true,
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"eslint": "^8.57.0 || ^9.0.0",
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/project-service": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
-			"integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+			"integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/tsconfig-utils": "^8.38.0",
-				"@typescript-eslint/types": "^8.38.0",
+				"@typescript-eslint/tsconfig-utils": "^8.46.0",
+				"@typescript-eslint/types": "^8.46.0",
 				"debug": "^4.3.4"
 			},
 			"engines": {
@@ -2345,46 +2162,20 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
-			"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/scope-manager": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
-			"integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+			"integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0"
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -2392,9 +2183,9 @@
 			}
 		},
 		"node_modules/@typescript-eslint/tsconfig-utils": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
-			"integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+			"integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
 			"dev": true,
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2404,45 +2195,40 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/type-utils": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
-			"integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+			"integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"dependencies": {
-				"@typescript-eslint/typescript-estree": "7.18.0",
-				"@typescript-eslint/utils": "7.18.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0",
+				"@typescript-eslint/utils": "8.46.0",
 				"debug": "^4.3.4",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
+				"eslint": "^8.57.0 || ^9.0.0",
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/types": {
-			"version": "7.12.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
-			"integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+			"integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
 			"dev": true,
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -2450,44 +2236,31 @@
 			}
 		},
 		"node_modules/@typescript-eslint/typescript-estree": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
-			"integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+			"integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/project-service": "8.46.0",
+				"@typescript-eslint/tsconfig-utils": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"debug": "^4.3.4",
-				"globby": "^11.1.0",
+				"fast-glob": "^3.3.2",
 				"is-glob": "^4.0.3",
 				"minimatch": "^9.0.4",
 				"semver": "^7.6.0",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+			"peerDependencies": {
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
@@ -2515,68 +2288,55 @@
 			}
 		},
 		"node_modules/@typescript-eslint/utils": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
-			"integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+			"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/typescript-estree": "7.18.0"
+				"@eslint-community/eslint-utils": "^4.7.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"eslint": "^8.56.0"
-			}
-		},
-		"node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"eslint": "^8.57.0 || ^9.0.0",
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/visitor-keys": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
-			"integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+			"integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "7.18.0",
-				"eslint-visitor-keys": "^3.4.3"
+				"@typescript-eslint/types": "8.46.0",
+				"eslint-visitor-keys": "^4.2.1"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			}
 		},
-		"node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+		"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+			"version": "4.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+			"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
 			"dev": true,
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/@ungap/structured-clone": {
@@ -4073,12 +3833,12 @@
 			}
 		},
 		"node_modules/ast-metadata-inferer": {
-			"version": "0.8.0",
-			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
-			"integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
+			"integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
 			"dev": true,
 			"dependencies": {
-				"@mdn/browser-compat-data": "^5.2.34"
+				"@mdn/browser-compat-data": "^5.6.19"
 			}
 		},
 		"node_modules/ast-types": {
@@ -4246,6 +4006,15 @@
 				}
 			]
 		},
+		"node_modules/baseline-browser-mapping": {
+			"version": "2.8.28",
+			"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz",
+			"integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==",
+			"dev": true,
+			"bin": {
+				"baseline-browser-mapping": "dist/cli.js"
+			}
+		},
 		"node_modules/basic-ftp": {
 			"version": "5.0.5",
 			"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
@@ -4332,9 +4101,9 @@
 			"dev": true
 		},
 		"node_modules/browserslist": {
-			"version": "4.24.4",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
-			"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+			"version": "4.28.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
+			"integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -4350,12 +4119,12 @@
 					"url": "https://github.com/sponsors/ai"
 				}
 			],
-			"license": "MIT",
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001688",
-				"electron-to-chromium": "^1.5.73",
-				"node-releases": "^2.0.19",
-				"update-browserslist-db": "^1.1.1"
+				"baseline-browser-mapping": "^2.8.25",
+				"caniuse-lite": "^1.0.30001754",
+				"electron-to-chromium": "^1.5.249",
+				"node-releases": "^2.0.27",
+				"update-browserslist-db": "^1.1.4"
 			},
 			"bin": {
 				"browserslist": "cli.js"
@@ -4469,9 +4238,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001692",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
-			"integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+			"version": "1.0.30001754",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+			"integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
 			"dev": true,
 			"funding": [
 				{
@@ -4486,8 +4255,7 @@
 					"type": "github",
 					"url": "https://github.com/sponsors/ai"
 				}
-			],
-			"license": "CC-BY-4.0"
+			]
 		},
 		"node_modules/caseless": {
 			"version": "0.12.0",
@@ -4914,12 +4682,12 @@
 			"dev": true
 		},
 		"node_modules/core-js-compat": {
-			"version": "3.37.1",
-			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
-			"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+			"version": "3.46.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz",
+			"integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==",
 			"dev": true,
 			"dependencies": {
-				"browserslist": "^4.23.0"
+				"browserslist": "^4.26.3"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -5489,9 +5257,9 @@
 			}
 		},
 		"node_modules/debug": {
-			"version": "4.4.1",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
-			"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+			"version": "4.4.3",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+			"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
 			"dev": true,
 			"dependencies": {
 				"ms": "^2.1.3"
@@ -5608,6 +5376,15 @@
 				"node": ">=0.3.1"
 			}
 		},
+		"node_modules/diff-sequences": {
+			"version": "27.5.1",
+			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+			"integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+			"dev": true,
+			"engines": {
+				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+			}
+		},
 		"node_modules/dir-glob": {
 			"version": "3.0.1",
 			"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -5874,11 +5651,10 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.5.79",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.79.tgz",
-			"integrity": "sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==",
-			"dev": true,
-			"license": "ISC"
+			"version": "1.5.250",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz",
+			"integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==",
+			"dev": true
 		},
 		"node_modules/emoji-regex": {
 			"version": "8.0.0",
@@ -5909,9 +5685,9 @@
 			}
 		},
 		"node_modules/enhanced-resolve": {
-			"version": "5.16.1",
-			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz",
-			"integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==",
+			"version": "5.18.3",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+			"integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
 			"dev": true,
 			"dependencies": {
 				"graceful-fs": "^4.2.4",
@@ -6155,9 +5931,9 @@
 			}
 		},
 		"node_modules/eslint-compat-utils": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
-			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+			"version": "0.6.5",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+			"integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
 			"dev": true,
 			"dependencies": {
 				"semver": "^7.5.4"
@@ -6170,257 +5946,143 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.31.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.31.0.tgz",
-			"integrity": "sha512-Z/t/zGPdxs/ehxb0EM6THNWAzueT7GtuqzjUvmBpkxcTKzZPJEXWnnpswdj/hgv8Ce8PIeDp0zwQxR4e3c9CIw==",
+			"version": "0.32.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.0.tgz",
+			"integrity": "sha512-kTuvtzzbvAgCIUjPsG7d+wilFK7MGAx3Fhb9onr16UsrFlyplXqNKetUu2awPrH4q4W+4V2JU5ju192A0blLvQ==",
 			"dev": true,
 			"dependencies": {
 				"@stylistic/eslint-plugin": "^3.1.0",
-				"@typescript-eslint/eslint-plugin": "8.35.1",
-				"@typescript-eslint/parser": "8.35.1",
+				"@typescript-eslint/eslint-plugin": "8.46.0",
+				"@typescript-eslint/parser": "8.46.0",
 				"browserslist-config-wikimedia": "^0.7.0",
 				"eslint": "^8.57.0",
-				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.6.0",
-				"eslint-plugin-jest": "^28.5.0",
-				"eslint-plugin-jsdoc": "48.2.5",
+				"eslint-plugin-compat": "^6.0.2",
+				"eslint-plugin-es-x": "^8.7.0",
+				"eslint-plugin-jest": "^29.0.1",
+				"eslint-plugin-jsdoc": "61.0.0",
 				"eslint-plugin-json-es": "^1.6.0",
-				"eslint-plugin-mediawiki": "^0.7.0",
-				"eslint-plugin-mocha": "^10.4.3",
-				"eslint-plugin-n": "^17.7.0",
+				"eslint-plugin-mediawiki": "^0.8.1",
+				"eslint-plugin-mocha": "^10.5.0",
+				"eslint-plugin-n": "^17.23.1",
 				"eslint-plugin-no-jquery": "^3.1.1",
-				"eslint-plugin-qunit": "^8.1.1",
-				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^53.0.0",
-				"eslint-plugin-vue": "^9.26.0",
-				"eslint-plugin-wdio": "^8.24.12",
-				"eslint-plugin-yml": "^1.14.0"
+				"eslint-plugin-qunit": "^8.2.5",
+				"eslint-plugin-security": "^3.0.1",
+				"eslint-plugin-unicorn": "^56.0.1",
+				"eslint-plugin-vue": "^9.33.0",
+				"eslint-plugin-wdio": "^9.16.2",
+				"eslint-plugin-yml": "^1.19.0"
 			},
 			"engines": {
-				"node": ">=18 <25"
+				"node": ">=20 <25"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
-			"integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
+		"node_modules/eslint-plugin-compat": {
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
+			"integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/regexpp": "^4.10.0",
-				"@typescript-eslint/scope-manager": "8.35.1",
-				"@typescript-eslint/type-utils": "8.35.1",
-				"@typescript-eslint/utils": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1",
-				"graphemer": "^1.4.0",
-				"ignore": "^7.0.0",
-				"natural-compare": "^1.4.0",
-				"ts-api-utils": "^2.1.0"
+				"@mdn/browser-compat-data": "^5.5.35",
+				"ast-metadata-inferer": "^0.8.1",
+				"browserslist": "^4.24.2",
+				"caniuse-lite": "^1.0.30001687",
+				"find-up": "^5.0.0",
+				"globals": "^15.7.0",
+				"lodash.memoize": "^4.1.2",
+				"semver": "^7.6.2"
 			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": ">=18.x"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/parser": "^8.35.1",
-				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
-			"integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
+		"node_modules/eslint-plugin-compat/node_modules/globals": {
+			"version": "15.15.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+			"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
 			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/typescript-estree": "8.35.1",
-				"@typescript-eslint/utils": "8.35.1",
-				"debug": "^4.3.4",
-				"ts-api-utils": "^2.1.0"
-			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+				"node": ">=18"
 			},
 			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
-			"integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
+		"node_modules/eslint-plugin-es-x": {
+			"version": "8.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-8.7.0.tgz",
+			"integrity": "sha512-Du5Sb067sjqzmglaPhsfcEQgE1EYfL8sko+4jOMcAB/XKGoCxntSrOmTYuVzswA1rzM9+MZwH6+GOp0G3/wVCg==",
 			"dev": true,
+			"funding": [
+				"https://github.com/sponsors/ota-meshi",
+				"https://opencollective.com/eslint"
+			],
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.7.0",
-				"@typescript-eslint/scope-manager": "8.35.1",
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/typescript-estree": "8.35.1"
+				"@eslint-community/eslint-utils": "^4.1.2",
+				"@eslint-community/regexpp": "^4.12.1",
+				"eslint-compat-utils": "^0.6.3"
 			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": "^14.18.0 || >=16.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"eslint": ">=8"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/parser": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
-			"integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
+		"node_modules/eslint-plugin-jest": {
+			"version": "29.1.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
+			"integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/scope-manager": "8.35.1",
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/typescript-estree": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1",
-				"debug": "^4.3.4"
+				"@typescript-eslint/utils": "^8.0.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": "^20.12.0 || ^22.0.0 || >=24.0.0"
 			},
 			"peerDependencies": {
+				"@typescript-eslint/eslint-plugin": "^8.0.0",
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/project-service": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
-			"integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/tsconfig-utils": "^8.35.1",
-				"@typescript-eslint/types": "^8.35.1",
-				"debug": "^4.3.4"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"jest": "*"
 			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
+			"peerDependenciesMeta": {
+				"@typescript-eslint/eslint-plugin": {
+					"optional": true
+				},
+				"jest": {
+					"optional": true
+				}
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/scope-manager": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
-			"integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
+		"node_modules/eslint-plugin-jsdoc": {
+			"version": "61.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
+			"integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1"
+				"@es-joy/jsdoccomment": "~0.75.0",
+				"are-docs-informative": "^0.0.2",
+				"comment-parser": "1.4.1",
+				"debug": "^4.4.3",
+				"escape-string-regexp": "^4.0.0",
+				"espree": "^10.4.0",
+				"esquery": "^1.6.0",
+				"html-entities": "^2.6.0",
+				"object-deep-merge": "^1.0.5",
+				"parse-imports-exports": "^0.2.4",
+				"semver": "^7.7.3",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/tsconfig-utils": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
-			"integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": ">=20.11.0"
 			},
 			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/types": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
-			"integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/typescript-estree": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
-			"integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/project-service": "8.35.1",
-				"@typescript-eslint/tsconfig-utils": "8.35.1",
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1",
-				"debug": "^4.3.4",
-				"fast-glob": "^3.3.2",
-				"is-glob": "^4.0.3",
-				"minimatch": "^9.0.4",
-				"semver": "^7.6.0",
-				"ts-api-utils": "^2.1.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/visitor-keys": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
-			"integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/types": "8.35.1",
-				"eslint-visitor-keys": "^4.2.1"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/brace-expansion": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-			"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-			"dev": true,
-			"dependencies": {
-				"balanced-match": "^1.0.0"
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/eslint-visitor-keys": {
+		"node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": {
 			"version": "4.2.1",
 			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
 			"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
@@ -6432,129 +6094,21 @@
 				"url": "https://opencollective.com/eslint"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/ignore": {
-			"version": "7.0.5",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
-			"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
-			"dev": true,
-			"engines": {
-				"node": ">= 4"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/minimatch": {
-			"version": "9.0.5",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-			"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-			"dev": true,
-			"dependencies": {
-				"brace-expansion": "^2.0.1"
-			},
-			"engines": {
-				"node": ">=16 || 14 >=14.17"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/isaacs"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/ts-api-utils": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
-			"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=18.12"
-			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4"
-			}
-		},
-		"node_modules/eslint-plugin-compat": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
-			"integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
-			"dev": true,
-			"dependencies": {
-				"@mdn/browser-compat-data": "^5.3.13",
-				"ast-metadata-inferer": "^0.8.0",
-				"browserslist": "^4.21.10",
-				"caniuse-lite": "^1.0.30001524",
-				"find-up": "^5.0.0",
-				"lodash.memoize": "^4.1.2",
-				"semver": "^7.5.4"
-			},
-			"engines": {
-				"node": ">=14.x"
-			},
-			"peerDependencies": {
-				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
-			}
-		},
-		"node_modules/eslint-plugin-es-x": {
-			"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==",
+		"node_modules/eslint-plugin-jsdoc/node_modules/espree": {
+			"version": "10.4.0",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+			"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.1.2",
-				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.5.0"
+				"acorn": "^8.15.0",
+				"acorn-jsx": "^5.3.2",
+				"eslint-visitor-keys": "^4.2.1"
 			},
 			"engines": {
-				"node": "^14.18.0 || >=16.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
-				"url": "https://github.com/sponsors/ota-meshi"
-			},
-			"peerDependencies": {
-				"eslint": ">=8"
-			}
-		},
-		"node_modules/eslint-plugin-jest": {
-			"version": "28.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz",
-			"integrity": "sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
-			},
-			"engines": {
-				"node": "^16.10.0 || ^18.12.0 || >=20.0.0"
-			},
-			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0",
-				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
-				"jest": "*"
-			},
-			"peerDependenciesMeta": {
-				"@typescript-eslint/eslint-plugin": {
-					"optional": true
-				},
-				"jest": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/eslint-plugin-jsdoc": {
-			"version": "48.2.5",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
-			"integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
-			"dev": true,
-			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.43.0",
-				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.4.1",
-				"debug": "^4.3.4",
-				"escape-string-regexp": "^4.0.0",
-				"esquery": "^1.5.0",
-				"is-builtin-module": "^3.2.1",
-				"semver": "^7.6.1",
-				"spdx-expression-parse": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=18"
-			},
-			"peerDependencies": {
-				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": {
@@ -6598,12 +6152,11 @@
 			}
 		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
-			"integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
+			"integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
 			"dev": true,
 			"dependencies": {
-				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			},
 			"peerDependencies": {
@@ -6611,9 +6164,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-mocha": {
-			"version": "10.4.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
-			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
+			"version": "10.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz",
+			"integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
@@ -6628,19 +6181,20 @@
 			}
 		},
 		"node_modules/eslint-plugin-n": {
-			"version": "17.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.7.0.tgz",
-			"integrity": "sha512-4Jg4ZKVE4VjHig2caBqPHYNW5na84RVufUuipFLJbgM/G57O6FdpUKJbHakCDJb/yjQuyqVzYWRtU3HNYaZUwg==",
-			"dev": true,
-			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"enhanced-resolve": "^5.15.0",
-				"eslint-plugin-es-x": "^7.5.0",
-				"get-tsconfig": "^4.7.0",
-				"globals": "^15.0.0",
-				"ignore": "^5.2.4",
-				"minimatch": "^9.0.0",
-				"semver": "^7.5.3"
+			"version": "17.23.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
+			"integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+			"dev": true,
+			"dependencies": {
+				"@eslint-community/eslint-utils": "^4.5.0",
+				"enhanced-resolve": "^5.17.1",
+				"eslint-plugin-es-x": "^7.8.0",
+				"get-tsconfig": "^4.8.1",
+				"globals": "^15.11.0",
+				"globrex": "^0.1.2",
+				"ignore": "^5.3.2",
+				"semver": "^7.6.3",
+				"ts-declaration-location": "^1.0.6"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -6652,40 +6206,52 @@
 				"eslint": ">=8.23.0"
 			}
 		},
-		"node_modules/eslint-plugin-n/node_modules/brace-expansion": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-			"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+		"node_modules/eslint-plugin-n/node_modules/eslint-compat-utils": {
+			"version": "0.5.1",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
 			"dev": true,
 			"dependencies": {
-				"balanced-match": "^1.0.0"
+				"semver": "^7.5.4"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"peerDependencies": {
+				"eslint": ">=6.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-n/node_modules/globals": {
-			"version": "15.3.0",
-			"resolved": "https://registry.npmjs.org/globals/-/globals-15.3.0.tgz",
-			"integrity": "sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==",
+		"node_modules/eslint-plugin-n/node_modules/eslint-plugin-es-x": {
+			"version": "7.8.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+			"integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
 			"dev": true,
+			"funding": [
+				"https://github.com/sponsors/ota-meshi",
+				"https://opencollective.com/eslint"
+			],
+			"dependencies": {
+				"@eslint-community/eslint-utils": "^4.1.2",
+				"@eslint-community/regexpp": "^4.11.0",
+				"eslint-compat-utils": "^0.5.1"
+			},
 			"engines": {
-				"node": ">=18"
+				"node": "^14.18.0 || >=16.0.0"
 			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
+			"peerDependencies": {
+				"eslint": ">=8"
 			}
 		},
-		"node_modules/eslint-plugin-n/node_modules/minimatch": {
-			"version": "9.0.4",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
-			"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+		"node_modules/eslint-plugin-n/node_modules/globals": {
+			"version": "15.15.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+			"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
 			"dev": true,
-			"dependencies": {
-				"brace-expansion": "^2.0.1"
-			},
 			"engines": {
-				"node": ">=16 || 14 >=14.17"
+				"node": ">=18"
 			},
 			"funding": {
-				"url": "https://github.com/sponsors/isaacs"
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
@@ -6699,9 +6265,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-qunit": {
-			"version": "8.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
-			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
+			"version": "8.2.5",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
+			"integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
@@ -6712,27 +6278,33 @@
 			}
 		},
 		"node_modules/eslint-plugin-security": {
-			"version": "1.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz",
-			"integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==",
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
+			"integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
 			"dev": true,
 			"dependencies": {
 				"safe-regex": "^2.1.1"
+			},
+			"engines": {
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/eslint-plugin-unicorn": {
-			"version": "53.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
-			"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
+			"version": "56.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+			"integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.24.5",
+				"@babel/helper-validator-identifier": "^7.24.7",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"@eslint/eslintrc": "^3.0.2",
 				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
-				"core-js-compat": "^3.37.0",
-				"esquery": "^1.5.0",
+				"core-js-compat": "^3.38.1",
+				"esquery": "^1.6.0",
+				"globals": "^15.9.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
@@ -6740,7 +6312,7 @@
 				"read-pkg-up": "^7.0.1",
 				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"semver": "^7.6.1",
+				"semver": "^7.6.3",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
@@ -6753,62 +6325,10 @@
 				"eslint": ">=8.56.0"
 			}
 		},
-		"node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
-			"integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
-			"dev": true,
-			"dependencies": {
-				"ajv": "^6.12.4",
-				"debug": "^4.3.2",
-				"espree": "^10.0.1",
-				"globals": "^14.0.0",
-				"ignore": "^5.2.0",
-				"import-fresh": "^3.2.1",
-				"js-yaml": "^4.1.0",
-				"minimatch": "^3.1.2",
-				"strip-json-comments": "^3.1.1"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"url": "https://opencollective.com/eslint"
-			}
-		},
-		"node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
-			"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"url": "https://opencollective.com/eslint"
-			}
-		},
-		"node_modules/eslint-plugin-unicorn/node_modules/espree": {
-			"version": "10.0.1",
-			"resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
-			"integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
-			"dev": true,
-			"dependencies": {
-				"acorn": "^8.11.3",
-				"acorn-jsx": "^5.3.2",
-				"eslint-visitor-keys": "^4.0.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"url": "https://opencollective.com/eslint"
-			}
-		},
 		"node_modules/eslint-plugin-unicorn/node_modules/globals": {
-			"version": "14.0.0",
-			"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
-			"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+			"version": "15.15.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+			"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
 			"dev": true,
 			"engines": {
 				"node": ">=18"
@@ -6818,9 +6338,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "9.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz",
-			"integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==",
+			"version": "9.33.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+			"integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
@@ -6828,8 +6348,8 @@
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
 				"postcss-selector-parser": "^6.0.15",
-				"semver": "^7.6.0",
-				"vue-eslint-parser": "^9.4.2",
+				"semver": "^7.6.3",
+				"vue-eslint-parser": "^9.4.3",
 				"xml-name-validator": "^4.0.0"
 			},
 			"engines": {
@@ -6840,23 +6360,24 @@
 			}
 		},
 		"node_modules/eslint-plugin-wdio": {
-			"version": "8.24.12",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
-			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
+			"version": "9.16.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
+			"integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
 			"dev": true,
 			"engines": {
-				"node": "^16.13 || >=18"
+				"node": ">=18.20.0"
 			}
 		},
 		"node_modules/eslint-plugin-yml": {
-			"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==",
+			"version": "1.19.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.0.tgz",
+			"integrity": "sha512-S+4GbcCWksFKAvFJtf0vpdiCkZZvDJCV4Zsi9ahmYkYOYcf+LRqqzvzkb/ST7vTYV6sFwXOvawzYyL/jFT2nQA==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.5.0",
-				"lodash": "^4.17.21",
+				"diff-sequences": "^27.5.1",
+				"escape-string-regexp": "4.0.0",
+				"eslint-compat-utils": "^0.6.0",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
 			},
@@ -6968,9 +6489,9 @@
 			}
 		},
 		"node_modules/esquery": {
-			"version": "1.5.0",
-			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
-			"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+			"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
 			"dev": true,
 			"dependencies": {
 				"estraverse": "^5.1.0"
@@ -7821,9 +7342,9 @@
 			}
 		},
 		"node_modules/get-tsconfig": {
-			"version": "4.7.5",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
-			"integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+			"version": "4.13.0",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+			"integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
 			"dev": true,
 			"dependencies": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -8006,6 +7527,12 @@
 			"integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
 			"dev": true
 		},
+		"node_modules/globrex": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+			"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+			"dev": true
+		},
 		"node_modules/globule": {
 			"version": "1.3.3",
 			"resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz",
@@ -8489,6 +8016,22 @@
 			"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
 			"dev": true
 		},
+		"node_modules/html-entities": {
+			"version": "2.6.0",
+			"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+			"integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+			"dev": true,
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/mdevils"
+				},
+				{
+					"type": "patreon",
+					"url": "https://patreon.com/mdevils"
+				}
+			]
+		},
 		"node_modules/html-tags": {
 			"version": "3.3.1",
 			"resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
@@ -8616,9 +8159,9 @@
 			]
 		},
 		"node_modules/ignore": {
-			"version": "5.3.1",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
-			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+			"version": "5.3.2",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+			"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
 			"dev": true,
 			"engines": {
 				"node": ">= 4"
@@ -9235,12 +8778,12 @@
 			"dev": true
 		},
 		"node_modules/jsdoc-type-pratt-parser": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
-			"integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+			"version": "6.9.1",
+			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
+			"integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
 			"dev": true,
 			"engines": {
-				"node": ">=12.0.0"
+				"node": ">=20.0.0"
 			}
 		},
 		"node_modules/jsdoc-wmf-theme": {
@@ -9280,9 +8823,9 @@
 			}
 		},
 		"node_modules/jsesc": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
-			"integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+			"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
 			"dev": true,
 			"bin": {
 				"jsesc": "bin/jsesc"
@@ -10216,11 +9759,10 @@
 			}
 		},
 		"node_modules/node-releases": {
-			"version": "2.0.19",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
-			"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
-			"dev": true,
-			"license": "MIT"
+			"version": "2.0.27",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+			"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+			"dev": true
 		},
 		"node_modules/nopt": {
 			"version": "3.0.6",
@@ -10328,6 +9870,27 @@
 				"node": ">=0.10.0"
 			}
 		},
+		"node_modules/object-deep-merge": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
+			"integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
+			"dev": true,
+			"dependencies": {
+				"type-fest": "4.2.0"
+			}
+		},
+		"node_modules/object-deep-merge/node_modules/type-fest": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
+			"integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
+			"dev": true,
+			"engines": {
+				"node": ">=16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
 		"node_modules/object-inspect": {
 			"version": "1.13.4",
 			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -10600,6 +10163,15 @@
 			"integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==",
 			"dev": true
 		},
+		"node_modules/parse-imports-exports": {
+			"version": "0.2.4",
+			"resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+			"integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+			"dev": true,
+			"dependencies": {
+				"parse-statements": "1.0.11"
+			}
+		},
 		"node_modules/parse-json": {
 			"version": "5.2.0",
 			"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -10639,6 +10211,12 @@
 				"node": ">=0.10.0"
 			}
 		},
+		"node_modules/parse-statements": {
+			"version": "1.0.11",
+			"resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+			"integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+			"dev": true
+		},
 		"node_modules/parse5": {
 			"version": "7.3.0",
 			"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
@@ -10939,9 +10517,9 @@
 			}
 		},
 		"node_modules/postcss-selector-parser": {
-			"version": "6.0.16",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
-			"integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
+			"version": "6.1.2",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+			"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
 			"dev": true,
 			"dependencies": {
 				"cssesc": "^3.0.0",
@@ -11861,9 +11439,9 @@
 			}
 		},
 		"node_modules/semver": {
-			"version": "7.7.2",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
-			"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+			"version": "7.7.3",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+			"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
 			"dev": true,
 			"bin": {
 				"semver": "bin/semver.js"
@@ -12875,12 +12453,16 @@
 			"license": "MIT"
 		},
 		"node_modules/tapable": {
-			"version": "2.2.1",
-			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+			"integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
 			"dev": true,
 			"engines": {
 				"node": ">=6"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/webpack"
 			}
 		},
 		"node_modules/tar-fs": {
@@ -13008,15 +12590,49 @@
 			}
 		},
 		"node_modules/ts-api-utils": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
-			"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+			"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
 			"dev": true,
 			"engines": {
-				"node": ">=16"
+				"node": ">=18.12"
+			},
+			"peerDependencies": {
+				"typescript": ">=4.8.4"
+			}
+		},
+		"node_modules/ts-declaration-location": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+			"integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+			"dev": true,
+			"funding": [
+				{
+					"type": "ko-fi",
+					"url": "https://ko-fi.com/rebeccastevens"
+				},
+				{
+					"type": "tidelift",
+					"url": "https://tidelift.com/funding/github/npm/ts-declaration-location"
+				}
+			],
+			"dependencies": {
+				"picomatch": "^4.0.2"
 			},
 			"peerDependencies": {
-				"typescript": ">=4.2.0"
+				"typescript": ">=4.0.0"
+			}
+		},
+		"node_modules/ts-declaration-location/node_modules/picomatch": {
+			"version": "4.0.3",
+			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+			"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+			"dev": true,
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/jonschlinkert"
 			}
 		},
 		"node_modules/tslib": {
@@ -13181,9 +12797,9 @@
 			}
 		},
 		"node_modules/update-browserslist-db": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
-			"integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+			"version": "1.1.4",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+			"integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
 			"dev": true,
 			"funding": [
 				{
@@ -13199,7 +12815,6 @@
 					"url": "https://github.com/sponsors/ai"
 				}
 			],
-			"license": "MIT",
 			"dependencies": {
 				"escalade": "^3.2.0",
 				"picocolors": "^1.1.1"
@@ -13663,25 +13278,24 @@
 			}
 		},
 		"node_modules/yaml": {
-			"version": "2.4.3",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz",
-			"integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==",
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+			"integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
 			"dev": true,
 			"bin": {
 				"yaml": "bin.mjs"
 			},
 			"engines": {
-				"node": ">= 14"
+				"node": ">= 14.6"
 			}
 		},
 		"node_modules/yaml-eslint-parser": {
-			"version": "1.2.3",
-			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
-			"integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz",
+			"integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==",
 			"dev": true,
 			"dependencies": {
 				"eslint-visitor-keys": "^3.0.0",
-				"lodash": "^4.17.21",
 				"yaml": "^2.0.0"
 			},
 			"engines": {
@@ -13955,17 +13569,16 @@
 			"dev": true
 		},
 		"@es-joy/jsdoccomment": {
-			"version": "0.43.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
-			"integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
+			"version": "0.75.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
+			"integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
 			"dev": true,
 			"requires": {
-				"@types/eslint": "^8.56.5",
-				"@types/estree": "^1.0.5",
-				"@typescript-eslint/types": "^7.2.0",
+				"@types/estree": "^1.0.8",
+				"@typescript-eslint/types": "^8.46.0",
 				"comment-parser": "1.4.1",
-				"esquery": "^1.5.0",
-				"jsdoc-type-pratt-parser": "~4.0.0"
+				"esquery": "^1.6.0",
+				"jsdoc-type-pratt-parser": "~6.9.1"
 			}
 		},
 		"@esbuild/aix-ppc64": {
@@ -14153,9 +13766,9 @@
 			}
 		},
 		"@eslint-community/regexpp": {
-			"version": "4.10.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
-			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+			"version": "4.12.2",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+			"integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
 			"dev": true
 		},
 		"@eslint/eslintrc": {
@@ -14891,9 +14504,9 @@
 			}
 		},
 		"@mdn/browser-compat-data": {
-			"version": "5.4.1",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.4.1.tgz",
-			"integrity": "sha512-rD1yrH+vrinzmdgtLjj7qeE4FmYh0VezWQaB3DqVrLSBcGtz61pqV/yCO7piJQc8XmgOIKQIF9Go3LUdS9ORHg==",
+			"version": "5.7.6",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz",
+			"integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==",
 			"dev": true
 		},
 		"@noble/hashes": {
@@ -14999,71 +14612,6 @@
 				"picomatch": "^4.0.2"
 			},
 			"dependencies": {
-				"@typescript-eslint/scope-manager": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
-					"integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/types": "8.38.0",
-						"@typescript-eslint/visitor-keys": "8.38.0"
-					}
-				},
-				"@typescript-eslint/types": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
-					"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
-					"dev": true
-				},
-				"@typescript-eslint/typescript-estree": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
-					"integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/project-service": "8.38.0",
-						"@typescript-eslint/tsconfig-utils": "8.38.0",
-						"@typescript-eslint/types": "8.38.0",
-						"@typescript-eslint/visitor-keys": "8.38.0",
-						"debug": "^4.3.4",
-						"fast-glob": "^3.3.2",
-						"is-glob": "^4.0.3",
-						"minimatch": "^9.0.4",
-						"semver": "^7.6.0",
-						"ts-api-utils": "^2.1.0"
-					}
-				},
-				"@typescript-eslint/utils": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
-					"integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
-					"dev": true,
-					"requires": {
-						"@eslint-community/eslint-utils": "^4.7.0",
-						"@typescript-eslint/scope-manager": "8.38.0",
-						"@typescript-eslint/types": "8.38.0",
-						"@typescript-eslint/typescript-estree": "8.38.0"
-					}
-				},
-				"@typescript-eslint/visitor-keys": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
-					"integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/types": "8.38.0",
-						"eslint-visitor-keys": "^4.2.1"
-					}
-				},
-				"brace-expansion": {
-					"version": "2.0.2",
-					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-					"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-					"dev": true,
-					"requires": {
-						"balanced-match": "^1.0.0"
-					}
-				},
 				"eslint-visitor-keys": {
 					"version": "4.2.1",
 					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
@@ -15081,27 +14629,11 @@
 						"eslint-visitor-keys": "^4.2.1"
 					}
 				},
-				"minimatch": {
-					"version": "9.0.5",
-					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-					"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-					"dev": true,
-					"requires": {
-						"brace-expansion": "^2.0.1"
-					}
-				},
 				"picomatch": {
 					"version": "4.0.3",
 					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
 					"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
 					"dev": true
-				},
-				"ts-api-utils": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
-					"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
-					"dev": true,
-					"requires": {}
 				}
 			}
 		},
@@ -15135,16 +14667,6 @@
 					"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
 					"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
 					"dev": true
-				},
-				"postcss-selector-parser": {
-					"version": "6.1.2",
-					"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
-					"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
-					"dev": true,
-					"requires": {
-						"cssesc": "^3.0.0",
-						"util-deprecate": "^1.0.2"
-					}
 				}
 			}
 		},
@@ -15163,20 +14685,10 @@
 			"integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
 			"dev": true
 		},
-		"@types/eslint": {
-			"version": "8.56.10",
-			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
-			"integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
-			"dev": true,
-			"requires": {
-				"@types/estree": "*",
-				"@types/json-schema": "*"
-			}
-		},
 		"@types/estree": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
-			"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+			"version": "1.0.8",
+			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+			"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
 			"dev": true
 		},
 		"@types/istanbul-lib-coverage": {
@@ -15203,12 +14715,6 @@
 				"@types/istanbul-lib-report": "*"
 			}
 		},
-		"@types/json-schema": {
-			"version": "7.0.15",
-			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-			"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-			"dev": true
-		},
 		"@types/linkify-it": {
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
@@ -15311,135 +14817,108 @@
 			}
 		},
 		"@typescript-eslint/eslint-plugin": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
-			"integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+			"integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"requires": {
 				"@eslint-community/regexpp": "^4.10.0",
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/type-utils": "7.18.0",
-				"@typescript-eslint/utils": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/type-utils": "8.46.0",
+				"@typescript-eslint/utils": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"graphemer": "^1.4.0",
-				"ignore": "^5.3.1",
+				"ignore": "^7.0.0",
 				"natural-compare": "^1.4.0",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
+			},
+			"dependencies": {
+				"ignore": {
+					"version": "7.0.5",
+					"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+					"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+					"dev": true
+				}
 			}
 		},
 		"@typescript-eslint/parser": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
-			"integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+			"integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"requires": {
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/typescript-estree": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"debug": "^4.3.4"
-			},
-			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-					"dev": true,
-					"optional": true,
-					"peer": true
-				}
 			}
 		},
 		"@typescript-eslint/project-service": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
-			"integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+			"integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/tsconfig-utils": "^8.38.0",
-				"@typescript-eslint/types": "^8.38.0",
+				"@typescript-eslint/tsconfig-utils": "^8.46.0",
+				"@typescript-eslint/types": "^8.46.0",
 				"debug": "^4.3.4"
-			},
-			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
-					"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
-					"dev": true
-				}
 			}
 		},
 		"@typescript-eslint/scope-manager": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
-			"integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+			"integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0"
-			},
-			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-					"dev": true
-				}
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0"
 			}
 		},
 		"@typescript-eslint/tsconfig-utils": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
-			"integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+			"integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
 			"dev": true,
 			"requires": {}
 		},
 		"@typescript-eslint/type-utils": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
-			"integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+			"integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"requires": {
-				"@typescript-eslint/typescript-estree": "7.18.0",
-				"@typescript-eslint/utils": "7.18.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0",
+				"@typescript-eslint/utils": "8.46.0",
 				"debug": "^4.3.4",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			}
 		},
 		"@typescript-eslint/types": {
-			"version": "7.12.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
-			"integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+			"integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
 			"dev": true
 		},
 		"@typescript-eslint/typescript-estree": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
-			"integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+			"integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/project-service": "8.46.0",
+				"@typescript-eslint/tsconfig-utils": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"debug": "^4.3.4",
-				"globby": "^11.1.0",
+				"fast-glob": "^3.3.2",
 				"is-glob": "^4.0.3",
 				"minimatch": "^9.0.4",
 				"semver": "^7.6.0",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			},
 			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-					"dev": true
-				},
 				"brace-expansion": {
 					"version": "2.0.2",
 					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -15461,39 +14940,31 @@
 			}
 		},
 		"@typescript-eslint/utils": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
-			"integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+			"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
 			"dev": true,
 			"requires": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/typescript-estree": "7.18.0"
-			},
-			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-					"dev": true
-				}
+				"@eslint-community/eslint-utils": "^4.7.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0"
 			}
 		},
 		"@typescript-eslint/visitor-keys": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
-			"integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+			"integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "7.18.0",
-				"eslint-visitor-keys": "^3.4.3"
+				"@typescript-eslint/types": "8.46.0",
+				"eslint-visitor-keys": "^4.2.1"
 			},
 			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+				"eslint-visitor-keys": {
+					"version": "4.2.1",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+					"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
 					"dev": true
 				}
 			}
@@ -16581,12 +16052,12 @@
 			"dev": true
 		},
 		"ast-metadata-inferer": {
-			"version": "0.8.0",
-			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
-			"integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
+			"integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
 			"dev": true,
 			"requires": {
-				"@mdn/browser-compat-data": "^5.2.34"
+				"@mdn/browser-compat-data": "^5.6.19"
 			}
 		},
 		"ast-types": {
@@ -16701,6 +16172,12 @@
 			"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
 			"dev": true
 		},
+		"baseline-browser-mapping": {
+			"version": "2.8.28",
+			"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz",
+			"integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==",
+			"dev": true
+		},
 		"basic-ftp": {
 			"version": "5.0.5",
 			"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
@@ -16778,15 +16255,16 @@
 			"dev": true
 		},
 		"browserslist": {
-			"version": "4.24.4",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
-			"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+			"version": "4.28.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
+			"integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001688",
-				"electron-to-chromium": "^1.5.73",
-				"node-releases": "^2.0.19",
-				"update-browserslist-db": "^1.1.1"
+				"baseline-browser-mapping": "^2.8.25",
+				"caniuse-lite": "^1.0.30001754",
+				"electron-to-chromium": "^1.5.249",
+				"node-releases": "^2.0.27",
+				"update-browserslist-db": "^1.1.4"
 			}
 		},
 		"browserslist-config-wikimedia": {
@@ -16856,9 +16334,9 @@
 			"dev": true
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001692",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
-			"integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+			"version": "1.0.30001754",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+			"integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
 			"dev": true
 		},
 		"caseless": {
@@ -17177,12 +16655,12 @@
 			"dev": true
 		},
 		"core-js-compat": {
-			"version": "3.37.1",
-			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
-			"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+			"version": "3.46.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz",
+			"integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==",
 			"dev": true,
 			"requires": {
-				"browserslist": "^4.23.0"
+				"browserslist": "^4.26.3"
 			}
 		},
 		"core-util-is": {
@@ -17575,9 +17053,9 @@
 			"dev": true
 		},
 		"debug": {
-			"version": "4.4.1",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
-			"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+			"version": "4.4.3",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+			"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
 			"dev": true,
 			"requires": {
 				"ms": "^2.1.3"
@@ -17659,6 +17137,12 @@
 			"integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
 			"dev": true
 		},
+		"diff-sequences": {
+			"version": "27.5.1",
+			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+			"integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+			"dev": true
+		},
 		"dir-glob": {
 			"version": "3.0.1",
 			"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -17851,9 +17335,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.5.79",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.79.tgz",
-			"integrity": "sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==",
+			"version": "1.5.250",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz",
+			"integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==",
 			"dev": true
 		},
 		"emoji-regex": {
@@ -17882,9 +17366,9 @@
 			}
 		},
 		"enhanced-resolve": {
-			"version": "5.16.1",
-			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz",
-			"integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==",
+			"version": "5.18.3",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+			"integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
 			"dev": true,
 			"requires": {
 				"graceful-fs": "^4.2.4",
@@ -18078,251 +17562,123 @@
 			}
 		},
 		"eslint-compat-utils": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
-			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+			"version": "0.6.5",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+			"integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
 			"dev": true,
 			"requires": {
 				"semver": "^7.5.4"
 			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.31.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.31.0.tgz",
-			"integrity": "sha512-Z/t/zGPdxs/ehxb0EM6THNWAzueT7GtuqzjUvmBpkxcTKzZPJEXWnnpswdj/hgv8Ce8PIeDp0zwQxR4e3c9CIw==",
+			"version": "0.32.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.0.tgz",
+			"integrity": "sha512-kTuvtzzbvAgCIUjPsG7d+wilFK7MGAx3Fhb9onr16UsrFlyplXqNKetUu2awPrH4q4W+4V2JU5ju192A0blLvQ==",
 			"dev": true,
 			"requires": {
 				"@stylistic/eslint-plugin": "^3.1.0",
-				"@typescript-eslint/eslint-plugin": "8.35.1",
-				"@typescript-eslint/parser": "8.35.1",
+				"@typescript-eslint/eslint-plugin": "8.46.0",
+				"@typescript-eslint/parser": "8.46.0",
 				"browserslist-config-wikimedia": "^0.7.0",
 				"eslint": "^8.57.0",
-				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.6.0",
-				"eslint-plugin-jest": "^28.5.0",
-				"eslint-plugin-jsdoc": "48.2.5",
+				"eslint-plugin-compat": "^6.0.2",
+				"eslint-plugin-es-x": "^8.7.0",
+				"eslint-plugin-jest": "^29.0.1",
+				"eslint-plugin-jsdoc": "61.0.0",
 				"eslint-plugin-json-es": "^1.6.0",
-				"eslint-plugin-mediawiki": "^0.7.0",
-				"eslint-plugin-mocha": "^10.4.3",
-				"eslint-plugin-n": "^17.7.0",
+				"eslint-plugin-mediawiki": "^0.8.1",
+				"eslint-plugin-mocha": "^10.5.0",
+				"eslint-plugin-n": "^17.23.1",
 				"eslint-plugin-no-jquery": "^3.1.1",
-				"eslint-plugin-qunit": "^8.1.1",
-				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^53.0.0",
-				"eslint-plugin-vue": "^9.26.0",
-				"eslint-plugin-wdio": "^8.24.12",
-				"eslint-plugin-yml": "^1.14.0"
-			},
-			"dependencies": {
-				"@typescript-eslint/eslint-plugin": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
-					"integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
-					"dev": true,
-					"requires": {
-						"@eslint-community/regexpp": "^4.10.0",
-						"@typescript-eslint/scope-manager": "8.35.1",
-						"@typescript-eslint/type-utils": "8.35.1",
-						"@typescript-eslint/utils": "8.35.1",
-						"@typescript-eslint/visitor-keys": "8.35.1",
-						"graphemer": "^1.4.0",
-						"ignore": "^7.0.0",
-						"natural-compare": "^1.4.0",
-						"ts-api-utils": "^2.1.0"
-					},
-					"dependencies": {
-						"@typescript-eslint/type-utils": {
-							"version": "8.35.1",
-							"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
-							"integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
-							"dev": true,
-							"requires": {
-								"@typescript-eslint/typescript-estree": "8.35.1",
-								"@typescript-eslint/utils": "8.35.1",
-								"debug": "^4.3.4",
-								"ts-api-utils": "^2.1.0"
-							}
-						},
-						"@typescript-eslint/utils": {
-							"version": "8.35.1",
-							"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
-							"integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
-							"dev": true,
-							"requires": {
-								"@eslint-community/eslint-utils": "^4.7.0",
-								"@typescript-eslint/scope-manager": "8.35.1",
-								"@typescript-eslint/types": "8.35.1",
-								"@typescript-eslint/typescript-estree": "8.35.1"
-							}
-						}
-					}
-				},
-				"@typescript-eslint/parser": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
-					"integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/scope-manager": "8.35.1",
-						"@typescript-eslint/types": "8.35.1",
-						"@typescript-eslint/typescript-estree": "8.35.1",
-						"@typescript-eslint/visitor-keys": "8.35.1",
-						"debug": "^4.3.4"
-					}
-				},
-				"@typescript-eslint/project-service": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
-					"integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/tsconfig-utils": "^8.35.1",
-						"@typescript-eslint/types": "^8.35.1",
-						"debug": "^4.3.4"
-					}
-				},
-				"@typescript-eslint/scope-manager": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
-					"integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/types": "8.35.1",
-						"@typescript-eslint/visitor-keys": "8.35.1"
-					}
-				},
-				"@typescript-eslint/tsconfig-utils": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
-					"integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
-					"dev": true,
-					"requires": {}
-				},
-				"@typescript-eslint/types": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
-					"integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
-					"dev": true
-				},
-				"@typescript-eslint/typescript-estree": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
-					"integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/project-service": "8.35.1",
-						"@typescript-eslint/tsconfig-utils": "8.35.1",
-						"@typescript-eslint/types": "8.35.1",
-						"@typescript-eslint/visitor-keys": "8.35.1",
-						"debug": "^4.3.4",
-						"fast-glob": "^3.3.2",
-						"is-glob": "^4.0.3",
-						"minimatch": "^9.0.4",
-						"semver": "^7.6.0",
-						"ts-api-utils": "^2.1.0"
-					}
-				},
-				"@typescript-eslint/visitor-keys": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
-					"integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/types": "8.35.1",
-						"eslint-visitor-keys": "^4.2.1"
-					}
-				},
-				"brace-expansion": {
-					"version": "2.0.2",
-					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-					"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-					"dev": true,
-					"requires": {
-						"balanced-match": "^1.0.0"
-					}
-				},
-				"eslint-visitor-keys": {
-					"version": "4.2.1",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
-					"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
-					"dev": true
-				},
-				"ignore": {
-					"version": "7.0.5",
-					"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
-					"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
-					"dev": true
-				},
-				"minimatch": {
-					"version": "9.0.5",
-					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-					"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-					"dev": true,
-					"requires": {
-						"brace-expansion": "^2.0.1"
-					}
-				},
-				"ts-api-utils": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
-					"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
-					"dev": true,
-					"requires": {}
-				}
+				"eslint-plugin-qunit": "^8.2.5",
+				"eslint-plugin-security": "^3.0.1",
+				"eslint-plugin-unicorn": "^56.0.1",
+				"eslint-plugin-vue": "^9.33.0",
+				"eslint-plugin-wdio": "^9.16.2",
+				"eslint-plugin-yml": "^1.19.0"
 			}
 		},
 		"eslint-plugin-compat": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
-			"integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
+			"integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
 			"dev": true,
 			"requires": {
-				"@mdn/browser-compat-data": "^5.3.13",
-				"ast-metadata-inferer": "^0.8.0",
-				"browserslist": "^4.21.10",
-				"caniuse-lite": "^1.0.30001524",
+				"@mdn/browser-compat-data": "^5.5.35",
+				"ast-metadata-inferer": "^0.8.1",
+				"browserslist": "^4.24.2",
+				"caniuse-lite": "^1.0.30001687",
 				"find-up": "^5.0.0",
+				"globals": "^15.7.0",
 				"lodash.memoize": "^4.1.2",
-				"semver": "^7.5.4"
+				"semver": "^7.6.2"
+			},
+			"dependencies": {
+				"globals": {
+					"version": "15.15.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+					"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+					"dev": true
+				}
 			}
 		},
 		"eslint-plugin-es-x": {
-			"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==",
+			"version": "8.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-8.7.0.tgz",
+			"integrity": "sha512-Du5Sb067sjqzmglaPhsfcEQgE1EYfL8sko+4jOMcAB/XKGoCxntSrOmTYuVzswA1rzM9+MZwH6+GOp0G3/wVCg==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.1.2",
-				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.5.0"
+				"@eslint-community/regexpp": "^4.12.1",
+				"eslint-compat-utils": "^0.6.3"
 			}
 		},
 		"eslint-plugin-jest": {
-			"version": "28.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz",
-			"integrity": "sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==",
+			"version": "29.1.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
+			"integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
+				"@typescript-eslint/utils": "^8.0.0"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "48.2.5",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
-			"integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
+			"version": "61.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
+			"integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
 			"dev": true,
 			"requires": {
-				"@es-joy/jsdoccomment": "~0.43.0",
+				"@es-joy/jsdoccomment": "~0.75.0",
 				"are-docs-informative": "^0.0.2",
 				"comment-parser": "1.4.1",
-				"debug": "^4.3.4",
+				"debug": "^4.4.3",
 				"escape-string-regexp": "^4.0.0",
-				"esquery": "^1.5.0",
-				"is-builtin-module": "^3.2.1",
-				"semver": "^7.6.1",
+				"espree": "^10.4.0",
+				"esquery": "^1.6.0",
+				"html-entities": "^2.6.0",
+				"object-deep-merge": "^1.0.5",
+				"parse-imports-exports": "^0.2.4",
+				"semver": "^7.7.3",
 				"spdx-expression-parse": "^4.0.0"
 			},
 			"dependencies": {
+				"eslint-visitor-keys": {
+					"version": "4.2.1",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+					"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+					"dev": true
+				},
+				"espree": {
+					"version": "10.4.0",
+					"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+					"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+					"dev": true,
+					"requires": {
+						"acorn": "^8.15.0",
+						"acorn-jsx": "^5.3.2",
+						"eslint-visitor-keys": "^4.2.1"
+					}
+				},
 				"spdx-expression-parse": {
 					"version": "4.0.0",
 					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
@@ -18356,19 +17712,18 @@
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
-			"integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
+			"integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			}
 		},
 		"eslint-plugin-mocha": {
-			"version": "10.4.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
-			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
+			"version": "10.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz",
+			"integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -18377,44 +17732,47 @@
 			}
 		},
 		"eslint-plugin-n": {
-			"version": "17.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.7.0.tgz",
-			"integrity": "sha512-4Jg4ZKVE4VjHig2caBqPHYNW5na84RVufUuipFLJbgM/G57O6FdpUKJbHakCDJb/yjQuyqVzYWRtU3HNYaZUwg==",
-			"dev": true,
-			"requires": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"enhanced-resolve": "^5.15.0",
-				"eslint-plugin-es-x": "^7.5.0",
-				"get-tsconfig": "^4.7.0",
-				"globals": "^15.0.0",
-				"ignore": "^5.2.4",
-				"minimatch": "^9.0.0",
-				"semver": "^7.5.3"
+			"version": "17.23.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
+			"integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+			"dev": true,
+			"requires": {
+				"@eslint-community/eslint-utils": "^4.5.0",
+				"enhanced-resolve": "^5.17.1",
+				"eslint-plugin-es-x": "^7.8.0",
+				"get-tsconfig": "^4.8.1",
+				"globals": "^15.11.0",
+				"globrex": "^0.1.2",
+				"ignore": "^5.3.2",
+				"semver": "^7.6.3",
+				"ts-declaration-location": "^1.0.6"
 			},
 			"dependencies": {
-				"brace-expansion": {
-					"version": "2.0.2",
-					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-					"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+				"eslint-compat-utils": {
+					"version": "0.5.1",
+					"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+					"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
 					"dev": true,
 					"requires": {
-						"balanced-match": "^1.0.0"
+						"semver": "^7.5.4"
 					}
 				},
-				"globals": {
-					"version": "15.3.0",
-					"resolved": "https://registry.npmjs.org/globals/-/globals-15.3.0.tgz",
-					"integrity": "sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==",
-					"dev": true
-				},
-				"minimatch": {
-					"version": "9.0.4",
-					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
-					"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+				"eslint-plugin-es-x": {
+					"version": "7.8.0",
+					"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+					"integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
 					"dev": true,
 					"requires": {
-						"brace-expansion": "^2.0.1"
+						"@eslint-community/eslint-utils": "^4.1.2",
+						"@eslint-community/regexpp": "^4.11.0",
+						"eslint-compat-utils": "^0.5.1"
 					}
+				},
+				"globals": {
+					"version": "15.15.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+					"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+					"dev": true
 				}
 			}
 		},
@@ -18426,9 +17784,9 @@
 			"requires": {}
 		},
 		"eslint-plugin-qunit": {
-			"version": "8.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
-			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
+			"version": "8.2.5",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
+			"integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -18436,27 +17794,27 @@
 			}
 		},
 		"eslint-plugin-security": {
-			"version": "1.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz",
-			"integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==",
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
+			"integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
 			"dev": true,
 			"requires": {
 				"safe-regex": "^2.1.1"
 			}
 		},
 		"eslint-plugin-unicorn": {
-			"version": "53.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
-			"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
+			"version": "56.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+			"integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.24.5",
+				"@babel/helper-validator-identifier": "^7.24.7",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"@eslint/eslintrc": "^3.0.2",
 				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
-				"core-js-compat": "^3.37.0",
-				"esquery": "^1.5.0",
+				"core-js-compat": "^3.38.1",
+				"esquery": "^1.6.0",
+				"globals": "^15.9.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
@@ -18464,56 +17822,22 @@
 				"read-pkg-up": "^7.0.1",
 				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"semver": "^7.6.1",
+				"semver": "^7.6.3",
 				"strip-indent": "^3.0.0"
 			},
 			"dependencies": {
-				"@eslint/eslintrc": {
-					"version": "3.1.0",
-					"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
-					"integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
-					"dev": true,
-					"requires": {
-						"ajv": "^6.12.4",
-						"debug": "^4.3.2",
-						"espree": "^10.0.1",
-						"globals": "^14.0.0",
-						"ignore": "^5.2.0",
-						"import-fresh": "^3.2.1",
-						"js-yaml": "^4.1.0",
-						"minimatch": "^3.1.2",
-						"strip-json-comments": "^3.1.1"
-					}
-				},
-				"eslint-visitor-keys": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
-					"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
-					"dev": true
-				},
-				"espree": {
-					"version": "10.0.1",
-					"resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
-					"integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
-					"dev": true,
-					"requires": {
-						"acorn": "^8.11.3",
-						"acorn-jsx": "^5.3.2",
-						"eslint-visitor-keys": "^4.0.0"
-					}
-				},
 				"globals": {
-					"version": "14.0.0",
-					"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
-					"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+					"version": "15.15.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+					"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
 					"dev": true
 				}
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "9.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz",
-			"integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==",
+			"version": "9.33.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+			"integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
@@ -18521,26 +17845,27 @@
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
 				"postcss-selector-parser": "^6.0.15",
-				"semver": "^7.6.0",
-				"vue-eslint-parser": "^9.4.2",
+				"semver": "^7.6.3",
+				"vue-eslint-parser": "^9.4.3",
 				"xml-name-validator": "^4.0.0"
 			}
 		},
 		"eslint-plugin-wdio": {
-			"version": "8.24.12",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
-			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
+			"version": "9.16.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
+			"integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
 			"dev": true
 		},
 		"eslint-plugin-yml": {
-			"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==",
+			"version": "1.19.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.0.tgz",
+			"integrity": "sha512-S+4GbcCWksFKAvFJtf0vpdiCkZZvDJCV4Zsi9ahmYkYOYcf+LRqqzvzkb/ST7vTYV6sFwXOvawzYyL/jFT2nQA==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.5.0",
-				"lodash": "^4.17.21",
+				"diff-sequences": "^27.5.1",
+				"escape-string-regexp": "4.0.0",
+				"eslint-compat-utils": "^0.6.0",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
 			}
@@ -18596,9 +17921,9 @@
 			"dev": true
 		},
 		"esquery": {
-			"version": "1.5.0",
-			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
-			"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+			"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
 			"dev": true,
 			"requires": {
 				"estraverse": "^5.1.0"
@@ -19199,9 +18524,9 @@
 			}
 		},
 		"get-tsconfig": {
-			"version": "4.7.5",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
-			"integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+			"version": "4.13.0",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+			"integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
 			"dev": true,
 			"requires": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -19344,6 +18669,12 @@
 			"integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
 			"dev": true
 		},
+		"globrex": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+			"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+			"dev": true
+		},
 		"globule": {
 			"version": "1.3.3",
 			"resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz",
@@ -19708,6 +19039,12 @@
 			"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
 			"dev": true
 		},
+		"html-entities": {
+			"version": "2.6.0",
+			"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+			"integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+			"dev": true
+		},
 		"html-tags": {
 			"version": "3.3.1",
 			"resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
@@ -19791,9 +19128,9 @@
 			"dev": true
 		},
 		"ignore": {
-			"version": "5.3.1",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
-			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+			"version": "5.3.2",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+			"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
 			"dev": true
 		},
 		"image-q": {
@@ -20279,9 +19616,9 @@
 			"dev": true
 		},
 		"jsdoc-type-pratt-parser": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
-			"integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+			"version": "6.9.1",
+			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
+			"integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
 			"dev": true
 		},
 		"jsdoc-wmf-theme": {
@@ -20308,9 +19645,9 @@
 			}
 		},
 		"jsesc": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
-			"integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+			"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
 			"dev": true
 		},
 		"json-buffer": {
@@ -21044,9 +20381,9 @@
 			}
 		},
 		"node-releases": {
-			"version": "2.0.19",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
-			"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+			"version": "2.0.27",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+			"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
 			"dev": true
 		},
 		"nopt": {
@@ -21129,6 +20466,23 @@
 			"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
 			"dev": true
 		},
+		"object-deep-merge": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
+			"integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
+			"dev": true,
+			"requires": {
+				"type-fest": "4.2.0"
+			},
+			"dependencies": {
+				"type-fest": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
+					"integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
+					"dev": true
+				}
+			}
+		},
 		"object-inspect": {
 			"version": "1.13.4",
 			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -21345,6 +20699,15 @@
 			"integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==",
 			"dev": true
 		},
+		"parse-imports-exports": {
+			"version": "0.2.4",
+			"resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+			"integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+			"dev": true,
+			"requires": {
+				"parse-statements": "1.0.11"
+			}
+		},
 		"parse-json": {
 			"version": "5.2.0",
 			"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -21369,6 +20732,12 @@
 			"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
 			"dev": true
 		},
+		"parse-statements": {
+			"version": "1.0.11",
+			"resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+			"integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+			"dev": true
+		},
 		"parse5": {
 			"version": "7.3.0",
 			"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
@@ -21575,9 +20944,9 @@
 			"requires": {}
 		},
 		"postcss-selector-parser": {
-			"version": "6.0.16",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
-			"integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
+			"version": "6.1.2",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+			"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
 			"dev": true,
 			"requires": {
 				"cssesc": "^3.0.0",
@@ -22279,9 +21648,9 @@
 			}
 		},
 		"semver": {
-			"version": "7.7.2",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
-			"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+			"version": "7.7.3",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+			"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
 			"dev": true
 		},
 		"serialize-error": {
@@ -22961,9 +22330,9 @@
 			}
 		},
 		"tapable": {
-			"version": "2.2.1",
-			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+			"integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
 			"dev": true
 		},
 		"tar-fs": {
@@ -23078,12 +22447,29 @@
 			}
 		},
 		"ts-api-utils": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
-			"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+			"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
 			"dev": true,
 			"requires": {}
 		},
+		"ts-declaration-location": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+			"integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+			"dev": true,
+			"requires": {
+				"picomatch": "^4.0.2"
+			},
+			"dependencies": {
+				"picomatch": {
+					"version": "4.0.3",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+					"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+					"dev": true
+				}
+			}
+		},
 		"tslib": {
 			"version": "2.8.1",
 			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -23197,9 +22583,9 @@
 			"dev": true
 		},
 		"update-browserslist-db": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
-			"integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+			"version": "1.1.4",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+			"integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
 			"dev": true,
 			"requires": {
 				"escalade": "^3.2.0",
@@ -23547,19 +22933,18 @@
 			"dev": true
 		},
 		"yaml": {
-			"version": "2.4.3",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz",
-			"integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==",
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+			"integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
 			"dev": true
 		},
 		"yaml-eslint-parser": {
-			"version": "1.2.3",
-			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
-			"integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz",
+			"integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==",
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^3.0.0",
-				"lodash": "^4.17.21",
 				"yaml": "^2.0.0"
 			}
 		},
diff --git a/package.json b/package.json
index a7046c5..84f7f9d 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
 		"@wdio/mocha-framework": "9.15.0",
 		"@wdio/spec-reporter": "9.15.0",
 		"api-testing": "1.7.1",
-		"eslint-config-wikimedia": "0.31.0",
+		"eslint-config-wikimedia": "0.32.0",
 		"eslint-plugin-local": "^4.2.2",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.13.0",
-- 
2.47.3

$ date
--- stdout ---
Thu Nov 13 15:30:43 UTC 2025

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-VisualEditor.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
--- stderr ---
Submodule 'lib/ve' (https://gerrit.wikimedia.org/r/VisualEditor/VisualEditor.git) registered for path 'lib/ve'
Cloning into '/src/repo/lib/ve'...
--- stdout ---
Submodule path 'lib/ve': checked out 'b70ee4a11dfb2a5db4befc350470c43170cf42fa'

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

--- end ---
$ git show-ref refs/heads/master
--- stdout ---
313b70a9565e9c3ff4d22c0afbcd77eebf196a56 refs/heads/master

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "@jimp/core": {
      "name": "@jimp/core",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "phin"
      ],
      "effects": [
        "@jimp/custom"
      ],
      "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0",
      "nodes": [
        "node_modules/@jimp/core"
      ],
      "fixAvailable": {
        "name": "jimp",
        "version": "1.6.0",
        "isSemVerMajor": true
      }
    },
    "@jimp/custom": {
      "name": "@jimp/custom",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "@jimp/core"
      ],
      "effects": [
        "jimp"
      ],
      "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0",
      "nodes": [
        "node_modules/@jimp/custom"
      ],
      "fixAvailable": {
        "name": "jimp",
        "version": "1.6.0",
        "isSemVerMajor": true
      }
    },
    "form-data": {
      "name": "form-data",
      "severity": "critical",
      "isDirect": false,
      "via": [
        {
          "source": 1109540,
          "name": "form-data",
          "dependency": "form-data",
          "title": "form-data uses unsafe random function in form-data for choosing boundary",
          "url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4",
          "severity": "critical",
          "cwe": [
            "CWE-330"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<2.5.4"
        }
      ],
      "effects": [
        "request"
      ],
      "range": "<2.5.4",
      "nodes": [
        "node_modules/form-data"
      ],
      "fixAvailable": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "jimp": {
      "name": "jimp",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "@jimp/custom"
      ],
      "effects": [],
      "range": "0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0",
      "nodes": [
        "node_modules/jimp"
      ],
      "fixAvailable": {
        "name": "jimp",
        "version": "1.6.0",
        "isSemVerMajor": true
      }
    },
    "mwbot": {
      "name": "mwbot",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "request"
      ],
      "effects": [
        "wdio-mediawiki"
      ],
      "range": ">=0.1.6",
      "nodes": [
        "node_modules/mwbot"
      ],
      "fixAvailable": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "phin": {
      "name": "phin",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096967,
          "name": "phin",
          "dependency": "phin",
          "title": "phin may include sensitive headers in subsequent requests after redirect",
          "url": "https://github.com/advisories/GHSA-x565-32qp-m3vf",
          "severity": "moderate",
          "cwe": [
            "CWE-200"
          ],
          "cvss": {
            "score": 4.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N"
          },
          "range": "<3.7.1"
        }
      ],
      "effects": [
        "@jimp/core"
      ],
      "range": "<3.7.1",
      "nodes": [
        "node_modules/phin"
      ],
      "fixAvailable": {
        "name": "jimp",
        "version": "1.6.0",
        "isSemVerMajor": true
      }
    },
    "request": {
      "name": "request",
      "severity": "critical",
      "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"
        },
        "form-data",
        "tough-cookie"
      ],
      "effects": [
        "mwbot"
      ],
      "range": "*",
      "nodes": [
        "node_modules/request"
      ],
      "fixAvailable": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "selenium-webdriver": {
      "name": "selenium-webdriver",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "tmp",
        "xml2js"
      ],
      "effects": [],
      "range": "2.43.1 - 4.0.0-rc-2",
      "nodes": [
        "node_modules/selenium-webdriver"
      ],
      "fixAvailable": {
        "name": "selenium-webdriver",
        "version": "4.38.0",
        "isSemVerMajor": true
      }
    },
    "tmp": {
      "name": "tmp",
      "severity": "low",
      "isDirect": false,
      "via": [
        {
          "source": 1109537,
          "name": "tmp",
          "dependency": "tmp",
          "title": "tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter",
          "url": "https://github.com/advisories/GHSA-52f5-9888-hmc6",
          "severity": "low",
          "cwe": [
            "CWE-59"
          ],
          "cvss": {
            "score": 2.5,
            "vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"
          },
          "range": "<=0.2.3"
        }
      ],
      "effects": [],
      "range": "<=0.2.3",
      "nodes": [
        "node_modules/tmp"
      ],
      "fixAvailable": true
    },
    "tough-cookie": {
      "name": "tough-cookie",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1097682,
          "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": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "wdio-mediawiki": {
      "name": "wdio-mediawiki",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "mwbot"
      ],
      "effects": [],
      "range": "<=5.1.0",
      "nodes": [
        "node_modules/wdio-mediawiki"
      ],
      "fixAvailable": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "xml2js": {
      "name": "xml2js",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096693,
          "name": "xml2js",
          "dependency": "xml2js",
          "title": "xml2js is vulnerable to prototype pollution",
          "url": "https://github.com/advisories/GHSA-776f-qx25-q3cc",
          "severity": "moderate",
          "cwe": [
            "CWE-1321"
          ],
          "cvss": {
            "score": 5.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
          },
          "range": "<0.5.0"
        }
      ],
      "effects": [
        "selenium-webdriver"
      ],
      "range": "<0.5.0",
      "nodes": [
        "node_modules/xml2js"
      ],
      "fixAvailable": {
        "name": "selenium-webdriver",
        "version": "4.38.0",
        "isSemVerMajor": true
      }
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 1,
      "moderate": 9,
      "high": 0,
      "critical": 2,
      "total": 12
    },
    "dependencies": {
      "prod": 1,
      "dev": 1089,
      "optional": 41,
      "peer": 5,
      "peerOptional": 0,
      "total": 1089
    }
  }
}

--- 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: 38 installs, 0 updates, 0 removals
  - Locking composer/pcre (3.3.2)
  - Locking composer/semver (3.4.4)
  - Locking composer/spdx-licenses (1.5.9)
  - Locking composer/xdebug-handler (3.0.5)
  - Locking dealerdirect/phpcodesniffer-composer-installer (v1.2.0)
  - Locking doctrine/deprecations (1.1.5)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking mediawiki/mediawiki-codesniffer (v48.0.0)
  - Locking mediawiki/mediawiki-phan-config (0.17.0)
  - Locking mediawiki/minus-x (1.1.3)
  - Locking mediawiki/phan-taint-check-plugin (7.0.0)
  - Locking microsoft/tolerant-php-parser (v0.1.2)
  - Locking netresearch/jsonmapper (v4.5.0)
  - Locking phan/phan (5.5.1)
  - 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.4.0)
  - Locking phpcsstandards/phpcsextra (1.4.0)
  - Locking phpcsstandards/phpcsutils (1.1.1)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.6.3)
  - Locking phpdocumentor/type-resolver (1.10.0)
  - Locking phpstan/phpdoc-parser (2.3.0)
  - Locking psr/container (2.0.2)
  - Locking psr/log (3.0.2)
  - Locking sabre/event (5.1.7)
  - Locking squizlabs/php_codesniffer (3.13.2)
  - Locking symfony/console (v7.3.6)
  - Locking symfony/deprecation-contracts (v3.6.0)
  - Locking symfony/polyfill-ctype (v1.33.0)
  - Locking symfony/polyfill-intl-grapheme (v1.33.0)
  - Locking symfony/polyfill-intl-normalizer (v1.33.0)
  - Locking symfony/polyfill-mbstring (v1.33.0)
  - Locking symfony/polyfill-php80 (v1.33.0)
  - Locking symfony/service-contracts (v3.6.1)
  - Locking symfony/string (v7.3.4)
  - Locking tysonandre/var_representation_polyfill (0.1.3)
  - Locking webmozart/assert (1.12.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 38 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Installing squizlabs/php_codesniffer (3.13.2): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.2.0): Extracting archive
  - Installing composer/pcre (3.3.2): Extracting archive
  - Installing phpcsstandards/phpcsutils (1.1.1): Extracting archive
  - Installing phpcsstandards/phpcsextra (1.4.0): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.33.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.9): Extracting archive
  - Installing composer/semver (3.4.4): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v48.0.0): Extracting archive
  - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
  - Installing symfony/polyfill-php80 (v1.33.0): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.33.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.33.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.33.0): Extracting archive
  - Installing symfony/string (v7.3.4): Extracting archive
  - Installing symfony/deprecation-contracts (v3.6.0): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing symfony/service-contracts (v3.6.1): Extracting archive
  - Installing symfony/console (v7.3.6): Extracting archive
  - Installing sabre/event (5.1.7): Extracting archive
  - Installing netresearch/jsonmapper (v4.5.0): Extracting archive
  - Installing microsoft/tolerant-php-parser (v0.1.2): Extracting archive
  - Installing webmozart/assert (1.12.1): Extracting archive
  - Installing phpstan/phpdoc-parser (2.3.0): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing doctrine/deprecations (1.1.5): Extracting archive
  - Installing phpdocumentor/type-resolver (1.10.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.6.3): Extracting archive
  - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
  - Installing psr/log (3.0.2): Extracting archive
  - Installing composer/xdebug-handler (3.0.5): Extracting archive
  - Installing phan/phan (5.5.1): Extracting archive
  - Installing mediawiki/phan-taint-check-plugin (7.0.0): Extracting archive
  - Installing mediawiki/mediawiki-phan-config (0.17.0): Extracting archive
  - Installing mediawiki/minus-x (1.1.3): 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.4.0): Extracting archive
  0/36 [>---------------------------]   0%
 28/36 [=====================>------]  77%
 36/36 [============================] 100%
1 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.31.0 -> 0.32.0
$ /usr/bin/npm install
--- stderr ---
npm WARN deprecated lodash.isequal@4.5.0: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
npm WARN deprecated glob@8.1.0: Glob versions prior to v9 are 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 node-domexception@1.0.0: Use your platform's native DOMException instead
--- stdout ---

added 1044 packages, and audited 1045 packages in 18s

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

12 vulnerabilities (1 low, 9 moderate, 2 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

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

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

up to date, audited 1045 packages in 3s

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

12 vulnerabilities (1 low, 9 moderate, 2 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

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

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

/src/repo/build/screenshots.js
  97:6  warning  Found writeFile from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/editcheck/modules/EditCheckAction.js
   50:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  239:9   error    ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  241:10  error    ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  314:10  error    ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some

/src/repo/editcheck/modules/EditCheckActionWidget.js
  109:1  warning  The type 'jQuery.Event' is undefined    jsdoc/no-undefined-types
  146:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/editcheck/modules/EditCheckGutterSectionWidget.js
  132:14  error  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/editcheck/modules/controller.js
  158:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  192:19  error    ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  204:1   warning  The type 'Controller.position' is undefined            jsdoc/no-undefined-types
  215:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  256:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  300:53  error    ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  301:60  error    ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  321:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  347:1   warning  The type 'Controller.focusAction' is undefined         jsdoc/no-undefined-types
  348:1   warning  The type 'Controller.position' is undefined            jsdoc/no-undefined-types
  406:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  407:1   warning  The type 'Controller.focusAction' is undefined         jsdoc/no-undefined-types
  430:16  error    ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  823:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  838:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types

/src/repo/editcheck/modules/dialogs/EditCheckDialog.js
   60:24  error    OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
   68:20  error    OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  163:9   error    ES2025 'Iterator.prototype.some' method is forbidden                                                        es-x/no-iterator-prototype-some
  328:1   warning  The type 'jQuery.Promise' is undefined                                                                      jsdoc/no-undefined-types
  343:1   warning  The type 'jQuery.Promise' is undefined                                                                      jsdoc/no-undefined-types

/src/repo/editcheck/modules/dialogs/GutterSidebarEditCheckDialog.js
  151:5  error  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/editcheck/modules/editchecks/BaseEditCheck.js
  148:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  327:3   error    ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  432:10  error    ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  536:24  error    ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some

/src/repo/editcheck/modules/editchecks/experimental/ExternalLinksEditCheck.js
  41:4  error  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/editcheck/modules/editchecks/experimental/TextMatchEditCheck.js
  101:12  error    ES2025 'Iterator.prototype.reduce' method is forbidden                                 es-x/no-iterator-prototype-reduce
  118:10  error    ES2025 'Iterator.prototype.some' method is forbidden                                   es-x/no-iterator-prototype-some
  144:25  error    ES2025 'Iterator.prototype.some' method is forbidden                                   es-x/no-iterator-prototype-some
  252:1   warning  The type 'jQuery.Promise' is undefined                                                 jsdoc/no-undefined-types
  274:9   error    ES2025 'Iterator.prototype.every' method is forbidden                                  es-x/no-iterator-prototype-every
  276:10  error    ES2025 'Iterator.prototype.some' method is forbidden                                   es-x/no-iterator-prototype-some
  308:1   warning  Expected @param names to be "item, id, collator". Got "matchItem, item, id, collator"  jsdoc/check-param-names
  309:1   warning  Missing JSDoc @param "item" type                                                       jsdoc/require-param-type
  311:1   warning  The type 'Collator' is undefined                                                       jsdoc/no-undefined-types

/src/repo/editcheck/modules/init.js
  102:25  error  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
  110:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types
  140:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
  140:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types
  168:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWSignatureNode.js
  145:11  error  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWTableNode.js
  123:24  error  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
  199:1  warning  The type 'jQuery.Deferred' is undefined                  jsdoc/no-undefined-types
  258:9  error    ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  264:1  warning  The type 'jQuery.Deferred' is undefined                  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/dm/models/ve.dm.MWParameterModel.js
   11:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   11:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   21:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  104:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTemplateModel.js
   10:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  130:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  158:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  249:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  249:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  314:22  error    ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTemplatePlaceholderModel.js
  10:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTemplateSpecModel.js
   89:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  171:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  213:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  247:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  275:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  275:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  439:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionContentModel.js
  10:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js
   18:1   warning  The type 'jQuery.Deferred' is undefined                jsdoc/no-undefined-types
   43:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
   88:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  171:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  326:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  393:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  444:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  469:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  502:10  error    ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  590:10  error    ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionPartModel.js
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  74:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  74:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
  317:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
  220:10  error    ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  456:9   error    ES2025 'Iterator.prototype.some' method is forbidden     es-x/no-iterator-prototype-some
  489:1   warning  Invalid JSDoc inline tag name "see"                      jsdoc/check-tag-names

/src/repo/modules/ve-mw/init/apiresponsecache/ve.init.mw.ApiResponseCache.js
   74:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  136:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/targets/ve.init.mw.ArticleTarget.js
   870:2  error    ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  1016:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1100:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1101:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1279:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1312:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1361:1  warning  The type 'jQuery.Deferred' is undefined                  jsdoc/no-undefined-types
  1488:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1590:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1677:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1819:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2274:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2306:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2374:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2464:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js
   58:27  error    ES2025 'Iterator.prototype.reduce' method is forbidden   es-x/no-iterator-prototype-reduce
   58:27  error    ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  387:1   warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  389:1   warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  827:1   warning  The type 'jQuery.Event' is undefined                     jsdoc/no-undefined-types
  893:1   warning  The type 'jQuery.Event' is undefined                     jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/targets/ve.init.mw.Target.js
  526:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  564:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  606:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/ve.init.mw.Platform.js
  109:9  error  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray

/src/repo/modules/ve-mw/init/ve.init.mw.ViewportZoomHandler.js
  106:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types
  119:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types
  128:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/preinit/ve.init.mw.ArticleTargetLoader.js
  116:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  239:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  319:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  513:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/preinit/ve.init.mw.ArticleTargetSaver.js
   33:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  119:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  133:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  156:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  172:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  215:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js
   252:1   warning  The type 'jQuery.Event' is undefined                   jsdoc/no-undefined-types
   282:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
   411:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
   573:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  1077:1   warning  The type 'jQuery.Event' is undefined                   jsdoc/no-undefined-types
  1180:1   warning  The type 'jQuery.Event' is undefined                   jsdoc/no-undefined-types
  1367:10  error    ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/modules/ve-mw/preinit/ve.init.mw.DiffLoader.js
  48:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  49:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  81:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  82:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  83:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  86:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/tests/init/targets/ve.init.mw.DesktopArticleTarget.test.js
  143:35  error  Avoid direct access to sessionStorage. Use mw.storage.session instead  mediawiki/no-storage

/src/repo/modules/ve-mw/tests/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.test.js
  21:1  warning  The type 'QUnit.Assert' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/tests/ve.test.utils.js
  45:10  error  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWExtensionDialog.js
  113:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWFloatingHelpDialog.js
  9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWGalleryDialog.js
  618:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js
  747:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js
   95:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types
  134:1  warning  The type 'jQuery.Promise' is undefined   jsdoc/no-undefined-types
  135:1  warning  The type 'jQuery.Promise' is undefined   jsdoc/no-undefined-types
  418:1  warning  The type 'jQuery.Promise' is undefined   jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTemplateDialog.js
   12:1  warning  Invalid JSDoc inline tag name "see"      jsdoc/check-tag-names
   12:1  warning  Invalid JSDoc inline tag name "see"      jsdoc/check-tag-names
   52:1  warning  Invalid JSDoc inline tag name "see"      jsdoc/check-tag-names
  312:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTransclusionDialog.js
   13:1  warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  151:1  warning  The type 'jQuery.Event' is undefined                  jsdoc/no-undefined-types
  266:1  warning  The type 'jQuery.Event' is undefined                  jsdoc/no-undefined-types
  302:3  error    ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some
  437:1  warning  The type 'jQuery.Promise' is undefined                jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/elements/ve.ui.MWExpandableErrorElement.js
  33:16  error  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget

/src/repo/modules/ve-mw/ui/inspectors/ve.ui.MWLinkAnnotationInspector.js
  208:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js
    2:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  102:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  171:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWAdvancedSettingsPage.js
  194:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWCategoriesPage.js
  227:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js
  124:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js
  282:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/tools/ve.ui.MWPopupTool.js
  58:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/ve.ui.MWWikitextDataTransferHandlerFactory.js
  56:73  error  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryPopupWidget.js
   31:22  error    OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  101:1   warning  The type 'jQuery.Event' is undefined                                                                        jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js
  295:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  367:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWEditSummaryWidget.js
  132:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWEducationPopupWidget.js
  95:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWExternalLinkAnnotationWidget.js
  81:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWGalleryItemWidget.js
  92:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js
  203:27  error  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some
  221:56  error  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineButtonWidget.js
   3:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  63:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  68:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineControlsWidget.js
  23:27  error  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  28:27  error  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  33:18  error  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  39:20  error  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  45:22  error  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterSelectWidget.js
    5:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
   52:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  195:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterWidget.js
   3:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
   3:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  56:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlinePartWidget.js
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   79:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   89:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  108:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  117:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineWidget.js
   30:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   38:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  150:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  188:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  206:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

✖ 217 problems (48 errors, 169 warnings)


--- end ---
$ ./node_modules/.bin/eslint . -f json
--- stdout ---
[{"filePath":"/src/repo/.eslint-plugin-local.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":"implicit-arrow-linebreak","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/.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":"implicit-arrow-linebreak","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/.stylelintrc.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":"implicit-arrow-linebreak","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/.svgo.config.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":"implicit-arrow-linebreak","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/Gruntfile.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":"implicit-arrow-linebreak","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/build/.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":"implicit-arrow-linebreak","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/build/checkModules.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":2,"message":"Don't use process.exit(); throw an error instead.","line":150,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":150,"endColumn":19,"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":"implicit-arrow-linebreak","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/build/screenshots-client/.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":"implicit-arrow-linebreak","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/build/screenshots-client/diffs.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":"implicit-arrow-linebreak","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/build/screenshots-client/userGuide.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":9,"column":4,"nodeType":"CallExpression","endLine":9,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":13,"column":6,"nodeType":"CallExpression","endLine":13,"endColumn":21,"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":"implicit-arrow-linebreak","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/build/screenshots-client/utils.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-deferred","severity":2,"message":"Prefer Promise to $.Deferred","line":87,"column":63,"nodeType":"CallExpression","endLine":87,"endColumn":75,"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":"implicit-arrow-linebreak","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/build/screenshots.diffs.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":"implicit-arrow-linebreak","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/build/screenshots.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found writeFile from package \"fs\" with non literal argument at index 0","line":97,"column":6,"nodeType":"CallExpression","endLine":97,"endColumn":53}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst accessKey = process.env.SAUCE_ONDEMAND_ACCESS_KEY,\n\tBuilder = require( 'selenium-webdriver' ).Builder,\n\tfs = require( 'fs' ),\n\tJimp = require( 'jimp' ),\n\tusername = process.env.SAUCE_ONDEMAND_USERNAME,\n\twebdriver = require( 'selenium-webdriver' ),\n\tTIMEOUT = 10 * 1000;\n\nfunction createScreenshotEnvironment( test ) {\n\tlet clientSize, driver;\n\n\ttest.beforeEach( function () {\n\t\tconst lang = this.currentTest.parent.lang || 'en';\n\n\t\t// Use Sauce Labs when running on Jenins\n\t\tif ( process.env.JENKINS_URL ) {\n\t\t\tdriver = new webdriver.Builder().withCapabilities( {\n\t\t\t\tbrowserName: process.env.BROWSER,\n\t\t\t\tplatform: process.env.PLATFORM,\n\t\t\t\tscreenResolution: '1280x1024',\n\t\t\t\tusername: username,\n\t\t\t\taccessKey: accessKey\n\t\t\t} ).usingServer( 'http://' + username + ':' + accessKey +\n\t\t\t\t'@ondemand.saucelabs.com:80/wd/hub' ).build();\n\t\t} else {\n\t\t\t// If not running on Jenkins, use local browser\n\t\t\tdriver = new Builder().forBrowser( 'chrome' ).build();\n\t\t}\n\n\t\tdriver.manage().timeouts().setScriptTimeout( TIMEOUT );\n\t\tdriver.manage().window().setSize( 1200, 1000 );\n\n\t\tdriver.get( 'https://en.wikipedia.org/wiki/Help:Sample_page?veaction=edit&vehidebetadialog=1&uselang=' + lang )\n\t\t\t.then( null, ( e ) => {\n\t\t\t\tconsole.error( e.message );\n\t\t\t} );\n\t\tdriver.wait(\n\t\t\tdriver.executeAsyncScript(\n\t\t\t\trequire( './screenshots-client/utils.js' )\n\t\t\t).then( ( cs ) => {\n\t\t\t\tclientSize = cs;\n\t\t\t}, ( e ) => {\n\t\t\t\t// Log error (timeout)\n\t\t\t\tconsole.error( e.message );\n\t\t\t\t// Setup failed, set clientSize to null so no screenshots are generated\n\t\t\t\tclientSize = null;\n\t\t\t} )\n\t\t);\n\t} );\n\n\ttest.afterEach( () => {\n\t\tdriver.quit()\n\t\t\t.then( null, ( e ) => {\n\t\t\t\tconsole.error( e.message );\n\t\t\t} );\n\t} );\n\n\tfunction cropScreenshot( filename, imageBuffer, rect, padding ) {\n\t\tif ( padding === undefined ) {\n\t\t\tpadding = 5;\n\t\t}\n\n\t\tconst left = Math.max( 0, rect.left - padding );\n\t\tconst top = Math.max( 0, rect.top - padding );\n\t\tconst right = Math.min( clientSize.width, rect.left + rect.width + padding );\n\t\tconst bottom = Math.min( clientSize.height, rect.top + rect.height + padding );\n\n\t\treturn Jimp.read( imageBuffer ).then( ( jimpImage ) => {\n\t\t\ttry {\n\t\t\t\tjimpImage\n\t\t\t\t\t.crop( left, top, right - left, bottom - top )\n\t\t\t\t\t.write( filename );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Log error (memory?)\n\t\t\t\tconsole.error( e );\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction runScreenshotTest( lang, name, clientScript, padding, teardownScript ) {\n\t\tif ( !clientSize ) {\n\t\t\t// Setup failed, don't generated a broken screenshot\n\t\t\treturn;\n\t\t}\n\n\t\tconst filename = './screenshots/' + name + '-' + lang + '.png';\n\n\t\tdriver.manage().timeouts().setScriptTimeout( TIMEOUT );\n\t\tdriver.wait(\n\t\t\tdriver.executeAsyncScript( clientScript ).then( ( rect ) => driver.takeScreenshot().then( ( base64Image ) => {\n\t\t\t\tif ( rect ) {\n\t\t\t\t\tconst imageBuffer = Buffer.from( base64Image, 'base64' );\n\t\t\t\t\treturn cropScreenshot( filename, imageBuffer, rect, padding );\n\t\t\t\t} else {\n\t\t\t\t\tfs.writeFile( filename, base64Image, 'base64' );\n\t\t\t\t}\n\t\t\t} ).then( () => {\n\t\t\t\tif ( teardownScript ) {\n\t\t\t\t\treturn driver.executeAsyncScript( teardownScript );\n\t\t\t\t}\n\t\t\t} ), ( e ) => {\n\t\t\t\t// Log error (timeout)\n\t\t\t\tconsole.error( e );\n\t\t\t} )\n\t\t);\n\t}\n\n\treturn runScreenshotTest;\n}\n\nmodule.exports.createScreenshotEnvironment = createScreenshotEnvironment;\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":"implicit-arrow-linebreak","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/build/screenshots.userGuide.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":"implicit-arrow-linebreak","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/build/screenshots.yml","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":"implicit-arrow-linebreak","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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/build/tasks/screenshotLangs.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":"implicit-arrow-linebreak","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/build/typos.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":"implicit-arrow-linebreak","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/bundlesize.config.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":"implicit-arrow-linebreak","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/composer.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":"implicit-arrow-linebreak","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/editcheck/i18n/api/en.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":"implicit-arrow-linebreak","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/editcheck/i18n/api/qqq.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":"implicit-arrow-linebreak","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/editcheck/i18n/en.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":"implicit-arrow-linebreak","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/editcheck/i18n/qqq.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":"implicit-arrow-linebreak","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/editcheck/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":"implicit-arrow-linebreak","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/editcheck/modules/EditCheckAction.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":50,"column":1,"nodeType":"Block","endLine":50,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":239,"column":9,"nodeType":"MemberExpression","messageId":"forbidden","endLine":239,"endColumn":29},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":241,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":241,"endColumn":30},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":314,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":314,"endColumn":29}],"suppressedMessages":[],"errorCount":3,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * EditCheckAction\n *\n * @class\n * @mixes OO.EventEmitter\n *\n * @param {Object} config Configuration options\n * @param {mw.editcheck.BaseEditCheck} config.check Check which created this action\n * @param {ve.dm.SurfaceFragment[]} config.fragments Affected fragments\n * @param {ve.dm.SurfaceFragment} [config.focusFragment] Fragment to focus\n * @param {jQuery|string|Function|OO.ui.HtmlSnippet} [config.title] Title\n * @param {jQuery|string|Function|OO.ui.HtmlSnippet} [config.message] Body message\n * @param {jQuery|string|Function|OO.ui.HtmlSnippet} [config.prompt] Prompt to show before choices\n * @param {string} [config.id] Optional unique identifier\n * @param {string} [config.icon] Optional icon name\n * @param {string} [config.type='warning'] Type of message (e.g., 'warning', 'error')\n * @param {boolean} [config.suggestion] Whether this is a suggestion\n * @param {Object[]} [config.choices] User choices\n */\nmw.editcheck.EditCheckAction = function MWEditCheckAction( config ) {\n\t// Mixin constructor\n\tOO.EventEmitter.call( this );\n\n\tthis.mode = config.mode || '';\n\tthis.check = config.check;\n\tthis.fragments = config.fragments;\n\tthis.originalText = this.fragments.map( ( fragment ) => fragment.getText() );\n\tthis.focusFragment = config.focusFragment;\n\tthis.message = config.message;\n\tthis.prompt = config.prompt;\n\tthis.footer = config.footer;\n\tthis.id = config.id;\n\tthis.title = config.title;\n\tthis.icon = config.icon;\n\tthis.type = config.type || 'warning';\n\tthis.choices = config.choices || config.check.constructor.static.choices;\n\tthis.suggestion = config.suggestion;\n};\n\n/* Inheritance */\n\nOO.mixinClass( mw.editcheck.EditCheckAction, OO.EventEmitter );\n\n/* Events */\n\n/**\n * Fired when the user selects an action (e.g., clicks a suggestion button).\n *\n * @event mw.editcheck.EditCheckAction#act\n * @param {jQuery.Promise} promise A promise that resolves when the action is complete\n */\n\n/* Methods */\n\n/**\n * Compare the start offsets of two actions.\n *\n * @param {mw.editcheck.EditCheckAction} a\n * @param {mw.editcheck.EditCheckAction} b\n * @return {number}\n */\nmw.editcheck.EditCheckAction.static.compareStarts = function ( a, b ) {\n\tconst aStart = a.getHighlightSelections()[ 0 ].getCoveringRange().start;\n\tconst bStart = b.getHighlightSelections()[ 0 ].getCoveringRange().start;\n\tconst difference = aStart - bStart;\n\tif ( difference === 0 ) {\n\t\tif ( a.check.takesFocus() ) {\n\t\t\treturn -1;\n\t\t}\n\t\tif ( b.check.takesFocus() ) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\treturn difference;\n};\n\n/**\n * Get the action's title\n *\n * @return {jQuery|string|Function|OO.ui.HtmlSnippet}\n */\nmw.editcheck.EditCheckAction.prototype.getTitle = function () {\n\treturn this.title || this.check.getTitle( this );\n};\n\n/**\n * Get the action's footer, if any\n *\n * @return {jQuery|string|Function|OO.ui.HtmlSnippet|undefined}\n */\nmw.editcheck.EditCheckAction.prototype.getFooter = function () {\n\treturn this.footer || this.check.getFooter( this );\n};\n\n/**\n * Get the prompt question for the current choices\n *\n * @return {jQuery|string|Function|OO.ui.HtmlSnippet|undefined}\n */\nmw.editcheck.EditCheckAction.prototype.getPrompt = function () {\n\treturn this.prompt || this.check.getPrompt( this );\n};\n\n/**\n * Get the available choices\n *\n * @return {Object[]}\n */\nmw.editcheck.EditCheckAction.prototype.getChoices = function () {\n\treturn this.choices;\n};\n\n/**\n * Get selections to highlight for this check\n *\n * @return {ve.dm.Selection[]}\n */\nmw.editcheck.EditCheckAction.prototype.getHighlightSelections = function () {\n\treturn this.fragments.map( ( fragment ) => fragment.getSelection() );\n};\n\n/**\n * Get the selection to focus for this check\n *\n * @return {ve.dm.Selection}\n */\nmw.editcheck.EditCheckAction.prototype.getFocusSelection = function () {\n\t// TODO: Instead of fragments[0], create a fragment that covers all fragments?\n\treturn ( this.focusFragment || this.fragments[ 0 ] ).getSelection();\n};\n\n/**\n * Get a description of the check\n *\n * @return {string}\n */\nmw.editcheck.EditCheckAction.prototype.getDescription = function () {\n\treturn this.message || this.check.getDescription( this );\n};\n\n/**\n * Get the type of this action (e.g., 'warning', 'error')\n *\n * @return {string}\n */\nmw.editcheck.EditCheckAction.prototype.getType = function () {\n\tif ( this.suggestion ) {\n\t\treturn 'success';\n\t}\n\treturn this.type;\n};\n\n/**\n * Get the name of the check type\n *\n * @return {string} Check type name\n */\nmw.editcheck.EditCheckAction.prototype.getName = function () {\n\treturn this.check.getName();\n};\n\n/**\n * Whether this is a suggestion\n *\n * @return {boolean}\n */\nmw.editcheck.EditCheckAction.prototype.isSuggestion = function () {\n\treturn this.suggestion;\n};\n\n/**\n * Render as an EditCheckActionWidget\n *\n * @param {boolean} collapsed Start collapsed\n * @param {boolean} singleAction This is the only action shown\n * @param {ve.ui.Surface} surface Surface\n * @return {mw.editcheck.EditCheckActionWidget}\n */\nmw.editcheck.EditCheckAction.prototype.render = function ( collapsed, singleAction, surface ) {\n\tconst widget = new mw.editcheck.EditCheckActionWidget( {\n\t\ttype: this.getType(),\n\t\ticon: this.icon,\n\t\tname: this.getName(),\n\t\tlabel: this.getTitle(),\n\t\tmessage: this.getDescription(),\n\t\tfooter: this.getFooter(),\n\t\tprompt: this.getPrompt(),\n\t\tmode: this.mode,\n\t\tsingleAction: singleAction,\n\t\tsuggestion: this.suggestion\n\t} );\n\twidget.actions.connect( this, {\n\t\tclick: [ 'onActionClick', surface ]\n\t} );\n\twidget.actions.add( this.getChoices().map(\n\t\t( choice ) => new OO.ui.ActionWidget( ve.extendObject( { modes: [ '' ], framed: true }, choice ) )\n\t) );\n\twidget.toggleCollapse( collapsed );\n\n\treturn widget;\n};\n\nmw.editcheck.EditCheckAction.prototype.setMode = function ( mode ) {\n\tthis.mode = mode;\n};\n\n/**\n * Handle click events from an action button\n *\n * @param {ve.ui.Surface} surface Surface\n * @param {OO.ui.ActionWidget} actionWidget Clicked action widget\n * @fires mw.editcheck.EditCheckAction#act\n */\nmw.editcheck.EditCheckAction.prototype.onActionClick = function ( surface, actionWidget ) {\n\tconst promise = this.check.act( actionWidget.action, this, surface );\n\tthis.emit( 'act', promise || ve.createDeferred().resolve().promise() );\n\tve.track( 'activity.editCheck-' + this.getName(), {\n\t\taction: ( this.isSuggestion() ? 'suggestion-' : '' ) + 'action-' + ( actionWidget.getAction() || 'unknown' )\n\t} );\n};\n\n/**\n * Compare to another action\n *\n * @param {mw.editcheck.EditCheckAction} other Other action\n * @param {boolean} allowOverlaps Count overlaps rather than a perfect match\n * @return {boolean}\n */\nmw.editcheck.EditCheckAction.prototype.equals = function ( other, allowOverlaps ) {\n\tif ( this.check.constructor !== other.check.constructor ) {\n\t\treturn false;\n\t}\n\tif ( this.id || other.id ) {\n\t\treturn this.id === other.id;\n\t}\n\tif ( this.fragments.length !== other.fragments.length ) {\n\t\treturn false;\n\t}\n\treturn this.fragments.every( ( fragment ) => {\n\t\tconst selection = fragment.getSelection();\n\t\treturn other.fragments.some( ( otherFragment ) => {\n\t\t\tif ( allowOverlaps ) {\n\t\t\t\treturn otherFragment.getSelection().getCoveringRange().overlapsRange( selection.getCoveringRange() );\n\t\t\t} else {\n\t\t\t\treturn otherFragment.getSelection().equals( selection );\n\t\t\t}\n\t\t} );\n\t} );\n};\n\n/**\n * Force the action into a stale or not-stale state\n *\n * @param {boolean} stale\n */\nmw.editcheck.EditCheckAction.prototype.setStale = function ( stale ) {\n\tconst previousState = this.isStale();\n\tthis.originalText = stale ? null : this.fragments.map( ( fragment ) => fragment.getText() );\n\tif ( previousState !== this.isStale() ) {\n\t\tthis.emit( 'stale', this.isStale() );\n\t}\n};\n\n/**\n * Check whether the text has changed since this action was created\n *\n * @return {boolean} Whether the text has changed since this action was created\n */\nmw.editcheck.EditCheckAction.prototype.isStale = function () {\n\treturn this.check.canBeStale() && (\n\t\t!this.originalText || !OO.compare(\n\t\t\tthis.originalText,\n\t\t\tthis.fragments.map( ( fragment ) => fragment.getText() )\n\t\t)\n\t);\n};\n\n/**\n * Method called by the controller when the action is removed from the action list\n */\nmw.editcheck.EditCheckAction.prototype.discarded = function () {\n\tthis.emit( 'discard' );\n};\n\n/**\n * Tag this action\n *\n * @param {string} tag\n */\nmw.editcheck.EditCheckAction.prototype.tag = function ( tag ) {\n\tthis.check.tag( tag, this );\n};\n\n/**\n * Untag this action\n *\n * @param {string} tag\n * @return {boolean} Whether anything was untagged\n */\nmw.editcheck.EditCheckAction.prototype.untag = function ( tag ) {\n\treturn this.check.untag( tag, this );\n};\n\n/**\n * Is this action tagged?\n *\n * @param {string} tag\n * @return {boolean}\n */\nmw.editcheck.EditCheckAction.prototype.isTagged = function ( tag ) {\n\tif ( this.id ) {\n\t\treturn this.check.isTaggedId( tag, this.id );\n\t} else {\n\t\treturn this.fragments.some( ( fragment ) => this.check.isTaggedRange( tag, fragment.getSelection().getRange() ) );\n\t}\n};\n\n/**\n * Get unique tag name for this action\n *\n * @return {string}\n */\nmw.editcheck.EditCheckAction.prototype.getTagName = function () {\n\treturn this.check.constructor.static.name;\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":"implicit-arrow-linebreak","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/editcheck/modules/EditCheckActionWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":109,"column":1,"nodeType":"Block","endLine":109,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":146,"column":1,"nodeType":"Block","endLine":146,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * EditCheckActionWidget\n *\n * @class\n * @extends OO.ui.MessageWidget\n *\n * @param {Object} config Configuration options\n * @param {string} config.type Type of message (e.g., 'warning', 'error')\n * @param {string|jQuery|Function|OO.ui.HtmlSnippet} config.label Title\n * @param {string|jQuery|Function|OO.ui.HtmlSnippet} config.message Body message\n * @param {string|jQuery|Function|OO.ui.HtmlSnippet} [config.footer] Footer message\n * @param {string} [config.icon] Icon name\n * @param {boolean} [config.singleAction] This is the only action shown\n * @param {string} [config.mode] Mode for the action set widget\n * @param {boolean} [config.suggestion] This is a suggestion\n */\nmw.editcheck.EditCheckActionWidget = function MWEditCheckActionWidget( config ) {\n\tthis.singleAction = config.singleAction;\n\tthis.mode = config.mode || '';\n\tthis.suggestion = config.suggestion;\n\n\tthis.name = config.name;\n\n\tthis.actions = new OO.ui.ActionSet();\n\tthis.actions.connect( this, {\n\t\tchange: 'onActionsChange'\n\t} );\n\n\tmw.editcheck.EditCheckActionWidget.super.call( this, config );\n\n\tthis.feedbackDeferred = null;\n\n\tthis.collapsed = false;\n\tthis.message = new OO.ui.LabelWidget( { label: config.message } );\n\tthis.prompt = config.prompt && new OO.ui.LabelWidget( {\n\t\tlabel: config.prompt,\n\t\tclasses: [ 've-ui-editCheckActionWidget-prompt' ]\n\t} );\n\tthis.footer = config.footer && new OO.ui.LabelWidget( {\n\t\tlabel: config.footer,\n\t\tclasses: [ 've-ui-editCheckActionWidget-footer' ]\n\t} );\n\tthis.$actions = $( '<div>' ).addClass( 've-ui-editCheckActionWidget-actions oo-ui-element-hidden' );\n\tif ( this.prompt ) {\n\t\tthis.$actions.addClass( 've-ui-editCheckActionWidget-actions-prompted' )\n\t\t\t.append( this.prompt.$element );\n\t}\n\n\tthis.$element.on( 'click', this.onClick.bind( this ) );\n\n\tthis.$body = $( '<div>' )\n\t\t.append( this.message.$element, this.$actions )\n\t\t.addClass( 've-ui-editCheckActionWidget-body' );\n\n\tif ( this.footer ) {\n\t\tthis.$body.append( this.footer.$element );\n\t}\n\n\tif ( this.suggestion ) {\n\t\tthis.$element.addClass( 've-ui-editCheckActionWidget-suggestion' );\n\t}\n\n\tthis.$element\n\t\t.append( this.$body )\n\t\t.addClass( 've-ui-editCheckActionWidget' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( mw.editcheck.EditCheckActionWidget, OO.ui.MessageWidget );\n\n/* Events */\n\n/**\n * Fired when the user toggles the collapsed state of the widget.\n *\n * @event mw.editcheck.EditCheckActionWidget#togglecollapse\n */\n\n/* Methods */\n\n/**\n * Handle change events on the action set\n */\nmw.editcheck.EditCheckActionWidget.prototype.onActionsChange = function () {\n\tthis.$actions.addClass( 'oo-ui-element-hidden' ).find( '.oo-ui-actionWidget' ).remove();\n\tthis.actions.get( { modes: [ this.mode ] } ).forEach( ( actionWidget ) => {\n\t\tthis.$actions.append( actionWidget.$element ).removeClass( 'oo-ui-element-hidden' );\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nmw.editcheck.EditCheckActionWidget.prototype.setDisabled = function ( disabled ) {\n\t// Calling setDisabled on the parent doesn't do anything useful,\n\t// and causes the icon to become the wrong color due to an\n\t// upstream bug\n\t// Parent method\n\t// OO.ui.Widget.prototype.setDisabled.call( this, disabled );\n\tthis.actions.forEach( null, ( action ) => {\n\t\taction.setDisabled( disabled );\n\t} );\n};\n\n/**\n * Handle click events anywhere on the widget\n *\n * @param {jQuery.Event} e Click event\n * @fires mw.editcheck.EditCheckActionWidget#togglecollapse\n */\nmw.editcheck.EditCheckActionWidget.prototype.onClick = function ( e ) {\n\tif ( this.singleAction ) {\n\t\treturn;\n\t}\n\tif ( this.$body[ 0 ].contains( e.target ) ) {\n\t\treturn;\n\t}\n\tthis.emit( 'togglecollapse' );\n\n\te.preventDefault();\n};\n\n/**\n * Toggle the collapsed state of the widget\n *\n * @param {boolean} [collapsed] The new collapsed state, toggles if unset\n */\nmw.editcheck.EditCheckActionWidget.prototype.toggleCollapse = function ( collapsed ) {\n\tconst previousState = this.collapsed;\n\tthis.collapsed = collapsed !== undefined ? collapsed : !this.collapsed;\n\tthis.$element.toggleClass( 've-ui-editCheckActionWidget-collapsed', this.collapsed );\n\n\tif ( this.collapsed && previousState !== this.collapsed && this.feedbackDeferred ) {\n\t\tthis.feedbackDeferred.reject();\n\t}\n};\n\n/**\n * Show a feedback panel\n *\n * @param {Object} data\n * @param {string} data.title\n * @param {string} [data.description]\n * @param {Object[]} data.choices\n * @return {jQuery.Promise} Promise which resolves when feedback is submitted or is rejected when back is chosen\n */\nmw.editcheck.EditCheckActionWidget.prototype.showFeedback = function ( data ) {\n\tconst deferred = this.feedbackDeferred = ve.createDeferred();\n\tif ( this.suggestion ) {\n\t\t// Suggestions bypass feedback surveys\n\t\treturn deferred.resolve().promise();\n\t}\n\n\tconst form = new OO.ui.FieldsetLayout( {\n\t\tclasses: [ 've-ui-editCheckActionWidget-feedback' ]\n\t} );\n\tconst answerRadioSelect = new OO.ui.RadioSelectWidget( {\n\t\titems: data.choices.map( ( choice ) => new OO.ui.RadioOptionWidget( choice ) )\n\t} );\n\tconst submit = new OO.ui.ButtonInputWidget( {\n\t\tlabel: ve.msg( 'editcheck-dialog-action-submit' ),\n\t\tflags: [ 'progressive', 'primary' ],\n\t\tdisabled: true\n\t} );\n\tconst back = new OO.ui.ButtonInputWidget( {\n\t\tlabel: ve.msg( 'editcheck-dialog-action-back' ),\n\t\tflags: [ 'safe', 'back' ],\n\t\ticon: 'previous'\n\t} );\n\tanswerRadioSelect.on( 'select', () => {\n\t\tsubmit.setDisabled( !answerRadioSelect.findSelectedItem() );\n\t} );\n\tform.addItems( [\n\t\tnew OO.ui.FieldLayout( answerRadioSelect, {\n\t\t\tlabel: data.description || ve.msg( 'editcheck-reject-description' ),\n\t\t\talign: 'top'\n\t\t} ),\n\t\tnew OO.ui.HorizontalLayout( {\n\t\t\titems: [\n\t\t\t\tnew OO.ui.FieldLayout( back ),\n\t\t\t\tnew OO.ui.FieldLayout( submit )\n\t\t\t]\n\t\t} )\n\t] );\n\tsubmit.on( 'click', () => {\n\t\tconst selectedItem = answerRadioSelect.findSelectedItem();\n\t\tconst reason = selectedItem && selectedItem.getData();\n\t\tif ( reason ) {\n\t\t\tdeferred.resolve( reason );\n\t\t\tve.track( 'activity.editCheck-' + this.name, { action: 'edit-check-feedback-reason-' + reason } );\n\t\t}\n\t} );\n\tback.on( 'click', () => {\n\t\tdeferred.reject();\n\t} );\n\n\tthis.$body.prepend( form.$element );\n\n\tve.track( 'activity.editCheck-' + this.name, { action: 'edit-check-feedback-shown' } );\n\treturn deferred.promise().always( () => {\n\t\t// HACK: This causes the answerRadioSelect.onDocumentKeyDownHandler to be unbound\n\t\t// Otherwise, it'll swallow certain key events (arrow keys, enter, pagedown/up) forever.\n\t\tanswerRadioSelect.$element.trigger( 'blur' );\n\t\tform.$element.remove();\n\t\tthis.feedbackDeferred = null;\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":"implicit-arrow-linebreak","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/editcheck/modules/EditCheckFactory.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":"implicit-arrow-linebreak","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/editcheck/modules/EditCheckGutterSectionWidget.js","messages":[{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":132,"column":14,"nodeType":"MemberExpression","messageId":"forbidden","endLine":132,"endColumn":32}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * EditCheckGutterSectionWidget\n *\n * @class\n *\n * @param {Object} config Configuration options\n * @param {mw.editcheck.Controller} config.controller\n * @param {mw.editcheck.EditCheckAction[]} config.actions\n */\nmw.editcheck.EditCheckGutterSectionWidget = function MWEditCheckGutterSectionWidget( config ) {\n\tthis.controller = config.controller;\n\tthis.actions = config.actions;\n\n\tthis.icon = new OO.ui.IconWidget();\n\tthis.iconLabel = new OO.ui.LabelWidget( {\n\t\tlabel: this.actions.length.toString(),\n\t\tinvisibleLabel: this.actions.length === 1\n\t} );\n\n\tthis.actionButton = new OO.ui.ButtonWidget( {\n\t\ticon: 'check',\n\t\tflags: [ 'invert' ],\n\t\tlabel: 'act',\n\t\tinvisibleLabel: true,\n\t\tframed: false\n\t} );\n\tthis.actionButton.toggle( false );\n\n\tthis.$element = $( '<div>' )\n\t\t.addClass( 've-ui-editCheck-gutter-action' )\n\t\t.append( this.icon.$element, this.iconLabel.$element, this.actionButton.$element )\n\t\t.on( 'click', this.onClick.bind( this ) );\n\n\tif ( config.rect ) {\n\t\tthis.setPosition( config.rect );\n\t}\n};\n\nOO.initClass( mw.editcheck.EditCheckGutterSectionWidget );\n\n/* Methods */\n\nmw.editcheck.EditCheckGutterSectionWidget.prototype.isFocused = function () {\n\treturn this.actions.includes( this.controller.focusedAction );\n};\n\nmw.editcheck.EditCheckGutterSectionWidget.prototype.getPrimaryAction = function () {\n\tif ( this.controller.focusedAction && this.actions.includes( this.controller.focusedAction ) ) {\n\t\treturn this.controller.focusedAction;\n\t}\n\treturn this.actions[ 0 ];\n};\n\nmw.editcheck.EditCheckGutterSectionWidget.prototype.update = function () {\n\tconst action = this.getPrimaryAction();\n\n\tthis.$element\n\t\t.removeClass( ( index, classes ) => (\n\t\t\tclasses.split( ' ' ).filter( ( cls ) => cls.startsWith( 've-ui-editCheck-gutter-action-' ) )\n\t\t) )\n\t\t// The following classes are used here:\n\t\t// * ve-ui-editCheck-gutter-action-error\n\t\t// * ve-ui-editCheck-gutter-action-warning\n\t\t// * ve-ui-editCheck-gutter-action-notice\n\t\t// * ve-ui-editCheck-gutter-action-success\n\t\t.addClass( 've-ui-editCheck-gutter-action-' + action.getType() )\n\t\t.toggleClass( 've-ui-editCheck-gutter-action-inactive', !this.isFocused() )\n\t\t.toggleClass( 've-ui-editCheck-gutter-action-stale', action.isStale() )\n\t\t.toggleClass( 've-ui-editCheck-gutter-action-suggestion', action.isSuggestion() );\n\n\tif ( action.gutterQuickAction ) {\n\t\tthis.$element.addClass( 've-ui-editCheck-gutter-action-quickaction' );\n\t\tthis.icon.toggle( false );\n\t\tthis.iconLabel.toggle( false );\n\t\tthis.actionButton.toggle( true );\n\t} else {\n\t\tthis.icon.setIcon( mw.editcheck.EditCheckActionWidget.static.iconMap[ action.getType() ] || 'notice' );\n\t\tthis.icon.toggle( true );\n\t\tthis.iconLabel.toggle( true );\n\t\tthis.actionButton.toggle( false );\n\t\tif ( this.actions.includes( this.controller.focusedAction ) ) {\n\t\t\tthis.icon.setFlags( this.controller.focusedAction.getType() );\n\t\t} else {\n\t\t\tthis.icon.clearFlags();\n\t\t}\n\t}\n};\n\nmw.editcheck.EditCheckGutterSectionWidget.prototype.setPosition = function ( rect ) {\n\tthis.$element.css( {\n\t\ttop: rect.top + 2,\n\t\theight: rect.height\n\t} );\n\n\tthis.update();\n};\n\nmw.editcheck.EditCheckGutterSectionWidget.prototype.onClick = function () {\n\tif ( this.acting ) {\n\t\treturn;\n\t}\n\tconst action = this.getPrimaryAction();\n\tthis.controller.focusAction( action, true );\n\t// Should we trigger the popup? By default yes, unless\n\t// we're in the onBeforeSave mode where we can assume\n\t// something else is handling it.\n\tif ( this.controller.inBeforeSave ) {\n\t\treturn;\n\t}\n\t// mid-edit\n\tconst controller = this.controller;\n\tconst surface = controller.surface;\n\tif ( action.gutterQuickAction ) {\n\t\t// This is an abridged set of what ve.ui.EditCheckDialog.prototype.onAct does\n\t\tconst promise = action.check.act( action.gutterQuickAction, action, surface );\n\t\tthis.actionButton.setDisabled( true );\n\t\tthis.acting = true;\n\t\tpromise.then( () => {\n\t\t\tthis.actionButton.setDisabled( false );\n\t\t\tthis.acting = false;\n\t\t\tcontroller.updatePositionsDebounced();\n\t\t\tif ( controller.getActions().includes( action ) ) {\n\t\t\t\t// The action wasn't removed, so show its dialog again\n\t\t\t\tthis.showDialogWithAction( action );\n\t\t\t}\n\t\t} );\n\t\treturn;\n\t}\n\tconst currentWindow = surface.getToolbarDialogs( ve.ui.FixedEditCheckDialog.static.position ).getCurrentWindow();\n\tif ( !currentWindow || currentWindow.constructor.static.name !== 'fixedEditCheckDialog' ) {\n\t\tthis.showDialogWithAction( action );\n\t} else if ( this.actions.every( ( sact ) => currentWindow.hasAction( sact ) ) ) {\n\t\t// Second click: defocus and close\n\t\treturn this.controller.closeDialog();\n\t} else {\n\t\tcurrentWindow.showActions( this.actions, [ action ] );\n\t\tcurrentWindow.footer.toggle( this.actions.length !== 1 );\n\t}\n};\n\nmw.editcheck.EditCheckGutterSectionWidget.prototype.showDialogWithAction = function ( action ) {\n\tconst windowAction = ve.ui.actionFactory.create( 'window', this.controller.surface, 'check' );\n\twindowAction.open(\n\t\t'fixedEditCheckDialog',\n\t\t{\n\t\t\tcontroller: this.controller,\n\t\t\tinBeforeSave: false,\n\t\t\tactions: this.actions,\n\t\t\tfooter: this.actions.length !== 1,\n\t\t\t// just filter out any discarded actions from the allowed set\n\t\t\tupdateFilter: ( updatedActions, newActions, discardedActions, prevActions ) => prevActions.filter( ( pact ) => !discardedActions.includes( pact ) )\n\t\t}\n\t);\n\tthis.controller.focusAction( action, true );\n};\n\nmw.editcheck.EditCheckGutterSectionWidget.prototype.teardown = function () {\n\tthis.$element.remove();\n\n\tthis.controller = null;\n\tthis.surface = null;\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":"implicit-arrow-linebreak","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/editcheck/modules/EditCheckPreSaveToolbarTools.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":"implicit-arrow-linebreak","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/editcheck/modules/controller.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":158,"column":1,"nodeType":"Block","endLine":158,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":192,"column":19,"nodeType":"MemberExpression","messageId":"forbidden","endLine":192,"endColumn":84},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Controller.position' is undefined.","line":204,"column":1,"nodeType":"Block","endLine":204,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Controller.actionsUpdated' is undefined.","line":215,"column":1,"nodeType":"Block","endLine":215,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Controller.actionsUpdated' is undefined.","line":256,"column":1,"nodeType":"Block","endLine":256,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":300,"column":53,"nodeType":"MemberExpression","messageId":"forbidden","endLine":300,"endColumn":67},{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":301,"column":60,"nodeType":"MemberExpression","messageId":"forbidden","endLine":301,"endColumn":73},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Controller.actionsUpdated' is undefined.","line":321,"column":1,"nodeType":"Block","endLine":321,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Controller.focusAction' is undefined.","line":347,"column":1,"nodeType":"Block","endLine":347,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Controller.position' is undefined.","line":348,"column":1,"nodeType":"Block","endLine":348,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Controller.actionsUpdated' is undefined.","line":406,"column":1,"nodeType":"Block","endLine":406,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Controller.focusAction' is undefined.","line":407,"column":1,"nodeType":"Block","endLine":407,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":430,"column":16,"nodeType":"MemberExpression","messageId":"forbidden","endLine":430,"endColumn":51},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":823,"column":1,"nodeType":"Block","endLine":823,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":838,"column":1,"nodeType":"Block","endLine":838,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-when","severity":2,"message":"Prefer Promise.all to $.when","line":266,"column":20,"nodeType":"CallExpression","endLine":269,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":4,"fatalErrorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst midEditListeners = [ 'onDocumentChange', 'onBranchNodeChange' ];\n\n/**\n * EditCheck controller\n *\n * Manages triggering and updating edit checks.\n *\n * @class\n * @constructor\n * @mixes OO.EventEmitter\n * @param {ve.init.mw.Target} target The VisualEditor target\n * @param {Object} config\n * @param {boolean} config.suggestions Enable suggestion mode\n */\nfunction Controller( target, config ) {\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\tthis.actionsByListener = {};\n\n\tthis.target = target;\n\n\tthis.surface = null;\n\tthis.inBeforeSave = false;\n\tthis.branchNode = null;\n\tthis.focusedAction = null;\n\tthis.suggestionsMode = config.suggestions;\n\n\tthis.taggedFragments = {};\n\tthis.taggedIds = {};\n\n\tconst debounceWithTeardownCheck = ( func, wait, immediate ) => ve.debounce( ( ...args ) => {\n\t\t// This could potentially be called after teardown\n\t\tif ( !this.surface ) {\n\t\t\treturn;\n\t\t}\n\t\treturn func( ...args );\n\t}, wait, immediate );\n\n\tthis.onDocumentChangeDebounced = debounceWithTeardownCheck( this.onDocumentChange.bind( this ), 100 );\n\tthis.onPositionDebounced = debounceWithTeardownCheck( this.onPosition.bind( this ), 100 );\n\tthis.onSelectDebounced = debounceWithTeardownCheck( this.onSelect.bind( this ), 100 );\n\tthis.onContextChangeDebounced = debounceWithTeardownCheck( this.onContextChange.bind( this ), 100 );\n\tthis.updatePositionsDebounced = debounceWithTeardownCheck( this.updatePositions.bind( this ) );\n\n\t// Don't run a scroll if the previous animation is still running (which is jQuery 'fast' === 200ms)\n\tthis.scrollActionIntoViewDebounced = debounceWithTeardownCheck( this.scrollActionIntoView.bind( this ), 200, true );\n}\n\n/* Inheritance */\n\nOO.mixinClass( Controller, OO.EventEmitter );\n\n/* Events */\n\n/**\n * Actions for a given listener are updated\n *\n * @event Controller#actionsUpdated\n * @param {string} listener The listener type (e.g. 'onBeforeSave')\n * @param {mw.editcheck.EditCheckAction[]} actions All current actions\n * @param {mw.editcheck.EditCheckAction[]} newActions Actions newly added\n * @param {mw.editcheck.EditCheckAction[]} discardedActions Actions newly removed\n * @param {boolean} rejected The update was due to a user rejecting/dismissing a check\n */\n\n/**\n * An action is focused\n *\n * @event Controller#focusAction\n * @param {mw.editcheck.EditCheckAction} action Action\n * @param {number} index Index of the action in #getActions\n * @param {boolean} scrollTo Scroll the action's selection into view\n */\n\n/**\n * Actions have been redrawn or repositioned\n *\n * @event Controller#position\n */\n\n/**\n * Set up controller\n */\nController.prototype.setup = function () {\n\tconst target = this.target;\n\ttarget.on( 'surfaceReady', () => {\n\t\tthis.surface = target.getSurface();\n\n\t\tif ( this.surface.getMode() !== 'visual' ) {\n\t\t\t// Some checks will entirely work in source mode for most cases.\n\t\t\t// But others will fail spectacularly -- e.g. reference check\n\t\t\t// isn't aware of <ref> tags and so will suggest that all content\n\t\t\t// has references added. As such, disable in source mode for now.\n\t\t\treturn;\n\t\t}\n\t\tif ( !this.editChecksArePossible() ) {\n\t\t\treturn;\n\t\t}\n\t\t// Ideally this would happen slightly earlier:\n\t\t$( document.documentElement ).addClass( 've-editcheck-available' );\n\t\t// Adding the class can cause large layout changes (e.g. hiding Vector\n\t\t// side panels), so emit a window resize event to notify any components\n\t\t// that may be affected, e.g. the VE toolbar\n\t\twindow.dispatchEvent( new Event( 'resize' ) );\n\n\t\tthis.surface.getView().on( 'position', this.onPositionDebounced );\n\t\tthis.surface.getModel().connect( this, {\n\t\t\tundoStackChange: 'onDocumentChangeDebounced',\n\t\t\tselect: 'onSelectDebounced',\n\t\t\tcontextChange: 'onContextChangeDebounced'\n\t\t} );\n\n\t\tthis.surface.getSidebarDialogs().connect( this, {\n\t\t\topening: 'onSidebarDialogsOpeningOrClosing',\n\t\t\tclosing: 'onSidebarDialogsOpeningOrClosing'\n\t\t} );\n\n\t\tthis.on( 'branchNodeChange', this.onBranchNodeChange, null, this );\n\t\tthis.on( 'actionsUpdated', this.onActionsUpdated, null, this );\n\n\t\t// Run on load (e.g. recovering from auto-save)\n\t\tsetTimeout( () => this.refresh(), 100 );\n\n\t\tthis.surface.on( 'destroy', () => {\n\t\t\tthis.off( 'actionsUpdated' );\n\n\t\t\tconst win = this.surface.getSidebarDialogs().getCurrentWindow();\n\t\t\tif ( win ) {\n\t\t\t\twin.close();\n\t\t\t}\n\n\t\t\tthis.surface = null;\n\t\t\tthis.actionsByListener = {};\n\t\t\tthis.focusedAction = null;\n\n\t\t\tthis.taggedFragments = {};\n\t\t\tthis.taggedIds = {};\n\n\t\t\tmw.editcheck.checksShown = {};\n\n\t\t\t$( document.documentElement ).removeClass( 've-editcheck-available' );\n\t\t\twindow.dispatchEvent( new Event( 'resize' ) );\n\t\t} );\n\t}, null, this );\n\n\tthis.setupPreSaveProcess();\n};\n\n/**\n * Handle sidebar dialog open/close events\n *\n * Transition skin/VE components around to make room for sidebar\n *\n * @param {OO.ui.Window} win The window instance\n * @param {jQuery.Promise} openingOrClosing Promise that resolves when closing finishes\n */\nController.prototype.onSidebarDialogsOpeningOrClosing = function ( win, openingOrClosing ) {\n\tif ( win.constructor.static.name !== 'sidebarEditCheckDialog' ) {\n\t\treturn;\n\t}\n\tconst isOpening = !win.isOpened();\n\t// Wait for sidebar to render before applying CSS which starts transitions\n\trequestAnimationFrame( () => {\n\t\t$( document.documentElement ).toggleClass( 've-editcheck-enabled', isOpening );\n\t} );\n\tif ( isOpening ) {\n\t\t$( document.documentElement ).addClass( 've-editcheck-transitioning' );\n\t} else {\n\t\topeningOrClosing.then( () => {\n\t\t\t$( document.documentElement ).removeClass( 've-editcheck-transitioning' );\n\t\t} );\n\t}\n\t// Adjust toolbar position after animation ends\n\tsetTimeout( () => {\n\t\t// Check the toolbar still exists (i.e. we haven't closed the editor)\n\t\tif ( this.target.toolbar ) {\n\t\t\tthis.target.toolbar.onWindowResize();\n\t\t}\n\t}, OO.ui.theme.getDialogTransitionDuration() );\n};\n\n/**\n * Check if any edit checks could be run for the current user/context\n *\n * @return {boolean}\n */\nController.prototype.editChecksArePossible = function () {\n\treturn [ 'onBeforeSave', 'onDocumentChange' ].some(\n\t\t( listener ) => mw.editcheck.editCheckFactory.getNamesByListener( listener ).some(\n\t\t\t( checkName ) => {\n\t\t\t\tconst check = mw.editcheck.editCheckFactory.create( checkName, this );\n\t\t\t\treturn check.canBeShown();\n\t\t\t}\n\t\t)\n\t);\n};\n\n/**\n * Update position of edit check highlights\n *\n * @fires Controller#position\n */\nController.prototype.updatePositions = function () {\n\tthis.drawSelections();\n\n\tthis.emit( 'position' );\n};\n\n/**\n * Update edit check list\n *\n * @fires Controller#actionsUpdated\n */\nController.prototype.refresh = function () {\n\tif ( this.target.deactivating || !this.target.active ) {\n\t\treturn;\n\t}\n\tif ( this.inBeforeSave ) {\n\t\t// These shouldn't be recalculated\n\t\tthis.emit( 'actionsUpdated', 'onBeforeSave', this.getActions(), [], [], false );\n\t} else {\n\t\t// Use a process so that updateForListener doesn't run twice in parallel,\n\t\t// which causes problems as the active actions list can change.\n\t\t// TODO: this causes problems if the refresh triggers a sidebar opening\n\t\t// and both listeners have actions, as the second actionsUpdated won't be\n\t\t// caught by the still-opening sidebar.\n\t\tconst process = new OO.ui.Process();\n\t\tmidEditListeners.forEach(\n\t\t\t( listener ) => process.next( () => this.updateForListener( listener, true ) )\n\t\t);\n\t\tprocess.execute();\n\t}\n};\n\nController.prototype.toggleSuggestionsMode = function () {\n\tthis.suggestionsMode = !this.suggestionsMode;\n\tthis.actionsByListener = {};\n\tthis.refresh();\n};\n\n/**\n * Fires all edit checks associated with a given listener.\n *\n * Actions are created anew for every run, but we want continuity for certain state changes. We therefore match them up\n * to existing actions by checking for equality, ie, the same constructor and same ID or fragments.\n *\n * We return a promise so that UI actions such as opening the pre-save dialog\n * do not occur until checks have completed.\n *\n * @param {string} listener e.g. onBeforeSave, onDocumentChange, onBranchNodeChange\n * @param {boolean} fromRefresh Update comes from a manual refresh, not a real event\n * @return {Promise<mw.editcheck.EditCheckAction[]>} An updated set of actions.\n * @fires Controller#actionsUpdated\n */\nController.prototype.updateForListener = function ( listener, fromRefresh ) {\n\t// Get the existing actions for this listener\n\tconst existing = this.getActions( listener );\n\n\tlet actionsPromise = mw.editcheck.editCheckFactory.createAllActionsByListener( this, listener, this.surface.getModel(), false );\n\t// Create all actions for this listener\n\tif ( this.suggestionsMode && !this.inBeforeSave ) {\n\t\t// eslint-disable-next-line no-jquery/no-when\n\t\tactionsPromise = $.when(\n\t\t\tactionsPromise,\n\t\t\tmw.editcheck.editCheckFactory.createAllActionsByListener( this, listener, this.surface.getModel(), true )\n\t\t).then( ( checkActions, suggestionActions ) => [\n\t\t\t...checkActions,\n\t\t\t// Discard any suggestions that have an equivalent non-suggestion\n\t\t\t...suggestionActions.filter( ( suggestion ) => !checkActions.find( ( action ) => action.equals( suggestion, true ) ) )\n\t\t] );\n\t}\n\treturn actionsPromise\n\t\t.then( ( actionsFromListener ) => {\n\t\t\t// Try to match each new action to an existing one (to preserve state)\n\t\t\tconst actions = actionsFromListener.map( ( action ) => {\n\t\t\t\tconst oldAction = existing.find( ( existingAction ) => action.equals( existingAction ) );\n\t\t\t\tif ( oldAction && !( oldAction.isSuggestion() && !action.isSuggestion() ) ) {\n\t\t\t\t\t// Let a new non-suggestion take over from an old suggestion\n\t\t\t\t\treturn oldAction;\n\t\t\t\t}\n\t\t\t\treturn action;\n\t\t\t} );\n\n\t\t\tlet staleUpdated = false;\n\t\t\tif ( !fromRefresh ) {\n\t\t\t\tactions.forEach( ( action ) => {\n\t\t\t\t\tif ( action.isStale() ) {\n\t\t\t\t\t\taction.setStale( false );\n\t\t\t\t\t\tstaleUpdated = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Update the actions for this listener\n\t\t\tthis.actionsByListener[ listener ] = actions;\n\n\t\t\tconst newActions = actions.filter( ( action ) => existing.every( ( oldAction ) => !action.equals( oldAction ) ) );\n\t\t\tconst discardedActions = existing.filter( ( action ) => actions.every( ( newAction ) => !action.equals( newAction ) ) );\n\n\t\t\t// If the actions list changed, update\n\t\t\tif ( fromRefresh || staleUpdated || actions.length !== existing.length || newActions.length || discardedActions.length ) {\n\t\t\t\t// TODO: We need to consider a consistency check here as the document state may have changed since the\n\t\t\t\t// action within the promise was created\n\t\t\t\t// Notify listeners that actions have been updated\n\t\t\t\tthis.emit( 'actionsUpdated', listener, this.getActions(), newActions, discardedActions, false );\n\t\t\t}\n\t\t\t// Return the updated actions\n\t\t\treturn actions;\n\t\t} );\n};\n\n/**\n * Remove an edit check action\n *\n * @param {string} listener Listener which triggered the action\n * @param {mw.editcheck.EditCheckAction} action Action to remove\n * @param {boolean} rejected The action was rejected\n * @fires Controller#actionsUpdated\n */\nController.prototype.removeAction = function ( listener, action, rejected ) {\n\tconst actions = this.getActions( listener );\n\tconst index = actions.indexOf( action );\n\tif ( index === -1 ) {\n\t\treturn;\n\t}\n\tconst removed = actions.splice( index, 1 );\n\n\tif ( action === this.focusedAction ) {\n\t\tthis.focusedAction = null;\n\t}\n\n\tthis.emit( 'actionsUpdated', listener, this.getActions(), [], removed, rejected );\n};\n\n/**\n * Trigger a focus state for a given action\n *\n * Will emit a focusAction event if the focused action changed or if scrolling\n * was requested.\n *\n * @param {mw.editcheck.EditCheckAction} action Action to focus\n * @param {boolean} [scrollTo] Scroll action's selection into view\n * @param {boolean} [alignToTop] Align selection to top of page when scrolling\n * @fires Controller#focusAction\n * @fires Controller#position\n */\nController.prototype.focusAction = function ( action, scrollTo, alignToTop ) {\n\tif ( !scrollTo && action === this.focusedAction ) {\n\t\t// Don't emit unnecessary events if there is no change or scroll\n\t\treturn;\n\t}\n\n\tthis.focusedAction = action;\n\n\tif ( scrollTo ) {\n\t\tthis.scrollActionIntoViewDebounced( action, alignToTop );\n\t}\n\n\tthis.emit( 'focusAction', action, this.getActions().indexOf( action ), scrollTo );\n\n\tthis.updatePositionsDebounced();\n};\n\n/**\n * Get actions by listener\n *\n * If no listener is specified, then get all actions relevant to the current moment, i.e.:\n * - During beforeSave, get onBeforeSave listeners\n * - Otherwise, get all mid-edit listeners\n *\n * @param {string} [listener] The listener; if omitted, get all relevant actions\n * @return {mw.editcheck.EditCheckAction[]} Actions\n */\nController.prototype.getActions = function ( listener ) {\n\tif ( listener ) {\n\t\treturn this.actionsByListener[ listener ] || [];\n\t}\n\tconst listeners = this.inBeforeSave ? [ 'onBeforeSave' ] : midEditListeners;\n\tconst actions = [].concat( ...listeners.map( ( lr ) => this.actionsByListener[ lr ] || [] ) );\n\tactions.sort( mw.editcheck.EditCheckAction.static.compareStarts );\n\treturn actions;\n};\n\n/**\n * Handle select events from the surface model\n *\n * @param {ve.dm.Selection} selection New selection\n */\nController.prototype.onSelect = function () {\n\tif ( OO.ui.isMobile() && !this.inBeforeSave ) {\n\t\t// On mobile we want to close the drawer if the keyboard is shown\n\t\tif ( this.surface.getView().hasNativeCursorSelection() ) {\n\t\t\t// A native cursor selection means the keyboard will be visible\n\t\t\tthis.closeDialog( 'mobile-keyboard' );\n\t\t}\n\t}\n\tthis.updateActions();\n};\n\n/**\n * Update actions based on the current selection\n *\n * @fires Controller#actionsUpdated\n * @fires Controller#focusAction\n */\nController.prototype.updateActions = function () {\n\tif ( !this.surface ) {\n\t\t// This is debounced, and could potentially be called after teardown\n\t\treturn;\n\t}\n\tif ( this.surface.getView().reviewMode ) {\n\t\t// In review mode the selection and display of checks is being managed by the dialog\n\t\treturn;\n\t}\n\n\tconst selection = this.surface.getModel().getSelection();\n\n\tif ( !this.inBeforeSave && this.updateCurrentBranchNodeFromSelection( selection ) ) {\n\t\tthis.emit( 'branchNodeChange', this.branchNode );\n\t}\n\n\tif ( this.getActions().length === 0 || selection.isNull() ) {\n\t\t// Nothing to do\n\t\treturn;\n\t}\n\tconst actions = this.getActions().filter(\n\t\t( check ) => check.getHighlightSelections().some(\n\t\t\t( highlight ) => highlight.getCoveringRange().containsRange( selection.getCoveringRange() ) ) );\n\n\tif ( actions.length > 0 ) {\n\t\t// Focus the last action returned, because it should be the most-specific\n\t\tthis.focusAction( actions[ actions.length - 1 ], false );\n\t}\n};\n\n/**\n * Handle contextChange events from the surface model\n */\nController.prototype.onContextChange = function () {\n\tif ( OO.ui.isMobile() && this.surface.getContext().isVisible() ) {\n\t\tif ( !this.inBeforeSave ) {\n\t\t\t// The context overlaps the drawer on mobile, so we should get rid of the drawer\n\t\t\tthis.closeDialog( 'context' );\n\t\t} else {\n\t\t\t// We still want to hide the context, just not close the dialog\n\t\t\tthis.surface.getModel().setNullSelection();\n\t\t}\n\t}\n};\n\n/**\n * Handle position events from the surface view\n *\n * @param {boolean} passive Event is passive (don't scroll)\n */\nController.prototype.onPosition = function ( passive ) {\n\tthis.updatePositionsDebounced();\n\n\tif ( !passive && this.getActions().length && this.focusedAction && this.surface.getView().reviewMode ) {\n\t\tthis.scrollActionIntoViewDebounced( this.focusedAction, !OO.ui.isMobile() );\n\t}\n};\n\n/**\n * Handle changes to the document model (undoStackChange)\n */\nController.prototype.onDocumentChange = function () {\n\tif ( !this.inBeforeSave ) {\n\t\tthis.updateForListener( 'onDocumentChange' );\n\t}\n};\n\n/**\n * Handle changes to the selection moving between branch nodes\n */\nController.prototype.onBranchNodeChange = function () {\n\tif ( !this.surface ) {\n\t\t// This is debounced, and could potentially be called after teardown\n\t\treturn;\n\t}\n\tif ( !this.inBeforeSave ) {\n\t\tthis.updateForListener( 'onBranchNodeChange' );\n\t}\n};\n\n/**\n * Handler when 'actionsUpdated' fires.\n *\n * Updates gutter and highlights when the action list has changed.\n * Displays the edit check dialog if it is not already on screen.\n *\n * @param {string} listener e.g. onBeforeSave, onDocumentChange, onBranchNodeChange\n * @param {mw.editcheck.EditCheckAction[]} actions\n * @param {mw.editcheck.EditCheckAction[]} newActions\n * @param {mw.editcheck.EditCheckAction[]} discardedActions\n */\nController.prototype.onActionsUpdated = function ( listener, actions, newActions, discardedActions ) {\n\t// do we need to redraw anything?\n\tif ( newActions.length || discardedActions.length ) {\n\t\tif ( this.focusedAction && discardedActions.includes( this.focusedAction ) ) {\n\t\t\tthis.focusedAction = null;\n\t\t}\n\t\tthis.updatePositionsDebounced();\n\t}\n\n\t// Let actions know they've been discarded\n\tfor ( const action of discardedActions ) {\n\t\taction.discarded();\n\t}\n\n\t// do we need to show mid-edit actions?\n\tif ( listener === 'onBeforeSave' ) {\n\t\treturn;\n\t}\n\tif ( !actions.length ) {\n\t\treturn;\n\t}\n\tconst windowName = OO.ui.isMobile() ? 'gutterSidebarEditCheckDialog' : 'sidebarEditCheckDialog';\n\tlet shownPromise;\n\tconst currentWindow = this.surface.getSidebarDialogs().getCurrentWindow();\n\tif ( !currentWindow || currentWindow.constructor.static.name !== windowName ) {\n\t\tthis.target.$element.addClass( 've-ui-editCheck-sidebar-active' );\n\t\tconst windowAction = ve.ui.actionFactory.create( 'window', this.surface, 'check' );\n\t\tshownPromise = windowAction.open(\n\t\t\twindowName,\n\t\t\t{ inBeforeSave: this.inBeforeSave, actions: actions, controller: this }\n\t\t).then( ( instance ) => {\n\t\t\tve.track( 'activity.editCheckDialog', { action: 'window-open-from-check-midedit' } );\n\t\t\tinstance.closed.then( () => {\n\t\t\t\tthis.target.$element.removeClass( 've-ui-editCheck-sidebar-active' );\n\t\t\t} );\n\t\t} );\n\t} else {\n\t\tshownPromise = ve.createDeferred().resolve().promise();\n\t}\n\tshownPromise.then( () => {\n\t\tthis.updateShownStats( newActions, 'midedit' );\n\n\t\tif ( newActions.length ) {\n\t\t\t// Check if any new actions are relevant to our current selection:\n\t\t\tthis.updateActions();\n\t\t}\n\t} );\n};\n\n/**\n * Adds the pre-save edit check dialog before the normal page commit dialog.\n * Handles closing the mid-edit dialog, as well as restoring it if the user\n * exits the pre-save check dialog.\n *\n * We execute all pre-save checks, which may be asynchronous, and wait for them\n * to complete before opening the pre-save dialog.\n *\n * TODO: Set a time-out so that we don't hang forever if an async check takes\n * too long.\n */\nController.prototype.setupPreSaveProcess = function () {\n\tconst target = this.target;\n\tconst preSaveProcess = target.getPreSaveProcess();\n\tpreSaveProcess.next( () => {\n\t\tconst surface = target.getSurface();\n\t\tif ( surface.getMode() !== 'visual' ) {\n\t\t\treturn;\n\t\t}\n\t\tve.track( 'stats.mediawiki_editcheck_preSaveChecks_total', 1, { kind: 'Available' } );\n\n\t\tconst oldFocusedAction = this.focusedAction;\n\t\tthis.inBeforeSave = true;\n\t\treturn this.updateForListener( 'onBeforeSave' ).then( ( actions ) => {\n\t\t\tif ( actions.length ) {\n\t\t\t\tve.track( 'stats.mediawiki_editcheck_preSaveChecks_total', 1, { kind: 'Shown' } );\n\n\t\t\t\tthis.setupToolbar( target );\n\n\t\t\t\tlet $contextContainer, contextPadding;\n\t\t\t\tif ( surface.context.popup ) {\n\t\t\t\t\tcontextPadding = surface.context.popup.containerPadding;\n\t\t\t\t\t$contextContainer = surface.context.popup.$container;\n\t\t\t\t\tsurface.context.popup.$container = surface.$element;\n\t\t\t\t\tsurface.context.popup.containerPadding = 20;\n\t\t\t\t}\n\n\t\t\t\treturn this.closeSidebars( 'preSaveProcess' ).then( () => this.closeDialog( 'preSaveProcess' ).then( () => {\n\t\t\t\t\ttarget.onContainerScroll();\n\t\t\t\t\tconst windowAction = ve.ui.actionFactory.create( 'window', surface, 'check' );\n\t\t\t\t\treturn windowAction.open( 'fixedEditCheckDialog', { inBeforeSave: true, actions: actions, controller: this } )\n\t\t\t\t\t\t.then( ( instance ) => {\n\t\t\t\t\t\t\tve.track( 'activity.editCheckDialog', { action: 'window-open-from-check-presave' } );\n\t\t\t\t\t\t\tthis.updateShownStats( actions, 'presave' );\n\n\t\t\t\t\t\t\tthis.scrollActionIntoViewDebounced( this.focusedAction, true );\n\n\t\t\t\t\t\t\tinstance.closed.then( () => {}, () => {} ).then( () => {\n\t\t\t\t\t\t\t\tsurface.getView().setReviewMode( false );\n\t\t\t\t\t\t\t\tthis.inBeforeSave = false;\n\t\t\t\t\t\t\t\tthis.focusedAction = oldFocusedAction;\n\t\t\t\t\t\t\t\t// Re-open the mid-edit sidebar if necessary.\n\t\t\t\t\t\t\t\tthis.refresh();\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\treturn instance.closing.then( ( data ) => {\n\t\t\t\t\t\t\t\tif ( target.deactivating || !target.active ) {\n\t\t\t\t\t\t\t\t\t// Someone clicking \"read\" to leave the article\n\t\t\t\t\t\t\t\t\t// will trigger the closing of this; in that\n\t\t\t\t\t\t\t\t\t// case, just abandon what we're doing\n\t\t\t\t\t\t\t\t\tve.track( 'stats.mediawiki_editcheck_preSaveChecks_total', 1, { kind: 'Abandoned' } );\n\t\t\t\t\t\t\t\t\treturn ve.createDeferred().reject().promise();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.restoreToolbar( target );\n\n\t\t\t\t\t\t\t\tif ( $contextContainer ) {\n\t\t\t\t\t\t\t\t\tsurface.context.popup.$container = $contextContainer;\n\t\t\t\t\t\t\t\t\tsurface.context.popup.containerPadding = contextPadding;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttarget.onContainerScroll();\n\n\t\t\t\t\t\t\t\tif ( data ) {\n\t\t\t\t\t\t\t\t\tconst delay = ve.createDeferred();\n\t\t\t\t\t\t\t\t\t// If they inserted, wait 2 seconds on desktop\n\t\t\t\t\t\t\t\t\t// before showing save dialog to give user time\n\t\t\t\t\t\t\t\t\t// to see success notification.\n\t\t\t\t\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\t\t\t\t\tve.track( 'stats.mediawiki_editcheck_preSaveChecks_total', 1, { kind: 'Completed' } );\n\t\t\t\t\t\t\t\t\t\tdelay.resolve();\n\t\t\t\t\t\t\t\t\t}, !OO.ui.isMobile() && data.action !== 'reject' ? 2000 : 0 );\n\t\t\t\t\t\t\t\t\treturn delay.promise();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// closed via \"back\" or otherwise\n\t\t\t\t\t\t\t\t\tve.track( 'stats.mediawiki_editcheck_preSaveChecks_total', 1, { kind: 'Abandoned' } );\n\t\t\t\t\t\t\t\t\treturn ve.createDeferred().reject().promise();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t} ) );\n\t\t\t} else {\n\t\t\t\tthis.inBeforeSave = false;\n\t\t\t\t// Counterpart to earlier preSaveChecksShown, for use in tracking\n\t\t\t\t// errors in check-generation:\n\t\t\t\tve.track( 'stats.mediawiki_editcheck_preSaveChecks_total', 1, { kind: 'NotShown' } );\n\t\t\t}\n\t\t} );\n\t} );\n};\n\n/**\n * Replace toolbar tools for review mode during pre-save checks.\n *\n * @param {ve.init.mw.ArticleTarget} target\n */\nController.prototype.setupToolbar = function ( target ) {\n\tconst surface = target.getSurface();\n\tconst toolbar = target.getToolbar();\n\tthis.$originalToolbarTools = toolbar.$group.add( toolbar.$after ).addClass( 'oo-ui-element-hidden' );\n\n\tconst reviewToolbar = new ve.ui.TargetToolbar( target, target.toolbarConfig );\n\treviewToolbar.setup( [\n\t\t{\n\t\t\tname: 'back',\n\t\t\ttype: 'bar',\n\t\t\tinclude: [ 'editCheckBack' ]\n\t\t},\n\t\t{\n\t\t\tname: 'title',\n\t\t\ttype: 'label',\n\t\t\tlabel: ve.msg( 'editcheck-dialog-title' )\n\t\t},\n\t\t{\n\t\t\tname: 'save',\n\t\t\ttype: 'bar',\n\t\t\tinclude: [ 'showSaveDisabled' ]\n\t\t}\n\t], surface );\n\n\treviewToolbar.items[ 1 ].$element.removeClass( 'oo-ui-toolGroup-empty' );\n\t// Just append the $group of the new toolbar, so we don't have to wire up all the toolbar events.\n\tthis.$reviewToolbarGroup = reviewToolbar.$group.addClass( 've-ui-editCheck-toolbar-tools' );\n\ttoolbar.$group.after( this.$reviewToolbarGroup );\n\n\ttoolbar.onWindowResize();\n};\n\n/**\n * Restores the original toolbar tools after review mode is complete.\n *\n * @param {ve.init.mw.ArticleTarget} target\n */\nController.prototype.restoreToolbar = function ( target ) {\n\tif ( !this.$reviewToolbarGroup ) {\n\t\treturn;\n\t}\n\tconst toolbar = target.getToolbar();\n\n\tthis.$reviewToolbarGroup.remove();\n\tthis.$reviewToolbarGroup = null;\n\n\tthis.$originalToolbarTools.removeClass( 'oo-ui-element-hidden' );\n\n\ttoolbar.onWindowResize();\n};\n\n/**\n * Redraw selection highlights\n */\nController.prototype.drawSelections = function () {\n\tconst surfaceView = this.surface.getView();\n\tconst activeSelections = this.focusedAction ? this.focusedAction.getHighlightSelections().map(\n\t\t( selection ) => ve.ce.Selection.static.newFromModel( selection, surfaceView )\n\t) : [];\n\tconst isStale = !!this.focusedAction && this.focusedAction.isStale();\n\tconst showGutter = !isStale && !OO.ui.isMobile();\n\tconst activeOptions = { showGutter: showGutter, showRects: !isStale, showBounding: isStale };\n\n\tif ( this.inBeforeSave ) {\n\t\t// Review mode grays out everything that's not highlighted:\n\t\tconst highlightNodes = [];\n\t\tthis.getActions().forEach( ( action ) => {\n\t\t\taction.getHighlightSelections().forEach( ( selection ) => {\n\t\t\t\thighlightNodes.push( ...surfaceView.getDocument().selectNodes( selection.getCoveringRange(), 'branches' ).map( ( spec ) => spec.node ) );\n\t\t\t} );\n\t\t} );\n\t\tsurfaceView.setReviewMode( true, highlightNodes );\n\t\t// The following classes are used here:\n\t\t// * ve-ce-surface-selections-editCheck-active\n\t\tsurfaceView.getSelectionManager().drawSelections( 'editCheck-active', activeSelections, activeOptions );\n\t\treturn;\n\t}\n\n\tconst actions = this.getActions();\n\tif ( actions.length === 0 ) {\n\t\t// Clear any previously drawn selections\n\t\tsurfaceView.getSelectionManager().drawSelections( 'editCheck-active', [] );\n\t\tsurfaceView.getSelectionManager().drawSelections( 'editCheck-inactive', [] );\n\t\treturn;\n\t}\n\tconst inactiveOptions = { showGutter: showGutter, showRects: false };\n\n\tconst inactiveSelections = [];\n\t// Optimization: When showGutter is false inactive selections currently render nothing\n\tif ( showGutter ) {\n\t\tactions.forEach( ( action ) => {\n\t\t\tconst isActive = ( action === this.focusedAction );\n\t\t\taction.getHighlightSelections().forEach( ( selection ) => {\n\t\t\t\tconst selectionView = ve.ce.Selection.static.newFromModel( selection, surfaceView );\n\t\t\t\tif ( isActive ) {\n\t\t\t\t\tactiveSelections.push( selectionView );\n\t\t\t\t} else {\n\t\t\t\t\tinactiveSelections.push( selectionView );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// The following classes are used here:\n\t// * ve-ce-surface-selections-editCheck-active\n\t// * ve-ce-surface-selections-editCheck-inactive\n\tsurfaceView.getSelectionManager().drawSelections( 'editCheck-active', activeSelections, activeOptions );\n\tsurfaceView.getSelectionManager().drawSelections( 'editCheck-inactive', inactiveSelections, inactiveOptions );\n\n\t// Add 'type' classes\n\tactions.forEach( ( action ) => {\n\t\tconst type = action.getType();\n\t\tconst isActive = action === this.focusedAction;\n\t\tconst isPending = action.isTagged( 'pending' );\n\t\taction.getHighlightSelections().forEach( ( selection ) => {\n\t\t\tif ( !isActive && !showGutter ) {\n\t\t\t\t// Optimization: When showGutter is false inactive selections currently render nothing\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst selectionElements = surfaceView.getSelectionManager().getCachedSelectionElements(\n\t\t\t\tisActive ? 'editCheck-active' : 'editCheck-inactive', selection, isActive ? activeOptions : inactiveOptions\n\t\t\t);\n\t\t\tif ( selectionElements ) {\n\t\t\t\t// The following classes are used here:\n\t\t\t\t// * ve-ce-surface-selection-editCheck-error\n\t\t\t\t// * ve-ce-surface-selection-editCheck-warning\n\t\t\t\t// * ve-ce-surface-selection-editCheck-notice\n\t\t\t\t// * ve-ce-surface-selection-editCheck-success\n\t\t\t\tselectionElements.$selection.addClass( 've-ce-surface-selection-editCheck-' + type );\n\t\t\t\tif ( isPending ) {\n\t\t\t\t\tselectionElements.$selection.addClass( 've-ce-surface-selection-editCheck-pending' );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n};\n\n/**\n * Scrolls an action's selection into view\n *\n * @param {mw.editcheck.EditCheckAction} action\n * @param {boolean} [alignToTop] Align the selection to the top of the viewport\n */\nController.prototype.scrollActionIntoView = function ( action, alignToTop ) {\n\t// scrollSelectionIntoView scrolls to the focus of a selection, but we\n\t// want the very beginning to be in view, so collapse it:\n\tconst selection = action.getHighlightSelections()[ 0 ].collapseToStart();\n\tconst padding = ve.copy( this.surface.getPadding() );\n\n\tpadding.top += 10;\n\tpadding.bottom += 10;\n\n\tif ( ve.ui.FixedEditCheckDialog.static.position === 'below' ) {\n\t\t// TODO: ui.surface getPadding should really be fixed for this\n\t\tconst currentWindow = this.surface.getToolbarDialogs( ve.ui.FixedEditCheckDialog.static.position ).getCurrentWindow();\n\t\tif ( currentWindow ) {\n\t\t\tpadding.bottom += currentWindow.getContentHeight();\n\t\t}\n\t}\n\tthis.surface.scrollSelectionIntoView( selection, {\n\t\tanimate: true,\n\t\tpadding: padding,\n\t\talignToTop: alignToTop\n\t} );\n};\n\n/**\n * Closes the fixed edit check dialog (pre-save).\n *\n * @param {string} [action] Name of action which triggered the close ('mobile-keyboard', 'context', 'preSaveProcess')\n * @return {jQuery.Promise}\n */\nController.prototype.closeDialog = function ( action ) {\n\tif ( !this.focusedAction ) {\n\t\treturn ve.createDeferred().resolve().promise();\n\t}\n\tthis.focusAction( undefined );\n\tconst windowAction = ve.ui.actionFactory.create( 'window', this.surface, 'check' );\n\treturn windowAction.close( 'fixedEditCheckDialog', action ? { action: action } : undefined ).closed.then( () => {}, () => {} );\n};\n\n/**\n * Closes the sidebar edit check dialogs (mid-edit).\n *\n * @param {string} [action] Name of action which triggered the close (currently only 'preSaveProcess')\n * @return {jQuery.Promise}\n */\nController.prototype.closeSidebars = function ( action ) {\n\tconst currentWindow = this.surface.getSidebarDialogs().getCurrentWindow();\n\tif ( currentWindow ) {\n\t\t// .always is not chainable\n\t\treturn currentWindow.close( action ? { action: action } : undefined ).closed.then( () => {}, () => {} );\n\t}\n\treturn ve.createDeferred().resolve().promise();\n};\n\n/**\n * Set the current branch node from a selection\n *\n * @param {ve.dm.Selection} selection New selection\n * @return {boolean} whether the branch node changed\n */\nController.prototype.updateCurrentBranchNodeFromSelection = function ( selection ) {\n\tlet newBranchNode = null;\n\tif ( selection instanceof ve.dm.LinearSelection ) {\n\t\tnewBranchNode = this.surface.model.documentModel.getBranchNodeFromOffset( selection.range.to );\n\t}\n\tif ( newBranchNode !== this.branchNode ) {\n\t\tthis.branchNode = newBranchNode;\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nController.prototype.updateShownStats = function ( actions, moment ) {\n\tactions.forEach( ( action ) => {\n\t\tif ( action.isSuggestion() ) {\n\t\t\tve.track( 'activity.editCheck-' + action.getName(), { action: 'suggestion-shown-' + moment } );\n\t\t} else {\n\t\t\tmw.editcheck.checksShown[ action.getName() ] = true;\n\t\t\tve.track( 'activity.editCheck-' + action.getName(), { action: 'check-shown-' + moment } );\n\t\t}\n\t} );\n};\n\nmodule.exports = {\n\tController: Controller\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":"implicit-arrow-linebreak","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/editcheck/modules/dialogs/EditCheckDialog.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":60,"column":24,"nodeType":"NewExpression","messageId":"noLabel","endLine":65,"endColumn":5},{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":68,"column":20,"nodeType":"NewExpression","messageId":"noLabel","endLine":73,"endColumn":5},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":163,"column":9,"nodeType":"MemberExpression","messageId":"forbidden","endLine":163,"endColumn":33},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":328,"column":1,"nodeType":"Block","endLine":328,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":343,"column":1,"nodeType":"Block","endLine":343,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":405,"column":20,"nodeType":"CallExpression","endLine":405,"endColumn":79,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":3,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface EditCheckDialog class.\n *\n * @copyright See AUTHORS.txt\n */\n\n/**\n * EditCheckDialog constructor.\n *\n * Abstract mixin for FixedEditCheckDialog and SidebarEditCheckDialog.\n *\n * @class\n * @abstract\n *\n * @constructor\n */\nve.ui.EditCheckDialog = function VeUiEditCheckDialog() {\n\t// Pre-initialization\n\tthis.$element.addClass( 've-ui-editCheckDialog' );\n\n\tthis.acting = false;\n};\n\n/* Inheritance */\n\nOO.initClass( ve.ui.EditCheckDialog );\n\n/* Static Properties */\n\n// TODO: Keep surface active on mobile for some checks?\nve.ui.EditCheckDialog.static.activeSurface = !OO.ui.isMobile();\n\n// Invisible title for accessibility\nve.ui.EditCheckDialog.static.title = OO.ui.deferMsg( 'editcheck-review-title' );\n\nve.ui.EditCheckDialog.static.alwaysFocusAction = false;\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.EditCheckDialog.prototype.initialize = function () {\n\t// FIXME: click handlers are getting unbound when the window is closed\n\n\tthis.closeButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 've-ui-editCheckDialog-close' ],\n\t\tframed: false,\n\t\tlabel: ve.msg( 'visualeditor-contextitemwidget-label-close' ),\n\t\tinvisibleLabel: true,\n\t\ticon: 'expand'\n\t} ).connect( this, {\n\t\tclick: 'onCloseButtonClick'\n\t} );\n\n\tthis.currentOffset = null;\n\tthis.currentActions = null;\n\n\tthis.footerLabel = new OO.ui.LabelWidget();\n\tthis.previousButton = new OO.ui.ButtonWidget( {\n\t\ticon: 'collapse',\n\t\ttitle: ve.msg( 'last' ),\n\t\tinvisibleLabel: true,\n\t\tframed: false\n\t} ).connect( this, {\n\t\tclick: 'onPreviousButtonClick'\n\t} );\n\tthis.nextButton = new OO.ui.ButtonWidget( {\n\t\ticon: 'expand',\n\t\ttitle: ve.msg( 'next' ),\n\t\tinvisibleLabel: true,\n\t\tframed: false\n\t} ).connect( this, {\n\t\tclick: 'onNextButtonClick'\n\t} );\n\tthis.footer = new OO.ui.HorizontalLayout( {\n\t\tclasses: [ 've-ui-editCheckDialog-footer' ],\n\t\titems: [\n\t\t\tthis.footerLabel,\n\t\t\tthis.previousButton,\n\t\t\tthis.nextButton\n\t\t]\n\t} );\n\n\tthis.$actions = $( '<div>' );\n\tthis.$body.append( this.closeButton.$element, this.$actions, this.footer.$element );\n\tif ( mw.editcheck.experimental ) {\n\t\tconst $warning = new OO.ui.MessageWidget( {\n\t\t\ttype: 'error',\n\t\t\tlabel: 'Currently using experimental edit checks. For testing purposes only.',\n\t\t\tinline: true\n\t\t} ).$element.css( {\n\t\t\t'white-space': 'normal',\n\t\t\tmargin: '0.5em 1em'\n\t\t} );\n\t\tif ( OO.ui.isMobile() ) {\n\t\t\tthis.footer.$element.before( $warning );\n\t\t} else {\n\t\t\tthis.$body.append( $warning );\n\t\t}\n\t}\n};\n\n/**\n * Handle updates to the list of edit check actions.\n *\n * @param {string} listener Check listener\n * @param {mw.editcheck.EditCheckAction[]} actions All current actions\n * @param {mw.editcheck.EditCheckAction[]} newActions Newly added actions\n * @param {mw.editcheck.EditCheckAction[]} discardedActions Newly removed actions\n * @param {boolean} rejected The last action was rejected/dismissed\n */\nve.ui.EditCheckDialog.prototype.onActionsUpdated = function ( listener, actions, newActions, discardedActions, rejected ) {\n\tif ( this.inBeforeSave !== ( listener === 'onBeforeSave' ) ) {\n\t\treturn;\n\t}\n\tif ( this.updateFilter ) {\n\t\tactions = this.updateFilter( actions, newActions, discardedActions, this.currentActions );\n\t}\n\tthis.showActions( actions, newActions, rejected );\n};\n\n/**\n * Show the actions list\n *\n * @param {mw.editcheck.EditCheckAction[]} actions Actions\n * @param {mw.editcheck.EditCheckAction[]} newActions Newly added actions\n * @param {boolean} lastActionRejected Last action was rejected/dismissed\n */\nve.ui.EditCheckDialog.prototype.showActions = function ( actions, newActions, lastActionRejected ) {\n\tlet currentAction;\n\tif ( this.currentActions && this.currentOffset !== null && actions.includes( this.currentActions[ this.currentOffset ] ) ) {\n\t\tcurrentAction = this.currentActions[ this.currentOffset ];\n\t}\n\tthis.currentActions = actions;\n\tif ( actions.length === 0 ) {\n\t\tthis.close( { action: lastActionRejected ? 'reject' : 'complete' } );\n\t\treturn;\n\t}\n\n\tthis.refresh();\n\n\tif ( currentAction ) {\n\t\t// This just adjusts so the previously selected check remains selected:\n\t\tthis.setCurrentOffset( actions.indexOf( currentAction ), false, true );\n\t} else if ( newActions.length > 0 ) {\n\t\tthis.setCurrentOffset( actions.indexOf( newActions[ 0 ] ), false, false );\n\t} else if ( this.constructor.static.alwaysFocusAction ) {\n\t\t// This dialog always wants to have an action focused, so slip the focus onto\n\t\t// a nearby action if the current one was removed.\n\t\tconst newOffset = Math.min( this.currentOffset, actions.length - 1 );\n\t\tthis.setCurrentOffset( newOffset, true, false );\n\t}\n};\n\n/**\n * Check if an action exists in the current actions.\n *\n * @param {Object} action Action\n * @return {boolean}\n */\nve.ui.EditCheckDialog.prototype.hasAction = function ( action ) {\n\treturn this.currentActions.some( ( a ) => action.equals( a ) );\n};\n\n/**\n * Refresh the action list\n */\nve.ui.EditCheckDialog.prototype.refresh = function () {\n\tthis.$actions.empty();\n\n\tthis.currentActions.forEach( ( action, index ) => {\n\t\tconst widget = action.render( index !== this.currentOffset, this.singleAction, this.surface );\n\t\twidget.on( 'togglecollapse', this.onToggleCollapse, [ action, index ], this );\n\t\taction.off( 'act' ).on( 'act', this.onAct, [ action, widget ], this );\n\n\t\tthis.$actions.append( widget.$element );\n\n\t\t// for scrolling later\n\t\taction.widget = widget;\n\t} );\n\n\t// Update positions immediately to prevent flicker\n\tthis.controller.updatePositions();\n};\n\n/**\n * Set the offset of the current check, within the list of all checks.\n *\n * @param {number|null} offset New offset\n * @param {boolean} fromUserAction The change was triggered by a user action\n * @param {boolean} [internal] Change was triggered internally\n */\nve.ui.EditCheckDialog.prototype.setCurrentOffset = function ( offset, fromUserAction, internal ) {\n\t// TODO: work out how to tell the window to recalculate height here\n\n\tif ( offset === null || offset === -1 ) {\n\t\t/* That's valid, carry on */\n\t\toffset = null;\n\t} else if ( !Number.isSafeInteger( offset ) || ( offset < 0 || offset > ( this.currentActions.length - 1 ) ) ) {\n\t\tthrow new Error( `Bad offset ${ offset }, expected an integer between 0 and ${ this.currentActions.length - 1 }` );\n\t}\n\n\tthis.currentOffset = offset;\n\n\tthis.currentActions.forEach( ( action, i ) => {\n\t\taction.widget.toggleCollapse( i !== this.currentOffset );\n\t} );\n\n\tif ( this.currentOffset !== null ) {\n\t\tthis.footerLabel.setLabel(\n\t\t\tve.msg( 'visualeditor-find-and-replace-results',\n\t\t\t\tve.init.platform.formatNumber( this.currentOffset + 1 ),\n\t\t\t\tve.init.platform.formatNumber( this.currentActions.length )\n\t\t\t)\n\t\t);\n\t} else {\n\t\tthis.footerLabel.setLabel( '' );\n\t}\n\n\t// Warning: the toggleCollapse calls above may result in a promise's\n\t// `always` unsetting this.acting. This currently only happens for an\n\t// action widget's feedback form. If we switch away from jquery promises\n\t// or add anything which isn't completely synchronous, this call may need\n\t// to be deferred until this.acting settles:\n\tthis.updateNavigationState();\n\tthis.updateSize();\n\n\tif ( !internal ) {\n\t\tthis.controller.focusAction(\n\t\t\tthis.currentActions[ this.currentOffset ],\n\t\t\t// Scroll selection into view if user interacted with dialog\n\t\t\tfromUserAction,\n\t\t\t// Scroll to top of page in desktop fixed dialog (pre-save)\n\t\t\tthis.constructor.static.name === 'fixedEditCheckDialog' && !OO.ui.isMobile()\n\t\t);\n\t}\n};\n\n/**\n * Update the disabled state of the navigation buttons\n */\nve.ui.EditCheckDialog.prototype.updateNavigationState = function () {\n\tconst currentAction = this.currentActions[ this.currentOffset ];\n\tif ( currentAction ) {\n\t\tcurrentAction.widget.setDisabled( this.acting );\n\t}\n\tthis.footerLabel.setDisabled( this.acting );\n\tthis.nextButton.setDisabled(\n\t\tthis.acting ||\n\t\t( this.currentOffset !== null && this.currentOffset >= this.currentActions.length - 1 )\n\t);\n\tthis.previousButton.setDisabled(\n\t\tthis.acting ||\n\t\tthis.currentOffset === null || this.currentOffset <= 0\n\t);\n};\n\n/**\n * Handle focusAction events from the controller\n *\n * @param {mw.editcheck.EditCheckAction} action Action\n * @param {number} index Index of the action in #getActions\n * @param {boolean} scrollTo Scroll the action's selection into view\n */\nve.ui.EditCheckDialog.prototype.onFocusAction = function ( action, index, scrollTo ) {\n\tthis.setCurrentOffset( this.currentActions.indexOf( action ), scrollTo, true );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.EditCheckDialog.prototype.getSetupProcess = function ( data, process ) {\n\treturn process.first( () => {\n\t\tthis.controller = data.controller;\n\t\tthis.controller.on( 'actionsUpdated', this.onActionsUpdated, false, this );\n\t\tthis.controller.on( 'focusAction', this.onFocusAction, false, this );\n\n\t\tconst actions = data.actions || this.controller.getActions();\n\n\t\tif ( !Object.prototype.hasOwnProperty.call( data, 'inBeforeSave' ) ) {\n\t\t\tthrow new Error( 'inBeforeSave argument required' );\n\t\t}\n\t\tthis.inBeforeSave = data.inBeforeSave;\n\t\tthis.surface = data.surface;\n\t\tthis.updateFilter = data.updateFilter;\n\n\t\t// Reset currentOffset so that reusing the dialog multiple times in a\n\t\t// session won't produce unexpected behavior. (T404661)\n\t\tthis.currentOffset = null;\n\n\t\tthis.singleAction = this.inBeforeSave || OO.ui.isMobile();\n\n\t\tthis.closeButton.toggle( OO.ui.isMobile() );\n\t\tif ( data.footer !== undefined ) {\n\t\t\tthis.footer.toggle( data.footer );\n\t\t} else {\n\t\t\tthis.footer.toggle( this.singleAction );\n\t\t}\n\t\tthis.$element.toggleClass( 've-ui-editCheckDialog-singleAction', this.singleAction );\n\n\t\tthis.surface.context.hide();\n\n\t\tthis.showActions( actions, actions );\n\t\tif ( this.onPosition ) {\n\t\t\t// This currently only applies to SidebarEditCheckDialog but needs to be\n\t\t\t// called immediately so margin-top is set before the animation starts.\n\t\t\tthis.onPosition();\n\t\t}\n\t}, this );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.EditCheckDialog.prototype.getTeardownProcess = function ( data, process ) {\n\treturn process.next( () => {\n\t\tthis.controller.off( 'actionsUpdated', this.onActionsUpdated, this );\n\t\tthis.controller.off( 'focusAction', this.onFocusAction, this );\n\t\tthis.$actions.empty();\n\t}, this );\n};\n\n/**\n * HACK: Override #ready to prevent trying to focus $content\n *\n * @param {Object} data\n * @return {jQuery.Promise}\n */\nve.ui.EditCheckDialog.prototype.ready = function ( data ) {\n\treturn this.getReadyProcess( data ).execute().then( () => {\n\t\t// Force redraw by asking the browser to measure the elements' widths\n\t\tthis.$element.addClass( 'oo-ui-window-ready' ).width();\n\t\tthis.$content.addClass( 'oo-ui-window-content-ready' ).width();\n\t} );\n};\n\n/**\n * Handle 'act' events from the mw.widget.EditCheckActionWidget.\n *\n * @param {mw.editcheck.EditCheckAction} action Action\n * @param {mw.editcheck.EditCheckActionWidget} widget Action's widget\n * @param {jQuery.Promise} promise Promise which resolves when the action is complete\n */\nve.ui.EditCheckDialog.prototype.onAct = function ( action, widget, promise ) {\n\tthis.acting = true;\n\tthis.updateNavigationState();\n\tthis.updateSize();\n\tpromise.then( ( data ) => {\n\t\tif ( data && this.inBeforeSave ) {\n\t\t\t// If an action has been taken, we want to linger for a brief moment\n\t\t\t// to show the result of the action before moving away\n\t\t\t// TODO: This was written for AddReferenceEditCheck but should be\n\t\t\t// more generic\n\t\t\tconst pause = data.action !== 'reject' ? 500 : 0;\n\t\t\tsetTimeout( () => {\n\t\t\t\tconst rejected = [ 'reject', 'dismiss' ].includes( data.action );\n\t\t\t\tthis.controller.removeAction( 'onBeforeSave', action, rejected );\n\t\t\t}, pause );\n\t\t} else {\n\t\t\tthis.controller.refresh();\n\t\t}\n\t} ).always( () => {\n\t\tthis.acting = false;\n\t\tthis.updateNavigationState();\n\t} );\n};\n\n/**\n * Handle 'togglecollapse' events from the mw.widget.EditCheckActionWidget.\n *\n * @param {mw.editcheck.EditCheckAction} action Action being expanded/collapsed\n * @param {number} index Index of action in list\n */\nve.ui.EditCheckDialog.prototype.onToggleCollapse = function ( action ) {\n\tif ( action.widget.collapsed ) {\n\t\t// Expand\n\t\tthis.setCurrentOffset( this.currentActions.indexOf( action ), true );\n\t\tif ( !OO.ui.isMobile() ) {\n\t\t\tconst surfaceModel = this.surface.getModel();\n\t\t\tconst checkRange = action.getFocusSelection().getCoveringRange();\n\t\t\tconst surfaceRange = surfaceModel.getSelection().getCoveringRange();\n\t\t\t// Collapse and move the selection to the nearest part of the check range\n\t\t\t// Don't alter it if it touches the check range\n\t\t\tif ( surfaceRange === null || surfaceRange.end < checkRange.start ) {\n\t\t\t\tsurfaceModel.setLinearSelection( new ve.Range( checkRange.start ) );\n\t\t\t\tthis.surface.getView().activate();\n\t\t\t\tthis.surface.getView().focus();\n\t\t\t} else if ( surfaceRange.start > checkRange.end ) {\n\t\t\t\tsurfaceModel.setLinearSelection( new ve.Range( checkRange.end ) );\n\t\t\t\tthis.surface.getView().activate();\n\t\t\t\tthis.surface.getView().focus();\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.setCurrentOffset( null );\n\t}\n};\n\n/**\n * Handle click events from the close button.\n */\nve.ui.EditCheckDialog.prototype.onCloseButtonClick = function () {\n\t// eslint-disable-next-line no-jquery/no-class-state\n\tconst collapse = !this.$element.hasClass( 've-ui-editCheckDialog-collapsed' );\n\tthis.$element.toggleClass( 've-ui-editCheckDialog-collapsed', collapse );\n\tthis.closeButton.setIcon( collapse ? 'collapse' : 'expand' );\n};\n\n/**\n * Handle click events from the next button.\n */\nve.ui.EditCheckDialog.prototype.onNextButtonClick = function () {\n\tthis.setCurrentOffset( this.currentOffset === null ? 0 : this.currentOffset + 1, true );\n};\n\n/**\n * Handle click events from the previous button.\n */\nve.ui.EditCheckDialog.prototype.onPreviousButtonClick = function () {\n\tthis.setCurrentOffset( this.currentOffset === null ? this.currentActions.length - 1 : this.currentOffset - 1, true );\n};\n\n/* Command registration */\n\nve.ui.commandRegistry.register(\n\tnew ve.ui.Command(\n\t\t'editCheckDialogInProcessOpen', 'window', 'open', { args: [ 'editCheckDialog', { listener: 'onDocumentChange' } ] }\n\t)\n);\n\nve.ui.commandRegistry.register(\n\tnew ve.ui.Command(\n\t\t'editCheckDialogInProcessToggle', 'window', 'toggle', { args: [ 'editCheckDialog', { listener: 'onDocumentChange' } ] }\n\t)\n);\n\nve.ui.commandRegistry.register(\n\tnew ve.ui.Command(\n\t\t'editCheckDialogBeforeSave', 'window', 'toggle', { args: [ 'editCheckDialog', { listener: 'onBeforeSave' } ] }\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":"implicit-arrow-linebreak","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/editcheck/modules/dialogs/EditCheckDialogTool.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":"implicit-arrow-linebreak","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/editcheck/modules/dialogs/FixedEditCheckDialog.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":"implicit-arrow-linebreak","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/editcheck/modules/dialogs/GutterSidebarEditCheckDialog.js","messages":[{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":151,"column":5,"nodeType":"MemberExpression","messageId":"forbidden","endLine":151,"endColumn":26}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface GutterSidebarEditCheckDialog class.\n *\n * @copyright See AUTHORS.txt\n */\n\n/**\n * GutterSidebarEditCheckDialog constructor.\n *\n * The edit check dialog which is created when the user is on mobile. It adds a narrow gutter wide enough to show an\n * icon. When clicked, we create (or reuse) a ve.ui.FixedEditCheckDialog instance to show the check details.\n *\n * @class\n * @extends ve.ui.SidebarDialog\n * @constructor\n * @param {Object} config Configuration options\n */\nve.ui.GutterSidebarEditCheckDialog = function VeUiGutterSidebarEditCheckDialog( config ) {\n\t// Parent constructor\n\tve.ui.GutterSidebarEditCheckDialog.super.call( this, config );\n\n\tthis.$element.addClass( 've-ui-gutterSidebarEditCheckDialog' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.GutterSidebarEditCheckDialog, ve.ui.SidebarDialog );\n\n/* Static properties */\n\nve.ui.GutterSidebarEditCheckDialog.static.name = 'gutterSidebarEditCheckDialog';\n\nve.ui.GutterSidebarEditCheckDialog.static.size = 'gutter';\n\n// The gutter should never steal the focus, as it's intended to be a discreet notification\nve.ui.GutterSidebarEditCheckDialog.static.activeSurface = true;\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.GutterSidebarEditCheckDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.GutterSidebarEditCheckDialog.super.prototype.initialize.call( this );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.GutterSidebarEditCheckDialog.prototype.getSetupProcess = function ( data ) {\n\tconst process = this.constructor.super.prototype.getSetupProcess.call( this, data );\n\treturn process.first( () => {\n\t\tthis.controller = data.controller;\n\t\tif ( !Object.prototype.hasOwnProperty.call( data, 'inBeforeSave' ) ) {\n\t\t\tthrow new Error( 'inBeforeSave argument required' );\n\t\t}\n\t\tthis.inBeforeSave = data.inBeforeSave;\n\t\tthis.surface = data.controller.surface;\n\t\tthis.surface.getTarget().$element.addClass( 've-ui-editCheck-gutter-active' );\n\n\t\tthis.controller.on( 'actionsUpdated', this.onActionsUpdated, null, this );\n\t\tthis.controller.on( 'position', this.onPosition, null, this );\n\n\t\tthis.renderActions( data.actions || this.controller.getActions() );\n\t}, this );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.GutterSidebarEditCheckDialog.prototype.getTeardownProcess = function ( data ) {\n\t// Parent method\n\tconst process = ve.ui.GutterSidebarEditCheckDialog.super.prototype.getTeardownProcess.call( this, data );\n\treturn process.first( () => {\n\t\tthis.controller.disconnect( this );\n\n\t\tthis.widgets.forEach( ( widget ) => widget.teardown() );\n\t\tthis.widgets = [];\n\n\t\tthis.surface = null;\n\t\tthis.controller = null;\n\t}, this );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.GutterSidebarEditCheckDialog.prototype.onActionsUpdated = function ( listener, actions ) {\n\tif ( ( this.inBeforeSave && listener !== 'onBeforeSave' ) || ( !this.inBeforeSave && listener === 'onBeforeSave' ) ) {\n\t\treturn;\n\t}\n\tthis.renderActions( actions );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.GutterSidebarEditCheckDialog.prototype.onPosition = function () {\n\tthis.renderActions( this.controller.getActions() );\n};\n\n/**\n * Render the edit check actions as gutter icons, grouping overlapping actions.\n *\n * @param {mw.editcheck.EditCheckAction[]} actions List of actions to render\n */\nve.ui.GutterSidebarEditCheckDialog.prototype.renderActions = function ( actions ) {\n\tif ( actions.length === 0 ) {\n\t\tthis.close( 'complete' );\n\t\treturn;\n\t}\n\n\tconst surfaceView = this.surface.getView();\n\tconst sections = [];\n\n\t// First join overlapping actions into \"sections\"\n\tactions.forEach( ( action ) => {\n\t\tconst rects = action.getHighlightSelections().map( ( selection ) => {\n\t\t\tconst selectionView = ve.ce.Selection.static.newFromModel( selection, surfaceView );\n\t\t\treturn selectionView.getSelectionBoundingRect();\n\t\t} ).filter( ( rect ) => rect );\n\t\tconst boundingRect = ve.getBoundingRect( rects );\n\t\tif ( !boundingRect ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Look for any other section that the new one overlaps with\n\t\t// TODO: join when two other sections are joined by the new one?\n\t\tconst prev = sections.find( ( p ) => !( p.rect.bottom < boundingRect.top || boundingRect.bottom < p.rect.top ) );\n\t\tif ( prev ) {\n\t\t\t// overlap, so merge\n\t\t\tprev.actions.push( action );\n\t\t\t// top, bottom, left, right, width, height\n\t\t\tprev.rect.top = Math.min( prev.rect.top, boundingRect.top );\n\t\t\tprev.rect.bottom = Math.max( prev.rect.bottom, boundingRect.bottom );\n\t\t\tprev.rect.height = prev.rect.bottom - prev.rect.top;\n\t\t\treturn;\n\t\t}\n\t\tsections.push( { actions: [ action ], rect: boundingRect } );\n\t} );\n\n\t// Now try to reuse old widgets if possible, to avoid icons flickering\n\tconst oldWidgets = this.widgets || [];\n\tlet shown = false;\n\tthis.widgets = [];\n\tsections.forEach( ( section ) => {\n\t\tlet widget;\n\t\tconst index = oldWidgets.findIndex(\n\t\t\t( owidget ) => owidget.actions.length === section.actions.length &&\n\t\t\t\towidget.actions.every( ( oact ) => section.actions.includes( oact ) )\n\t\t);\n\t\tlet actionToShow;\n\t\tif ( index !== -1 ) {\n\t\t\twidget = oldWidgets.splice( index, 1 )[ 0 ];\n\t\t} else {\n\t\t\twidget = new mw.editcheck.EditCheckGutterSectionWidget( {\n\t\t\t\tactions: section.actions,\n\t\t\t\tcontroller: this.controller\n\t\t\t} );\n\t\t\tif ( !shown ) {\n\t\t\t\tactionToShow = section.actions.find( ( action ) => action.check.takesFocus() );\n\t\t\t}\n\t\t\tthis.$body.append( widget.$element );\n\t\t}\n\t\twidget.setPosition( section.rect );\n\t\tthis.widgets.push( widget );\n\t\tif ( actionToShow ) {\n\t\t\twidget.showDialogWithAction( actionToShow );\n\t\t\tshown = true;\n\t\t}\n\t} );\n\n\toldWidgets.forEach( ( widget ) => widget.teardown() );\n};\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.GutterSidebarEditCheckDialog );\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":"implicit-arrow-linebreak","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/editcheck/modules/dialogs/SidebarEditCheckDialog.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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/AddReferenceEditCheck.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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/AsyncTextCheck.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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/BaseEditCheck.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":148,"column":1,"nodeType":"Block","endLine":148,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":327,"column":3,"nodeType":"MemberExpression","messageId":"forbidden","endLine":327,"endColumn":19},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":432,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":432,"endColumn":29},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":536,"column":24,"nodeType":"MemberExpression","messageId":"forbidden","endLine":536,"endColumn":38}],"suppressedMessages":[],"errorCount":3,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * BaseEditCheck\n *\n * Abstract base class for edit checks. Provides common configuration, tagging,\n * and utility methods for subclasses implementing specific edit check logic.\n *\n * Subclasses should implement event handler methods such as onBeforeSave and onDocumentChange.\n *\n * @class\n * @abstract\n * @param {mw.editcheck.Controller} controller Edit check controller\n * @param {Object} [config] Configuration options\n * @param {boolean} [includeSuggestions=false]\n */\nmw.editcheck.BaseEditCheck = function MWBaseEditCheck( controller, config, includeSuggestions ) {\n\tthis.controller = controller;\n\tthis.config = ve.extendObject( {}, this.constructor.static.defaultConfig, config );\n\tthis.includeSuggestions = includeSuggestions;\n};\n\n/* Inheritance */\n\nOO.initClass( mw.editcheck.BaseEditCheck );\n\n/* Static properties */\n\nmw.editcheck.BaseEditCheck.static.onlyCoveredNodes = false;\n\nmw.editcheck.BaseEditCheck.static.choices = [\n\t{\n\t\taction: 'accept',\n\t\tlabel: OO.ui.deferMsg( 'editcheck-dialog-action-yes' ),\n\t\ticon: 'check'\n\t},\n\t{\n\t\taction: 'reject',\n\t\tlabel: OO.ui.deferMsg( 'editcheck-dialog-action-no' ),\n\t\ticon: 'close'\n\t}\n];\n\nmw.editcheck.BaseEditCheck.static.defaultConfig = {\n\tenabled: true,\n\taccount: false, // 'loggedin', 'loggedout', anything non-truthy means allow either\n\tmaximumEditcount: 100,\n\tignoreSections: [],\n\tignoreLeadSection: false\n};\n\nmw.editcheck.BaseEditCheck.static.title = OO.ui.deferMsg( 'editcheck-review-title' );\n\nmw.editcheck.BaseEditCheck.static.description = OO.ui.deferMsg( 'editcheck-dialog-addref-description' );\n\nmw.editcheck.BaseEditCheck.static.canBeStale = false;\n\n/**\n * Takes focus from the surface to show the check as soon as it is detected (on mobile)\n *\n * On desktop the check cards are always visible so\n * this config does nothing.\n *\n * @type {boolean}\n */\nmw.editcheck.BaseEditCheck.static.takesFocus = false;\n\n/* Static methods */\n\n/**\n * Find out if any conditions in the provided config are met\n *\n * @param {Object} [config] Configuration options\n * @return {boolean} Whether the config matches\n */\nmw.editcheck.BaseEditCheck.static.doesConfigMatch = function ( config ) {\n\tif ( !config.enabled ) {\n\t\treturn false;\n\t}\n\t// account status:\n\t// loggedin, loggedout, or any-other-value meaning 'both'\n\t// we'll count temporary users as \"logged out\" by using isNamed here\n\tif ( config.account === 'loggedout' && mw.user.isNamed() ) {\n\t\treturn false;\n\t}\n\tif ( config.account === 'loggedin' && !mw.user.isNamed() ) {\n\t\treturn false;\n\t}\n\t// some checks are only shown for newer users\n\tif ( config.maximumEditcount && mw.config.get( 'wgUserEditCount', 0 ) > config.maximumEditcount ) {\n\t\treturn false;\n\t}\n\treturn true;\n};\n\n/* Methods */\n\n/**\n * Get the name of the check type\n *\n * @return {string} Check type name\n */\nmw.editcheck.BaseEditCheck.prototype.getName = function () {\n\treturn this.constructor.static.name;\n};\n\n/**\n * Check if the edit check can be stale\n *\n * @return {boolean}\n */\nmw.editcheck.BaseEditCheck.prototype.canBeStale = function () {\n\treturn this.constructor.static.canBeStale;\n};\n\n/**\n * Get actions to show before save\n *\n * @abstract\n * @param {ve.dm.Surface} surfaceModel\n * @return {mw.editcheck.EditCheckAction[]|void}\n */\nmw.editcheck.BaseEditCheck.prototype.onBeforeSave = null;\n\n/**\n * Get actions to show when document changed\n *\n * @abstract\n * @param {ve.dm.Surface} surfaceModel\n * @return {mw.editcheck.EditCheckAction[]|void}\n */\nmw.editcheck.BaseEditCheck.prototype.onDocumentChange = null;\n\n/**\n * Get actions to show when the focused branch node changed\n *\n * @abstract\n * @param {ve.dm.Surface} surfaceModel\n * @return {mw.editcheck.EditCheckAction[]|void}\n */\nmw.editcheck.BaseEditCheck.prototype.onBranchNodeChange = null;\n\n/**\n * User performs an action on an check\n *\n * @abstract\n * @param {string} choice `action` key from static.choices\n * @param {mw.editcheck.EditCheckAction} action\n * @param {ve.ui.Surface} surface\n * @return {jQuery.Promise} Promise which resolves when action is complete\n */\nmw.editcheck.BaseEditCheck.prototype.act = null;\n\n/**\n * Get the title of the check\n *\n * @param {mw.editcheck.EditCheckAction} action\n * @return {jQuery|string|Function|OO.ui.HtmlSnippet}\n */\nmw.editcheck.BaseEditCheck.prototype.getTitle = function () {\n\treturn this.constructor.static.title;\n};\n\n/**\n * Get the prompt for the check's actions, if any\n *\n * @param {mw.editcheck.EditCheckAction} action\n * @return {jQuery|string|Function|OO.ui.HtmlSnippet|undefined}\n */\nmw.editcheck.BaseEditCheck.prototype.getPrompt = function () {\n\treturn this.constructor.static.prompt || undefined;\n};\n\n/**\n * Get the footer of the check, if any\n *\n * @param {mw.editcheck.EditCheckAction} action\n * @return {jQuery|string|Function|OO.ui.HtmlSnippet|undefined}\n */\nmw.editcheck.BaseEditCheck.prototype.getFooter = function () {\n\treturn this.constructor.static.footer || undefined;\n};\n\n/**\n * @param {mw.editcheck.EditCheckAction} action\n * @return {string}\n */\nmw.editcheck.BaseEditCheck.prototype.getDescription = function () {\n\treturn this.constructor.static.description;\n};\n\n/**\n * @return {boolean}\n */\nmw.editcheck.BaseEditCheck.prototype.takesFocus = function () {\n\treturn this.constructor.static.takesFocus;\n};\n\n/**\n * Find out whether the check should be applied\n *\n * This is a general check for its applicability to the viewer / page, rather\n * than a specific check based on the current edit. It's used to filter out\n * checks before any maybe-expensive content analysis happens.\n *\n * @return {boolean} Whether the check should be shown\n */\nmw.editcheck.BaseEditCheck.prototype.canBeShown = function () {\n\t// all checks are only in the main namespace for now\n\tif ( mw.config.get( 'wgNamespaceNumber' ) !== mw.config.get( 'wgNamespaceIds' )[ '' ] ) {\n\t\treturn false;\n\t}\n\t// some checks are configured to only be for logged in / out users\n\tif ( mw.editcheck.forceEnable ) {\n\t\treturn true;\n\t}\n\tif ( !this.constructor.static.doesConfigMatch( this.config ) ) {\n\t\treturn false;\n\t}\n\treturn true;\n};\n\n/**\n * Get content ranges where at least the minimum about of text has been changed\n *\n * @param {ve.dm.Document} documentModel\n * @return {ve.Range[]}\n */\nmw.editcheck.BaseEditCheck.prototype.getModifiedContentRanges = function ( documentModel ) {\n\treturn this.getModifiedRanges( documentModel, this.constructor.static.onlyCoveredNodes, true );\n};\n\n/**\n * Get content ranges where at least the minimum about of text has been added\n *\n * @param {ve.dm.Document} documentModel\n * @return {ve.Range[]}\n */\nmw.editcheck.BaseEditCheck.prototype.getAddedContentRanges = function ( documentModel ) {\n\treturn this.getAddedRanges( documentModel, this.constructor.static.onlyCoveredNodes, true );\n};\n\n/**\n * Get ContentBranchNodes where some text has been changed\n *\n * @param {ve.dm.Document} documentModel\n * @return {ve.dm.ContentBranchNode[]}\n */\nmw.editcheck.BaseEditCheck.prototype.getModifiedContentBranchNodes = function ( documentModel ) {\n\tconst modified = new Set();\n\tthis.getModifiedRanges( documentModel, false, true ).forEach( ( range ) => {\n\t\tif ( !range.isCollapsed() ) {\n\t\t\tmodified.add( documentModel.getBranchNodeFromOffset( range.start ) );\n\t\t}\n\t} );\n\treturn Array.from( modified );\n};\n\n/**\n * Find nodes that were added during the edit session\n *\n * @param {ve.dm.Document} documentModel\n * @param {string} [type] Type of nodes to find, or all nodes if false\n * @return {ve.dm.Node[]}\n */\nmw.editcheck.BaseEditCheck.prototype.getAddedNodes = function ( documentModel, type ) {\n\tconst matchedNodes = [];\n\tif ( this.includeSuggestions ) {\n\t\tif ( type ) {\n\t\t\treturn documentModel.getNodesByType( type, true );\n\t\t}\n\t\treturn documentModel.selectNodes( documentModel.getDocumentRange(), 'covered' )\n\t\t\t.map( ( node ) => node.node );\n\t}\n\tthis.getModifiedRanges( documentModel ).forEach( ( range ) => {\n\t\tconst nodes = documentModel.selectNodes( range, 'covered' );\n\t\tnodes.forEach( ( node ) => {\n\t\t\tif ( !type || node.node.getType() === type ) {\n\t\t\t\tmatchedNodes.push( node.node );\n\t\t\t}\n\t\t} );\n\t} );\n\treturn matchedNodes;\n};\n\n/**\n * Get content ranges which have been inserted\n *\n * @param {ve.dm.Document} documentModel\n * @param {boolean} coveredNodesOnly Only include ranges which cover the whole of their node\n * @param {boolean} onlyContentRanges Only return ranges which are content branch node interiors\n * @return {ve.Range[]}\n */\nmw.editcheck.BaseEditCheck.prototype.getAddedRanges = function ( documentModel, coveredNodesOnly, onlyContentRanges ) {\n\treturn this.getModifiedRanges( documentModel, coveredNodesOnly, onlyContentRanges, true );\n};\n\n/**\n * Get content ranges which have been modified\n *\n * @param {ve.dm.Document} documentModel\n * @param {boolean} coveredNodesOnly Only include ranges which cover the whole of their node\n * @param {boolean} onlyContentRanges Only return ranges which are content branch node interiors\n * @param {boolean} onlyPureInsertions Only return ranges which didn't replace any other content\n * @return {ve.Range[]}\n */\nmw.editcheck.BaseEditCheck.prototype.getModifiedRanges = function ( documentModel, coveredNodesOnly, onlyContentRanges, onlyPureInsertions ) {\n\tif ( !documentModel.completeHistory.getLength() ) {\n\t\treturn [];\n\t}\n\tlet candidates = [];\n\tif ( this.includeSuggestions ) {\n\t\tcandidates = documentModel.getDocumentNode().getChildren()\n\t\t\t.filter( ( branchNode ) => !( branchNode instanceof ve.dm.InternalListNode ) )\n\t\t\t.map( ( branchNode ) => branchNode.getRange() );\n\t} else {\n\t\tlet operations;\n\t\ttry {\n\t\t\toperations = documentModel.completeHistory.squash().transactions[ 0 ].operations;\n\t\t} catch ( err ) {\n\t\t\t// TransactionSquasher can sometimes throw errors; until T333710 is\n\t\t\t// fixed just count this as not needing a reference.\n\t\t\tmw.errorLogger.logError( err, 'error.visualeditor' );\n\t\t\treturn [];\n\t\t}\n\n\t\tlet offset = 0;\n\t\tconst endOffset = documentModel.getDocumentRange().end;\n\t\toperations.every( ( op ) => {\n\t\t\tif ( op.type === 'retain' ) {\n\t\t\t\toffset += op.length;\n\t\t\t} else if ( op.type === 'replace' ) {\n\t\t\t\tconst insertedRange = new ve.Range( offset, offset + op.insert.length );\n\t\t\t\toffset += op.insert.length;\n\t\t\t\t// 1. Only trigger if the check is a pure insertion with no\n\t\t\t\t// adjacent content removed (T340088), or if we're allowing\n\t\t\t\t// non-pure insertions. Either way, a pure removal won't be included.\n\t\t\t\tif ( ( !onlyPureInsertions && op.insert.length > 0 ) || op.remove.length === 0 ) {\n\t\t\t\t\tcandidates.push( insertedRange );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Reached the end of the doc / start of internal list, stop searching\n\t\t\treturn offset < endOffset;\n\t\t} );\n\t}\n\tconst ranges = [];\n\tcandidates.forEach( ( range ) => {\n\t\tif ( onlyContentRanges ) {\n\t\t\tve.batchPush(\n\t\t\t\tranges,\n\t\t\t\t// 2. Only fully inserted paragraphs (ranges that cover the whole node) (T345121)\n\t\t\t\tthis.getContentRangesFromRange( documentModel, range, coveredNodesOnly )\n\t\t\t);\n\t\t} else {\n\t\t\tranges.push( range );\n\t\t}\n\t} );\n\treturn ranges.filter( ( range ) => this.isRangeValid( range, documentModel ) );\n};\n\n/**\n * Return the content ranges (content branch node interiors) contained within a range\n *\n * For a content branch node entirely contained within the range, its entire interior\n * range will be included. For a content branch node overlapping with the range boundary,\n * only the covered part of its interior range will be included.\n *\n * @param {ve.dm.Document} documentModel The documentModel to search\n * @param {ve.Range} range The range to include\n * @param {boolean} covers Only include ranges which cover the whole of their node\n * @return {ve.Range[]} The contained content ranges (content branch node interiors)\n */\nmw.editcheck.BaseEditCheck.prototype.getContentRangesFromRange = function ( documentModel, range, covers ) {\n\tconst ranges = [];\n\tdocumentModel.selectNodes( range, 'branches' ).forEach( ( spec ) => {\n\t\tif (\n\t\t\tspec.node.canContainContent() && (\n\t\t\t\t!covers || (\n\t\t\t\t\t!spec.range || // an empty range means the node is covered\n\t\t\t\t\tspec.range.equalsSelection( spec.nodeRange )\n\t\t\t\t)\n\t\t\t)\n\t\t) {\n\t\t\tranges.push( spec.range || spec.nodeRange );\n\t\t}\n\t} );\n\treturn ranges;\n};\n\n/**\n * Test whether the range is valid for the check to apply\n *\n * @param {ve.Range} range\n * @param {ve.dm.Document} documentModel\n * @return {boolean}\n */\nmw.editcheck.BaseEditCheck.prototype.isRangeValid = function ( range, documentModel ) {\n\treturn this.isRangeInValidSection( range, documentModel );\n};\n\n/**\n * Check if a modified range is a section we don't ignore (config.ignoreSections)\n *\n * @param {ve.Range} range\n * @param {ve.dm.Document} documentModel\n * @return {boolean} Whether the range is in a section we don't ignore\n */\nmw.editcheck.BaseEditCheck.prototype.isRangeInValidSection = function ( range, documentModel ) {\n\tconst ignoreSections = this.config.ignoreSections || [];\n\tif ( ignoreSections.length === 0 && !this.config.ignoreLeadSection ) {\n\t\t// Nothing is forbidden, so everything is permitted\n\t\treturn true;\n\t}\n\tconst isHeading = ( nodeType ) => nodeType === 'mwHeading';\n\t// Note: we set a limit of 1 here because otherwise this will turn around\n\t// to keep looking when it hits the document boundary:\n\tconst heading = documentModel.getNearestNodeMatching( isHeading, range.start, -1, 1 );\n\tif ( !heading ) {\n\t\t// There's no preceding heading, so work out if we count as being in a\n\t\t// lead section. It's only a lead section if there's more headings\n\t\t// later in the document, otherwise it's just a stub article.\n\t\treturn !(\n\t\t\tthis.config.ignoreLeadSection &&\n\t\t\t!!documentModel.getNearestNodeMatching( isHeading, range.start, 1 )\n\t\t);\n\t}\n\tif ( ignoreSections.length === 0 ) {\n\t\t// There's nothing left to deny\n\t\treturn true;\n\t}\n\tconst compare = new Intl.Collator( documentModel.getLang(), { sensitivity: 'accent' } ).compare;\n\tconst headingText = documentModel.data.getText( false, heading.getRange() );\n\t// If the heading text matches any of ignoreSections, return false.\n\treturn !ignoreSections.some( ( section ) => compare( headingText, section ) === 0 );\n};\n\n/**\n * Dismiss a check action\n *\n * @param {mw.editCheck.EditCheckAction} action\n */\nmw.editcheck.BaseEditCheck.prototype.dismiss = function ( action ) {\n\tthis.tag( 'dismissed', action );\n};\n\n/**\n * Tag a check action\n *\n * TODO: This is asymmetrical. Do we want to split this into two functions, or\n * unify isTaggedRange/isTaggedId into one function?\n *\n * @param {string} tag\n * @param {mw.editCheck.EditCheckAction} action\n */\nmw.editcheck.BaseEditCheck.prototype.tag = function ( tag, action ) {\n\tconst name = action.getTagName();\n\tif ( action.id ) {\n\t\tconst taggedIds = this.controller.taggedIds;\n\t\ttaggedIds[ name ] = taggedIds[ name ] || {};\n\t\ttaggedIds[ name ][ tag ] = taggedIds[ name ][ tag ] || new Set();\n\t\ttaggedIds[ name ][ tag ].add( action.id );\n\t} else {\n\t\tconst taggedFragments = this.controller.taggedFragments;\n\t\ttaggedFragments[ name ] = taggedFragments[ name ] || {};\n\t\ttaggedFragments[ name ][ tag ] = taggedFragments[ name ][ tag ] || [];\n\t\ttaggedFragments[ name ][ tag ].push(\n\t\t\t// Exclude insertions so we don't accidentally block unrelated changes:\n\t\t\t...action.fragments.map( ( fragment ) => fragment.clone().setExcludeInsertions( true ) )\n\t\t);\n\t}\n};\n\n/**\n * Untag a check action\n *\n * TODO: This is asymmetrical. Do we want to split this into two functions, or\n * unify isTaggedRange/isTaggedId into one function?\n *\n * @param {string} tag\n * @param {mw.editCheck.EditCheckAction} action\n * @return {boolean} Whether anything was untagged\n */\nmw.editcheck.BaseEditCheck.prototype.untag = function ( tag, action ) {\n\tconst name = action.getTagName();\n\tif ( action.id ) {\n\t\tconst taggedIds = this.controller.taggedIds;\n\t\tif ( taggedIds[ name ] && taggedIds[ name ][ tag ] ) {\n\t\t\ttaggedIds[ name ][ tag ].delete( action.id );\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\tconst taggedFragments = this.controller.taggedFragments;\n\t\tif ( taggedFragments[ name ] && taggedFragments[ name ][ tag ] ) {\n\t\t\taction.fragments.forEach( ( fragment ) => {\n\t\t\t\tconst selection = fragment.getSelection();\n\t\t\t\tconst index = taggedFragments[ name ][ tag ].findIndex(\n\t\t\t\t\t( taggedFragment ) => taggedFragment.getSelection().equals( selection )\n\t\t\t\t);\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\ttaggedFragments[ name ][ tag ].splice( index, 1 );\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\treturn false;\n};\n\n/**\n * Check if this type of check has been dismissed covering a specific range\n *\n * @param {ve.Range} range\n * @param {string} name of the tag\n * @return {boolean}\n */\nmw.editcheck.BaseEditCheck.prototype.isDismissedRange = function ( range, name ) {\n\treturn this.isTaggedRange( 'dismissed', range, name );\n};\n\n/**\n * Check if this type of check has a given tag\n *\n * @param {string} tag\n * @param {ve.Range} range\n * @param {string} name of the tag\n * @return {boolean}\n */\nmw.editcheck.BaseEditCheck.prototype.isTaggedRange = function ( tag, range, name ) {\n\tif ( !name ) {\n\t\tname = this.constructor.static.name;\n\t}\n\tconst tags = this.controller.taggedFragments[ name ];\n\tif ( tags === undefined ) {\n\t\treturn false;\n\t}\n\n\tconst fragments = tags[ tag ];\n\treturn !!fragments && fragments.some(\n\t\t( fragment ) => fragment.getSelection().getCoveringRange().containsRange( range )\n\t);\n};\n\n/**\n * Check if an action with a given ID has been dismissed\n *\n * @param {string} id\n * @return {boolean}\n */\nmw.editcheck.BaseEditCheck.prototype.isDismissedId = function ( id ) {\n\treturn this.isTaggedId( 'dismissed', id );\n};\n\n/**\n * Check if an action with a given ID has a given tag\n *\n * @param {string} tag\n * @param {string} id\n * @return {boolean}\n */\nmw.editcheck.BaseEditCheck.prototype.isTaggedId = function ( tag, id ) {\n\tconst tags = this.controller.taggedIds[ this.constructor.static.name ];\n\tif ( tags === undefined ) {\n\t\treturn false;\n\t}\n\tconst ids = tags[ tag ];\n\treturn !!ids && ids.has( id );\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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/PasteCheck.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":55,"column":13,"nodeType":"CallExpression","endLine":55,"endColumn":129,"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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/ToneCheck.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'modified_text' is not in camel case.","line":68,"column":6,"nodeType":"Identifier","messageId":"notCamelCase","endLine":68,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'page_title' is not in camel case.","line":69,"column":6,"nodeType":"Identifier","messageId":"notCamelCase","endLine":69,"endColumn":16,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'original_text' is not in camel case.","line":70,"column":6,"nodeType":"Identifier","messageId":"notCamelCase","endLine":70,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'check_type' is not in camel case.","line":71,"column":6,"nodeType":"Identifier","messageId":"notCamelCase","endLine":71,"endColumn":16,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":122,"column":12,"nodeType":"CallExpression","endLine":122,"endColumn":122,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":127,"column":11,"nodeType":"CallExpression","endLine":127,"endColumn":111,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-when","severity":2,"message":"Prefer Promise.all to $.when","line":230,"column":10,"nodeType":"CallExpression","endLine":230,"endColumn":56,"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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/experimental/ConvertReferenceEditCheck.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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/experimental/DisambiguationEditCheck.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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/experimental/ExternalLinksEditCheck.js","messages":[{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":41,"column":4,"nodeType":"MemberExpression","messageId":"forbidden","endLine":41,"endColumn":17}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"mw.editcheck.ExternalLinksEditCheck = function MWExternalLinksEditCheck() {\n\t// Parent constructor\n\tmw.editcheck.ExternalLinksEditCheck.super.apply( this, arguments );\n};\n\nOO.inheritClass( mw.editcheck.ExternalLinksEditCheck, mw.editcheck.BaseEditCheck );\n\nmw.editcheck.ExternalLinksEditCheck.static.title = 'External link';\n\nmw.editcheck.ExternalLinksEditCheck.static.name = 'externalLink';\n\nmw.editcheck.ExternalLinksEditCheck.static.description = 'Generally, external links should not appear in the body of the article. Please refer to WP:ELNO. Edit this link?';\n\nmw.editcheck.ExternalLinksEditCheck.static.defaultConfig = ve.extendObject( {}, mw.editcheck.BaseEditCheck.static.defaultConfig, {\n\tignoreSections: [\n\t\t'External links',\n\t\t'References',\n\t\t'Further reading'\n\t]\n} );\n\nmw.editcheck.ExternalLinksEditCheck.static.choices = [\n\t{\n\t\taction: 'edit',\n\t\tlabel: 'Edit link',\n\t\ticon: 'edit'\n\t},\n\t{\n\t\taction: 'dismiss',\n\t\tlabel: OO.ui.deferMsg( 'editcheck-dialog-action-no' ),\n\t\ticon: 'check'\n\t}\n];\n\nmw.editcheck.ExternalLinksEditCheck.prototype.onDocumentChange = function ( surfaceModel ) {\n\tconst modified = this.getModifiedContentRanges( surfaceModel.getDocument() );\n\treturn surfaceModel.documentModel.documentNode.getAnnotationRanges()\n\t\t.filter( ( annRange ) => annRange.annotation instanceof ve.dm.MWExternalLinkAnnotation &&\n\t\t\t!this.isDismissedRange( annRange.range ) &&\n\t\t\tthis.isRangeInValidSection( annRange.range, surfaceModel.documentModel ) &&\n\t\t\tmodified.some( ( modifiedRange ) => modifiedRange.containsRange( annRange.range ) )\n\t\t).map( ( annRange ) => new mw.editcheck.EditCheckAction( {\n\t\t\tfragments: [ surfaceModel.getLinearFragment( annRange.range ) ],\n\t\t\tcheck: this\n\t\t} ) );\n};\n\nmw.editcheck.ExternalLinksEditCheck.prototype.act = function ( choice, action, surface ) {\n\tswitch ( choice ) {\n\t\tcase 'dismiss':\n\t\t\tthis.dismiss( action );\n\t\t\tbreak;\n\t\tcase 'edit':\n\t\t\tsetTimeout( () => {\n\t\t\t\taction.fragments[ 0 ].select();\n\t\t\t\tsurface.execute( 'window', 'open', 'link' );\n\t\t\t} );\n\t\t\tbreak;\n\t}\n};\n\nmw.editcheck.editCheckFactory.register( mw.editcheck.ExternalLinksEditCheck );\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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/experimental/ImageCaptionCheck.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":"implicit-arrow-linebreak","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/editcheck/modules/editchecks/experimental/TextMatchEditCheck.js","messages":[{"ruleId":"es-x/no-iterator-prototype-reduce","severity":2,"message":"ES2025 'Iterator.prototype.reduce' method is forbidden.","line":101,"column":12,"nodeType":"MemberExpression","messageId":"forbidden","endLine":103,"endColumn":13},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":118,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":118,"endColumn":23},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":144,"column":25,"nodeType":"MemberExpression","messageId":"forbidden","endLine":144,"endColumn":61},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":252,"column":1,"nodeType":"Block","endLine":252,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":274,"column":9,"nodeType":"MemberExpression","messageId":"forbidden","endLine":274,"endColumn":29},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":276,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":276,"endColumn":30},{"ruleId":"jsdoc/check-param-names","severity":1,"message":"Expected @param names to be \"item, id, collator\". Got \"matchItem, item, id, collator\".","line":308,"column":1,"nodeType":"Block","endLine":308,"endColumn":1},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"item\" type.","line":309,"column":1,"nodeType":"Block","endLine":309,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Collator' is undefined.","line":311,"column":1,"nodeType":"Block","endLine":311,"endColumn":1}],"suppressedMessages":[],"errorCount":5,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"mw.editcheck.TextMatchEditCheck = function MWTextMatchEditCheck() {\n\t// Parent constructor\n\tmw.editcheck.TextMatchEditCheck.super.apply( this, arguments );\n\n\tthis.lang = mw.config.get( 'wgContentLanguage' );\n\tthis.sensitivity = 'accent'; // TODO figure out how to determine this on an editcheck level\n\tthis.collator = new Intl.Collator( this.lang, { sensitivity: this.sensitivity } );\n\n\tconst rawMatchItems = Object.assign(\n\t\t{},\n\t\tthis.constructor.static.matchItems || {},\n\t\tthis.config.matchItems || {}\n\t);\n\tthis.matchItems = [];\n\t// Create matchItem instances\n\tObject.entries( rawMatchItems ).forEach( ( [ id, item ] ) => {\n\t\tthis.matchItems.push( new mw.editcheck.TextMatchItem( item, id, this.collator ) );\n\t} );\n\n\t// Initialize lookup maps\n\tthis.matchItemsSensitiveByTerm = {};\n\tthis.matchItemsInsensitiveByTerm = {};\n\n\tthis.matchItems.forEach( ( matchItem ) => {\n\t\tconst targetMap = matchItem.isCaseSensitive() ?\n\t\t\tthis.matchItemsSensitiveByTerm :\n\t\t\tthis.matchItemsInsensitiveByTerm;\n\n\t\tObject.keys( matchItem.query ).forEach( ( key ) => {\n\t\t\tif ( !targetMap[ key ] ) {\n\t\t\t\ttargetMap[ key ] = [];\n\t\t\t}\n\t\t\ttargetMap[ key ].push( matchItem );\n\t\t} );\n\t} );\n\n};\n\nOO.inheritClass( mw.editcheck.TextMatchEditCheck, mw.editcheck.BaseEditCheck );\n\nmw.editcheck.TextMatchEditCheck.static.name = 'textMatch';\n\n/**\n * The configs of TextMatchEditCheck take priority over individual matchItem configs.\n * So we make TextMatch’s defaults nonrestrictive,\n * and let the finer limitations be handled by individual matchItems.\n */\nmw.editcheck.TextMatchEditCheck.static.defaultConfig = ve.extendObject( {}, mw.editcheck.BaseEditCheck.static.defaultConfig, {\n\tmaximumEditcount: null\n} );\n\nmw.editcheck.TextMatchEditCheck.static.choices = [\n\t{\n\t\taction: 'dismiss',\n\t\tlabel: OO.ui.deferMsg( 'ooui-dialog-process-dismiss' ),\n\t\tmodes: [ '', 'info', 'replace', 'delete' ]\n\t},\n\t{\n\t\taction: 'accept',\n\t\tlabel: OO.ui.deferMsg( 'ooui-dialog-message-accept' ),\n\t\tmodes: [ 'replace' ]\n\t},\n\t{\n\t\taction: 'delete',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-contextitemwidget-label-remove' ),\n\t\tmodes: [ 'delete' ]\n\t}\n];\n\nmw.editcheck.TextMatchEditCheck.static.matchItems = [];\n\n/**\n * Given a term, find all the equivalent keys that exist in case-insensitive matchItem queries\n *\n * @param {string} term Term to find keys for\n * @return {string} Array of keys that match\n */\nmw.editcheck.TextMatchEditCheck.prototype.getMatchingKeys = function ( term ) {\n\tconst matches = Object.keys( this.matchItemsInsensitiveByTerm ).filter(\n\t\t( key ) => this.collator.compare( key, term ) === 0\n\t);\n\treturn matches;\n};\n\nmw.editcheck.TextMatchEditCheck.prototype.handleListener = function ( surfaceModel, listener ) {\n\tconst actions = [];\n\tconst document = surfaceModel.getDocument();\n\tconst modified = this.getModifiedContentRanges( document );\n\n\tconst matchConfigs = [\n\t\t{\n\t\t\tcaseSensitive: true,\n\t\t\tterms: Object.keys( this.matchItemsSensitiveByTerm ),\n\t\t\tlookup: ( term ) => this.matchItemsSensitiveByTerm[ term ] || [ ]\n\t\t},\n\t\t{\n\t\t\tcaseSensitive: false,\n\t\t\tterms: Object.keys( this.matchItemsInsensitiveByTerm ),\n\t\t\tlookup: ( term ) => {\n\t\t\t\tconst keys = this.getMatchingKeys( term );\n\t\t\t\treturn keys\n\t\t\t\t\t.map( ( key ) => this.matchItemsInsensitiveByTerm[ key ] || [] )\n\t\t\t\t\t.reduce( ( acc, arr ) => acc.concat( arr ), [] );\n\t\t\t}\n\t\t}\n\t];\n\n\tfor ( const { caseSensitive, terms, lookup } of matchConfigs ) {\n\t\tconst ranges = document.findText(\n\t\t\tnew Set( terms ),\n\t\t\t{\n\t\t\t\tcaseSensitiveString: caseSensitive,\n\t\t\t\twholeWord: true\n\t\t\t}\n\t\t);\n\n\t\tfor ( const range of ranges ) {\n\t\t\tif ( !modified.some( ( modRange ) => range.touchesRange( modRange ) ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( !this.isRangeInValidSection( range, surfaceModel.documentModel ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst term = surfaceModel.getLinearFragment( range ).getText();\n\n\t\t\tconst relevantMatchItems = lookup( term );\n\t\t\tif ( !relevantMatchItems ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor ( const matchItem of relevantMatchItems ) {\n\t\t\t\tconst name = this.getTagNameByMatchItem( matchItem, term );\n\t\t\t\tif ( this.isDismissedRange( range, name ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( matchItem.listener && matchItem.listener !== listener ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( !this.constructor.static.doesConfigMatch( matchItem.config ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet fragment = surfaceModel.getLinearFragment( range );\n\t\t\t\tfragment = matchItem.getExpandedFragment( fragment );\n\t\t\t\tconst isValidMode = this.constructor.static.choices.some(\n\t\t\t\t\t( choice ) => choice.modes.includes( matchItem.mode )\n\t\t\t\t);\n\t\t\t\tconst mode = isValidMode ? matchItem.mode : '';\n\t\t\t\tactions.push(\n\t\t\t\t\tnew mw.editcheck.TextMatchEditCheckAction( {\n\t\t\t\t\t\tfragments: [ fragment ],\n\t\t\t\t\t\ttitle: matchItem.title,\n\t\t\t\t\t\tmessage: matchItem.message,\n\t\t\t\t\t\tcheck: this,\n\t\t\t\t\t\tmode: mode,\n\t\t\t\t\t\tmatchItem: matchItem,\n\t\t\t\t\t\tterm: term\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\treturn actions;\n};\n\nmw.editcheck.TextMatchEditCheck.prototype.onDocumentChange = function ( surfaceModel ) {\n\treturn this.handleListener( surfaceModel, 'onDocumentChange' );\n};\n\n/**\n * Get a unique tag name for a given matchItem-term pair.\n * Builds the tag name from:\n * - the name of this editcheck\n * - and the unique subtag of this matchitem-term pair\n *\n * @param {Object} matchItem\n * @param {string} term\n * @return {string} A tag name in the format 'textMatch-{subtag}'\n */\nmw.editcheck.TextMatchEditCheck.prototype.getTagNameByMatchItem = function ( matchItem, term ) {\n\treturn this.constructor.static.name + matchItem.getSubTag( term );\n};\n\n// For now it doesn't make sense to run a TextMatchEditCheck in review mode\n// as there isn't a way to edit the text.\nmw.editcheck.TextMatchEditCheck.prototype.onBeforeSave = null;\n\nmw.editcheck.TextMatchEditCheck.prototype.act = function ( choice, action /* , surface */ ) {\n\tswitch ( choice ) {\n\t\tcase 'dismiss':\n\t\t\tthis.dismiss( action );\n\t\t\tve.track( 'activity.editCheck-' + action.getName(),\n\t\t\t\t{ action: 'dismiss' } );\n\t\t\tbreak;\n\t\tcase 'delete':\n\t\t\taction.fragments[ 0 ].removeContent();\n\t\t\tve.track( 'activity.editCheck-' + action.getName(),\n\t\t\t\t{ action: 'delete' } );\n\t\t\tbreak;\n\t\tcase 'accept': {\n\t\t\tve.track( 'activity.editCheck-' + action.getName(),\n\t\t\t\t{ action: 'accept' } );\n\t\t\tconst fragment = action.fragments[ 0 ];\n\t\t\tconst oldWord = fragment.getText();\n\t\t\tconst matchItem = action.matchItem;\n\t\t\tif ( !matchItem ) {\n\t\t\t\tve.log( `mw.editcheck.TextMatchEditCheck.prototype.act(): did not find matchItem for ${ oldWord }` );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst newWord = matchItem.getReplacement( oldWord );\n\t\t\t// TODO match case of old word\n\t\t\tif ( !newWord ) {\n\t\t\t\tve.log( `mw.editcheck.TextMatchEditCheck.prototype.act(): did not find replacement for ${ oldWord }` );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfragment.removeContent().insertContent( newWord );\n\t\t}\n\n\t}\n\treturn ve.createDeferred().resolve( {} );\n};\n\nmw.editcheck.editCheckFactory.register( mw.editcheck.TextMatchEditCheck );\n\n/**\n * TextMatchEditCheckAction\n *\n * Subclass of EditCheckAction to include information\n * about the matchItem associated with this action\n *\n * @class\n *\n * @param {Object} config Configuration options\n * @param {Object} config.matchItem the associated matchItem for this action\n * @param {string} config.term term that prompted the action\n */\nmw.editcheck.TextMatchEditCheckAction = function MWTextMatchEditCheckAction( config ) {\n\tmw.editcheck.TextMatchEditCheckAction.super.call( this, config );\n\tthis.matchItem = config.matchItem;\n\tthis.term = config.term;\n};\n\n/* Inheritance */\n\nOO.inheritClass( mw.editcheck.TextMatchEditCheckAction, mw.editcheck.EditCheckAction );\n\n/* Events */\n\n/**\n * Fired when the user selects an action (e.g., clicks a suggestion button).\n *\n * @event mw.editcheck.EditCheckAction#act\n * @param {jQuery.Promise} promise A promise that resolves when the action is complete\n */\n\n/* Methods */\n\n/**\n * Compare to another action\n *\n * @param {mw.editcheck.EditCheckAction} other Other action\n * @return {boolean}\n */\nmw.editcheck.TextMatchEditCheckAction.prototype.equals = function ( other ) {\n\tif ( !( other instanceof mw.editcheck.TextMatchEditCheckAction ) ||\n\t\tthis.check.constructor !== other.check.constructor ) {\n\t\treturn false;\n\t}\n\tif ( this.matchItem !== other.matchItem ) {\n\t\treturn false;\n\t}\n\tif ( this.fragments.length !== other.fragments.length ) {\n\t\treturn false;\n\t}\n\treturn this.fragments.every( ( fragment ) => {\n\t\tconst selection = fragment.getSelection();\n\t\treturn other.fragments.some( ( otherFragment ) => otherFragment.getSelection().equals( selection ) );\n\t} );\n};\n\n/**\n * Get unique tag name for this action\n *\n * @return {string} unique tag\n */\nmw.editcheck.TextMatchEditCheckAction.prototype.getTagName = function () {\n\tif ( !this.matchItem ) {\n\t\treturn this.check.getName();\n\t}\n\treturn this.check.getTagNameByMatchItem( this.matchItem, this.term );\n};\n\n/**\n * Get the name of the check type\n *\n * @return {string} Check type name\n */\nmw.editcheck.TextMatchEditCheckAction.prototype.getName = function () {\n\treturn this.check.getName() + '-' + this.matchItem.id;\n};\n\n/**\n * TextMatchItem\n *\n * Class to represent a single matchItem for TextMatchEditCheck\n *\n * @class\n *\n * @param {Object} matchItem\n * @param item\n * @param {string} id of matchitem in config\n * @param {Collator} collator to use for comparisons\n */\nmw.editcheck.TextMatchItem = function MWTextMatchItem( item, id, collator ) {\n\tthis.title = item.title;\n\tthis.mode = item.mode || '';\n\tthis.message = item.message;\n\tthis.config = ve.extendObject( {}, this.constructor.static.defaultConfig, item.config );\n\tthis.expand = item.expand;\n\tthis.listener = item.listener || null;\n\n\tthis.id = id;\n\tthis.collator = collator;\n\n\t// Normalize queries to allow support for both objects and arrays\n\tthis.query = this.normalizeQuery( item.query );\n};\n\n/* Inheritance */\n\nOO.initClass( mw.editcheck.TextMatchItem );\n\n/* Static properties */\n\nmw.editcheck.TextMatchItem.static.defaultConfig = {\n\tenabled: true\n};\n\n/* Methods */\n\n/**\n * Transform any query type into a dictionary of terms and their replacements,\n * with a null replacement if none exists\n *\n * @param {Object.<string,string>|string[]|string} query\n * @return {Object.<string,string>} Dictionary of each term and its replacement\n */\nmw.editcheck.TextMatchItem.prototype.normalizeQuery = function ( query ) {\n\tif ( typeof query === 'string' ) {\n\t\tquery = [ query ];\n\t}\n\tif ( Array.isArray( query ) ) {\n\t\tconst normalized = Object.create( null );\n\t\tfor ( const word of query ) {\n\t\t\tnormalized[ word ] = null;\n\t\t}\n\t\treturn normalized;\n\t}\n\treturn query || Object.create( null );\n};\n\n/**\n * @return {boolean} if this matchItem is configured to be case sensitive\n */\nmw.editcheck.TextMatchItem.prototype.isCaseSensitive = function () {\n\treturn this.config && this.config.caseSensitive;\n};\n\n/**\n * Return the corresponding replacement word,\n * as defined for the given word in this matchItem's query\n *\n * @param {string} term to get replacement for\n * @return {string} replacement term\n */\nmw.editcheck.TextMatchItem.prototype.getReplacement = function ( term ) {\n\tif ( this.isCaseSensitive() ) {\n\t\treturn this.query[ term ];\n\t}\n\tconst key = Object.keys( this.query ).find(\n\t\t( k ) => this.collator.compare( k, term ) === 0\n\t);\n\treturn key ? this.query[ key ] : null;\n};\n\n/**\n * Expand a fragment given the match item's config\n *\n * @param {ve.dm.SurfaceFragment} fragment\n * @return {ve.dm.SurfaceFragment} Expanded fragment\n */\nmw.editcheck.TextMatchItem.prototype.getExpandedFragment = function ( fragment ) {\n\tswitch ( this.expand ) {\n\t\tcase 'sentence':\n\t\t\t// TODO: implement once unicodejs support is added\n\t\t\tbreak;\n\t\tcase 'paragraph':\n\t\t\tfragment = fragment.expandLinearSelection( 'closest', ve.dm.ContentBranchNode )\n\t\t\t\t// …but that covered the entire CBN, we only want the contents\n\t\t\t\t.adjustLinearSelection( 1, -1 );\n\t\t\tbreak;\n\t\tcase 'word':\n\t\tcase 'siblings':\n\t\tcase 'parent':\n\t\t\tfragment = fragment.expandLinearSelection( this.expand );\n\t\t\tbreak;\n\t}\n\treturn fragment;\n};\n\n/**\n * Get a unique subtag for this matchitem-term pair.\n * Builds the subtag from:\n * - the index of the matchItem when created\n * - and the index of the term in the list of keys from the matchItem's query\n *\n * @param {string} term\n * @return {string} A subtag in the format '-{matchIndex}-{termIndex}'\n */\nmw.editcheck.TextMatchItem.prototype.getSubTag = function ( term ) {\n\tconst queries = Object.keys( this.query );\n\tlet termIndex;\n\tif ( this.caseSensitive ) {\n\t\ttermIndex = queries.indexOf( term );\n\t} else {\n\t\ttermIndex = queries.findIndex( ( q ) => this.collator.compare( q, term ) === 0 );\n\t}\n\tif ( !this.id || termIndex === -1 ) {\n\t\treturn '';\n\t}\n\treturn `-${ this.id }-${ termIndex }`;\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":"implicit-arrow-linebreak","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/editcheck/modules/init.js","messages":[{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":102,"column":25,"nodeType":"MemberExpression","messageId":"forbidden","endLine":102,"endColumn":37}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*\n * `ecenable` query string:\n *   1: override user eligibility criteria for all checks\n *   2: also load experimental checks\n * Can also be a comma-separated series of flags:\n *   experimental: also load experimental checks\n *   suggestions: enable suggestions mode\n */\nlet ecenable = mw.libs.ve.initialUrl.searchParams.get( 'ecenable' );\nif ( window.MWVE_FORCE_EDIT_CHECK_ENABLED && ecenable !== '0' ) {\n\t// if edit check isn't forcibly disabled, override from this global\n\tecenable = window.MWVE_FORCE_EDIT_CHECK_ENABLED;\n}\nconst abCheck = mw.config.get( 'wgVisualEditorConfig' ).editCheckABTest;\nconst abGroup = mw.config.get( 'wgVisualEditorConfig' ).editCheckABTestGroup;\n\nmw.editcheck = {\n\tconfig: require( './config.json' ),\n\tforceEnable: !!ecenable,\n\texperimental: !!( mw.config.get( 'wgVisualEditorConfig' ).editCheckExperimental || ecenable === '2' ),\n\tchecksShown: {}\n};\n\nif ( ecenable && /^[\\w,]+$/.test( ecenable ) ) {\n\tconst ecenableFlags = ecenable.split( ',' );\n\tmw.editcheck.experimental = mw.editcheck.experimental || ecenableFlags.includes( 'experimental' );\n\tmw.editcheck.suggestions = mw.editcheck.suggestions || ecenableFlags.includes( 'suggestions' );\n}\n\n// Checks which are loaded for logging but shouldn't show by default yet\nconst nonDefaultChecks = new Set();\n\nrequire( './utils.js' );\nrequire( './EditCheckPreSaveToolbarTools.js' );\nrequire( './EditCheckFactory.js' );\nrequire( './EditCheckAction.js' );\nrequire( './EditCheckActionWidget.js' );\nrequire( './EditCheckGutterSectionWidget.js' );\nrequire( './dialogs/EditCheckDialog.js' );\nrequire( './dialogs/FixedEditCheckDialog.js' );\nrequire( './dialogs/SidebarEditCheckDialog.js' );\nrequire( './dialogs/GutterSidebarEditCheckDialog.js' );\nrequire( './editchecks/BaseEditCheck.js' );\nrequire( './editchecks/AsyncTextCheck.js' );\nrequire( './editchecks/AddReferenceEditCheck.js' );\nrequire( './editchecks/ToneCheck.js' );\nrequire( './editchecks/PasteCheck.js' );\n\nnonDefaultChecks.add( 'tone' );\n\nif ( mw.editcheck.experimental ) {\n\tmw.loader.using( 'ext.visualEditor.editCheck.experimental' );\n\tnonDefaultChecks.clear();\n}\nif ( abGroup === 'test' ) {\n\tnonDefaultChecks.delete( abCheck );\n} else if ( abGroup === 'control' ) {\n\t// This means that we can make any default check a/b testable\n\tnonDefaultChecks.add( abCheck );\n}\n\nfor ( const check of nonDefaultChecks ) {\n\tmw.editcheck.editCheckFactory.unregister( check );\n}\n\nif ( abCheck === 'paste' ) {\n\t// In the a/b test, force-enable/disable the check\n\tmw.editcheck.config.paste = ve.extendObject( mw.editcheck.config.paste || {}, { enabled: abGroup === 'test' } );\n}\n\nconst isMainNamespace = mw.config.get( 'wgNamespaceNumber' ) === mw.config.get( 'wgNamespaceIds' )[ '' ];\n\n// Helper functions for ve.init.mw.ArticleTarget save-tagging, keep logic\n// in-sync with AddReferenceEditCheck and ToneCheck.\n\n/**\n * Check if the document has content needing a reference, for AddReferenceEditCheck\n *\n * @param {ve.dm.Document} documentModel\n * @param {boolean} includeReferencedContent Include content that already contains a reference\n * @return {boolean}\n */\nmw.editcheck.hasAddedContentNeedingReference = function ( documentModel, includeReferencedContent ) {\n\t// Tag anything in the main namespace, regardless of other eligibility checks\n\tif ( !isMainNamespace ) {\n\t\treturn false;\n\t}\n\t// TODO: This should be factored out into a static method so we don't have to construct a dummy check\n\t// Check might not be registered so we can't use the factory.\n\tconst check = new mw.editcheck.AddReferenceEditCheck( null, mw.editcheck.editCheckFactory.buildConfig( 'addReference', { enabled: true } ) );\n\treturn check.findAddedContent( documentModel, includeReferencedContent ).length > 0;\n};\n\nmw.editcheck.hasFailingToneCheck = function ( surfaceModel ) {\n\t// Check might not be registered so we can't use the factory.\n\tconst check = new mw.editcheck.ToneCheck( null, mw.editcheck.editCheckFactory.buildConfig( 'tone', { enabled: true } ) );\n\t// Run actual check eligibility before calling API\n\tif ( !check.canBeShown() ) {\n\t\treturn ve.createDeferred().resolve( false ).promise();\n\t}\n\treturn Promise.all( check.handleListener( 'onCheckAll', surfaceModel ) )\n\t\t.then( ( results ) => results.some( ( result ) => result !== null ) );\n};\n\nif ( mw.config.get( 'wgVisualEditorConfig' ).editCheckTagging ) {\n\tmw.hook( 've.newTarget' ).add( ( target ) => {\n\t\tif ( target.constructor.static.name !== 'article' ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttarget.on( 'surfaceReady', () => {\n\t\t\tfunction getRefNodes() {\n\t\t\t\t// The firstNodes list is a numerically indexed array of reference nodes in the document.\n\t\t\t\t// The list is append only, and removed references are set to undefined in place.\n\t\t\t\t// To check if a new reference is being published, we just need to know if a reference\n\t\t\t\t// with an index beyond the initial list (initLength) is still set.\n\t\t\t\tconst internalList = target.getSurface().getModel().getDocument().getInternalList();\n\t\t\t\tconst group = internalList.getNodeGroup( 'mwReference/' );\n\t\t\t\treturn group ? group.firstNodes || [] : [];\n\t\t\t}\n\n\t\t\tlet hasFailingToneCheck = null;\n\t\t\ttarget.getPreSaveProcess().first( () => {\n\t\t\t\t// Start checking for tone in the pre-save process, but don't block the save dialog\n\t\t\t\t// from appearing. If the tone check isn't finished by save time we will just log\n\t\t\t\t// an error.\n\t\t\t\thasFailingToneCheck = null;\n\t\t\t\tmw.editcheck.hasFailingToneCheck( target.getSurface().getModel() ).then( ( result ) => {\n\t\t\t\t\thasFailingToneCheck = result;\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tconst initLength = getRefNodes().length;\n\t\t\ttarget.saveFields.vetags = function () {\n\t\t\t\tconst refNodes = getRefNodes();\n\t\t\t\tconst newLength = refNodes.length;\n\t\t\t\tlet newNodesInDoc = false;\n\t\t\t\tfor ( let i = initLength; i < newLength; i++ ) {\n\t\t\t\t\tif ( refNodes[ i ] ) {\n\t\t\t\t\t\tnewNodesInDoc = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst tags = [];\n\t\t\t\tif ( newNodesInDoc ) {\n\t\t\t\t\ttags.push( 'editcheck-newreference' );\n\t\t\t\t}\n\t\t\t\tif ( mw.editcheck.checksShown.addReference ) {\n\t\t\t\t\ttags.push( 'editcheck-references-shown' );\n\t\t\t\t}\n\t\t\t\tif ( mw.editcheck.checksShown.tone ) {\n\t\t\t\t\ttags.push( 'editcheck-tone-shown' );\n\t\t\t\t}\n\t\t\t\tif ( mw.editcheck.checksShown.paste ) {\n\t\t\t\t\ttags.push( 'editcheck-paste-shown' );\n\t\t\t\t}\n\t\t\t\tif ( hasFailingToneCheck ) {\n\t\t\t\t\ttags.push( 'editcheck-tone' );\n\t\t\t\t} else if ( hasFailingToneCheck === null ) {\n\t\t\t\t\tve.track( 'activity.editCheck-tone', { action: 'save-before-check-finalized' } );\n\t\t\t\t}\n\t\t\t\treturn tags.join( ',' );\n\t\t\t};\n\t\t} );\n\n\t\ttarget.on( 'teardown', () => {\n\t\t\tdelete target.saveFields.vetags;\n\t\t} );\n\t} );\n}\n\nif ( mw.config.get( 'wgVisualEditorConfig' ).editCheck || mw.editcheck.forceEnable ) {\n\tconst Controller = require( './controller.js' ).Controller;\n\tmw.hook( 've.newTarget' ).add( ( target ) => {\n\t\tif ( target.constructor.static.name !== 'article' ) {\n\t\t\treturn;\n\t\t}\n\t\tconst controller = new Controller( target, {\n\t\t\tsuggestions: mw.editcheck.suggestions\n\t\t} );\n\t\tcontroller.setup();\n\n\t\ttarget.editcheckController = controller;\n\n\t\t// Temporary logging for T394952\n\t\tif ( abCheck === 'tone' && abGroup === 'control' ) {\n\t\t\tconst checkForTone = function ( listener ) {\n\t\t\t\tmw.editcheck.hasFailingToneCheck( controller.surface.getModel() ).then( ( result ) => {\n\t\t\t\t\tif ( result ) {\n\t\t\t\t\t\tve.track( 'activity.editCheck-tone', { action: 'check-control-' + listener } );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t};\n\t\t\tcontroller.on( 'branchNodeChange', () => {\n\t\t\t\tcheckForTone( 'branchNodeChange' );\n\t\t\t} );\n\t\t\tcontroller.on( 'onBeforeSave', () => {\n\t\t\t\tcheckForTone( 'onBeforeSave' );\n\t\t\t} );\n\t\t}\n\t\t// Temporary logging for T402460\n\t\ttarget.on( 'surfaceReady', () => {\n\t\t\ttarget.getSurface().getView().on( 'paste', ( data ) => {\n\t\t\t\tconst defaults = mw.editcheck.editCheckFactory.buildConfig( 'paste' );\n\t\t\t\t// Check might not be registered so we can't use the factory.\n\t\t\t\tconst check = new mw.editcheck.PasteCheck( null, mw.editcheck.editCheckFactory.buildConfig( 'paste', { enabled: true } ) );\n\t\t\t\tif ( check.canBeShown() && data.fragment.getSelection().getCoveringRange().getLength() >= check.config.minimumCharacters ) {\n\t\t\t\t\t// The check would be shown for the current viewer, and there's enough content that we care about it:\n\t\t\t\t\tif ( data.source ) {\n\t\t\t\t\t\t// Known-source pastes that we're not showing regardless of the check being enabled/disabled\n\t\t\t\t\t\tve.track( 'activity.editCheck-paste', { action: 'ignored-paste-' + data.source } );\n\t\t\t\t\t} else if ( !defaults.enabled ) {\n\t\t\t\t\t\t// The check is disabled, and there's no source so we would have shown the check otherwise\n\t\t\t\t\t\tve.track( 'activity.editCheck-paste', { action: 'relevant-paste' } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\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":"implicit-arrow-linebreak","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/editcheck/modules/utils.js","messages":[],"suppressedMessages":[{"ruleId":"compat/compat","severity":2,"message":"AbortController is not supported in Safari 11.1, iOS Safari 11.3-11.4","line":21,"column":26,"nodeType":"MemberExpression","endLine":21,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"compat/compat","severity":2,"message":"AbortController is not supported in Safari 11.1, iOS Safari 11.3-11.4","line":21,"column":51,"nodeType":"NewExpression","endLine":21,"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":"implicit-arrow-linebreak","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/extension.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":"implicit-arrow-linebreak","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/i18n/ve-mw/api/en.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":"implicit-arrow-linebreak","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/i18n/ve-mw/api/qqq.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":"implicit-arrow-linebreak","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/i18n/ve-mw/en.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":"implicit-arrow-linebreak","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/i18n/ve-mw/mwlanguagevariant/en.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":"implicit-arrow-linebreak","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/i18n/ve-mw/mwlanguagevariant/qqq.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":"implicit-arrow-linebreak","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/i18n/ve-mw/qqq.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":"implicit-arrow-linebreak","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/i18n/ve-wmf/en.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":"implicit-arrow-linebreak","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/i18n/ve-wmf/qqq.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":"implicit-arrow-linebreak","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/jsdoc.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":"implicit-arrow-linebreak","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/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":"implicit-arrow-linebreak","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/eslint-shared.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":"implicit-arrow-linebreak","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/ve-mw-collab/ve.init.mw.CollabTarget.init.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":12,"column":13,"nodeType":"CallExpression","endLine":12,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":13,"column":22,"nodeType":"CallExpression","endLine":13,"endColumn":46,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":21,"column":31,"nodeType":"CallExpression","endLine":21,"endColumn":70,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":22,"column":37,"nodeType":"CallExpression","endLine":22,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":23,"column":38,"nodeType":"CallExpression","endLine":23,"endColumn":80,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":24,"column":31,"nodeType":"CallExpression","endLine":24,"endColumn":74,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":28,"column":32,"nodeType":"CallExpression","endLine":28,"endColumn":76,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":30,"column":24,"nodeType":"CallExpression","endLine":30,"endColumn":60,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":42,"column":3,"nodeType":"CallExpression","endLine":42,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":72,"column":4,"nodeType":"CallExpression","endLine":72,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":77,"column":4,"nodeType":"CallExpression","endLine":77,"endColumn":24,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":217,"column":4,"nodeType":"CallExpression","endLine":217,"endColumn":24,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":221,"column":4,"nodeType":"CallExpression","endLine":221,"endColumn":15,"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":"implicit-arrow-linebreak","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-mw-collab/ve.init.mw.CollabTarget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":43,"column":26,"nodeType":"CallExpression","endLine":43,"endColumn":49,"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":"implicit-arrow-linebreak","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-mw-collab/ve.init.mw.DesktopCollabTarget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":27,"column":26,"nodeType":"CallExpression","endLine":27,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":50,"column":3,"nodeType":"CallExpression","endLine":50,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":50,"column":3,"nodeType":"CallExpression","endLine":55,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":56,"column":30,"nodeType":"CallExpression","endLine":56,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":58,"column":3,"nodeType":"CallExpression","endLine":58,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":67,"column":2,"nodeType":"CallExpression","endLine":67,"endColumn":20,"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":"implicit-arrow-linebreak","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-mw-collab/ve.init.mw.MobileCollabTarget.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":"implicit-arrow-linebreak","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-mw-collab/ve.init.mw.collab.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":"implicit-arrow-linebreak","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-mw-collab/ve.ui.MWExportWikitextDialog.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":"implicit-arrow-linebreak","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-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.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":"implicit-arrow-linebreak","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-mw/ce/annotations/ve.ce.MWInternalLinkAnnotation.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":59,"column":13,"nodeType":"CallExpression","endLine":59,"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":"implicit-arrow-linebreak","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-mw/ce/annotations/ve.ce.MWNowikiAnnotation.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWAlienAnnotationNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWAlienBlockExtensionNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWAlienExtensionNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWAlienInlineExtensionNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWAnnotationNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWBlockExtensionNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWBlockImageNode.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":122,"column":3,"nodeType":"CallExpression","endLine":124,"endColumn":59,"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":122,"column":3,"nodeType":"CallExpression","endLine":123,"endColumn":56,"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":132,"column":2,"nodeType":"CallExpression","endLine":132,"endColumn":38,"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":248,"column":5,"nodeType":"CallExpression","endLine":250,"endColumn":54,"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":248,"column":5,"nodeType":"CallExpression","endLine":249,"endColumn":59,"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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWEntityNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWExtensionNode.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":110,"column":1,"nodeType":"Block","endLine":110,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":140,"column":1,"nodeType":"Block","endLine":140,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor ContentEditable MWExtensionNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * ContentEditable MediaWiki extension node.\n *\n * Configuration options for .update():\n * - extsrc: override the contents of the tag (string)\n * - attrs: override the attributes of the tag (object)\n *\n * @class\n * @abstract\n * @extends ve.ce.LeafNode\n * @mixes ve.ce.FocusableNode\n * @mixes ve.ce.GeneratedContentNode\n *\n * @constructor\n */\nve.ce.MWExtensionNode = function VeCeMWExtensionNode() {\n\t// Parent constructor\n\tve.ce.MWExtensionNode.super.apply( this, arguments );\n\n\t// Mixin constructors\n\tve.ce.FocusableNode.call( this, this.getFocusableElement() );\n\tve.ce.GeneratedContentNode.call( this );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ce.MWExtensionNode, ve.ce.LeafNode );\nOO.mixinClass( ve.ce.MWExtensionNode, ve.ce.FocusableNode );\nOO.mixinClass( ve.ce.MWExtensionNode, ve.ce.GeneratedContentNode );\n\n/* Static properties */\n\n/**\n * Extension renders visible content when empty\n *\n * @static\n * @property {boolean}\n * @inheritable\n */\nve.ce.MWExtensionNode.static.rendersEmpty = false;\n\nve.ce.MWExtensionNode.static.iconWhenInvisible = 'markup';\n\nve.ce.MWExtensionNode.static.getDescription = function ( model ) {\n\tconst body = ve.getProp( model.getAttribute( 'mw' ), 'body', 'extsrc' ) || '';\n\treturn body.slice( 0, 100 ) + ( body.length > 100 ? '…' : '' );\n};\n\n/* Methods */\n\n/**\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWExtensionNode.prototype.generateContents = function ( config ) {\n\tconst deferred = ve.createDeferred(),\n\t\tmwData = ve.copy( this.getModel().getAttribute( 'mw' ) ),\n\t\textsrc = config && config.extsrc !== undefined ? config.extsrc : ( ve.getProp( mwData, 'body', 'extsrc' ) || '' ),\n\t\tattrs = config && config.attrs || mwData.attrs,\n\t\ttagName = this.getModel().getExtensionName();\n\n\t// undefined means omit the attribute, not convert it to string 'undefined'\n\tfor ( const attr in attrs ) {\n\t\tif ( attrs[ attr ] === undefined ) {\n\t\t\tdelete attrs[ attr ];\n\t\t}\n\t}\n\n\t// XML-like tags in wikitext are not actually XML and don't expect their contents to be escaped.\n\tconst wikitext = mw.html.element( tagName, attrs, new mw.html.Raw( extsrc ) );\n\n\tif ( this.constructor.static.rendersEmpty || extsrc.trim() !== '' ) {\n\t\tconst xhr = ve.init.target.parseWikitextFragment( wikitext, false, this.getModel().getDocument() );\n\t\txhr.then(\n\t\t\tthis.onParseSuccess.bind( this, deferred ),\n\t\t\tthis.onParseError.bind( this, deferred )\n\t\t);\n\t\treturn deferred.promise( { abort: xhr.abort } );\n\t} else {\n\t\tdeferred.resolve( $( '<span>' ).text( '\\u00a0' ).get() );\n\t\treturn deferred.promise();\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWExtensionNode.prototype.getRenderedDomElements = function () {\n\t// Parent method\n\tconst elements = ve.ce.GeneratedContentNode.prototype.getRenderedDomElements.apply( this, arguments );\n\n\tif ( this.getModelHtmlDocument() ) {\n\t\tve.init.platform.linkCache.styleParsoidElements(\n\t\t\t$( elements ),\n\t\t\tthis.getModelHtmlDocument()\n\t\t);\n\t}\n\treturn elements;\n};\n\n/**\n * Handle a successful response from the parser for the wikitext fragment.\n *\n * @param {jQuery.Deferred} deferred The Deferred object created by generateContents\n * @param {Object} response Response data\n */\nve.ce.MWExtensionNode.prototype.onParseSuccess = function ( deferred, response ) {\n\tconst data = response.visualeditor,\n\t\tcontentNodes = $( data.content ).get();\n\tdeferred.resolve( contentNodes );\n};\n\nve.ce.MWExtensionNode.prototype.afterRender = function () {\n\tconst $images = this.$element\n\t\t.find( 'img:not([width]),img:not([height])' )\n\t\t.addBack( 'img:not([width]),img:not([height])' );\n\n\t// Mixin method\n\tve.ce.GeneratedContentNode.prototype.afterRender.call( this );\n\n\t// Images missing a dimension change size after load\n\t// TODO: Ignore images which have dimensions defined in CSS, if performant\n\tif ( $images.length ) {\n\t\t$images.on( 'load', () => {\n\t\t\t// Mixin method\n\t\t\tve.ce.GeneratedContentNode.prototype.afterRender.call( this );\n\t\t} );\n\t}\n};\n\n/**\n * Handle an unsuccessful response from the parser for the wikitext fragment.\n *\n * @param {jQuery.Deferred} deferred The promise object created by generateContents\n * @param {Object} response Response data\n */\nve.ce.MWExtensionNode.prototype.onParseError = function ( deferred ) {\n\tdeferred.reject();\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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWGalleryCaptionNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWGalleryImageCaptionNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWGalleryImageNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWGalleryNode.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":120,"column":3,"nodeType":"CallExpression","endLine":122,"endColumn":31,"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":120,"column":3,"nodeType":"CallExpression","endLine":121,"endColumn":36,"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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWHeadingNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWImageCaptionNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWImageNode.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":140,"column":1,"nodeType":"Block","endLine":140,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":168,"column":1,"nodeType":"Block","endLine":168,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor ContentEditable MWImageNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * ContentEditable MediaWiki image node.\n *\n * @class\n * @abstract\n * @extends ve.ce.GeneratedContentNode\n * @mixes ve.ce.FocusableNode\n * @mixes ve.ce.MWResizableNode\n *\n * @constructor\n * @param {jQuery} $focusable Focusable part of the node\n * @param {jQuery} $image Image part of the node\n * @param {Object} [config] Configuration options\n */\nve.ce.MWImageNode = function VeCeMWImageNode( $focusable, $image, config ) {\n\tconfig = ve.extendObject( {\n\t\tenforceMax: false,\n\t\tminDimensions: { width: 1, height: 1 },\n\t\t$bounding: this.$element\n\t}, config );\n\n\t// Properties\n\tthis.$image = $image;\n\t// Parent constructor triggers render so this must precede it\n\tthis.renderedDimensions = null;\n\n\t// Parent constructor\n\tve.ce.GeneratedContentNode.call( this );\n\n\t// Mixin constructors\n\tve.ce.FocusableNode.call( this, $focusable, config );\n\tve.ce.MWResizableNode.call( this, this.$image, config );\n\n\t// Events\n\tthis.model.connect( this, { attributeChange: 'onAttributeChange' } );\n\n\t// Initialization\n\tthis.updateMediaType();\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ce.MWImageNode, ve.ce.GeneratedContentNode );\n\nOO.mixinClass( ve.ce.MWImageNode, ve.ce.FocusableNode );\n\n// Need to mixin base class as well (T92540)\nOO.mixinClass( ve.ce.MWImageNode, ve.ce.ResizableNode );\n\nOO.mixinClass( ve.ce.MWImageNode, ve.ce.MWResizableNode );\n\n/* Static Properties */\n\nve.ce.MWImageNode.static.primaryCommandName = 'media';\n\n/* Static Methods */\n\n/**\n * @inheritdoc ve.ce.Node\n */\nve.ce.MWImageNode.static.getDescription = function ( model ) {\n\tconst title = new mw.Title( model.getFilename() );\n\treturn title.getMainText();\n};\n\n/* Methods */\n\n/**\n * Update the rendering of the 'align', src', 'width' and 'height' attributes\n * when they change in the model.\n *\n * @param {string} key Attribute key\n * @param {string} from Old value\n * @param {string} to New value\n */\nve.ce.MWImageNode.prototype.onAttributeChange = function () {\n\tthis.update();\n};\n\n/**\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWImageNode.prototype.onGeneratedContentNodeUpdate = function () {\n\t// Do nothing to avoid re-rendering every time the caption is changed.\n\t// Call update inside onAttributeChange instead.\n};\n\n/**\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWImageNode.prototype.generateContents = function () {\n\tconst model = this.getModel(),\n\t\theight = model.getAttribute( 'height' ),\n\t\tmwData = model.getAttribute( 'mw' ) || {},\n\t\tdeferred = ve.createDeferred();\n\tlet width = model.getAttribute( 'width' );\n\n\t// If the current rendering is larger don't fetch a new image, just let the browser resize\n\tif ( this.renderedDimensions && this.renderedDimensions.width > width ) {\n\t\treturn deferred.reject().promise();\n\t}\n\n\tlet params;\n\tif ( mwData.thumbtime !== undefined ) {\n\t\tparams = 'seek=' + mwData.thumbtime;\n\t} else if ( mwData.page !== undefined ) {\n\t\tparams = 'page' + mwData.page + '-' + width + 'px';\n\t\t// Don't send width twice\n\t\twidth = undefined;\n\t}\n\n\tconst xhr = ve.init.target.getContentApi( this.getModel().getDocument() ).get( {\n\t\taction: 'query',\n\t\tprop: 'imageinfo',\n\t\tiiprop: 'url',\n\t\tiiurlwidth: width,\n\t\tiiurlheight: height,\n\t\tiiurlparam: params,\n\t\ttitles: this.getModel().getFilename()\n\t} );\n\n\txhr.then(\n\t\tthis.onParseSuccess.bind( this, deferred ),\n\t\tthis.onParseError.bind( this, deferred )\n\t);\n\n\treturn deferred.promise( { abort: xhr.abort } );\n};\n\n/**\n * Handle a successful response from the parser for the image src.\n *\n * @param {jQuery.Deferred} deferred The Deferred object created by generateContents\n * @param {Object} response Response data\n */\nve.ce.MWImageNode.prototype.onParseSuccess = function ( deferred, response ) {\n\tconst thumburl = ve.getProp( response.query.pages[ 0 ], 'imageinfo', 0, 'thumburl' );\n\tif ( thumburl ) {\n\t\tdeferred.resolve( thumburl );\n\t} else {\n\t\tdeferred.reject();\n\t}\n};\n\n/**\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWImageNode.prototype.render = function ( generatedContents ) {\n\tthis.$image.attr( 'src', generatedContents );\n\t// As we only re-render when the image is larger than last rendered size\n\t// this will always be the largest ever rendering\n\tthis.renderedDimensions = ve.copy( this.model.getScalable().getCurrentDimensions() );\n\tif ( this.live ) {\n\t\tthis.afterRender();\n\t}\n};\n\n/**\n * Handle an unsuccessful response from the parser for the image src.\n *\n * @param {jQuery.Deferred} deferred The promise object created by generateContents\n * @param {Object} response Response data\n */\nve.ce.MWImageNode.prototype.onParseError = function ( deferred ) {\n\tdeferred.reject();\n};\n\n/**\n * Update rendering when media type changes\n */\nve.ce.MWImageNode.prototype.updateMediaType = function () {\n\tthis.$image.toggleClass( 've-ce-mwImageNode-audioPlayer', this.model.getMediaType() === 'AUDIO' );\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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWIncludesNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWInlineExtensionNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWInlineImageNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWLanguageVariantBlockNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWLanguageVariantHiddenNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWLanguageVariantInlineNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWLanguageVariantNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWMagicLinkNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWNumberedExternalLinkNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWPreNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWPreformattedNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWSignatureNode.js","messages":[{"ruleId":"es-x/no-iterator-prototype-toarray","severity":2,"message":"ES2025 'Iterator.prototype.toArray' method is forbidden.","line":145,"column":11,"nodeType":"MemberExpression","messageId":"forbidden","endLine":145,"endColumn":69}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor ContentEditable MWSignatureNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * ContentEditable MediaWiki signature node. This defines the behavior of the signature node\n * inserted into the ContentEditable document.\n *\n * @class\n * @extends ve.ce.LeafNode\n *\n * @constructor\n * @param {ve.dm.MWSignatureNode} model Model to observe\n * @param {Object} [config] Configuration options\n */\nve.ce.MWSignatureNode = function VeCeMWSignatureNode() {\n\t// Parent constructor\n\tve.ce.MWSignatureNode.super.apply( this, arguments );\n\n\t// Mixin constructors\n\tve.ce.GeneratedContentNode.call( this );\n\tve.ce.FocusableNode.call( this );\n\n\t// DOM changes\n\tthis.$element.addClass( 've-ce-mwSignatureNode' );\n\n\tif ( this.isGenerating() ) {\n\t\t// Use an initial rendering of '~~~~' as a placeholder to avoid\n\t\t// the width changing when using the Sequence.\n\t\tthis.$element.text( '~~~~' );\n\t}\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ce.MWSignatureNode, ve.ce.LeafNode );\nOO.mixinClass( ve.ce.MWSignatureNode, ve.ce.GeneratedContentNode );\nOO.mixinClass( ve.ce.MWSignatureNode, ve.ce.FocusableNode );\n\n/* Static Properties */\n\nve.ce.MWSignatureNode.static.name = 'mwSignature';\n\nve.ce.MWSignatureNode.static.tagName = 'span';\n\nve.ce.MWSignatureNode.static.primaryCommandName = 'mwSignature';\n\nve.ce.MWSignatureNode.static.liveSignatures = [];\n\n// Set a description for focusable node tooltip\nve.ce.MWSignatureNode.static.getDescription = function () {\n\treturn ve.msg( 'visualeditor-mwsignature-tool' );\n};\n\n// Update the timestamp on inserted signatures every minute.\nsetInterval( () => {\n\tconst liveSignatures = ve.ce.MWSignatureNode.static.liveSignatures;\n\n\tconst updatedSignatures = [];\n\tfor ( let i = 0; i < liveSignatures.length; i++ ) {\n\t\tconst sig = liveSignatures[ i ];\n\t\ttry {\n\t\t\tsig.forceUpdate();\n\t\t\tupdatedSignatures.push( sig );\n\t\t} catch ( er ) {\n\t\t\t// Do nothing\n\t\t}\n\t}\n\t// Stop updating signatures that failed once\n\tve.ce.MWSignatureNode.static.liveSignatures = updatedSignatures;\n}, 60 * 1000 );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ce.MWSignatureNode.prototype.onSetup = function () {\n\t// Parent method\n\tve.ce.MWSignatureNode.super.prototype.onSetup.call( this );\n\n\t// Keep track for regular updating of timestamp\n\tthis.constructor.static.liveSignatures.push( this );\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWSignatureNode.prototype.onTeardown = function () {\n\tconst liveSignatures = this.constructor.static.liveSignatures;\n\n\t// Parent method\n\tve.ce.MWSignatureNode.super.prototype.onTeardown.call( this );\n\n\t// Stop tracking\n\tconst index = liveSignatures.indexOf( this );\n\tif ( index !== -1 ) {\n\t\tliveSignatures.splice( index, 1 );\n\t}\n};\n\n/**\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWSignatureNode.prototype.generateContents = function () {\n\tconst doc = this.getModel().getDocument();\n\tconst api = ve.init.target.getContentApi( doc );\n\tconst ajaxOptions = {};\n\tconst abortable = api.makeAbortablePromise( ajaxOptions );\n\n\t// Acquire a temporary user username before previewing, so that signatures\n\t// display the temp user instead of IP user. (T331397)\n\treturn mw.user.acquireTempUserName()\n\t\t.then( () => {\n\t\t\t// We must have only one top-level node, this is the easiest way.\n\t\t\tconst wikitext = '<span>~~~~</span>';\n\n\t\t\t// Parsoid doesn't support pre-save transforms. PHP parser doesn't support Parsoid's\n\t\t\t// meta attributes (that may or may not be required).\n\t\t\t// We could try hacking up one (or even both) of these, but just calling the two parsers\n\t\t\t// in order seems slightly saner.\n\t\t\treturn api.post( {\n\t\t\t\taction: 'parse',\n\t\t\t\ttext: wikitext,\n\t\t\t\tcontentmodel: 'wikitext',\n\t\t\t\tprop: 'text',\n\t\t\t\tonlypst: true\n\t\t\t}, ajaxOptions );\n\t\t} )\n\t\t.then( ( pstResponse ) => {\n\t\t\tconst wikitext = ve.getProp( pstResponse, 'parse', 'text' );\n\t\t\tif ( !wikitext ) {\n\t\t\t\treturn ve.createDeferred().reject();\n\t\t\t}\n\t\t\treturn ve.init.target.parseWikitextFragment( wikitext, true, doc, ajaxOptions );\n\t\t} )\n\t\t.then( ( parseResponse ) => {\n\t\t\tif ( ve.getProp( parseResponse, 'visualeditor', 'result' ) !== 'success' ) {\n\t\t\t\treturn ve.createDeferred().reject();\n\t\t\t}\n\t\t\t// Simplified case of template rendering, don't need to worry about filtering etc\n\t\t\treturn $( parseResponse.visualeditor.content ).contents().toArray();\n\t\t} )\n\t\t.promise( abortable );\n};\n\n/* Registration */\n\nve.ce.nodeFactory.register( ve.ce.MWSignatureNode );\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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWTableNode.js","messages":[{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":123,"column":24,"nodeType":"MemberExpression","messageId":"forbidden","endLine":123,"endColumn":40}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor ContentEditable MWTableNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * ContentEditable MW table node.\n *\n * @class\n * @extends ve.ce.TableNode\n * @mixes ve.ce.ClassAttributeNode\n *\n * @constructor\n * @param {ve.dm.MWTableNode} model Model to observe\n * @param {Object} [config] Configuration options\n */\nve.ce.MWTableNode = function VeCeMWTableNode() {\n\t// Parent constructor\n\tve.ce.MWTableNode.super.apply( this, arguments );\n\n\t// Mixin constructors\n\tve.ce.ClassAttributeNode.call( this );\n\n\t// Properties\n\tthis.updateSortableHeadersHandler = ve.debounce( this.updateSortableHeaders );\n\tthis.$sortableHeaders = $( [] );\n\n\t// Events\n\tthis.connect( this, { setup: 'updateSortableHeadersHandler' } );\n\tthis.model.connect( this, {\n\t\t// Update when the table is made sortable or not sortable\n\t\tattributeChange: 'updateSortableHeadersHandler',\n\t\t// Update when a cell style changes between content cell and header cell\n\t\tcellAttributeChange: 'updateSortableHeadersHandler'\n\t} );\n\tthis.model.getMatrix().connect( this, {\n\t\t// Update when cells are added, removed, merged, split\n\t\tstructureChange: 'updateSortableHeadersHandler'\n\t} );\n\n\t// DOM changes\n\tthis.$element.addClass( 've-ce-mwTableNode' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ce.MWTableNode, ve.ce.TableNode );\n\nOO.mixinClass( ve.ce.MWTableNode, ve.ce.ClassAttributeNode );\n\n/* Static Properties */\n\nve.ce.MWTableNode.static.name = 'mwTable';\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ce.MWTableNode.prototype.destroy = function () {\n\tthis.model.getMatrix().disconnect( this );\n\n\t// Parent method\n\tve.ce.MWTableNode.super.prototype.destroy.apply( this, arguments );\n};\n\n/**\n * Update sortable headers (if the table is sortable).\n *\n * @private\n */\nve.ce.MWTableNode.prototype.updateSortableHeaders = function () {\n\tif ( !this.model ) {\n\t\t// Fired after teardown due to debounce\n\t\treturn;\n\t}\n\n\tif ( this.model.getAttribute( 'collapsible' ) ) {\n\t\tmw.loader.load( 'jquery.makeCollapsible.styles' );\n\t}\n\n\tthis.$element.toggleClass( 'jquery-tablesorter', this.model.getAttribute( 'sortable' ) );\n\n\tthis.$sortableHeaders.removeClass( 'headerSort' );\n\n\tif ( this.model.getAttribute( 'sortable' ) ) {\n\t\t// We only really want the styles. But it's harmless to load the entire module, and if the user\n\t\t// ends up saving this change, it will be loaded anyway to render the real sortable table.\n\t\tmw.loader.load( 'jquery.tablesorter' );\n\n\t\tconst cellModels = this.getTablesorterHeaderCells();\n\t\tconst cellViews = cellModels.map( ( cellModel ) => this.getNodeFromOffset( cellModel.getOffset() - this.model.getOffset() ) );\n\n\t\tthis.$sortableHeaders = $( cellViews.map( ( cell ) => cell.$element[ 0 ] ) ).not( '.unsortable' );\n\t} else {\n\t\tthis.$sortableHeaders = $( [] );\n\t}\n\n\tthis.$sortableHeaders.addClass( 'headerSort' );\n\n\t// .headerSort class adds some padding, causing the overlays to become misaligned\n\tthis.updateOverlay();\n};\n\n/**\n * Find the last of header rows with maximum number of cells (minimum number of colspans) and return\n * all of its cells. These are the cells that serve as sortable headers in jQuery Tablesorter.\n * This algorithm is exactly the same, see the buildHeaders() function in jquery.tablesorter.js.\n *\n * @private\n * @return {ve.dm.TableCellNode[]}\n */\nve.ce.MWTableNode.prototype.getTablesorterHeaderCells = function () {\n\tconst matrix = this.model.getMatrix();\n\n\tlet longestRow = [];\n\tlet longestRowLength = 0;\n\tfor ( let i = 0, l = matrix.getRowCount(); i < l; i++ ) {\n\t\tconst matrixCells = matrix.getRow( i );\n\t\tconst cellModels = OO.unique( matrixCells.map( ( matrixCell ) => matrixCell && matrixCell.getOwner().node ) );\n\t\tconst isAllHeaders = cellModels.every( ( cellModel ) => cellModel && cellModel.getAttribute( 'style' ) === 'header' );\n\t\tif ( !isAllHeaders ) {\n\t\t\t// This is the end of table head (thead), stop looking further\n\t\t\tbreak;\n\t\t}\n\t\tconst rowLength = cellModels.length;\n\t\tif ( rowLength >= longestRowLength ) {\n\t\t\tlongestRowLength = rowLength;\n\t\t\tlongestRow = cellModels;\n\t\t}\n\t}\n\n\treturn longestRow;\n};\n\n/* Registration */\n\nve.ce.nodeFactory.register( ve.ce.MWTableNode );\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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWTransclusionBlockNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWTransclusionInlineNode.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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWTransclusionNode.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":199,"column":1,"nodeType":"Block","endLine":199,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-toarray","severity":2,"message":"ES2025 'Iterator.prototype.toArray' method is forbidden.","line":258,"column":9,"nodeType":"MemberExpression","messageId":"forbidden","endLine":258,"endColumn":91},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":264,"column":1,"nodeType":"Block","endLine":264,"endColumn":1}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor ContentEditable MWTransclusionNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * ContentEditable MediaWiki transclusion node.\n *\n * @class\n * @abstract\n * @extends ve.ce.LeafNode\n * @mixes ve.ce.GeneratedContentNode\n * @mixes ve.ce.FocusableNode\n *\n * @constructor\n * @param {ve.dm.MWTransclusionNode} model Model to observe\n * @param {Object} [config] Configuration options\n */\nve.ce.MWTransclusionNode = function VeCeMWTransclusionNode( model, config ) {\n\t// Parent constructor\n\tve.ce.MWTransclusionNode.super.call( this, model, config );\n\n\t// Mixin constructors\n\tve.ce.GeneratedContentNode.call( this );\n\tve.ce.FocusableNode.call( this );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ce.MWTransclusionNode, ve.ce.LeafNode );\n\nOO.mixinClass( ve.ce.MWTransclusionNode, ve.ce.GeneratedContentNode );\nOO.mixinClass( ve.ce.MWTransclusionNode, ve.ce.FocusableNode );\n\n/* Static Properties */\n\nve.ce.MWTransclusionNode.static.name = 'mwTransclusion';\n\nve.ce.MWTransclusionNode.static.primaryCommandName = 'transclusion';\n\nve.ce.MWTransclusionNode.static.iconWhenInvisible = 'puzzle';\n\n/* Static Methods */\n\n/**\n * Get a plain text description of the template parts in a transclusion node, excluding raw wikitext\n * snippets.\n *\n * @static\n * @param {ve.dm.MWTransclusionNode} model\n * @return {string} Comma-separated list of template names\n */\nve.ce.MWTransclusionNode.static.getDescription = function ( model ) {\n\treturn model.getPartsList()\n\t\t.map( ( part ) => {\n\t\t\tif ( part.templatePage ) {\n\t\t\t\treturn mw.Title.newFromText( part.templatePage )\n\t\t\t\t\t.getRelativeText( mw.config.get( 'wgNamespaceIds' ).template );\n\t\t\t}\n\t\t\t// Not actually a template, but e.g. a parser function\n\t\t\treturn part.template || '';\n\t\t} )\n\t\t.filter( ( desc ) => desc )\n\t\t.join( ve.msg( 'comma-separator' ) );\n};\n\n/**\n * Get a formatted description of the template parts in a transclusion node, excluding raw wikitext\n * snippets.\n *\n * Like #getDescription, but parts generated from templates are linked to\n * those templates\n *\n * @static\n * @param {ve.dm.MWTransclusionNode} model\n * @return {HTMLElement} DOM node with comma-separated list of template names\n */\nve.ce.MWTransclusionNode.static.getDescriptionDom = function ( model ) {\n\tconst nodes = model.getPartsList()\n\t\t.map( ( part ) => {\n\t\t\tif ( part.templatePage ) {\n\t\t\t\tconst title = mw.Title.newFromText( part.templatePage );\n\t\t\t\tconst link = document.createElement( 'a' );\n\t\t\t\tlink.textContent = title.getRelativeText( mw.config.get( 'wgNamespaceIds' ).template );\n\t\t\t\tve.setAttributeSafe( link, 'href', title.getUrl() );\n\t\t\t\treturn link;\n\t\t\t}\n\t\t\t// Not actually a template, but e.g. a parser function\n\t\t\treturn part.template ? document.createTextNode( part.template ) : null;\n\t\t} )\n\t\t.filter( ( desc ) => desc );\n\tconst span = document.createElement( 'span' );\n\tnodes.forEach( ( node, i ) => {\n\t\tif ( i ) {\n\t\t\tspan.appendChild( document.createTextNode( ve.msg( 'comma-separator' ) ) );\n\t\t}\n\t\tspan.appendChild( node );\n\t} );\n\tve.targetLinksToNewWindow( span );\n\treturn span;\n};\n\n/**\n * Filter rendering to remove auto-generated content and wrappers\n *\n * @static\n * @param {Node[]} contentNodes Rendered nodes\n * @return {Node[]} Filtered rendered nodes\n */\nve.ce.MWTransclusionNode.static.filterRendering = function ( contentNodes ) {\n\tif ( !contentNodes.length ) {\n\t\treturn [];\n\t}\n\n\tconst whitespaceRegex = new RegExp( '^[' + ve.dm.Converter.static.whitespaceList + ']+$' );\n\n\tcontentNodes = contentNodes.filter( ( node ) => {\n\t\tif ( !node || node.nodeType !== Node.ELEMENT_NODE ) {\n\t\t\treturn true;\n\t\t}\n\t\t// Filter out i18n placeholders (T397491)\n\t\tif ( node.getAttribute( 'typeof' ) === 'mw:I18n' ) {\n\t\t\treturn false;\n\t\t}\n\t\t// Filter out auto-generated items, e.g. reference lists\n\t\tconst dataMw = node.hasAttribute( 'data-mw' ) && JSON.parse( node.getAttribute( 'data-mw' ) );\n\t\tif ( dataMw && dataMw.autoGenerated ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t} );\n\n\tcontentNodes.forEach( ( node ) => {\n\t\tif ( node.nodeType === Node.ELEMENT_NODE ) {\n\t\t\tmw.libs.ve.stripParsoidFallbackIds( node );\n\t\t}\n\t} );\n\n\tfunction isWhitespaceNode( node ) {\n\t\treturn node && node.nodeType === Node.TEXT_NODE && whitespaceRegex.test( node.data );\n\t}\n\n\twhile ( isWhitespaceNode( contentNodes[ 0 ] ) ) {\n\t\tcontentNodes.shift();\n\t}\n\twhile ( isWhitespaceNode( contentNodes[ contentNodes.length - 1 ] ) ) {\n\t\tcontentNodes.pop();\n\t}\n\t// HACK: if $content consists of a single paragraph, unwrap it.\n\t// We have to do this because the parser wraps everything in <p>s, and inline templates\n\t// will render strangely when wrapped in <p>s.\n\tif ( contentNodes.length === 1 && contentNodes[ 0 ].nodeName.toLowerCase() === 'p' ) {\n\t\tcontentNodes = Array.prototype.slice.call( contentNodes[ 0 ].childNodes );\n\t}\n\treturn contentNodes;\n};\n\n/* Methods */\n\n/** @inheritDoc */\nve.ce.MWTransclusionNode.prototype.executeCommand = function () {\n\tconst contextItems = this.focusableSurface.getSurface().getContext().items;\n\tconst transclusionContextItem = contextItems.find( ( contextItem ) => contextItem instanceof ve.ui.MWTransclusionContextItem );\n\tif ( transclusionContextItem ) {\n\t\t// Utilize the context item when it's there instead of triggering the command manually.\n\t\t// Required to make the context item show the \"Loading…\" message (see T297773).\n\t\ttransclusionContextItem.onEditButtonClick();\n\t\treturn;\n\t}\n\n\t// Parent method\n\tve.ce.FocusableNode.prototype.executeCommand.apply( this, arguments );\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWTransclusionNode.prototype.generateContents = function ( config ) {\n\tconst deferred = ve.createDeferred();\n\tconst xhr = ve.init.target.parseWikitextFragment(\n\t\t( config && config.wikitext ) || this.model.getWikitext(),\n\t\ttrue,\n\t\tthis.getModel().getDocument()\n\t);\n\n\txhr.then(\n\t\tthis.onParseSuccess.bind( this, deferred ),\n\t\tthis.onParseError.bind( this, deferred )\n\t);\n\n\treturn deferred.promise( { abort: xhr.abort } );\n};\n\n/**\n * Handle a successful response from the parser for the wikitext fragment.\n *\n * @param {jQuery.Deferred} deferred The Deferred object created by #generateContents\n * @param {Object} response Response data\n */\nve.ce.MWTransclusionNode.prototype.onParseSuccess = function ( deferred, response ) {\n\tif ( ve.getProp( response, 'visualeditor', 'result' ) !== 'success' ) {\n\t\tthis.onParseError( deferred );\n\t\treturn;\n\t}\n\n\t// Work around https://github.com/jquery/jquery/issues/1997\n\tconst contentNodes = $.parseHTML( response.visualeditor.content, this.model && this.getModelHtmlDocument() ) || [];\n\tdeferred.resolve( this.constructor.static.filterRendering( contentNodes ) );\n};\n\n/**\n * Extend the ve.ce.GeneratedContentNode render method to check for hidden templates.\n *\n * Check if the final result of the imported template is empty.\n *\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWTransclusionNode.prototype.render = function ( generatedContents ) {\n\t// Call parent mixin\n\tve.ce.GeneratedContentNode.prototype.render.call( this, generatedContents );\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWTransclusionNode.prototype.onSetup = function () {\n\t// Parent method\n\tve.ce.MWTransclusionNode.super.prototype.onSetup.apply( this, arguments );\n\n\t// Render replaces this.$element with a new node so re-add classes\n\tthis.$element.addClass( 've-ce-mwTransclusionNode' );\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWTransclusionNode.prototype.getRenderedDomElements = function () {\n\t// Parent method\n\tconst elements = ve.ce.GeneratedContentNode.prototype.getRenderedDomElements.apply( this, arguments );\n\n\tif ( this.model && this.getModelHtmlDocument() ) {\n\t\tve.init.platform.linkCache.styleParsoidElements(\n\t\t\t$( elements ),\n\t\t\tthis.getModelHtmlDocument()\n\t\t);\n\t}\n\treturn elements;\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWTransclusionNode.prototype.filterRenderedDomElements = function ( domElements ) {\n\t// We want to remove all styles and links which aren't from TemplateStyles.\n\tconst selector = 'style:not([data-mw-deduplicate^=\"TemplateStyles:\"]), link:not([rel~=\"mw-deduplicated-inline-style\"][href^=\"mw-data:TemplateStyles:\"])';\n\treturn $( domElements ).find( selector ).addBack( selector ).remove().end().end().toArray();\n};\n\n/**\n * Handle an unsuccessful response from the parser for the wikitext fragment.\n *\n * @param {jQuery.Deferred} deferred The promise object created by #generateContents\n * @param {Object} response Response data\n */\nve.ce.MWTransclusionNode.prototype.onParseError = function ( deferred ) {\n\tdeferred.reject();\n};\n\n/* Registration */\n\nve.ce.nodeFactory.register( ve.ce.MWTransclusionNode );\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":"implicit-arrow-linebreak","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-mw/ce/nodes/ve.ce.MWTransclusionTableCellNode.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":"implicit-arrow-linebreak","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-mw/ce/ve.ce.MWResizableNode.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":"implicit-arrow-linebreak","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-mw/ce/ve.ce.MWWikitextClipboardHandler.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":"implicit-arrow-linebreak","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-mw/ce/ve.ce.MWWikitextSurface.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":"implicit-arrow-linebreak","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-mw/dm/.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":"implicit-arrow-linebreak","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/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.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":"implicit-arrow-linebreak","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-mw/dm/annotations/ve.dm.MWInternalLinkAnnotation.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":"implicit-arrow-linebreak","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-mw/dm/annotations/ve.dm.MWNowikiAnnotation.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWAlienMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWCategoryMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWDefaultSortMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWDisplayTitleMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWHiddenCategoryMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWIndexMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWLanguageMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWNewSectionEditMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWNoContentConvertMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWNoEditSectionMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWNoGalleryMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWNoTitleConvertMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWRedirectMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWStaticRedirectMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/metaitems/ve.dm.MWTOCMetaItem.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":"implicit-arrow-linebreak","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-mw/dm/models/ve.dm.MWImageModel.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":"implicit-arrow-linebreak","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-mw/dm/models/ve.dm.MWParameterModel.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":11,"column":1,"nodeType":"Block","endLine":11,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":11,"column":1,"nodeType":"Block","endLine":11,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":21,"column":1,"nodeType":"Block","endLine":21,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":104,"column":1,"nodeType":"Block","endLine":104,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWParameterModel class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Represents a parameter that's part of a template invocation, centered around the parameter's\n * value. Holds a reference to the specification of the template and the parameter as it is\n * documented via TemplateData. Meant to be a sub-element of a {@see ve.dm.MWTemplateModel}, which\n * is a sub-element of a {@see ve.dm.MWTransclusionModel}.\n *\n * @class\n * @mixes OO.EventEmitter\n *\n * @constructor\n * @param {ve.dm.MWTemplateModel} template Reference back to the template that contains the\n *  parameter, as well as to the specification\n * @param {string} [name] Can be missing or empty when meant to be used as a placeholder. Parameters\n *  without a name won't be serialized to wikitext, {@see ve.dm.MWTemplateModel.serialize}.\n * @param {string} [value='']\n */\nve.dm.MWParameterModel = function VeDmMWParameterModel( template, name, value ) {\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Properties\n\tthis.template = template;\n\tthis.originalName = name;\n\tthis.name = typeof name === 'string' ? name.trim() : '';\n\tthis.value = value || '';\n\tthis.id = this.template.getId() + '/' + this.name;\n};\n\n/* Inheritance */\n\nOO.mixinClass( ve.dm.MWParameterModel, OO.EventEmitter );\n\n/* Events */\n\n/**\n * Emitted when the parameter's value changed.\n *\n * @event ve.dm.MWParameterModel#change\n */\n\n/* Methods */\n\n/**\n * @return {boolean}\n */\nve.dm.MWParameterModel.prototype.isRequired = function () {\n\treturn this.template.getSpec().isParameterRequired( this.name );\n};\n\n/**\n * @return {boolean}\n */\nve.dm.MWParameterModel.prototype.isSuggested = function () {\n\treturn this.template.getSpec().isParameterSuggested( this.name );\n};\n\n/**\n * @return {boolean}\n */\nve.dm.MWParameterModel.prototype.isDeprecated = function () {\n\treturn this.template.getSpec().isParameterDeprecated( this.name );\n};\n\n/**\n * @return {boolean}\n */\nve.dm.MWParameterModel.prototype.isDocumented = function () {\n\treturn this.template.getSpec().isParameterDocumented( this.name );\n};\n\n/**\n * Get template of which this parameter is part.\n *\n * @return {ve.dm.MWTemplateModel}\n */\nve.dm.MWParameterModel.prototype.getTemplate = function () {\n\treturn this.template;\n};\n\n/**\n * Get unique parameter ID within the transclusion.\n *\n * @return {string} Unique ID\n */\nve.dm.MWParameterModel.prototype.getId = function () {\n\treturn this.id;\n};\n\n/**\n * @return {string} Trimmed parameter name, or an empty string if no name was provided\n */\nve.dm.MWParameterModel.prototype.getName = function () {\n\treturn this.name;\n};\n\n/**\n * Original parameter name. Will be used in {@see ve.dm.MWTransclusionPartModel.serialize}.\n *\n * @return {string|undefined} Untrimmed parameter name as provided on construction time\n */\nve.dm.MWParameterModel.prototype.getOriginalName = function () {\n\treturn this.originalName;\n};\n\n/**\n * @return {string} Parameter value, or automatic value if there is none stored.\n *  Otherwise an empty string.\n */\nve.dm.MWParameterModel.prototype.getValue = function () {\n\treturn this.value || this.getAutoValue() || '';\n};\n\n/**\n * @return {string[]}\n */\nve.dm.MWParameterModel.prototype.getSuggestedValues = function () {\n\treturn this.template.getSpec().getParameterSuggestedValues( this.name );\n};\n\n/**\n * @return {string}\n */\nve.dm.MWParameterModel.prototype.getDefaultValue = function () {\n\treturn this.template.getSpec().getParameterDefaultValue( this.name );\n};\n\n/**\n * @return {string|null}\n */\nve.dm.MWParameterModel.prototype.getExampleValue = function () {\n\treturn this.template.getSpec().getParameterExampleValue( this.name );\n};\n\n/**\n * @return {string}\n */\nve.dm.MWParameterModel.prototype.getAutoValue = function () {\n\treturn this.template.getSpec().getParameterAutoValue( this.name );\n};\n\n/**\n * @return {string} Parameter type, e.g. \"string\"\n */\nve.dm.MWParameterModel.prototype.getType = function () {\n\treturn this.template.getSpec().getParameterType( this.name );\n};\n\n/**\n * @param {string} value\n * @fires ve.dm.MWTemplateModel#change\n */\nve.dm.MWParameterModel.prototype.setValue = function ( value ) {\n\tif ( this.value !== value ) {\n\t\tthis.value = value;\n\t\tthis.emit( 'change' );\n\t}\n};\n\n/**\n * Remove parameter from template.\n */\nve.dm.MWParameterModel.prototype.remove = function () {\n\tthis.template.removeParameter( this );\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":"implicit-arrow-linebreak","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-mw/dm/models/ve.dm.MWTemplateModel.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":10,"column":1,"nodeType":"Block","endLine":10,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":130,"column":1,"nodeType":"Block","endLine":130,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":158,"column":1,"nodeType":"Block","endLine":158,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":249,"column":1,"nodeType":"Block","endLine":249,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":249,"column":1,"nodeType":"Block","endLine":249,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":314,"column":22,"nodeType":"MemberExpression","messageId":"forbidden","endLine":314,"endColumn":59}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWTemplateModel class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Represents a template invocation that's part of a (possibly unbalanced) sequence of template\n * invocations and raw wikitext snippets. Meant to be an item in a {@see ve.dm.MWTransclusionModel}.\n * Holds a back-reference to its parent.\n *\n * Holds a reference to the specification of the template, i.e. how the template is documented via\n * TemplateData. The actual invocation might be entirely different, missing parameters as well as\n * containing undocumented ones.\n *\n * @class\n * @extends ve.dm.MWTransclusionPartModel\n *\n * @constructor\n * @param {ve.dm.MWTransclusionModel} transclusion\n * @param {Object} target Template target\n * @param {string} target.wt Template name as originally used in the wikitext, including optional\n *  whitespace\n * @param {string} [target.href] Hypertext reference to target, e.g. \"./Template:Example\"\n */\nve.dm.MWTemplateModel = function VeDmMWTemplateModel( transclusion, target ) {\n\t// Parent constructor\n\tve.dm.MWTemplateModel.super.call( this, transclusion );\n\n\t// Properties\n\tthis.target = target;\n\n\t// TODO: Either here or in uses of this constructor we need to validate the title\n\tthis.title = target.href ? mw.libs.ve.normalizeParsoidResourceName( target.href ) : null;\n\tthis.orderedParameterNames = null;\n\tthis.params = {};\n\tthis.spec = new ve.dm.MWTemplateSpecModel( this );\n\tthis.originalData = null;\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.dm.MWTemplateModel, ve.dm.MWTransclusionPartModel );\n\n/* Events */\n\n/**\n * Emitted when a new parameter was added to the template.\n *\n * @event ve.dm.MWTemplateModel#add\n * @param {ve.dm.MWParameterModel} param Added param\n */\n\n/**\n * Emitted when a parameter was removed from the template.\n *\n * @event ve.dm.MWTemplateModel#remove\n * @param {ve.dm.MWParameterModel} param Removed param\n */\n\n/**\n * Emitted when anything changed, e.g. a parameter was added or removed, or a parameter's value\n * edited.\n *\n * @event ve.dm.MWTemplateModel#change\n */\n\n/* Static Methods */\n\n/**\n * Data is in the format provided by Parsoid.\n *\n * @param {ve.dm.MWTransclusionModel} transclusion Transclusion template is in\n * @param {Object} data Template data\n * @param {Object} data.params\n * @param {string} data.params.wt Wikitext\n * @return {ve.dm.MWTemplateModel} New template model\n */\nve.dm.MWTemplateModel.newFromData = function ( transclusion, data ) {\n\tconst template = new ve.dm.MWTemplateModel( transclusion, data.target );\n\n\tfor ( const key in data.params ) {\n\t\ttemplate.addParameter(\n\t\t\tnew ve.dm.MWParameterModel( template, key, data.params[ key ].wt )\n\t\t);\n\t}\n\n\ttemplate.setOriginalData( data );\n\n\treturn template;\n};\n\n/**\n * Name is equivalent to what would be entered between double brackets, defaulting to the Template\n * namespace, using a leading colon to access other namespaces.\n *\n * @param {ve.dm.MWTransclusionModel} transclusion Transclusion template is in\n * @param {string|mw.Title} name Template name\n * @return {ve.dm.MWTemplateModel|null} New template model\n */\nve.dm.MWTemplateModel.newFromName = function ( transclusion, name ) {\n\tconst templateNs = mw.config.get( 'wgNamespaceIds' ).template;\n\tlet title;\n\tif ( name instanceof mw.Title ) {\n\t\ttitle = name;\n\t\tname = title.getRelativeText( templateNs );\n\t} else {\n\t\ttitle = mw.Title.newFromText( name, templateNs );\n\t}\n\tif ( title !== null ) {\n\t\tconst href = title.getPrefixedText();\n\t\treturn new ve.dm.MWTemplateModel( transclusion, { href: href, wt: name } );\n\t}\n\n\treturn null;\n};\n\n/* Methods */\n\n/**\n * @return {Object} Template target\n */\nve.dm.MWTemplateModel.prototype.getTarget = function () {\n\treturn this.target;\n};\n\n/**\n * @return {string|null} Prefixed template title including the \"Template:\" namespace, if available.\n *  Use {@see ve.dm.MWTemplateSpecModel.getLabel} for a human-readable label without the namespace.\n */\nve.dm.MWTemplateModel.prototype.getTitle = function () {\n\treturn this.title;\n};\n\n/**\n * @return {string|null} Prefixed page name including the `Template:` namespace, but with syntax\n *  elements like `subst:` stripped.\n */\nve.dm.MWTemplateModel.prototype.getTemplateDataQueryTitle = function () {\n\t// FIXME: This currently doesn't strip localized versions of these magic words.\n\t// Strip magic words {{subst:…}} and {{safesubst:…}}\n\tconst name = this.target.wt.trim().replace( /^(?:safe)?subst:/i, '' ),\n\t\ttemplateNs = mw.config.get( 'wgNamespaceIds' ).template,\n\t\ttitle = mw.Title.newFromText( name, templateNs );\n\treturn title ? title.getPrefixedText() : this.getTitle();\n};\n\n/**\n * @return {ve.dm.MWTemplateSpecModel} Template specification\n */\nve.dm.MWTemplateModel.prototype.getSpec = function () {\n\treturn this.spec;\n};\n\n/**\n * Get all parameters that are currently present in this template invocation in the order as they\n * originally appear in the wikitext. This is critical for {@see serialize}. Might contain\n * placeholders with the parameter name \"\".\n *\n * @return {Object.<string,ve.dm.MWParameterModel>} Parameters keyed by name or alias\n */\nve.dm.MWTemplateModel.prototype.getParameters = function () {\n\treturn this.params;\n};\n\n/**\n * @param {string} name Parameter name or alias as originally used in the wikitext\n * @return {ve.dm.MWParameterModel|undefined}\n */\nve.dm.MWTemplateModel.prototype.getParameter = function ( name ) {\n\treturn this.params[ name ];\n};\n\n/**\n * Check if a parameter with this name or one of its aliases is currently part of this template.\n *\n * @param {string} name Parameter name or alias\n * @return {boolean} Parameter is in the template\n */\nve.dm.MWTemplateModel.prototype.hasParameter = function ( name ) {\n\treturn this.getOriginalParameterName( name ) in this.params;\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @return {string} Parameter name or alias as originally used in the wikitext\n */\nve.dm.MWTemplateModel.prototype.getOriginalParameterName = function ( name ) {\n\tif ( name in this.params ) {\n\t\treturn name;\n\t}\n\tconst aliases = this.spec.getParameterAliases( name );\n\t// FIXME: Should use .filter() when we dropped IE11 support\n\tfor ( let i = 0; i < aliases.length; i++ ) {\n\t\tif ( aliases[ i ] in this.params ) {\n\t\t\treturn aliases[ i ];\n\t\t}\n\t}\n\treturn this.spec.getPrimaryParameterName( name );\n};\n\n/**\n * Get all current and potential parameter names in a canonical order that's always the same,\n * unrelated to how the parameters appear in the wikitext. Parameter names and aliases documented\n * via TemplateData are first, in their documented order. Undocumented parameters are sorted with\n * numeric names first, followed by alphabetically sorted names. The unnamed placeholder parameter\n * is last.\n *\n * @return {string[]}\n */\nve.dm.MWTemplateModel.prototype.getAllParametersOrdered = function () {\n\tconst spec = this.spec,\n\t\tusedAliases = {};\n\n\tlet primaryName;\n\tfor ( const alias in this.params ) {\n\t\tif ( spec.isParameterAlias( alias ) ) {\n\t\t\tprimaryName = spec.getPrimaryParameterName( alias );\n\t\t\tif ( !usedAliases[ primaryName ] ) {\n\t\t\t\t// Skip primary name when it's not used, otherwise move it to the front\n\t\t\t\tusedAliases[ primaryName ] = primaryName in this.params ? [ primaryName ] : [];\n\t\t\t}\n\t\t\t// Append aliases in their original order (not documented order)\n\t\t\tusedAliases[ primaryName ].push( alias );\n\t\t}\n\t}\n\n\tlet parameters = spec.getCanonicalParameterOrder();\n\n\t// Restore aliases originally used in the wikitext. The spec doesn't know which alias was used.\n\tfor ( primaryName in usedAliases ) {\n\t\tconst i = parameters.indexOf( primaryName );\n\t\t// TODO: parameters.splice( i, 1, ...usedAliases[ primaryName ] ) when we can use ES6\n\t\tparameters = parameters.slice( 0, i ).concat( usedAliases[ primaryName ],\n\t\t\tparameters.slice( i + 1 ) );\n\t}\n\n\t// Restore the placeholder, if present. The spec doesn't keep track of placeholders.\n\tif ( '' in this.params ) {\n\t\tparameters.push( '' );\n\t}\n\n\t// TODO: cache results\n\treturn parameters;\n};\n\n/**\n * Returns the same parameters as {@see getParameters}, i.e. parameters that are currently present\n * in this template invocation, but sorted in a canonical order for presentational purposes.\n *\n * Don't use this if you need the parameters as they originally appear in the wikitext, or if you\n * don't care about an order. Use {@see getParameters} together with `Object.keys()` instead.\n *\n * @return {string[]} Sorted list of parameter names\n */\nve.dm.MWTemplateModel.prototype.getOrderedParameterNames = function () {\n\tif ( !this.orderedParameterNames ) {\n\t\tconst params = this.params;\n\t\tthis.orderedParameterNames = this.getAllParametersOrdered().filter( ( name ) => name in params );\n\t}\n\treturn this.orderedParameterNames;\n};\n\n/**\n * @param {ve.dm.MWParameterModel} param Parameter to add\n * @fires ve.dm.MWTemplateModel#add\n * @fires ve.dm.MWTemplateModel#change\n */\nve.dm.MWTemplateModel.prototype.addParameter = function ( param ) {\n\tconst name = param.getName();\n\tif ( name in this.params ) {\n\t\treturn;\n\t}\n\n\tthis.orderedParameterNames = null;\n\tthis.params[ name ] = param;\n\tthis.spec.fillFromTemplate();\n\t// This forwards change events from the nested ve.dm.MWParameterModel upwards. The array\n\t// syntax is a way to call `this.emit( 'change' )`.\n\tparam.connect( this, { change: [ 'emit', 'change' ] } );\n\tthis.emit( 'add', param );\n\tthis.emit( 'change' );\n};\n\n/**\n * Remove a parameter from this MWTemplateModel, and emit events which result in removing the\n * parameter from the UI. Note this does *not* remove the parameter from the linked specification.\n *\n * @param {ve.dm.MWParameterModel} [param]\n * @fires ve.dm.MWTemplateModel#remove\n * @fires ve.dm.MWTemplateModel#change\n */\nve.dm.MWTemplateModel.prototype.removeParameter = function ( param ) {\n\tif ( param ) {\n\t\tthis.orderedParameterNames = null;\n\t\tdelete this.params[ param.getName() ];\n\t\tparam.disconnect( this );\n\t\tthis.emit( 'remove', param );\n\t\tthis.emit( 'change' );\n\t}\n};\n\n/**\n * Add all non-existing required and suggested parameters, if any.\n */\nve.dm.MWTemplateModel.prototype.addPromptedParameters = function () {\n\tconst params = this.params,\n\t\tspec = this.spec,\n\t\tnames = spec.getKnownParameterNames();\n\n\tfor ( let i = 0; i < names.length; i++ ) {\n\t\tconst name = names[ i ];\n\t\tconst foundAlias = spec.getParameterAliases( name ).some( ( alias ) => alias in params );\n\t\tif (\n\t\t\t!foundAlias &&\n\t\t\t!params[ name ] &&\n\t\t\t(\n\t\t\t\tspec.isParameterRequired( name ) ||\n\t\t\t\tspec.isParameterSuggested( name )\n\t\t\t)\n\t\t) {\n\t\t\tthis.addParameter( new ve.dm.MWParameterModel( this, names[ i ] ) );\n\t\t}\n\t}\n};\n\n/**\n * Set original data, to be used as a base for serialization.\n *\n * @private\n * @param {Object} data Original data\n * @param {Object.<string,Object>} [data.params]\n */\nve.dm.MWTemplateModel.prototype.setOriginalData = function ( data ) {\n\tthis.originalData = data;\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWTemplateModel.prototype.serialize = function () {\n\tconst origData = this.originalData || {},\n\t\torigParams = origData.params || {},\n\t\ttemplate = { target: this.target, params: {} },\n\t\tspec = this.spec,\n\t\tparams = this.params;\n\n\tfor ( const name in params ) {\n\t\tif ( name === '' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\t// Don't add empty parameters (T101075)\n\t\t\tparams[ name ].getValue() === '' &&\n\t\t\t// …unless they were present before the edit\n\t\t\t!Object.prototype.hasOwnProperty.call( origParams, name ) &&\n\t\t\t// …unless they are required (T276989)\n\t\t\t!spec.isParameterRequired( name )\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst origName = params[ name ].getOriginalName();\n\t\ttemplate.params[ origName ] = ve.extendObject(\n\t\t\t{},\n\t\t\torigParams[ origName ],\n\t\t\t{ wt: params[ name ].getValue() }\n\t\t);\n\n\t}\n\n\t// Performs a non-deep extend, so this won't reintroduce\n\t// deleted parameters (T75134)\n\treturn { template: ve.extendObject( {}, origData, template ) };\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWTemplateModel.prototype.containsValuableData = function () {\n\tconst params = this.params;\n\n\treturn Object.keys( params ).some( ( name ) => {\n\t\t// Skip unnamed placeholders\n\t\tif ( !name ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst param = params[ name ],\n\t\t\tvalue = param.getValue();\n\t\treturn value &&\n\t\t\t// This will automatically be restored, see {@see ve.dm.MWParameterModel.getValue}\n\t\t\tvalue !== param.getAutoValue() &&\n\t\t\t// While this isn't always meaningless, it typically is, and it's easy to restore\n\t\t\tvalue !== param.getDefaultValue();\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":"implicit-arrow-linebreak","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-mw/dm/models/ve.dm.MWTemplatePlaceholderModel.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":10,"column":1,"nodeType":"Block","endLine":10,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWTemplatePlaceholderModel class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Represents a not yet realized template invocation as long as the user is still searching for a\n * template name. Meant to be an item in a {@see ve.dm.MWTransclusionModel}.\n *\n * @class\n * @extends ve.dm.MWTransclusionPartModel\n *\n * @constructor\n * @param {ve.dm.MWTransclusionModel} transclusion\n */\nve.dm.MWTemplatePlaceholderModel = function VeDmMWTemplatePlaceholderModel() {\n\t// Parent constructor\n\tve.dm.MWTemplatePlaceholderModel.super.apply( this, arguments );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.dm.MWTemplatePlaceholderModel, ve.dm.MWTransclusionPartModel );\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":"implicit-arrow-linebreak","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-mw/dm/models/ve.dm.MWTemplateSpecModel.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":89,"column":1,"nodeType":"Block","endLine":89,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":171,"column":1,"nodeType":"Block","endLine":171,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":213,"column":1,"nodeType":"Block","endLine":213,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":247,"column":1,"nodeType":"Block","endLine":247,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":275,"column":1,"nodeType":"Block","endLine":275,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":275,"column":1,"nodeType":"Block","endLine":275,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":439,"column":1,"nodeType":"Block","endLine":439,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWTemplateSpecModel class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * See https://www.mediawiki.org/wiki/Extension:TemplateData#Set_object\n *\n * @typedef {Object} Set\n * @memberof ve.dm.MWTemplateSpecModel\n * @property {string|Object.<string, string>} label A brief name for the parameter set.\n * @property {string[]} params One or more names of parameters to include in the set.\n */\n\n/**\n * Object literal returned by the TemplataData API. Expected to be in formatversion=2,\n * guaranteed via ve.init.mw.Target#getContentApi.\n *\n * @class ve.dm.MWTemplatePageMetadata\n * @private\n */\n/**\n * @property {string|boolean} [missing] Either \"1\" or true\n * @property {string|boolean} [notemplatedata] Either \"1\" or true when there is no user-provided\n *   documentation `params` are auto-detected in this case.\n * @property {string} title Template page name including the \"Template:\" namespace\n * @property {string|Object.<string,string>} [description] Template description\n * @property {Object.<string,ve.dm.MWTemplateParamDescription>} [params] Parameters by param name\n * @property {string[]} [paramOrder] Preferred parameter order as documented via TemplateData. If\n *  given, the TemplateData API makes sure this contains the same parameters as `params`.\n * @property {ve.dm.MWTemplateSpecModel.Set[]} [sets] List of parameter\n *  sets, i.e. parameters that belong together (whatever that means, this feature is underspecified\n *  and unused)\n * @property {Object.<string,Object.<string,string|string[]|string[][]>>} [maps] Source to target\n *  parameter mappings for consumers like Citoid or gadgets\n */\n\n/**\n * Object literal\n *\n * @class ve.dm.MWTemplateParamDescription\n * @private\n */\n/**\n * @property {string|Object.<string,string>} [label]\n * @property {string|Object.<string,string>} [description]\n * @property {string[]} [suggestedvalues]\n * @property {string} [default]\n * @property {string|Object.<string,string>} [example]\n * @property {string} [autovalue]\n * @property {string} [type]\n * @property {string[]} [aliases]\n * @property {boolean} [required]\n * @property {boolean} [suggested]\n * @property {boolean|string} [deprecated]\n */\n\n/**\n * Holds a mixture of:\n *\n * - A copy of a template's specification as it is documented via TemplateData.\n * - Undocumented parameters that appear in a template invocation, {@link #fillFromTemplate}.\n * - Documented aliases are also considered valid, known parameter names. Use\n *   {@link #isParameterAlias} to differentiate between the two.\n *\n * Therefore, this is not the original specification but an accessor to the documentation for an\n * individual template invocation. It's possibly different for every invocation.\n *\n * Meant to be in a 1:1 relationship to {@link ve.dm.MWTemplateModel}.\n *\n * The actual, unmodified specification can be found in the {@link #templateData} property and\n * the local `specCache` in {@link ve.dm.MWTransclusionModel}.\n *\n * See <https://github.com/wikimedia/mediawiki-extensions-TemplateData/blob/master/Specification.md>\n * for the latest version of the TemplateData specification.\n *\n * @class\n *\n * @constructor\n * @param {ve.dm.MWTemplateModel} template\n */\nve.dm.MWTemplateSpecModel = function VeDmMWTemplateSpecModel( template ) {\n\tthis.template = template;\n\t/**\n\t * @property {Object.<string,boolean>} seenParameterNames Keeps track of any parameter from any\n\t *  source and in which order they have been seen first. Includes parameters that have been removed\n\t *  during the lifetime of this object, i.e. {@see fillFromTemplate} doesn't remove parameters that\n\t *  have been seen before. The order is typically but not necessarily the original order in which\n\t *  the parameters appear in the template. Aliases are resolved and don't appear on their original\n\t *  position any more.\n\t */\n\tthis.seenParameterNames = {};\n\t/**\n\t * @property {Object} templateData Documentation as provided by the TemplateData API\n\t */\n\tthis.templateData = { notemplatedata: true, params: {} };\n\t/**\n\t * @property {Object.<string,string>} aliases Maps aliases to primary parameter names\n\t */\n\tthis.aliases = {};\n\n\t// Initialization\n\tthis.fillFromTemplate();\n};\n\nOO.initClass( ve.dm.MWTemplateSpecModel );\n\n/* Static methods */\n\n/**\n * @private\n * @param {string|Object.<string,string>|null} stringOrObject\n * @param {string} [languageCode]\n * @return {string|null|undefined}\n */\nve.dm.MWTemplateSpecModel.static.getLocalValue = function ( stringOrObject, languageCode ) {\n\treturn stringOrObject && typeof stringOrObject === 'object' ?\n\t\tOO.ui.getLocalValue( stringOrObject, languageCode ) :\n\t\tstringOrObject;\n};\n\n/* Methods */\n\n/**\n * Template spec data is available from the TemplateData extension's API.\n *\n * @param {ve.dm.MWTemplatePageMetadata} data\n */\nve.dm.MWTemplateSpecModel.prototype.setTemplateData = function ( data ) {\n\tif ( !data || !ve.isPlainObject( data ) ) {\n\t\treturn;\n\t}\n\n\tthis.templateData = data;\n\t// This is currently not optional in the TemplateData API but might be in the future\n\tif ( !this.templateData.params ) {\n\t\tthis.templateData.params = {};\n\t}\n\t// Incomplete server validation makes this possible, but the empty string is reserved for\n\t// {@see ve.ui.MWAddParameterPage}.\n\tdelete this.templateData.params[ '' ];\n\n\tlet resolveAliases = false;\n\n\tfor ( const primaryName in this.templateData.params ) {\n\t\tthis.seenParameterNames[ primaryName ] = true;\n\n\t\tconst aliases = this.getParameterAliases( primaryName );\n\t\tfor ( let i = 0; i < aliases.length; i++ ) {\n\t\t\tconst alias = aliases[ i ];\n\t\t\tthis.aliases[ alias ] = primaryName;\n\t\t\tif ( alias in this.seenParameterNames ) {\n\t\t\t\tresolveAliases = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( resolveAliases ) {\n\t\tconst primaryNames = {};\n\t\tfor ( const name in this.seenParameterNames ) {\n\t\t\tprimaryNames[ this.getPrimaryParameterName( name ) ] = true;\n\t\t}\n\t\tthis.seenParameterNames = primaryNames;\n\t}\n};\n\n/**\n * Adds all (possibly undocumented) parameters from the linked template to the list of known\n * parameters, {@see getKnownParameterNames}. This should be called every time a parameter is added\n * to the template.\n */\nve.dm.MWTemplateSpecModel.prototype.fillFromTemplate = function () {\n\tfor ( const name in this.template.getParameters() ) {\n\t\t// Ignore placeholder parameters with no name\n\t\tif ( name && !this.isKnownParameterOrAlias( name ) ) {\n\t\t\t// There is no information other than the names of the parameters, that they exist, and\n\t\t\t// in which order\n\t\t\tthis.seenParameterNames[ name ] = true;\n\t\t}\n\t}\n};\n\n/**\n * @return {string} Normalized template name without the \"Template:\" namespace prefix, if possible.\n *  Otherwise the unnormalized template name as used in the wikitext. Might even be a string like\n *  `{{example}}` when a template name is dynamically generated.\n */\nve.dm.MWTemplateSpecModel.prototype.getLabel = function () {\n\tlet title = this.template.getTemplateDataQueryTitle();\n\tif ( title ) {\n\t\ttry {\n\t\t\t// Normalize and remove namespace prefix if in the Template: namespace\n\t\t\ttitle = new mw.Title( title )\n\t\t\t\t.getRelativeText( mw.config.get( 'wgNamespaceIds' ).template );\n\t\t} catch ( e ) { }\n\t}\n\treturn title || this.template.getTarget().wt;\n};\n\n/**\n * @param {string} [languageCode]\n * @return {string|null} Template description or null if not available\n */\nve.dm.MWTemplateSpecModel.prototype.getDescription = function ( languageCode ) {\n\treturn this.constructor.static.getLocalValue( this.templateData.description || null, languageCode );\n};\n\n/**\n * True it the template does have any user-provided documentation. Note that undocumented templates\n * can still have auto-detected `params` and a `paramOrder`, while documented templates might not\n * have `params`. Use `{@see getDocumentedParameterOrder()}.length` to differentiate.\n *\n * @return {boolean}\n */\nve.dm.MWTemplateSpecModel.prototype.isDocumented = function () {\n\treturn !this.templateData.notemplatedata;\n};\n\n/**\n * Preferred order of parameters via TemplateData, without aliases or undocumented parameters. Empty\n * if the template is not documented. Otherwise the explicit `paramOrder` if given, or the order of\n * parameters as they appear in TemplateData. Returns a copy, i.e. it's safe to manipulate the\n * array.\n *\n * @return {string[]} Preferred order of parameters via TemplateData, if given\n */\nve.dm.MWTemplateSpecModel.prototype.getDocumentedParameterOrder = function () {\n\treturn Array.isArray( this.templateData.paramOrder ) ?\n\t\tthis.templateData.paramOrder.filter( ( name ) => name ) :\n\t\tObject.keys( this.templateData.params );\n};\n\n/**\n * The returned array is a copy, i.e. it's safe to manipulate.\n *\n * @return {string[]}\n */\nve.dm.MWTemplateSpecModel.prototype.getUndocumentedParameterNames = function () {\n\tconst documentedParameters = this.templateData.params;\n\n\treturn this.getKnownParameterNames().filter( ( name ) => !( name in documentedParameters ) );\n};\n\n/**\n * Same as {@see getKnownParameterNames}, but in a canonical order that's always the same, unrelated\n * to how the parameters appear in the wikitext. Primary parameter names documented via TemplateData\n * are first, in their documented order. Undocumented parameters are sorted with numeric names\n * first, followed by alphabetically sorted names.\n *\n * The returned array is a copy, i.e. it's safe to manipulate.\n *\n * @return {string[]}\n */\nve.dm.MWTemplateSpecModel.prototype.getCanonicalParameterOrder = function () {\n\tconst undocumentedParameters = this.getUndocumentedParameterNames();\n\n\tundocumentedParameters.sort( ( a, b ) => {\n\t\tif ( isNaN( a ) ) {\n\t\t\t// If a and b are string, order alphabetically, otherwise numbers before strings\n\t\t\treturn isNaN( b ) ? a.localeCompare( b ) : 1;\n\t\t} else {\n\t\t\t// If a and b are numeric, order incrementally, otherwise numbers before strings\n\t\t\treturn !isNaN( b ) ? a - b : -1;\n\t\t}\n\t} );\n\n\treturn this.getDocumentedParameterOrder().concat( undocumentedParameters );\n};\n\n/**\n * Check if a parameter name or alias was seen before. This includes parameters and aliases\n * documented via TemplateData as well as undocumented parameters, e.g. from the original template\n * invocation. When undocumented parameters are removed from the linked {@see ve.dm.MWTemplateModel}\n * they are still known and will still be offered via {@see getKnownParameterNames} for the lifetime\n * of this object.\n *\n * @param {string} name Parameter name or alias\n * @return {boolean}\n */\nve.dm.MWTemplateSpecModel.prototype.isKnownParameterOrAlias = function ( name ) {\n\treturn name in this.seenParameterNames || name in this.aliases;\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @return {boolean}\n */\nve.dm.MWTemplateSpecModel.prototype.isParameterAlias = function ( name ) {\n\treturn name in this.aliases;\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @return {boolean}\n */\nve.dm.MWTemplateSpecModel.prototype.isParameterDocumented = function ( name ) {\n\treturn name in this.templateData.params || name in this.aliases;\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @param {string} [languageCode]\n * @return {string} Descriptive label of the parameter, if given. Otherwise the alias or parameter\n *  name as is.\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterLabel = function ( name, languageCode ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn this.constructor.static.getLocalValue( param && param.label || name, languageCode );\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @param {string} [languageCode]\n * @return {string|null}\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterDescription = function ( name, languageCode ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn this.constructor.static.getLocalValue( param && param.description || null, languageCode );\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @return {string[]}\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterSuggestedValues = function ( name ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn param && param.suggestedvalues || [];\n};\n\n/**\n * The default value will be placed in the input field when the parameter is added. The user can\n * edit or even remove it.\n *\n * @param {string} name Parameter name or alias\n * @return {string} e.g. \"{{PAGENAME}}\"\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterDefaultValue = function ( name ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn param && param.default || '';\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @param {string} [languageCode]\n * @return {string|null}\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterExampleValue = function ( name, languageCode ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn this.constructor.static.getLocalValue( param && param.example || null, languageCode );\n};\n\n/**\n * The auto-value will be used by the template in case the user doesn't provide a value. In\n * VisualEditor this is only for documentation and should not appear in a serialization.\n *\n * @param {string} name Parameter name or alias\n * @return {string}\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterAutoValue = function ( name ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn param && param.autovalue || '';\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @return {string} e.g. \"string\"\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterType = function ( name ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn param && param.type || 'string';\n};\n\n/**\n * Warning, this does not return a copy. Don't manipulate the returned array.\n *\n * @param {string} name Parameter name or alias\n * @return {string[]} Alternate parameter names\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterAliases = function ( name ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn param && param.aliases || [];\n};\n\n/**\n * Get the parameter name, resolving an alias.\n *\n * If a parameter is not an alias of another, the output will be the same as the input.\n *\n * @param {string} name Parameter name or alias\n * @return {string}\n */\nve.dm.MWTemplateSpecModel.prototype.getPrimaryParameterName = function ( name ) {\n\treturn this.aliases[ name ] || name;\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @return {boolean}\n */\nve.dm.MWTemplateSpecModel.prototype.isParameterRequired = function ( name ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn !!( param && param.required );\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @return {boolean}\n */\nve.dm.MWTemplateSpecModel.prototype.isParameterSuggested = function ( name ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn !!( param && param.suggested );\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @return {boolean}\n */\nve.dm.MWTemplateSpecModel.prototype.isParameterDeprecated = function ( name ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn !!( param && ( param.deprecated || typeof param.deprecated === 'string' ) );\n};\n\n/**\n * @param {string} name Parameter name or alias\n * @return {string} Explaining of why parameter is deprecated, empty if parameter is either not\n *   deprecated or no description has been specified\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterDeprecationDescription = function ( name ) {\n\tconst param = this.templateData.params[ this.getPrimaryParameterName( name ) ];\n\treturn param && typeof param.deprecated === 'string' ? param.deprecated : '';\n};\n\n/**\n * Get all known primary parameter names, without aliases, in their original order as they became\n * known (usually but not necessarily the order in which they appear in the template). This still\n * includes undocumented parameters that have been part of the template at some point during the\n * lifetime of this object, but have been removed from the linked {@see ve.dm.MWTemplateModel} in\n * the meantime.\n *\n * The returned array is a copy, i.e. it's safe to manipulate.\n *\n * @return {string[]} Primary parameter names\n */\nve.dm.MWTemplateSpecModel.prototype.getKnownParameterNames = function () {\n\treturn Object.keys( this.seenParameterNames );\n};\n\n/**\n * @return {ve.dm.MWTemplateSpecModel.Set[]}\n */\nve.dm.MWTemplateSpecModel.prototype.getParameterSets = function () {\n\treturn this.templateData.sets || [];\n};\n\n/**\n * See https://www.mediawiki.org/wiki/Extension:TemplateData#Maps_object\n *\n * @return {Object.<string,Object>}\n */\nve.dm.MWTemplateSpecModel.prototype.getMaps = function () {\n\treturn this.templateData.maps || {};\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":"implicit-arrow-linebreak","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-mw/dm/models/ve.dm.MWTransclusionContentModel.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":10,"column":1,"nodeType":"Block","endLine":10,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWTransclusionContentModel class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Represents a raw wikitext snippet that is part of an unbalanced sequence of template invocations.\n * Meant to be an item in a {@see ve.dm.MWTransclusionModel}. Holds a back-reference to it's parent.\n *\n * @class\n * @extends ve.dm.MWTransclusionPartModel\n *\n * @constructor\n * @param {ve.dm.MWTransclusionModel} transclusion\n * @param {string} [wikitext='']\n */\nve.dm.MWTransclusionContentModel = function VeDmMWTransclusionContentModel( transclusion, wikitext ) {\n\t// Parent constructor\n\tve.dm.MWTransclusionContentModel.super.call( this, transclusion );\n\n\t// Properties\n\tthis.wikitext = wikitext || '';\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.dm.MWTransclusionContentModel, ve.dm.MWTransclusionPartModel );\n\n/* Events */\n\n/**\n * Emitted when the wikitext changed.\n *\n * @event ve.dm.MWTransclusionContentModel#change\n */\n\n/* Methods */\n\n/**\n * @param {string} wikitext\n * @fires ve.dm.MWTransclusionContentModel#change\n */\nve.dm.MWTransclusionContentModel.prototype.setWikitext = function ( wikitext ) {\n\tif ( this.wikitext !== wikitext ) {\n\t\tthis.wikitext = wikitext;\n\t\tthis.emit( 'change' );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWTransclusionContentModel.prototype.serialize = function () {\n\treturn this.wikitext;\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWTransclusionContentModel.prototype.containsValuableData = function () {\n\treturn this.wikitext !== '';\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":"implicit-arrow-linebreak","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-mw/dm/models/ve.dm.MWTransclusionModel.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":18,"column":1,"nodeType":"Block","endLine":18,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":43,"column":1,"nodeType":"Block","endLine":43,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":88,"column":1,"nodeType":"Block","endLine":88,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":171,"column":1,"nodeType":"Block","endLine":171,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":326,"column":1,"nodeType":"Block","endLine":326,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":393,"column":1,"nodeType":"Block","endLine":393,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":444,"column":1,"nodeType":"Block","endLine":444,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":469,"column":1,"nodeType":"Block","endLine":469,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":502,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":502,"endColumn":26},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":590,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":590,"endColumn":25}],"suppressedMessages":[{"ruleId":"no-undef","severity":2,"message":"'$' is not defined.","line":132,"column":25,"nodeType":"Identifier","messageId":"undef","endLine":132,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":2,"fatalErrorCount":0,"warningCount":8,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWTransclusionModel class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Object literal\n *\n * @class ve.dm.MWTransclusionPartInstruction\n * @private\n */\n/**\n * @property {ve.dm.MWTransclusionPartModel} [remove]\n * @property {ve.dm.MWTransclusionPartModel} [add]\n * @property {number} [index]\n * @property {jQuery.Deferred} [deferred]\n */\n\n( function () {\n\tconst hasOwn = Object.hasOwnProperty,\n\t\tspecCache = {};\n\n\t/**\n\t * Represents a MediaWiki transclusion, i.e. a sequence of one or more template invocations that\n\t * strictly belong to each other (e.g. because they are unbalanced), possibly mixed with raw\n\t * wikitext snippets. These individual \"parts\" are subclasses of ve.dm.MWTransclusionPartModel.\n\t *\n\t * @class\n\t * @mixes OO.EventEmitter\n\t *\n\t * @constructor\n\t * @param {ve.dm.Document} doc Document to use associate with API requests\n\t */\n\tve.dm.MWTransclusionModel = function VeDmMWTransclusionModel( doc ) {\n\t\t// Mixin constructors\n\t\tOO.EventEmitter.call( this );\n\n\t\t/**\n\t\t * @property {ve.dm.MWTransclusionPartModel[]} parts\n\t\t * @property {number} uid\n\t\t * @property {jQuery.Promise[]} templateDataApiRequests Currently running API requests. The only\n\t\t *  reason to keep these around is to be able to abort them earlier when the template dialog\n\t\t *  closes or resets.\n\t\t * @property {Object[]} changeQueue\n\t\t */\n\t\tthis.doc = doc;\n\t\tthis.parts = [];\n\t\tthis.uid = 0;\n\t\tthis.templateDataApiRequests = [];\n\t\tthis.changeQueue = [];\n\t};\n\n\t/* Inheritance */\n\n\tOO.mixinClass( ve.dm.MWTransclusionModel, OO.EventEmitter );\n\n\t/* Events */\n\n\t/**\n\t * Emitted when a part is added, removed, replaced (e.g. a placeholder with an actual template),\n\t * or an existing part changed position.\n\t *\n\t * @event ve.dm.MWTransclusionPartInstruction#replace\n\t * @param {ve.dm.MWTransclusionPartModel|null} removed Removed part\n\t * @param {ve.dm.MWTransclusionPartModel|null} added Added or moved part\n\t * @param {number} [newPosition] Position the part was added or moved to\n\t */\n\n\t/**\n\t * Emitted when anything changed, including any changes in the content of the parts.\n\t *\n\t * @event ve.dm.MWTransclusionPartInstruction#change\n\t */\n\n\t/* Methods */\n\n\t/**\n\t * Insert transclusion at the end of a surface fragment.\n\t *\n\t * If forceType is not specified and this is used in async mode, users of this method\n\t * should ensure the surface is not accessible while the type is being evaluated.\n\t *\n\t * @param {ve.dm.SurfaceFragment} surfaceFragment Surface fragment after which to insert.\n\t * @param {string} [forceType] Force the type to 'inline' or 'block'. If not\n\t *   specified it will be evaluated asynchronously.\n\t * @return {jQuery.Promise} Promise which resolves when the node has been inserted. If\n\t *   forceType was specified this will be instant.\n\t */\n\tve.dm.MWTransclusionModel.prototype.insertTransclusionNode = function ( surfaceFragment, forceType ) {\n\t\tconst deferred = ve.createDeferred(),\n\t\t\tbaseNodeClass = ve.dm.MWTransclusionNode;\n\n\t\tconst insertNode = ( isInline, generatedContents ) => {\n\t\t\tconst type = isInline ? baseNodeClass.static.inlineType : baseNodeClass.static.blockType,\n\t\t\t\tdata = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tmw: this.getPlainObject()\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{ type: '/' + type }\n\t\t\t\t];\n\n\t\t\t// If we just fetched the generated contents, put them in the store\n\t\t\t// so we don't do a duplicate API call later.\n\t\t\tif ( generatedContents ) {\n\t\t\t\tconst nodeClass = ve.dm.modelRegistry.lookup( type );\n\t\t\t\tconst store = surfaceFragment.getDocument().getStore();\n\t\t\t\tconst hash = OO.getHash( [ nodeClass.static.getHashObjectForRendering( data[ 0 ] ), undefined ] );\n\t\t\t\tstore.hash( generatedContents, hash );\n\t\t\t}\n\n\t\t\tsurfaceFragment.insertContent( data );\n\n\t\t\tdeferred.resolve();\n\t\t};\n\n\t\tif ( forceType ) {\n\t\t\tinsertNode( forceType === 'inline' );\n\t\t} else {\n\t\t\tve.init.target.parseWikitextFragment(\n\t\t\t\tbaseNodeClass.static.getWikitext( this.getPlainObject() ),\n\t\t\t\ttrue,\n\t\t\t\tsurfaceFragment.getDocument()\n\t\t\t).then( ( response ) => {\n\t\t\t\tif ( ve.getProp( response, 'visualeditor', 'result' ) === 'success' ) {\n\t\t\t\t\t// This method is only ever run by a client, so it is okay to use jQuery\n\t\t\t\t\t// eslint-disable-next-line no-undef\n\t\t\t\t\tlet contentNodes = $.parseHTML( response.visualeditor.content, surfaceFragment.getDocument().getHtmlDocument() ) || [];\n\t\t\t\t\tcontentNodes = ve.ce.MWTransclusionNode.static.filterRendering( contentNodes );\n\t\t\t\t\tinsertNode(\n\t\t\t\t\t\tbaseNodeClass.static.isHybridInline( contentNodes, ve.dm.converter.modelFromDomConverter ),\n\t\t\t\t\t\tcontentNodes\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// Request failed - just assume inline\n\t\t\t\t\tinsertNode( true );\n\t\t\t\t}\n\t\t\t}, () => {\n\t\t\t\tinsertNode( true );\n\t\t\t} );\n\t\t}\n\t\treturn deferred.promise();\n\t};\n\n\t/**\n\t * Update transclusion node in a document.\n\t *\n\t * @param {ve.dm.Surface} surfaceModel Surface model of main document\n\t * @param {ve.dm.MWTransclusionNode} node Transclusion node to update\n\t */\n\tve.dm.MWTransclusionModel.prototype.updateTransclusionNode = function ( surfaceModel, node ) {\n\t\tconst obj = this.getPlainObject();\n\n\t\tif ( obj !== null ) {\n\t\t\tsurfaceModel.getLinearFragment( node.getOuterRange(), true )\n\t\t\t\t.changeAttributes( { mw: obj } );\n\t\t} else {\n\t\t\tsurfaceModel.getLinearFragment( node.getOuterRange(), true )\n\t\t\t\t.removeContent();\n\t\t}\n\t};\n\n\t/**\n\t * Load from transclusion data, and fetch spec from server.\n\t *\n\t * @param {Object} data Transclusion data\n\t * @return {jQuery.Promise} Promise, resolved when spec is loaded\n\t */\n\tve.dm.MWTransclusionModel.prototype.load = function ( data ) {\n\t\tconst promises = [];\n\n\t\t// Convert single part format to multi-part format\n\t\t// Parsoid doesn't use this format any more, but we accept it for backwards compatibility\n\t\tif ( data.params && data.target ) {\n\t\t\tdata = { parts: [ { template: data } ] };\n\t\t}\n\n\t\tif ( Array.isArray( data.parts ) ) {\n\t\t\tfor ( let i = 0; i < data.parts.length; i++ ) {\n\t\t\t\tconst part = data.parts[ i ];\n\t\t\t\tif ( part.template ) {\n\t\t\t\t\tconst deferred = ve.createDeferred();\n\t\t\t\t\tpromises.push( deferred.promise() );\n\t\t\t\t\tthis.changeQueue.push( {\n\t\t\t\t\t\tadd: ve.dm.MWTemplateModel.newFromData( this, part.template ),\n\t\t\t\t\t\tdeferred: deferred\n\t\t\t\t\t} );\n\t\t\t\t} else if ( typeof part === 'string' ) {\n\t\t\t\t\tconst deferred = ve.createDeferred();\n\t\t\t\t\tpromises.push( deferred.promise() );\n\t\t\t\t\tthis.changeQueue.push( {\n\t\t\t\t\t\tadd: new ve.dm.MWTransclusionContentModel( this, part ),\n\t\t\t\t\t\tdeferred: deferred\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetTimeout( this.processChangeQueue.bind( this ) );\n\t\t}\n\n\t\treturn ve.promiseAll( promises );\n\t};\n\n\t/**\n\t * Process one or more queue items.\n\t *\n\t * @private\n\t * @param {ve.dm.MWTransclusionPartInstruction[]} queue List of objects containing parts to add and optionally\n\t * indexes to add them at, if no index is given parts will be added at the end\n\t * @fires ve.dm.MWTransclusionPartInstruction#replace For each item added\n\t * @fires ve.dm.MWTransclusionPartInstruction#change\n\t */\n\tve.dm.MWTransclusionModel.prototype.resolveChangeQueue = function ( queue ) {\n\t\tconst resolveQueue = [];\n\n\t\tfor ( let i = 0; i < queue.length; i++ ) {\n\t\t\tconst item = queue[ i ];\n\t\t\tlet remove = 0;\n\n\t\t\tif ( item.add instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\tconst title = item.add.getTemplateDataQueryTitle();\n\t\t\t\tif ( hasOwn.call( specCache, title ) && specCache[ title ] ) {\n\t\t\t\t\titem.add.getSpec().setTemplateData( specCache[ title ] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Use specified index\n\t\t\tlet index = item.index;\n\t\t\t// Auto-remove if already existing, preserving index\n\t\t\tconst existing = this.parts.indexOf( item.add );\n\t\t\tif ( existing !== -1 ) {\n\t\t\t\tthis.removePart( item.add );\n\t\t\t\tif ( index && existing + 1 < index ) {\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Derive index from removal if given\n\t\t\tif ( index === undefined && item.remove ) {\n\t\t\t\tindex = this.parts.indexOf( item.remove );\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\tremove = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Use last index as a last resort\n\t\t\tif ( index === undefined || index === -1 ) {\n\t\t\t\tindex = this.parts.length;\n\t\t\t}\n\n\t\t\tthis.parts.splice( index, remove, item.add );\n\t\t\tif ( item.add ) {\n\t\t\t\t// This forwards change events from the nested ve.dm.MWTransclusionPartModel upwards.\n\t\t\t\t// The array syntax is a way to call `this.emit( 'change' )`.\n\t\t\t\titem.add.connect( this, { change: [ 'emit', 'change' ] } );\n\t\t\t}\n\t\t\tif ( item.remove ) {\n\t\t\t\titem.remove.disconnect( this );\n\t\t\t}\n\t\t\tthis.emit( 'replace', item.remove || null, item.add, index );\n\n\t\t\t// Resolve promises\n\t\t\tif ( item.deferred ) {\n\t\t\t\tresolveQueue.push( item.deferred );\n\t\t\t}\n\t\t}\n\t\tthis.emit( 'change' );\n\n\t\t// We need to go back and resolve the deferreds after emitting change.\n\t\t// Otherwise we get silly situations like a single change event being\n\t\t// guaranteed after the transclusion loaded promise gets resolved.\n\t\tresolveQueue.forEach( ( queueItem ) => {\n\t\t\tqueueItem.resolve();\n\t\t} );\n\t};\n\n\t/**\n\t * @private\n\t */\n\tve.dm.MWTransclusionModel.prototype.processChangeQueue = function () {\n\t\tconst templateNamespaceId = mw.config.get( 'wgNamespaceIds' ).template,\n\t\t\ttitles = [];\n\n\t\tif ( !this.changeQueue.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst queue = this.changeQueue.slice();\n\n\t\t// Clear shared queue for future calls\n\t\tthis.changeQueue.length = 0;\n\n\t\t// Get unique list of template titles that aren't already loaded\n\t\tfor ( let i = 0; i < queue.length; i++ ) {\n\t\t\tconst item = queue[ i ];\n\t\t\tif ( item.add instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\tconst title = item.add.getTemplateDataQueryTitle(),\n\t\t\t\t\tmwTitle = title ? mw.Title.newFromText( title, templateNamespaceId ) : null;\n\t\t\t\tif (\n\t\t\t\t\t// Skip titles that don't have a resolvable href\n\t\t\t\t\tmwTitle &&\n\t\t\t\t\t// Skip already cached data\n\t\t\t\t\t!hasOwn.call( specCache, title ) &&\n\t\t\t\t\t// Skip duplicate titles in the same batch\n\t\t\t\t\t!titles.includes( title )\n\t\t\t\t) {\n\t\t\t\t\ttitles.push( title );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Bypass server for empty lists\n\t\tif ( !titles.length ) {\n\t\t\tsetTimeout( this.resolveChangeQueue.bind( this, queue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.templateDataApiRequests.push( this.callTemplateDataApi( titles, queue ) );\n\t};\n\n\t/**\n\t * @private\n\t * @param {string[]} titles\n\t * @param {ve.dm.MWTransclusionPartInstruction[]} queue\n\t * @return {jQuery.Promise}\n\t */\n\tve.dm.MWTransclusionModel.prototype.callTemplateDataApi = function ( titles, queue ) {\n\t\tconst xhr = ve.init.target.getContentApi( this.doc ).get( {\n\t\t\taction: 'templatedata',\n\t\t\ttitles: titles,\n\t\t\tlang: mw.config.get( 'wgUserLanguage' ),\n\t\t\tincludeMissingTitles: '1',\n\t\t\tredirects: '1'\n\t\t} );\n\n\t\txhr.then( this.cacheTemplateDataApiResponse.bind( this ) ).always(\n\t\t\tthis.markRequestAsDone.bind( this, xhr ),\n\t\t\tthis.resolveChangeQueue.bind( this, queue )\n\t\t);\n\t\treturn xhr;\n\t};\n\n\t/**\n\t * @private\n\t * @param {Object} [data]\n\t * @param {Object.<number,ve.dm.MWTemplatePageMetadata>} [data.pages]\n\t */\n\tve.dm.MWTransclusionModel.prototype.cacheTemplateDataApiResponse = function ( data ) {\n\t\tif ( !data || !data.pages ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Keep spec data on hand for future use\n\t\tfor ( const id in data.pages ) {\n\t\t\tconst title = data.pages[ id ].title;\n\n\t\t\tif ( data.pages[ id ].missing ) {\n\t\t\t\t// Remember templates that don't exist in the link cache\n\t\t\t\t// { title: { missing: true|false }\n\t\t\t\tconst missingTitle = {};\n\t\t\t\tmissingTitle[ title ] = { missing: true };\n\t\t\t\tve.init.platform.linkCache.setMissing( missingTitle );\n\t\t\t} else if ( data.pages[ id ].notemplatedata && !OO.isPlainObject( data.pages[ id ].params ) ) {\n\t\t\t\t// (T243868) Prevent asking again for templates that have neither user-provided specs\n\t\t\t\t// nor automatically detected params\n\t\t\t\tspecCache[ title ] = {};\n\t\t\t\tspecCache[ title ].pageId = id;\n\t\t\t} else {\n\t\t\t\tspecCache[ title ] = data.pages[ id ];\n\t\t\t\tspecCache[ title ].pageId = id;\n\t\t\t}\n\t\t}\n\n\t\t// Follow redirects\n\t\tconst aliasMap = data.redirects || [];\n\t\t// Follow MW's normalisation\n\t\tif ( data.normalized ) {\n\t\t\tve.batchPush( aliasMap, data.normalized );\n\t\t}\n\t\t// Cross-reference aliased titles.\n\t\tfor ( let i = 0; i < aliasMap.length; i++ ) {\n\t\t\t// Only define the alias if the target exists, otherwise\n\t\t\t// we create a new property with an invalid \"undefined\" value.\n\t\t\tif ( hasOwn.call( specCache, aliasMap[ i ].to ) ) {\n\t\t\t\tspecCache[ aliasMap[ i ].from ] = specCache[ aliasMap[ i ].to ];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @private\n\t * @param {jQuery.Promise} apiPromise\n\t */\n\tve.dm.MWTransclusionModel.prototype.markRequestAsDone = function ( apiPromise ) {\n\t\t// Prune completed request\n\t\tconst index = this.templateDataApiRequests.indexOf( apiPromise );\n\t\tif ( index !== -1 ) {\n\t\t\tthis.templateDataApiRequests.splice( index, 1 );\n\t\t}\n\t};\n\n\tve.dm.MWTransclusionModel.prototype.abortAllApiRequests = function () {\n\t\tfor ( let i = 0; i < this.templateDataApiRequests.length; i++ ) {\n\t\t\tthis.templateDataApiRequests[ i ].abort();\n\t\t}\n\t\tthis.templateDataApiRequests.length = 0;\n\t};\n\n\t/**\n\t * Get plain object representation of template transclusion.\n\t *\n\t * @return {Object|null} Plain object representation, or null if empty\n\t */\n\tve.dm.MWTransclusionModel.prototype.getPlainObject = function () {\n\t\tconst parts = [];\n\n\t\tfor ( let i = 0; i < this.parts.length; i++ ) {\n\t\t\tconst part = this.parts[ i ];\n\t\t\tconst serialization = part.serialize();\n\t\t\tif ( serialization !== undefined && serialization !== '' ) {\n\t\t\t\tparts.push( serialization );\n\t\t\t}\n\t\t}\n\n\t\treturn parts.length ? { parts: parts } : null;\n\t};\n\n\t/**\n\t * @return {string} Next part ID, starting from \"part_0\", guaranteed to be unique for this\n\t *  transclusion\n\t */\n\tve.dm.MWTransclusionModel.prototype.nextUniquePartId = function () {\n\t\treturn 'part_' + this.uid++;\n\t};\n\n\t/**\n\t * Replace asynchronously.\n\t *\n\t * @param {ve.dm.MWTransclusionPartModel} remove Part to remove\n\t * @param {ve.dm.MWTransclusionPartModel} add Part to add\n\t * @throws {Error} If part to remove is not valid\n\t * @throws {Error} If part to add is not valid\n\t * @return {jQuery.Promise} Promise, resolved when part is added\n\t */\n\tve.dm.MWTransclusionModel.prototype.replacePart = function ( remove, add ) {\n\t\tconst deferred = ve.createDeferred();\n\t\tif (\n\t\t\t!( remove instanceof ve.dm.MWTransclusionPartModel ) ||\n\t\t\t!( add instanceof ve.dm.MWTransclusionPartModel )\n\t\t) {\n\t\t\tthrow new Error( 'Invalid transclusion part' );\n\t\t}\n\t\tthis.changeQueue.push( { remove: remove, add: add, deferred: deferred } );\n\n\t\t// Fetch on next yield to process items in the queue together, subsequent calls will\n\t\t// have no effect because the queue will be clear\n\t\tsetTimeout( this.processChangeQueue.bind( this ) );\n\n\t\treturn deferred.promise();\n\t};\n\n\t/**\n\t * Added asynchronously, but order is preserved.\n\t *\n\t * @param {ve.dm.MWTransclusionPartModel} part\n\t * @param {number} [index] Specific index to add content at, defaults to the end\n\t * @throws {Error} If part is not valid\n\t * @return {jQuery.Promise} Promise, resolved when part is added\n\t */\n\tve.dm.MWTransclusionModel.prototype.addPart = function ( part, index ) {\n\t\tconst deferred = ve.createDeferred();\n\t\tif ( !( part instanceof ve.dm.MWTransclusionPartModel ) ) {\n\t\t\tthrow new Error( 'Invalid transclusion part' );\n\t\t}\n\t\tthis.changeQueue.push( { add: part, index: index, deferred: deferred } );\n\n\t\t// Fetch on next yield to process items in the queue together, subsequent calls to fetch will\n\t\t// have no effect because the queue will be clear\n\t\tsetTimeout( this.processChangeQueue.bind( this ) );\n\n\t\treturn deferred.promise();\n\t};\n\n\t/**\n\t * @param {ve.dm.MWTransclusionPartModel} part\n\t * @fires ve.dm.MWTransclusionPartInstruction#replace\n\t */\n\tve.dm.MWTransclusionModel.prototype.removePart = function ( part ) {\n\t\tconst index = this.parts.indexOf( part );\n\t\tif ( index !== -1 ) {\n\t\t\tthis.parts.splice( index, 1 );\n\t\t\tpart.disconnect( this );\n\t\t\tthis.emit( 'replace', part, null );\n\t\t}\n\t};\n\n\t/**\n\t * @return {boolean} True if the transclusion is literally empty or contains only placeholders\n\t */\n\tve.dm.MWTransclusionModel.prototype.isEmpty = function () {\n\t\treturn this.parts.every( ( part ) => part instanceof ve.dm.MWTemplatePlaceholderModel );\n\t};\n\n\t/**\n\t * @return {boolean} True if this is a single template or template placeholder\n\t */\n\tve.dm.MWTransclusionModel.prototype.isSingleTemplate = function () {\n\t\treturn this.parts.length === 1 && (\n\t\t\tthis.parts[ 0 ] instanceof ve.dm.MWTemplateModel ||\n\t\t\tthis.parts[ 0 ] instanceof ve.dm.MWTemplatePlaceholderModel\n\t\t);\n\t};\n\n\t/**\n\t * @return {ve.dm.MWTransclusionPartModel[]} All parts in this transclusion\n\t */\n\tve.dm.MWTransclusionModel.prototype.getParts = function () {\n\t\treturn this.parts;\n\t};\n\n\t/**\n\t * Matching is performed against the first section of the `id`, delimited by a '/'.\n\t *\n\t * @param {string} [id] Any id, including slash-delimited template parameter ids\n\t * @return {ve.dm.MWTransclusionPartModel|undefined} Part with matching ID, if found\n\t */\n\tve.dm.MWTransclusionModel.prototype.getPartFromId = function ( id ) {\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// For ids from ve.dm.MWParameterModel, compare against the part id\n\t\t// of the parameter instead of the entire model id (e.g. \"part_1\" instead of \"part_1/foo\").\n\t\tconst partId = id.split( '/', 1 )[ 0 ];\n\n\t\tfor ( let i = 0; i < this.parts.length; i++ ) {\n\t\t\tif ( this.parts[ i ].getId() === partId ) {\n\t\t\t\treturn this.parts[ i ];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Get the index of a part or parameter.\n\t *\n\t * Indexes are linear depth-first addresses in the transclusion tree.\n\t *\n\t * @param {ve.dm.MWTransclusionPartModel|ve.dm.MWParameterModel} model Part or parameter\n\t * @return {number} Page index of model\n\t */\n\tve.dm.MWTransclusionModel.prototype.getIndex = function ( model ) {\n\t\tconst parts = this.parts;\n\n\t\tlet index = 0;\n\t\tfor ( let i = 0; i < parts.length; i++ ) {\n\t\t\tconst part = parts[ i ];\n\t\t\tif ( part === model ) {\n\t\t\t\treturn index;\n\t\t\t}\n\t\t\tindex++;\n\t\t\tif ( part instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\tconst names = part.getOrderedParameterNames();\n\t\t\t\tfor ( let j = 0; j < names.length; j++ ) {\n\t\t\t\t\tif ( part.getParameter( names[ j ] ) === model ) {\n\t\t\t\t\t\treturn index;\n\t\t\t\t\t}\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t};\n\n\t/**\n\t * Add missing required and suggested parameters to each transclusion.\n\t */\n\tve.dm.MWTransclusionModel.prototype.addPromptedParameters = function () {\n\t\tthis.parts.forEach( ( part ) => {\n\t\t\tif ( part instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\tpart.addPromptedParameters();\n\t\t\t}\n\t\t} );\n\t};\n\n\t/**\n\t * @return {boolean} True if any transclusion part contains meaningful, non-default user input\n\t */\n\tve.dm.MWTransclusionModel.prototype.containsValuableData = function () {\n\t\treturn this.parts.some( ( part ) => part.containsValuableData() );\n\t};\n\n\t/**\n\t * Resets the model's state.\n\t */\n\tve.dm.MWTransclusionModel.prototype.reset = function () {\n\t\tthis.parts = [];\n\t\tthis.uid = 0;\n\t\tthis.templateDataApiRequests = [];\n\t\tthis.changeQueue = [];\n\t};\n\n\t// Temporary compatibility for https://github.com/femiwiki/Sanctions/pull/118. Remove when not\n\t// needed any more.\n\tmw.log.deprecate( ve.dm.MWTransclusionModel.prototype, 'abortRequests',\n\t\tve.dm.MWTransclusionModel.prototype.abortAllApiRequests,\n\t\t'Use \"abortAllApiRequests\" instead.'\n\t);\n\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":"implicit-arrow-linebreak","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-mw/dm/models/ve.dm.MWTransclusionPartModel.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":9,"column":1,"nodeType":"Block","endLine":9,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":9,"column":1,"nodeType":"Block","endLine":9,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":9,"column":1,"nodeType":"Block","endLine":9,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":9,"column":1,"nodeType":"Block","endLine":9,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":74,"column":1,"nodeType":"Block","endLine":74,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":74,"column":1,"nodeType":"Block","endLine":74,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWTransclusionPartModel class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Abstract base class for items in a {@see ve.dm.MWTransclusionModel}. Holds a back-reference to\n * it's parent. Currently used for:\n * - {@see ve.dm.MWTemplateModel} for a single template invocation.\n * - {@see ve.dm.MWTemplatePlaceholderModel} while searching for a template name to be added.\n * - {@see ve.dm.MWTransclusionContentModel} for a raw wikitext snippet.\n *\n * @abstract\n * @class\n * @mixes OO.EventEmitter\n *\n * @constructor\n * @param {ve.dm.MWTransclusionModel} transclusion\n */\nve.dm.MWTransclusionPartModel = function VeDmMWTransclusionPartModel( transclusion ) {\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Properties\n\tthis.transclusion = transclusion;\n\tthis.id = this.transclusion.nextUniquePartId();\n};\n\n/* Inheritance */\n\nOO.mixinClass( ve.dm.MWTransclusionPartModel, OO.EventEmitter );\n\n/* Events */\n\n/**\n * Emitted when anything changed in the content the part represents, e.g. a parameter was added to a\n * template, or a value edited.\n *\n * @event ve.dm.MWTransclusionPartModel#change\n */\n\n/* Methods */\n\n/**\n * Get transclusion part is in.\n *\n * @return {ve.dm.MWTransclusionModel} Transclusion\n */\nve.dm.MWTransclusionPartModel.prototype.getTransclusion = function () {\n\treturn this.transclusion;\n};\n\n/**\n * Get a unique part ID within the transclusion.\n *\n * @return {string} Unique ID\n */\nve.dm.MWTransclusionPartModel.prototype.getId = function () {\n\treturn this.id;\n};\n\n/**\n * Remove part from transclusion.\n */\nve.dm.MWTransclusionPartModel.prototype.remove = function () {\n\tthis.transclusion.removePart( this );\n};\n\n/**\n * Create a serialized representation of this part. Contains all information needed to recreate the\n * original wikitext, including extra whitespace. Used in\n * {@see ve.dm.MWTransclusionModel.getPlainObject}. The corresponding deserializer is in\n * {@see ve.dm.MWTransclusionNode.static.getWikitext}.\n *\n * @return {Object|string|undefined} Serialized representation, raw wikitext, or undefined if empty\n */\nve.dm.MWTransclusionPartModel.prototype.serialize = function () {\n\treturn undefined;\n};\n\n/**\n * @return {boolean} True if there is meaningful user input that was not e.g. auto-generated\n */\nve.dm.MWTransclusionPartModel.prototype.containsValuableData = function () {\n\treturn false;\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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWAlienBlockExtensionNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWAlienExtensionNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWAlienInlineExtensionNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWAnnotationNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWBlockExtensionNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWBlockImageNode.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":189,"column":3,"nodeType":"AssignmentExpression","endLine":189,"endColumn":31,"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":198,"column":3,"nodeType":"AssignmentExpression","endLine":198,"endColumn":44,"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":203,"column":3,"nodeType":"AssignmentExpression","endLine":203,"endColumn":56,"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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWEntityNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWExtensionNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWGalleryImageCaptionNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWGalleryImageNode.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":205,"column":3,"nodeType":"AssignmentExpression","endLine":205,"endColumn":44,"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":210,"column":3,"nodeType":"AssignmentExpression","endLine":210,"endColumn":56,"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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWGalleryNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWHeadingNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWImageCaptionNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWImageNode.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":317,"column":1,"nodeType":"Block","endLine":317,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWImageNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * DataModel MediaWiki image node.\n *\n * @class\n * @abstract\n * @extends ve.dm.GeneratedContentNode\n * @mixes ve.dm.FocusableNode\n * @mixes ve.dm.ResizableNode\n *\n * @constructor\n */\nve.dm.MWImageNode = function VeDmMWImageNode() {\n\t// Parent constructor\n\tve.dm.GeneratedContentNode.call( this );\n\n\t// Mixin constructors\n\tve.dm.FocusableNode.call( this );\n\t// ve.dm.MWResizableNode doesn't exist\n\tve.dm.ResizableNode.call( this );\n\n\tthis.scalablePromise = null;\n\n\t// Use 'bitmap' as default media type until we can\n\t// fetch the actual media type from the API\n\tthis.mediaType = 'BITMAP';\n\n\t// Initialize\n\tthis.constructor.static.syncScalableToType(\n\t\tthis.getAttribute( 'type' ),\n\t\tthis.mediaType,\n\t\tthis.getScalable()\n\t);\n\n\t// Events\n\tthis.connect( this, { attributeChange: 'onAttributeChange' } );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.dm.MWImageNode, ve.dm.GeneratedContentNode );\n\nOO.mixinClass( ve.dm.MWImageNode, ve.dm.FocusableNode );\n\nOO.mixinClass( ve.dm.MWImageNode, ve.dm.ResizableNode );\n\n/* Static methods */\n\nve.dm.MWImageNode.static.rdfaToTypes = ( function () {\n\tconst rdfaToType = {};\n\n\t[ 'File', 'Image', 'Video', 'Audio' ].forEach( ( mediaClass ) => {\n\t\trdfaToType[ 'mw:' + mediaClass ] = { mediaClass: mediaClass, frameType: 'none' };\n\t\trdfaToType[ 'mw:' + mediaClass + '/Frameless' ] = { mediaClass: mediaClass, frameType: 'frameless' };\n\t\t// Block image only:\n\t\trdfaToType[ 'mw:' + mediaClass + '/Thumb' ] = { mediaClass: mediaClass, frameType: 'thumb' };\n\t\trdfaToType[ 'mw:' + mediaClass + '/Frame' ] = { mediaClass: mediaClass, frameType: 'frame' };\n\t} );\n\n\treturn rdfaToType;\n}() );\n\n/**\n * Get RDFa type\n *\n * @static\n * @param {string} mediaClass Media class, one of 'File', 'Image', 'Video' or 'Audio'\n * @param {string} frameType Frame type, one of 'none', 'frameless', 'thumb' or 'frame'\n * @param {boolean} isError Whether the included media file is missing\n * @return {string} RDFa type\n */\nve.dm.MWImageNode.static.getRdfa = function ( mediaClass, frameType, isError ) {\n\treturn ( isError ? 'mw:Error ' : '' ) + 'mw:' + mediaClass + {\n\t\tnone: '',\n\t\tframeless: '/Frameless',\n\t\t// Block image only:\n\t\tthumb: '/Thumb',\n\t\tframe: '/Frame'\n\t}[ frameType ];\n};\n\n/**\n * Map media tags to source attributes\n *\n * @type {Object}\n */\nve.dm.MWImageNode.static.tagsToSrcAttrs = {\n\timg: 'src',\n\taudio: null,\n\tvideo: 'poster',\n\tspan: null\n};\n\n/**\n * @inheritdoc ve.dm.GeneratedContentNode\n */\nve.dm.MWImageNode.static.getHashObjectForRendering = function ( dataElement ) {\n\t// \"Rendering\" is just the URL of the thumbnail, so we only\n\t// care about src & dimensions\n\treturn {\n\t\ttype: 'mwImage',\n\t\tresource: dataElement.attributes.resource,\n\t\twidth: dataElement.attributes.width,\n\t\theight: dataElement.attributes.height\n\t};\n};\n\nve.dm.MWImageNode.static.getMatchRdfaTypes = function () {\n\treturn Object.keys( this.rdfaToTypes );\n};\n\nve.dm.MWImageNode.static.allowedRdfaTypes = [ 'mw:Error' ];\n\nve.dm.MWImageNode.static.isDiffComparable = function ( element, other ) {\n\t// Images with different src's shouldn't be diffed\n\treturn element.type === other.type && element.attributes.resource === other.attributes.resource;\n};\n\nve.dm.MWImageNode.static.describeChanges = function ( attributeChanges, attributes ) {\n\tconst customKeys = [ 'width', 'height', 'defaultSize', 'src', 'href' ],\n\t\tdescriptions = [];\n\n\tfunction describeSize( width, height ) {\n\t\treturn width + ve.msg( 'visualeditor-dimensionswidget-times' ) + height + ve.msg( 'visualeditor-dimensionswidget-px' );\n\t}\n\n\tif ( 'width' in attributeChanges || 'height' in attributeChanges ) {\n\t\tlet sizeFrom, sizeTo;\n\t\tif ( attributeChanges.defaultSize && attributeChanges.defaultSize.from === true ) {\n\t\t\tsizeFrom = ve.msg( 'visualeditor-mediasizewidget-sizeoptions-default' );\n\t\t} else {\n\t\t\tsizeFrom = describeSize(\n\t\t\t\t'width' in attributeChanges ? attributeChanges.width.from : attributes.width,\n\t\t\t\t'height' in attributeChanges ? attributeChanges.height.from : attributes.height\n\t\t\t);\n\t\t}\n\t\tif ( attributeChanges.defaultSize && attributeChanges.defaultSize.to === true ) {\n\t\t\tsizeTo = ve.msg( 'visualeditor-mediasizewidget-sizeoptions-default' );\n\t\t} else {\n\t\t\tsizeTo = describeSize(\n\t\t\t\t'width' in attributeChanges ? attributeChanges.width.to : attributes.width,\n\t\t\t\t'height' in attributeChanges ? attributeChanges.height.to : attributes.height\n\t\t\t);\n\t\t}\n\n\t\tdescriptions.push(\n\t\t\tve.htmlMsg( 'visualeditor-changedesc-image-size', this.wrapText( 'del', sizeFrom ), this.wrapText( 'ins', sizeTo ) )\n\t\t);\n\t}\n\tfor ( const key in attributeChanges ) {\n\t\tif ( !customKeys.includes( key ) ) {\n\t\t\tif ( key === 'borderImage' && !attributeChanges.borderImage.from && !attributeChanges.borderImage.to ) {\n\t\t\t\t// Skip noise from the data model\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst change = this.describeChange( key, attributeChanges[ key ] );\n\t\t\tif ( change ) {\n\t\t\t\tdescriptions.push( change );\n\t\t\t}\n\t\t}\n\t}\n\treturn descriptions;\n};\n\nve.dm.MWImageNode.static.describeChange = function ( key, change ) {\n\tswitch ( key ) {\n\t\tcase 'align':\n\t\t\treturn ve.htmlMsg( 'visualeditor-changedesc-align',\n\t\t\t\t// The following messages are used here:\n\t\t\t\t// * visualeditor-align-desc-left\n\t\t\t\t// * visualeditor-align-desc-right\n\t\t\t\t// * visualeditor-align-desc-center\n\t\t\t\t// * visualeditor-align-desc-default\n\t\t\t\t// * visualeditor-align-desc-none\n\t\t\t\tthis.wrapText( 'del', ve.msg( 'visualeditor-align-desc-' + change.from ) ),\n\t\t\t\tthis.wrapText( 'ins', ve.msg( 'visualeditor-align-desc-' + change.to ) )\n\t\t\t);\n\t\tcase 'originalWidth':\n\t\tcase 'originalHeight':\n\t\tcase 'originalClasses':\n\t\tcase 'unrecognizedClasses':\n\t\t\treturn;\n\t\t// TODO: Handle valign\n\t}\n\t// Parent method\n\treturn ve.dm.Node.static.describeChange.apply( this, arguments );\n};\n\n/**\n * Take the given dimensions and scale them to thumbnail size.\n *\n * @param {Object} dimensions Width and height of the image\n * @param {string} [mediaType] Media type 'DRAWING' or 'BITMAP'\n * @return {Object} The new width and height of the scaled image\n */\nve.dm.MWImageNode.static.scaleToThumbnailSize = function ( dimensions, mediaType ) {\n\tconst defaultThumbSize = mw.config.get( 'wgVisualEditorConfig' )\n\t\t.thumbLimits[ mw.user.options.get( 'thumbsize' ) ];\n\n\tmediaType = mediaType || 'BITMAP';\n\n\tif ( dimensions.width && dimensions.height ) {\n\t\t// Use dimensions\n\t\t// Resize to default thumbnail size, but only if the image itself\n\t\t// isn't smaller than the default size\n\t\t// For svg/drawings, the default wiki size is always applied\n\t\tif ( dimensions.width > defaultThumbSize || mediaType === 'DRAWING' ) {\n\t\t\treturn ve.dm.Scalable.static.getDimensionsFromValue( {\n\t\t\t\twidth: defaultThumbSize\n\t\t\t}, dimensions.width / dimensions.height );\n\t\t}\n\t}\n\treturn dimensions;\n};\n\n/**\n * Translate the image dimensions into new ones according to the bounding box.\n *\n * @param {Object} imageDimensions Width and height of the image\n * @param {Object} boundingBox The limit of the bounding box\n * @return {Object} The new width and height of the scaled image.\n */\nve.dm.MWImageNode.static.resizeToBoundingBox = function ( imageDimensions, boundingBox ) {\n\tconst scale = Math.min(\n\t\tboundingBox.height / imageDimensions.height,\n\t\tboundingBox.width / imageDimensions.width\n\t);\n\n\tlet newDimensions = ve.copy( imageDimensions );\n\tif ( scale < 1 ) {\n\t\t// Scale down\n\t\tnewDimensions = {\n\t\t\twidth: Math.floor( newDimensions.width * scale ),\n\t\t\theight: Math.floor( newDimensions.height * scale )\n\t\t};\n\t}\n\treturn newDimensions;\n};\n\n/**\n * Update image scalable properties according to the image type.\n *\n * @param {string} type The new image type\n * @param {string} mediaType Image media type 'DRAWING' or 'BITMAP'\n * @param {ve.dm.Scalable} scalable The scalable object to update\n */\nve.dm.MWImageNode.static.syncScalableToType = function ( type, mediaType, scalable ) {\n\tconst defaultThumbSize = mw.config.get( 'wgVisualEditorConfig' )\n\t\t.thumbLimits[ mw.user.options.get( 'thumbsize' ) ];\n\n\tconst originalDimensions = scalable.getOriginalDimensions();\n\n\t// We can only set default dimensions if we have the original ones\n\tif ( originalDimensions ) {\n\t\tif ( type === 'thumb' || type === 'frameless' ) {\n\t\t\t// Set the default size to that in the wiki configuration if\n\t\t\t// 1. The original image width is not smaller than the default\n\t\t\t// 2. If the image is an SVG drawing\n\t\t\tlet dimensions;\n\t\t\tif ( originalDimensions.width >= defaultThumbSize || mediaType === 'DRAWING' ) {\n\t\t\t\tdimensions = ve.dm.Scalable.static.getDimensionsFromValue( {\n\t\t\t\t\twidth: defaultThumbSize\n\t\t\t\t}, scalable.getRatio() );\n\t\t\t} else {\n\t\t\t\tdimensions = ve.dm.Scalable.static.getDimensionsFromValue(\n\t\t\t\t\toriginalDimensions,\n\t\t\t\t\tscalable.getRatio()\n\t\t\t\t);\n\t\t\t}\n\t\t\tscalable.setDefaultDimensions( dimensions );\n\t\t} else {\n\t\t\tscalable.setDefaultDimensions( originalDimensions );\n\t\t}\n\t}\n\n\t// Deal with maximum dimensions for images and drawings\n\tif ( mediaType === 'DRAWING' ) {\n\t\t// Vector images are scalable past their original dimensions\n\t\t// EnforcedMax may have previously been set to true\n\t\tscalable.setEnforcedMax( false );\n\n\t} else if ( mediaType === 'AUDIO' ) {\n\t\t// Audio files are scalable to any width but have fixed height\n\t\tscalable.fixedRatio = false;\n\t\tscalable.setMinDimensions( { width: 1, height: 32 } );\n\t\t// TODO: No way to enforce max height but not max width\n\t\tscalable.setMaxDimensions( { width: 99999, height: 32 } );\n\t\tscalable.setEnforcedMax( true );\n\t\tscalable.setEnforcedMin( true );\n\n\t\t// Default dimensions for audio files are 0x0, which is no good\n\t\tscalable.setDefaultDimensions( { width: defaultThumbSize, height: 32 } );\n\n\t} else {\n\t\t// Raster image files are limited to their original dimensions\n\t\tif ( originalDimensions ) {\n\t\t\tscalable.setMaxDimensions( originalDimensions );\n\t\t\tscalable.setEnforcedMax( true );\n\t\t} else {\n\t\t\tscalable.setEnforcedMax( false );\n\t\t}\n\t}\n\t// TODO: Some day, when $wgSvgMaxSize works properly in MediaWiki\n\t// we can add it back as max dimension consideration.\n};\n\n/**\n * Get the scalable promise which fetches original dimensions from the API\n *\n * @param {string} filename The image filename whose details the scalable will represent\n * @return {jQuery.Promise} Promise which resolves after the image size details are fetched from the API\n */\nve.dm.MWImageNode.static.getScalablePromise = function ( filename ) {\n\t// On the first call set off an async call to update the scalable's\n\t// original dimensions from the API.\n\tif ( ve.init.platform.imageInfoCache ) {\n\t\treturn ve.init.platform.imageInfoCache.get( filename ).then( ( info ) => {\n\t\t\tif ( !info || info.missing ) {\n\t\t\t\treturn ve.createDeferred().reject().promise();\n\t\t\t}\n\t\t\treturn info;\n\t\t} );\n\t} else {\n\t\treturn ve.createDeferred().reject().promise();\n\t}\n};\n\n/* Methods */\n\n/**\n * Respond to attribute change.\n * Update the rendering of the 'align', src', 'width' and 'height' attributes\n * when they change in the model.\n *\n * @param {string} key Attribute key\n * @param {string} from Old value\n * @param {string} to New value\n */\nve.dm.MWImageNode.prototype.onAttributeChange = function ( key, from, to ) {\n\tif ( key === 'type' ) {\n\t\tthis.constructor.static.syncScalableToType( to, this.mediaType, this.getScalable() );\n\t}\n};\n\n/**\n * Get the normalised filename of the image\n *\n * @return {string} Filename (including namespace)\n */\nve.dm.MWImageNode.prototype.getFilename = function () {\n\treturn mw.libs.ve.normalizeParsoidResourceName( this.getAttribute( 'resource' ) || '' );\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWImageNode.prototype.getScalable = function () {\n\tif ( !this.scalablePromise ) {\n\t\tthis.scalablePromise = ve.dm.MWImageNode.static.getScalablePromise( this.getFilename() ).then( ( info ) => {\n\t\t\tif ( info ) {\n\t\t\t\tthis.getScalable().setOriginalDimensions( {\n\t\t\t\t\twidth: info.width,\n\t\t\t\t\theight: info.height\n\t\t\t\t} );\n\t\t\t\tconst oldMediaType = this.mediaType;\n\t\t\t\t// Update media type\n\t\t\t\tthis.mediaType = info.mediatype;\n\t\t\t\t// Update according to type\n\t\t\t\tthis.constructor.static.syncScalableToType(\n\t\t\t\t\tthis.getAttribute( 'type' ),\n\t\t\t\t\tthis.mediaType,\n\t\t\t\t\tthis.getScalable()\n\t\t\t\t);\n\t\t\t\tthis.emit( 'attributeChange', 'mediaType', oldMediaType, this.mediaType );\n\t\t\t}\n\t\t} );\n\t}\n\t// Mixin method\n\treturn ve.dm.ResizableNode.prototype.getScalable.call( this );\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWImageNode.prototype.createScalable = function () {\n\treturn new ve.dm.Scalable( {\n\t\tcurrentDimensions: {\n\t\t\twidth: this.getAttribute( 'width' ),\n\t\t\theight: this.getAttribute( 'height' )\n\t\t},\n\t\tminDimensions: {\n\t\t\twidth: 1,\n\t\t\theight: 1\n\t\t}\n\t} );\n};\n\n/**\n * Get symbolic name of media type.\n *\n * Example values: \"BITMAP\" for JPEG or PNG images; \"DRAWING\" for SVG graphics\n *\n * @return {string|undefined} Symbolic media type name, or undefined if empty\n */\nve.dm.MWImageNode.prototype.getMediaType = function () {\n\treturn this.mediaType;\n};\n\n/**\n * Get RDFa type\n *\n * @return {string} RDFa type\n */\nve.dm.MWImageNode.prototype.getRdfa = function () {\n\treturn this.constructor.static.getRdfa(\n\t\tthis.getAttribute( 'mediaClass' ),\n\t\tthis.getAttribute( 'type' ),\n\t\tthis.getAttribute( 'isError' )\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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWIncludesNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWInlineExtensionNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWInlineImageNode.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":205,"column":3,"nodeType":"AssignmentExpression","endLine":205,"endColumn":40,"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":208,"column":3,"nodeType":"AssignmentExpression","endLine":208,"endColumn":44,"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":217,"column":3,"nodeType":"AssignmentExpression","endLine":217,"endColumn":56,"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":222,"column":3,"nodeType":"AssignmentExpression","endLine":222,"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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWLanguageVariantBlockNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWLanguageVariantHiddenNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWLanguageVariantInlineNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWLanguageVariantNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWMagicLinkNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWPreNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWPreformattedNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWSignatureNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWTableNode.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":83,"column":3,"nodeType":"AssignmentExpression","endLine":83,"endColumn":32,"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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWTransclusionBlockNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWTransclusionInlineNode.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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWTransclusionNode.js","messages":[{"ruleId":"es-x/no-iterator-prototype-toarray","severity":2,"message":"ES2025 'Iterator.prototype.toArray' method is forbidden.","line":220,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":220,"endColumn":35},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":456,"column":9,"nodeType":"MemberExpression","messageId":"forbidden","endLine":456,"endColumn":30},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":489,"column":1,"nodeType":"Block","endLine":489,"endColumn":1}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWTransclusionNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * DataModel MediaWiki transclusion node.\n *\n * @class\n * @abstract\n * @extends ve.dm.LeafNode\n * @mixes ve.dm.GeneratedContentNode\n * @mixes ve.dm.FocusableNode\n *\n * @constructor\n * @param {Object} [element] Reference to element in linear model\n */\nve.dm.MWTransclusionNode = function VeDmMWTransclusionNode() {\n\t// Parent constructor\n\tve.dm.MWTransclusionNode.super.apply( this, arguments );\n\n\t// Mixin constructors\n\tve.dm.GeneratedContentNode.call( this );\n\tve.dm.FocusableNode.call( this );\n\n\t// Properties\n\tthis.partsList = null;\n\n\t// Events\n\tthis.connect( this, { attributeChange: 'onAttributeChange' } );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.dm.MWTransclusionNode, ve.dm.LeafNode );\n\nOO.mixinClass( ve.dm.MWTransclusionNode, ve.dm.GeneratedContentNode );\n\nOO.mixinClass( ve.dm.MWTransclusionNode, ve.dm.FocusableNode );\n\n/* Static members */\n\nve.dm.MWTransclusionNode.static.name = 'mwTransclusion';\n\nve.dm.MWTransclusionNode.static.matchTagNames = null;\n\nve.dm.MWTransclusionNode.static.matchRdfaTypes = [ 'mw:Transclusion' ];\n\n// Transclusion nodes can contain other types, e.g. mw:PageProp/Category.\n// Allow all other types (null) so they match to this node.\nve.dm.MWTransclusionNode.static.allowedRdfaTypes = null;\n\n// HACK: This prevents any rules with higher specificity from matching,\n// e.g. LanguageAnnotation which uses a match function\nve.dm.MWTransclusionNode.static.matchFunction = function () {\n\treturn true;\n};\n\nve.dm.MWTransclusionNode.static.enableAboutGrouping = true;\n\n// We handle rendering ourselves, no need to render attributes from originalDomElements (T207325),\n// except for data-parsoid/RESTBase ID (T207325)\nve.dm.MWTransclusionNode.static.preserveHtmlAttributes = function ( attribute ) {\n\treturn [ 'data-parsoid', 'id' ].includes( attribute );\n};\n\nve.dm.MWTransclusionNode.static.getHashObject = function ( dataElement ) {\n\treturn {\n\t\ttype: dataElement.type,\n\t\tmw: dataElement.attributes.mw\n\t};\n};\n\nve.dm.MWTransclusionNode.static.isDiffComparable = function ( element, other ) {\n\tfunction getTemplateNames( parts ) {\n\t\treturn parts.map( ( part ) => part.template ? part.template.target.wt : '' ).join( '|' );\n\t}\n\n\treturn ve.dm.MWTransclusionNode.super.static.isDiffComparable.call( this, element, other ) &&\n\t\tgetTemplateNames( element.attributes.mw.parts ) === getTemplateNames( other.attributes.mw.parts );\n};\n\n/**\n * Node type to use when the transclusion is inline\n *\n * @static\n * @property {string}\n * @inheritable\n */\nve.dm.MWTransclusionNode.static.inlineType = 'mwTransclusionInline';\n\n/**\n * Node type to use when the transclusion is a block\n *\n * @static\n * @property {string}\n * @inheritable\n */\nve.dm.MWTransclusionNode.static.blockType = 'mwTransclusionBlock';\n\n/**\n * Node type to use when the transclusion is cellable\n *\n * @static\n * @property {string}\n * @inheritable\n */\nve.dm.MWTransclusionNode.static.cellType = 'mwTransclusionTableCell';\n\nve.dm.MWTransclusionNode.static.toDataElement = function ( domElements, converter ) {\n\tconst mwDataJSON = domElements[ 0 ].getAttribute( 'data-mw' ),\n\t\tmwData = mwDataJSON ? JSON.parse( mwDataJSON ) : {},\n\t\tisInline = this.isHybridInline( domElements, converter ),\n\t\ttype = isInline ? this.inlineType : this.blockType;\n\n\tconst dataElement = {\n\t\ttype: type,\n\t\tattributes: {\n\t\t\tmw: mwData,\n\t\t\toriginalMw: mwDataJSON\n\t\t}\n\t};\n\n\tif ( ve.dm.TableCellableNode.static.areNodesCellable( domElements ) ) {\n\t\tdataElement.type = this.cellType;\n\t\tve.dm.TableCellableNode.static.setAttributes( dataElement.attributes, domElements, true );\n\t}\n\n\tif ( !domElements[ 0 ].getAttribute( 'data-ve-no-generated-contents' ) ) {\n\t\tthis.storeGeneratedContents( dataElement, domElements, converter.getStore() );\n\t}\n\n\treturn dataElement;\n};\n\nve.dm.MWTransclusionNode.static.toDomElements = function ( dataElement, doc, converter ) {\n\tconst store = converter.getStore(),\n\t\toriginalMw = dataElement.attributes.originalMw,\n\t\toriginalDomElements = store.value( dataElement.originalDomElementsHash );\n\n\tfunction wrapTextNode( node ) {\n\t\tif ( node.nodeType === Node.TEXT_NODE ) {\n\t\t\tconst wrapper = doc.createElement( 'span' );\n\t\t\twrapper.appendChild( node );\n\t\t\treturn wrapper;\n\t\t}\n\t\treturn node;\n\t}\n\n\tlet els;\n\t// If the transclusion is unchanged just send back the\n\t// original DOM elements so selser can skip over it\n\tif (\n\t\toriginalDomElements &&\n\t\toriginalMw && ve.compare( dataElement.attributes.mw, JSON.parse( originalMw ) )\n\t) {\n\t\t// originalDomElements is also used for CE rendering so return a copy\n\t\tels = ve.copyDomElements( originalDomElements, doc );\n\t} else {\n\t\tlet value;\n\t\tif (\n\t\t\tconverter.doesModeNeedRendering() &&\n\t\t\t// Use getHashObjectForRendering to get the rendering from the store\n\t\t\t( value = store.value( store.hashOfValue( null, OO.getHash( [ this.getHashObjectForRendering( dataElement ), undefined ] ) ) ) )\n\t\t) {\n\t\t\t// For the clipboard use the current DOM contents so the user has something\n\t\t\t// meaningful to paste into external applications\n\t\t\tels = ve.copyDomElements( value, doc );\n\t\t\tels[ 0 ] = wrapTextNode( els[ 0 ] );\n\t\t} else if ( originalDomElements ) {\n\t\t\tels = [ doc.createElement( originalDomElements[ 0 ].nodeName ) ];\n\t\t} else if ( dataElement.type === this.cellType ) {\n\t\t\tels = [ doc.createElement( dataElement.attributes.style === 'header' ? 'th' : 'td' ) ];\n\t\t} else {\n\t\t\tels = [ doc.createElement( 'span' ) ];\n\t\t}\n\t\t// All we need to send back to Parsoid is the original transclusion marker, with a\n\t\t// reconstructed data-mw property.\n\t\tels[ 0 ].setAttribute( 'typeof', 'mw:Transclusion' );\n\t\tels[ 0 ].setAttribute( 'data-mw', JSON.stringify( dataElement.attributes.mw ) );\n\t}\n\tif ( converter.isForClipboard() ) {\n\t\t// If the first element is a <link>, <meta> or <style> tag, e.g. a category or TemplateStyles,\n\t\t// ensure it is not destroyed by copy-paste by replacing it with a span\n\t\tif ( els[ 0 ].tagName === 'LINK' || els[ 0 ].tagName === 'META' || els[ 0 ].tagName === 'STYLE' ) {\n\t\t\tconst span = doc.createElement( 'span' );\n\t\t\tspan.setAttribute( 'typeof', 'mw:Transclusion' );\n\t\t\tspan.setAttribute( 'data-mw', els[ 0 ].getAttribute( 'data-mw' ) );\n\t\t\tels[ 0 ] = span;\n\t\t}\n\n\t\t// Empty spans can get thrown around by Chrome when pasting, so give them a space\n\t\tif ( els[ 0 ].innerHTML === '' ) {\n\t\t\tels[ 0 ].appendChild( doc.createTextNode( '\\u00a0' ) );\n\t\t}\n\n\t\t// Mark the data-mw element as not having valid generated contents with it in case it is\n\t\t// inserted into another editor (e.g. via paste).\n\t\tels[ 0 ].setAttribute( 'data-ve-no-generated-contents', true );\n\n\t\t// ... and mark all but the first child as ignorable\n\t\tfor ( let i = 1; i < els.length; i++ ) {\n\t\t\t// Wrap plain text nodes so we can give them an attribute\n\t\t\tels[ i ] = wrapTextNode( els[ i ] );\n\t\t\tels[ i ].setAttribute( 'data-ve-ignore', '' );\n\t\t}\n\t} else if ( converter.isForPreview() ) {\n\t\tconst modelNode = ve.dm.nodeFactory.createFromElement( dataElement );\n\t\tmodelNode.setDocument( converter.internalList.getDocument() );\n\t\tconst viewNode = ve.ce.nodeFactory.createFromModel( modelNode );\n\t\t// HACK: Node must be attached to check for rendering\n\t\tviewNode.$element.appendTo( 'body' );\n\t\tif ( !viewNode.hasRendering() ) {\n\t\t\tviewNode.$element.detach();\n\t\t\tviewNode.onSetup();\n\t\t\t// HACK: Force the icon to render immediately\n\t\t\tviewNode.updateInvisibleIconSync( true );\n\t\t\tels = viewNode.$element.toArray();\n\t\t}\n\t\tviewNode.destroy();\n\t\tviewNode.$element.detach();\n\t}\n\treturn els;\n};\n\nve.dm.MWTransclusionNode.static.describeChanges = function ( attributeChanges ) {\n\tconst descriptions = [ ve.msg( 'visualeditor-changedesc-mwtransclusion' ) ];\n\n\t// This method assumes that the behavior of isDiffComparable above remains\n\t// the same, so it doesn't have to consider whether the actual template\n\t// involved has changed.\n\n\tfunction getLabel( par ) {\n\t\t// If a parameter is an object with a wt key, we just want the value of that.\n\t\tif ( par && par.wt !== undefined ) {\n\t\t\t// Can be `''`, and we're okay with that\n\t\t\treturn par.wt;\n\t\t}\n\t\treturn par;\n\t}\n\n\tif ( attributeChanges.mw.from.parts.length === 1 && attributeChanges.mw.to.parts.length === 1 ) {\n\t\t// Single-template transclusion, before and after. Relatively easy to summarize.\n\t\t// TODO: expand this to well-represent transclusions that contain multiple templates.\n\n\t\t// The bits of a template we care about are deeply-nested inside an\n\t\t// attribute. We'll restructure this so that we can pretend template\n\t\t// params are the direct attributes of the template.\n\t\tconst params = {};\n\t\tlet param;\n\t\tfor ( param in attributeChanges.mw.from.parts[ 0 ].template.params ) {\n\t\t\tparams[ param ] = { from: getLabel( attributeChanges.mw.from.parts[ 0 ].template.params[ param ] ) };\n\t\t}\n\t\tfor ( param in attributeChanges.mw.to.parts[ 0 ].template.params ) {\n\t\t\tparams[ param ] = ve.extendObject(\n\t\t\t\t{ to: getLabel( attributeChanges.mw.to.parts[ 0 ].template.params[ param ] ) },\n\t\t\t\tparams[ param ]\n\t\t\t);\n\t\t}\n\t\tlet paramChanges;\n\t\tfor ( param in params ) {\n\t\t\t// All we know is that *something* changed, without the normal\n\t\t\t// helpful just-being-given-the-changed-bits, so we have to filter\n\t\t\t// this ourselves.\n\t\t\t// Trim string values, and convert empty strings to undefined\n\t\t\tconst from = ( params[ param ].from || '' ).trim() || undefined,\n\t\t\t\tto = ( params[ param ].to || '' ).trim() || undefined;\n\t\t\tif ( from !== to ) {\n\t\t\t\tconst change = this.describeChange( param, { from: from, to: to } );\n\t\t\t\tif ( change ) {\n\t\t\t\t\tif ( !paramChanges ) {\n\t\t\t\t\t\tparamChanges = document.createElement( 'ul' );\n\t\t\t\t\t\tdescriptions.push( paramChanges );\n\t\t\t\t\t}\n\t\t\t\t\tconst listItem = document.createElement( 'li' );\n\t\t\t\t\tif ( typeof change === 'string' ) {\n\t\t\t\t\t\tlistItem.appendChild( document.createTextNode( change ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchange.forEach( ( node ) => {\n\t\t\t\t\t\t\tlistItem.appendChild( node );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\tparamChanges.appendChild( listItem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn descriptions;\n};\n\n/**\n * @inheritdoc ve.dm.Node\n */\nve.dm.MWTransclusionNode.static.cloneElement = function () {\n\t// Parent method\n\tconst clone = ve.dm.MWTransclusionNode.super.static.cloneElement.apply( this, arguments );\n\tdelete clone.attributes.originalMw;\n\treturn clone;\n};\n\n/**\n * Escape a template parameter. Helper function for #getWikitext.\n *\n * @static\n * @param {string} param Parameter value\n * @return {string} Escaped parameter value\n */\nve.dm.MWTransclusionNode.static.escapeParameter = function ( param ) {\n\tlet input = param,\n\t\toutput = '',\n\t\tinNowiki = false,\n\t\tbracketStack = 0,\n\t\tlinkStack = 0;\n\n\twhile ( input.length > 0 ) {\n\t\tconst match = input.match( /\\[\\[|]]|{{|}}|\\|+|<\\/?nowiki>|<nowiki\\s*\\/>/ );\n\t\tif ( !match ) {\n\t\t\toutput += input;\n\t\t\tbreak;\n\t\t}\n\t\toutput += input.slice( 0, match.index );\n\t\tinput = input.slice( match.index + match[ 0 ].length );\n\n\t\tif ( inNowiki ) {\n\t\t\tif ( match[ 0 ] === '</nowiki>' ) {\n\t\t\t\tinNowiki = false;\n\t\t\t}\n\t\t\toutput += match[ 0 ];\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet needsNowiki = true;\n\t\tswitch ( match[ 0 ].charAt( 0 ) ) {\n\t\t\tcase '<':\n\t\t\t\tif ( match[ 0 ] === '<nowiki>' ) {\n\t\t\t\t\tinNowiki = true;\n\t\t\t\t}\n\t\t\t\tneedsNowiki = false;\n\t\t\t\tbreak;\n\t\t\tcase '[':\n\t\t\t\tlinkStack++;\n\t\t\t\tneedsNowiki = false;\n\t\t\t\tbreak;\n\t\t\tcase ']':\n\t\t\t\tif ( linkStack > 0 ) {\n\t\t\t\t\tlinkStack--;\n\t\t\t\t\tneedsNowiki = false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '{':\n\t\t\t\tbracketStack++;\n\t\t\t\tneedsNowiki = false;\n\t\t\t\tbreak;\n\t\t\tcase '}':\n\t\t\t\tif ( bracketStack > 0 ) {\n\t\t\t\t\tbracketStack--;\n\t\t\t\t\tneedsNowiki = false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '|':\n\t\t\t\tif ( bracketStack > 0 || linkStack > 0 ) {\n\t\t\t\t\tneedsNowiki = false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\toutput += needsNowiki ?\n\t\t\t'<nowiki>' + match[ 0 ] + '</nowiki>' :\n\t\t\tmatch[ 0 ];\n\t}\n\treturn output;\n};\n\n/**\n * Recreate the wikitext for this transclusion, possibly containing multiple template invocations,\n * mixed with raw wikitext snippets.\n *\n * @static\n * @param {Object} content MW data content\n * @return {string} Wikitext\n */\nve.dm.MWTransclusionNode.static.getWikitext = function ( content ) {\n\tlet wikitext = '';\n\n\t// Normalize to multi template format\n\tif ( content.params ) {\n\t\tcontent = { parts: [ { template: content } ] };\n\t}\n\t// Build wikitext from content\n\tfor ( let i = 0, len = content.parts.length; i < len; i++ ) {\n\t\tconst part = content.parts[ i ];\n\t\tif ( part.template ) {\n\t\t\t// Template\n\t\t\tconst template = part.template;\n\t\t\twikitext += '{{' + template.target.wt;\n\t\t\tfor ( const param in template.params ) {\n\t\t\t\twikitext += '|' + param + '=' +\n\t\t\t\t\tthis.escapeParameter( template.params[ param ].wt );\n\t\t\t}\n\t\t\twikitext += '}}';\n\t\t} else {\n\t\t\t// Plain wikitext\n\t\t\twikitext += part;\n\t\t}\n\t}\n\treturn wikitext;\n};\n\n/* Methods */\n\n/**\n * Handle attribute change events.\n *\n * @param {string} key Attribute key\n * @param {string} from Old value\n * @param {string} to New value\n */\nve.dm.MWTransclusionNode.prototype.onAttributeChange = function ( key ) {\n\tif ( key === 'mw' ) {\n\t\tthis.partsList = null;\n\t}\n};\n\n/**\n * Check if transclusion contains only a single template.\n *\n * @param {string|string[]} [allowedTemplates] Names of templates to allow, omit to allow any template name\n * @return {boolean} Transclusion only contains a single template, which is one of the ones in templates\n */\nve.dm.MWTransclusionNode.prototype.isSingleTemplate = function ( allowedTemplates ) {\n\tconst templateNS = mw.config.get( 'wgNamespaceIds' ).template,\n\t\tparts = this.getPartsList();\n\n\tfunction normalizeTemplateTitle( name ) {\n\t\tconst title = mw.Title.newFromText( name, templateNS );\n\t\treturn title ? title.getPrefixedText() : name;\n\t}\n\n\t// Bail out as early as possible when no filter is given, or it's not a single part anyway\n\tconst isSingle = parts.length === 1;\n\tif ( !isSingle || !allowedTemplates ) {\n\t\treturn isSingle;\n\t}\n\n\tconst singlePart = parts[ 0 ];\n\t// It's not a template but e.g. a parser function or raw wikitext content\n\tif ( !singlePart.templatePage ) {\n\t\treturn false;\n\t}\n\n\tif ( typeof allowedTemplates === 'string' ) {\n\t\tallowedTemplates = [ allowedTemplates ];\n\t}\n\treturn allowedTemplates.some( ( template ) => singlePart.templatePage === normalizeTemplateTitle( template ) );\n};\n\n/**\n * Get a simplified description of the transclusion's parts.\n *\n * @return {Object[]} List of objects with either template or content properties\n */\nve.dm.MWTransclusionNode.prototype.getPartsList = function () {\n\tif ( !this.partsList ) {\n\t\tthis.partsList = [];\n\t\tconst content = this.getAttribute( 'mw' );\n\t\tfor ( let i = 0; i < content.parts.length; i++ ) {\n\t\t\tconst part = content.parts[ i ];\n\t\t\t// A template as serialized by {@see ve.dm.MWTemplateModel.serialize}\n\t\t\tif ( part.template ) {\n\t\t\t\tconst href = part.template.target.href,\n\t\t\t\t\tpage = href ? mw.libs.ve.normalizeParsoidResourceName( href ) : null;\n\t\t\t\tthis.partsList.push( {\n\t\t\t\t\ttemplate: part.template.target.wt,\n\t\t\t\t\ttemplatePage: page\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t// Raw wikitext as serialized by {@see ve.dm.MWTransclusionContentModel.serialize}\n\t\t\t\tthis.partsList.push( { content: part } );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn this.partsList;\n};\n\n/**\n * Wrapper for static method, {@see ve.dm.MWTransclusionNode.static.getWikitext} above.\n *\n * @return {string} Wikitext\n */\nve.dm.MWTransclusionNode.prototype.getWikitext = function () {\n\ttry {\n\t\treturn this.constructor.static.getWikitext( this.getAttribute( 'mw' ) );\n\t} catch ( e ) {\n\t\tlet message;\n\t\tconst originalDomElements = this.getOriginalDomElements( this.getStore() );\n\t\tif ( originalDomElements.length ) {\n\t\t\tmessage = originalDomElements.map( ve.getNodeHtml ).join( '' );\n\t\t} else {\n\t\t\tmessage = '[DOM elements not found]';\n\t\t}\n\t\t// Temporary logging for T380432\n\t\tthrow new Error( `Failed to generate wikitext for MWTransclusionNode: ${ message }` );\n\t}\n};\n\n/* Registration */\n\nve.dm.modelRegistry.register( ve.dm.MWTransclusionNode );\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":"implicit-arrow-linebreak","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-mw/dm/nodes/ve.dm.MWTransclusionTableCellNode.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":"implicit-arrow-linebreak","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-mw/dm/ve.dm.MWWikitextSurface.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":"implicit-arrow-linebreak","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-mw/dm/ve.dm.MWWikitextSurfaceFragment.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":"implicit-arrow-linebreak","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-mw/init/apiresponsecache/ve.init.mw.ApiResponseCache.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":74,"column":1,"nodeType":"Block","endLine":74,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":136,"column":1,"nodeType":"Block","endLine":136,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization ApiResponseCache class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki API batch queue.\n *\n * Used to queue up lists of items centrally to get information about in batches\n *  of requests.\n *\n * @class\n * @extends OO.EventEmitter\n * @constructor\n * @param {mw.Api} [api] API object to use. Defaults to new mw.Api()\n */\nve.init.mw.ApiResponseCache = function VeInitMwApiResponseCache( api ) {\n\t// Mixin constructor\n\tOO.EventEmitter.call( this );\n\n\tthis.api = api || new mw.Api();\n\n\t// Keys are titles, values are deferreds\n\tthis.deferreds = {};\n\n\t// Keys are page names, values are link data objects\n\t// This is kept for synchronous retrieval of cached values via #getCached\n\tthis.cacheValues = {};\n\n\t// Array of page titles queued to be looked up\n\tthis.queue = [];\n\n\tthis.schedule = ve.debounce( this.processQueue.bind( this ), 0 );\n};\n\n/* Inheritance */\n\nOO.mixinClass( ve.init.mw.ApiResponseCache, OO.EventEmitter );\n\n/* Static methods */\n\n/**\n * Process each page in the response of an API request\n *\n * @abstract\n * @static\n * @param {Object} page\n * @return {Object|undefined} Any relevant info that we want to cache and return.\n */\nve.init.mw.ApiResponseCache.static.processPage = null;\n\n/**\n * @param {string} title\n * @return {string}\n */\nve.init.mw.ApiResponseCache.static.normalizeTitle = function ( title ) {\n\tconst titleObj = mw.Title.newFromText( title );\n\tif ( !titleObj ) {\n\t\treturn title;\n\t}\n\treturn titleObj.getPrefixedText();\n};\n\n/* Methods */\n\n/**\n * Look up data about a title. If the data about this title is already in the cache, this\n * returns an already-resolved promise. Otherwise, it returns a pending promise and schedules\n * an request to retrieve the data.\n *\n * @param {string} title\n * @return {jQuery.Promise} Promise that will be resolved with the data once it's available\n */\nve.init.mw.ApiResponseCache.prototype.get = function ( title ) {\n\tif ( typeof title !== 'string' ) {\n\t\t// Don't bother letting things like undefined or null make it all the way through,\n\t\t// just reject them here. Otherwise they'll cause problems or exceptions at random\n\t\t// other points in this file.\n\t\treturn ve.createDeferred().reject().promise();\n\t}\n\ttitle = this.constructor.static.normalizeTitle( title );\n\tif ( !Object.prototype.hasOwnProperty.call( this.deferreds, title ) ) {\n\t\tthis.deferreds[ title ] = ve.createDeferred();\n\t\tthis.queue.push( title );\n\t\tthis.schedule();\n\t}\n\treturn this.deferreds[ title ].promise();\n};\n\n/**\n * Look up data about a page in the cache. If the data about this page is already in the cache,\n * this returns that data. Otherwise, it returns undefined.\n *\n * @param {string} name Normalized page title\n * @return {Object|undefined} Cache data for this name.\n */\nve.init.mw.ApiResponseCache.prototype.getCached = function ( name ) {\n\tif ( Object.prototype.hasOwnProperty.call( this.cacheValues, name ) ) {\n\t\treturn this.cacheValues[ name ];\n\t}\n};\n\n/**\n * Fired when a new entry is added to the cache.\n *\n * @event ve.init.mw.ApiResponseCache#add\n * @param {Object} entries Cache entries that were added. Object mapping names to data objects.\n */\n\n/**\n * Add entries to the cache. Does not overwrite already-set entries.\n *\n * @param {Object} entries Object keyed by page title, with the values being data objects\n * @fires ve.init.mw.ApiResponseCache#add\n */\nve.init.mw.ApiResponseCache.prototype.set = function ( entries ) {\n\tfor ( const name in entries ) {\n\t\tif ( !Object.prototype.hasOwnProperty.call( this.deferreds, name ) ) {\n\t\t\tthis.deferreds[ name ] = ve.createDeferred();\n\t\t}\n\t\tif ( this.deferreds[ name ].state() === 'pending' ) {\n\t\t\tthis.deferreds[ name ].resolve( entries[ name ] );\n\t\t\tthis.cacheValues[ name ] = entries[ name ];\n\t\t}\n\t}\n\tthis.emit( 'add', Object.keys( entries ) );\n};\n\n/**\n * Get an API request promise to deal with a list of titles\n *\n * @abstract\n * @param subqueue\n * @return {jQuery.Promise}\n */\nve.init.mw.ApiResponseCache.prototype.getRequestPromise = null;\n\n/**\n * Perform any scheduled API requests.\n *\n * @private\n * @fires ve.init.mw.ApiResponseCache#add\n */\nve.init.mw.ApiResponseCache.prototype.processQueue = function () {\n\tconst rejectSubqueue = ( rejectQueue ) => {\n\t\tfor ( let i = 0, len = rejectQueue.length; i < len; i++ ) {\n\t\t\tthis.deferreds[ rejectQueue[ i ] ].reject();\n\t\t}\n\t};\n\n\tconst processResult = ( data ) => {\n\t\tconst pages = ( data.query && data.query.pages ) || data.pages,\n\t\t\tprocessed = {};\n\n\t\tconst mappedTitles = [];\n\t\t[ 'redirects', 'normalized', 'converted' ].forEach( ( map ) => {\n\t\t\tve.batchPush( mappedTitles, ( data.query && data.query[ map ] ) || [] );\n\t\t} );\n\n\t\tif ( pages ) {\n\t\t\tlet page, processedPage;\n\t\t\tfor ( const pageid in pages ) {\n\t\t\t\tpage = pages[ pageid ];\n\t\t\t\tprocessedPage = this.constructor.static.processPage( page );\n\t\t\t\tif ( processedPage !== undefined ) {\n\t\t\t\t\tprocessed[ page.title ] = processedPage;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor ( let i = 0; i < mappedTitles.length; i++ ) {\n\t\t\t\t// Locate the title in mapped titles, if any.\n\t\t\t\tif ( mappedTitles[ i ].to === page.title ) {\n\t\t\t\t\tconst from = mappedTitles[ i ].fromencoded === '' ?\n\t\t\t\t\t\tdecodeURIComponent( mappedTitles[ i ].from ) :\n\t\t\t\t\t\tmappedTitles[ i ].from;\n\t\t\t\t\tprocessed[ from ] = processedPage;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.set( processed );\n\t\t}\n\t};\n\n\tconst queue = this.queue;\n\tthis.queue = [];\n\twhile ( queue.length ) {\n\t\tconst subqueue = queue.splice( 0, 50 ).map( this.constructor.static.normalizeTitle );\n\t\tthis.getRequestPromise( subqueue )\n\t\t\t.then( processResult )\n\n\t\t\t// Reject everything in subqueue; this will only reject the ones\n\t\t\t// that weren't already resolved above, because .reject() on an\n\t\t\t// already resolved Deferred is a no-op.\n\t\t\t.then( rejectSubqueue.bind( null, subqueue ) );\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":"implicit-arrow-linebreak","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-mw/init/apiresponsecache/ve.init.mw.GalleryImageInfoCache.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":"implicit-arrow-linebreak","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-mw/init/apiresponsecache/ve.init.mw.ImageInfoCache.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":"implicit-arrow-linebreak","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-mw/init/apiresponsecache/ve.init.mw.LinkCache.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":88,"column":3,"nodeType":"CallExpression","endLine":88,"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":"implicit-arrow-linebreak","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-mw/init/targets/ve.init.mw.ArticleTarget.js","messages":[{"ruleId":"es-x/no-iterator-prototype-toarray","severity":2,"message":"ES2025 'Iterator.prototype.toArray' method is forbidden.","line":870,"column":2,"nodeType":"MemberExpression","messageId":"forbidden","endLine":870,"endColumn":20},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":1016,"column":1,"nodeType":"Block","endLine":1016,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":1100,"column":1,"nodeType":"Block","endLine":1100,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":1101,"column":1,"nodeType":"Block","endLine":1101,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":1279,"column":1,"nodeType":"Block","endLine":1279,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":1312,"column":1,"nodeType":"Block","endLine":1312,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":1361,"column":1,"nodeType":"Block","endLine":1361,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":1488,"column":1,"nodeType":"Block","endLine":1488,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":1590,"column":1,"nodeType":"Block","endLine":1590,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":1677,"column":1,"nodeType":"Block","endLine":1677,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":1819,"column":1,"nodeType":"Block","endLine":1819,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":2274,"column":1,"nodeType":"Block","endLine":2274,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":2306,"column":1,"nodeType":"Block","endLine":2306,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":2374,"column":1,"nodeType":"Block","endLine":2374,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":2464,"column":1,"nodeType":"Block","endLine":2464,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":224,"column":9,"nodeType":"CallExpression","endLine":224,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"local/no-unsanitized-href","severity":2,"message":"Don't set 'href' without sanitizing; use ve.setAttributeSafe.","line":252,"column":4,"nodeType":"Property","messageId":"noHref","endLine":252,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":354,"column":3,"nodeType":"CallExpression","endLine":354,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":588,"column":2,"nodeType":"CallExpression","endLine":588,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":627,"column":2,"nodeType":"CallExpression","endLine":627,"endColumn":79,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":632,"column":3,"nodeType":"CallExpression","endLine":632,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":632,"column":3,"nodeType":"CallExpression","endLine":632,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":636,"column":7,"nodeType":"CallExpression","endLine":636,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":639,"column":3,"nodeType":"CallExpression","endLine":639,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":2396,"column":22,"nodeType":"CallExpression","endLine":2396,"endColumn":41,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":2405,"column":21,"nodeType":"CallExpression","endLine":2405,"endColumn":39,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":2425,"column":22,"nodeType":"CallExpression","endLine":2425,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":2430,"column":3,"nodeType":"CallExpression","endLine":2430,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"fatalErrorCount":0,"warningCount":14,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization ArticleTarget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/* eslint-disable no-jquery/no-global-selector */\n\n/**\n * Initialization MediaWiki article target.\n *\n * @class\n * @extends ve.init.mw.Target\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @param {Object} [config.toolbarConfig]\n * @param {boolean} [config.register=true]\n */\nve.init.mw.ArticleTarget = function VeInitMwArticleTarget( config = {} ) {\n\tconfig.toolbarConfig = ve.extendObject( {\n\t\tshadow: true,\n\t\tactions: true,\n\t\tfloatable: true\n\t}, config.toolbarConfig );\n\n\t// Parent constructor\n\tve.init.mw.ArticleTarget.super.call( this, config );\n\n\t// Register\n\tif ( config.register !== false ) {\n\t\t// ArticleTargets are never destroyed, but we can't trust ve.init.target to\n\t\t// not get overridden by other targets that may get created on the page.\n\t\tve.init.articleTarget = this;\n\t}\n\n\t// Properties\n\tthis.saveDialog = null;\n\tthis.saveDeferred = null;\n\tthis.saveFields = {};\n\tthis.wasSaveable = null;\n\tthis.docToSave = null;\n\tthis.originalDmDocPromise = null;\n\tthis.originalHtml = null;\n\tthis.toolbarSaveButton = null;\n\tthis.pageExists = mw.config.get( 'wgRelevantArticleId', 0 ) !== 0;\n\tconst enableVisualSectionEditing = mw.config.get( 'wgVisualEditorConfig' ).enableVisualSectionEditing;\n\tthis.enableVisualSectionEditing = enableVisualSectionEditing === true || enableVisualSectionEditing === this.constructor.static.trackingName;\n\tthis.toolbarScrollOffset = mw.config.get( 'wgVisualEditorToolbarScrollOffset', 0 );\n\tthis.currentUrl = new URL( location.href );\n\tthis.section = null;\n\tthis.visibleSection = null;\n\tthis.visibleSectionOffset = null;\n\tthis.sectionTitle = null;\n\tthis.editSummaryValue = null;\n\tthis.initialEditSummary = null;\n\tthis.initialCheckboxes = {};\n\tthis.preSaveProcess = new OO.ui.Process();\n\n\tthis.viewUrl = new URL( mw.util.getUrl( this.getPageName() ), location.href );\n\tthis.isViewPage = (\n\t\tmw.config.get( 'wgAction' ) === 'view' &&\n\t\t!this.currentUrl.searchParams.has( 'diff' )\n\t);\n\n\tthis.copyrightWarning = null;\n\tthis.checkboxFields = null;\n\tthis.checkboxesByName = null;\n\tthis.$saveAccessKeyElements = null;\n\n\tthis.$editableContent = this.getEditableContent();\n\n\t// Sometimes we actually don't want to send a useful oldid\n\t// if we do, PostEdit will give us a 'page restored' message\n\t// Use undefined instead of 0 for new documents (T262838)\n\tthis.requestedRevId = mw.config.get( 'wgEditLatestRevision' ) ? mw.config.get( 'wgCurRevisionId' ) : mw.config.get( 'wgRevisionId' ) || undefined;\n\tthis.currentRevisionId = mw.config.get( 'wgCurRevisionId' ) || undefined;\n\tthis.revid = this.requestedRevId || this.currentRevisionId;\n\n\tthis.edited = false;\n\tthis.restoring = !!this.requestedRevId && this.requestedRevId !== this.currentRevisionId;\n\tthis.pageDeletedWarning = false;\n\tthis.events = {\n\t\ttrack: () => {},\n\t\ttrackActivationStart: () => {},\n\t\ttrackActivationComplete: () => {}\n\t};\n\n\tthis.preparedCacheKeyPromise = null;\n\tthis.clearState();\n\n\t// Initialization\n\tthis.$element.addClass( 've-init-mw-articleTarget' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.init.mw.ArticleTarget, ve.init.mw.Target );\n\n/* Events */\n\n/**\n * @event ve.init.mw.ArticleTarget#save\n * @param {Object} data Save data from the API, see ve.init.mw.ArticleTarget#saveComplete\n * Fired immediately after a save is successfully completed\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#savePreview\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#saveReview\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#saveInitiated\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#saveWorkflowBegin\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#showChanges\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#noChanges\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#saveError\n * @param {string} code Error code\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#loadError\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#showChangesError\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#serializeError\n */\n\n/**\n * Fired when serialization is complete\n *\n * @event ve.init.mw.ArticleTarget#serializeComplete\n */\n\n/* Static Properties */\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.name = 'article';\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.annotateImportedData = true;\n\n/**\n * Tracking name of target class. Used by ArticleTargetEvents to identify which target we are tracking.\n *\n * @static\n * @property {string}\n * @inheritable\n */\nve.init.mw.ArticleTarget.static.trackingName = 'mwTarget';\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.integrationType = 'page';\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.platformType = 'other';\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.documentCommands = [\n\t...ve.init.mw.ArticleTarget.super.static.documentCommands,\n\t// Make help dialog triggerable from anywhere\n\t'commandHelp',\n\t// Make save commands triggerable from anywhere\n\t'showSave',\n\t'showChanges',\n\t'showPreview',\n\t'showMinoredit',\n\t'showWatchthis'\n];\n\n/* Static methods */\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.parseDocument = function ( documentString, mode, section, onlySection ) {\n\t// Add trailing linebreak to non-empty wikitext documents for consistency\n\t// with old editor and usability. Will be stripped on save. T156609\n\tif ( mode === 'source' && documentString ) {\n\t\tdocumentString += '\\n';\n\t}\n\n\t// Parent method\n\treturn ve.init.mw.ArticleTarget.super.static.parseDocument.call( this, documentString, mode, section, onlySection );\n};\n\n/**\n * Get the editable part of the page\n *\n * @return {jQuery} Editable DOM selection\n */\nve.init.mw.ArticleTarget.prototype.getEditableContent = function () {\n\treturn $( '#mw-content-text' );\n};\n\n/**\n * Build DOM for the redirect page subtitle (#redirectsub).\n *\n * @return {jQuery}\n */\nve.init.mw.ArticleTarget.static.buildRedirectSub = function () {\n\tconst $subMsg = mw.message( 'redirectpagesub' ).parseDom();\n\t// Page subtitle\n\t// Compare: Article::view()\n\treturn $( '<span>' )\n\t\t.attr( 'id', 'redirectsub' )\n\t\t.append( $subMsg );\n};\n\n/**\n * Build DOM for the redirect page content header (.redirectMsg).\n *\n * @param {string} title Redirect target\n * @return {jQuery}\n */\nve.init.mw.ArticleTarget.static.buildRedirectMsg = function ( title ) {\n\tconst $link = $( '<a>' )\n\t\t.attr( {\n\t\t\t// Redirect target is safe\n\t\t\t// eslint-disable-next-line local/no-unsanitized-href\n\t\t\thref: mw.Title.newFromText( title ).getUrl(),\n\t\t\ttitle: mw.msg( 'visualeditor-redirect-description', title )\n\t\t} )\n\t\t.text( title );\n\tve.init.platform.linkCache.styleElement( title, $link );\n\n\t// Page content header\n\t// Compare: LinkRenderer::makeRedirectHeader()\n\treturn $( '<div>' )\n\t\t.addClass( 'redirectMsg' )\n\t\t// Hack: This is normally inside #mw-content-text, but we may insert it before, so we need this.\n\t\t// The following classes are used here:\n\t\t// * mw-content-ltr\n\t\t// * mw-content-rtl\n\t\t.addClass( 'mw-content-' + mw.config.get( 'wgVisualEditor' ).pageLanguageDir )\n\t\t.append(\n\t\t\t$( '<p>' ).text( mw.msg( 'redirectto' ) ),\n\t\t\t$( '<ul>' )\n\t\t\t\t.addClass( 'redirectText' )\n\t\t\t\t.append( $( '<li>' ).append( $link ) )\n\t\t);\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.setDefaultMode = function () {\n\tconst oldDefaultMode = this.defaultMode;\n\t// Parent method\n\tve.init.mw.ArticleTarget.super.prototype.setDefaultMode.apply( this, arguments );\n\n\tif ( this.defaultMode !== oldDefaultMode ) {\n\t\tthis.updateTabs();\n\t\tif ( mw.libs.ve.setEditorPreference ) {\n\t\t\t// only set up by DAT.init\n\t\t\tmw.libs.ve.setEditorPreference( this.defaultMode === 'visual' ? 'visualeditor' : 'wikitext' );\n\t\t}\n\t}\n};\n\n/**\n * Update state of editing tabs from this target\n */\nve.init.mw.ArticleTarget.prototype.updateTabs = function () {};\n\n/**\n * Handle response to a successful load request.\n *\n * This method is called within the context of a target instance. If successful the DOM from the\n * server will be parsed, stored in {this.doc} and then {this.documentReady} will be called.\n *\n * @param {Object} response API response data\n * @param {string} status Text status message\n */\nve.init.mw.ArticleTarget.prototype.loadSuccess = function ( response ) {\n\tconst data = response ? ( response.visualeditor || response.visualeditoredit ) : null;\n\n\tif ( !data || typeof data.content !== 'string' ) {\n\t\tthis.loadFail( 've-api', { errors: [ {\n\t\t\tcode: 've-api',\n\t\t\thtml: mw.message( 'api-clientside-error-invalidresponse' ).parse()\n\t\t} ] } );\n\t} else if ( response.veMode && response.veMode !== this.getDefaultMode() ) {\n\t\tthis.loadFail( 've-mode', { errors: [ {\n\t\t\tcode: 've-mode',\n\t\t\thtml: mw.message( 'visualeditor-loaderror-wrongmode',\n\t\t\t\tresponse.veMode, this.getDefaultMode() ).parse()\n\t\t} ] } );\n\t} else {\n\t\tthis.track( 'trace.parseResponse.enter' );\n\t\tthis.originalHtml = data.content;\n\t\tthis.etag = data.etag;\n\t\t// We are reading from `preloaded` which comes from the VE API. If we want\n\t\t// to make the VE API non-blocking in the future we will need to handle\n\t\t// special-cases like this where the content doesn't come from RESTBase.\n\t\tthis.fromEditedState = !!data.fromEditedState || !!data.preloaded;\n\t\tthis.switched = data.switched;\n\t\tconst mode = this.getDefaultMode();\n\t\tconst section = ( mode === 'source' || this.enableVisualSectionEditing ) ? this.section : null;\n\t\tthis.doc = this.constructor.static.parseDocument( this.originalHtml, mode, section );\n\t\tthis.originalDmDocPromise = null;\n\n\t\t// Properties that don't come from the API\n\t\tthis.initialSourceRange = data.initialSourceRange;\n\t\tthis.recovered = data.recovered;\n\t\tthis.isRedirect = false;\n\n\t\t// Parse data this not available in RESTBase\n\t\tif ( !this.parseMetadata( response ) ) {\n\t\t\t// Invalid metadata, loadFail() or load() has been called\n\t\t\treturn;\n\t\t}\n\n\t\tthis.track( 'trace.parseResponse.exit' );\n\n\t\t// Everything worked, the page was loaded, continue initializing the editor\n\t\tthis.documentReady( this.doc );\n\t}\n\n\tif ( !this.isViewPage ) {\n\t\t$( '#firstHeading' ).text(\n\t\t\tmw.Title.newFromText( this.getPageName() ).getPrefixedText()\n\t\t);\n\t}\n};\n\n/**\n * Parse document metadata from the API response\n *\n * @param {Object} response API response data\n * @return {boolean} Whether metadata was loaded successfully. If true, you should call\n *   loadSuccess(). If false, either that loadFail() has been called or we're retrying via load().\n */\nve.init.mw.ArticleTarget.prototype.parseMetadata = function ( response ) {\n\tconst data = response ? ( response.visualeditor || response.visualeditoredit ) : null;\n\n\tif ( !data ) {\n\t\tthis.loadFail( 've-api', { errors: [ {\n\t\t\tcode: 've-api',\n\t\t\thtml: mw.message( 'api-clientside-error-invalidresponse' ).parse()\n\t\t} ] } );\n\t\treturn false;\n\t}\n\n\tthis.remoteNotices = ve.getObjectValues( data.notices );\n\tthis.protectedClasses = data.protectedClasses;\n\n\tthis.baseTimeStamp = data.basetimestamp;\n\tthis.startTimeStamp = data.starttimestamp;\n\tthis.revid = data.oldid || undefined;\n\tthis.preloaded = !!data.preloaded;\n\n\tthis.copyrightWarning = data.copyrightWarning;\n\n\tthis.checkboxesDef = data.checkboxesDef;\n\tthis.checkboxesMessages = data.checkboxesMessages;\n\tmw.messages.set( data.checkboxesMessages );\n\n\tthis.canEdit = data.canEdit;\n\tthis.wouldautocreate = data.wouldautocreate;\n\n\t// When docRevId is `undefined` it indicates that the page doesn't exist\n\tlet docRevId;\n\tconst aboutDoc = this.doc.documentElement && this.doc.documentElement.getAttribute( 'about' );\n\tif ( aboutDoc ) {\n\t\tconst docRevIdMatches = aboutDoc.match( /revision\\/([0-9]*)$/ );\n\t\tif ( docRevIdMatches.length >= 2 ) {\n\t\t\tdocRevId = parseInt( docRevIdMatches[ 1 ] );\n\t\t}\n\t}\n\t// There is no docRevId in source mode (doc is just a string), new visual documents, or when\n\t// switching from source mode with changes.\n\tif ( this.getDefaultMode() === 'visual' && !( this.switched && this.fromEditedState ) && docRevId !== this.revid ) {\n\t\tif ( this.retriedRevIdConflict ) {\n\t\t\t// Retried already, just error the second time.\n\t\t\tthis.loadFail( 've-api', { errors: [ {\n\t\t\t\tcode: 've-api',\n\t\t\t\thtml: mw.message( 'visualeditor-loaderror-revidconflict',\n\t\t\t\t\tString( docRevId ), String( this.revid ) ).parse()\n\t\t\t} ] } );\n\t\t} else {\n\t\t\tthis.retriedRevIdConflict = true;\n\t\t\t// TODO this retries both requests, in RESTbase mode we should only retry\n\t\t\t// the request that gave us the lower revid\n\t\t\tthis.loading = null;\n\t\t\t// HACK: Load with explicit revid to hopefully prevent this from happening again\n\t\t\tthis.requestedRevId = Math.max( docRevId || 0, this.revid );\n\t\t\tthis.load();\n\t\t}\n\t\treturn false;\n\t} else {\n\t\t// Set this to false after a successful load, so we don't immediately give up\n\t\t// if a subsequent load mismatches again\n\t\tthis.retriedRevIdConflict = false;\n\t}\n\n\t// Save dialog doesn't exist yet, so create an overlay for the widgets, and\n\t// append it to the save dialog later.\n\tthis.$saveDialogOverlay = $( '<div>' ).addClass( 'oo-ui-window-overlay' );\n\tconst checkboxes = mw.libs.ve.targetLoader.createCheckboxFields( this.checkboxesDef, { $overlay: this.$saveDialogOverlay } );\n\tthis.checkboxFields = checkboxes.checkboxFields;\n\tthis.checkboxesByName = checkboxes.checkboxesByName;\n\n\tthis.checkboxFields.forEach( ( field ) => {\n\t\t// TODO: This method should be upstreamed or moved so that targetLoader\n\t\t// can use it safely.\n\t\tve.targetLinksToNewWindow( field.$label[ 0 ] );\n\t} );\n\n\treturn true;\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.documentReady = function () {\n\t// We need to wait until documentReady as local notices may require special messages\n\tthis.editNotices = this.remoteNotices.concat(\n\t\tthis.localNoticeMessages.map( ( msgKey ) => '<p>' + ve.init.platform.getParsedMessage( msgKey ) + '</p>' )\n\t);\n\n\tthis.loading = null;\n\tthis.edited = this.fromEditedState;\n\n\t// Parent method\n\tve.init.mw.ArticleTarget.super.prototype.documentReady.apply( this, arguments );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.surfaceReady = function () {\n\tconst accessKeyPrefix = $.fn.updateTooltipAccessKeys.getAccessKeyPrefix().replace( /-/g, '+' ),\n\t\taccessKeyModifiers = new ve.ui.Trigger( accessKeyPrefix + '-' ).modifiers,\n\t\tsurfaceModel = this.getSurface().getModel();\n\n\t// loadSuccess() may have called setAssumeExistence( true );\n\tve.init.platform.linkCache.setAssumeExistence( false );\n\tsurfaceModel.connect( this, {\n\t\thistory: 'updateToolbarSaveButtonState'\n\t} );\n\n\t// Handle cancel events, i.e. pressing <escape>\n\tthis.getSurface().connect( this, {\n\t\tcancel: 'onSurfaceCancel'\n\t} );\n\n\t// Iterate over the trigger registry and resolve any access key conflicts\n\tfor ( const name in ve.ui.triggerRegistry.registry ) {\n\t\tconst triggers = ve.ui.triggerRegistry.registry[ name ];\n\t\tfor ( let i = 0; i < triggers.length; i++ ) {\n\t\t\tif ( ve.compare( triggers[ i ].modifiers, accessKeyModifiers ) ) {\n\t\t\t\tthis.disableAccessKey( triggers[ i ].primary );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !mw.config.get( 'wgVisualEditorConfig' ).enableHelpCompletion ) {\n\t\tthis.getSurface().commandRegistry.unregister( 'openHelpCompletions' );\n\t\tthis.getSurface().commandRegistry.unregister( 'openHelpCompletionsTrigger' );\n\t}\n\n\tif ( !this.canEdit ) {\n\t\tthis.getSurface().setReadOnly( true );\n\t} else {\n\t\t// TODO: If the user rejects joining the collab session, start auto-save\n\t\tif ( !this.currentUrl.searchParams.has( 'collabSession' ) ) {\n\t\t\t// Auto-save\n\t\t\tthis.initAutosave();\n\t\t}\n\n\t\tsetTimeout( () => {\n\t\t\tmw.libs.ve.targetSaver.preloadDeflate();\n\t\t}, 500 );\n\t}\n\n\t// Parent method\n\tve.init.mw.ArticleTarget.super.prototype.surfaceReady.apply( this, arguments );\n\n\tmw.hook( 've.activationComplete' ).fire();\n};\n\n/**\n * Handle surface cancel events\n */\nve.init.mw.ArticleTarget.prototype.onSurfaceCancel = function () {\n\tthis.tryTeardown( false, 'navigate-read' );\n};\n\n/**\n * Runs after the surface has been made ready and visible\n *\n * Implementing sub-classes must call this method.\n */\nve.init.mw.ArticleTarget.prototype.afterSurfaceReady = function () {\n\tthis.restoreEditSection();\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.storeDocState = function ( html ) {\n\tconst mode = this.getSurface().getMode();\n\tthis.getSurface().getModel().storeDocState( {\n\t\trequest: {\n\t\t\tpageName: this.getPageName(),\n\t\t\tmode: mode,\n\t\t\t// Check true section editing is in use\n\t\t\tsection: ( mode === 'source' || this.enableVisualSectionEditing ) ? this.section : null\n\t\t},\n\t\tresponse: {\n\t\t\t// --------------------------------------------------------------------------------\n\t\t\t// This should match the API result in ApiVisualEditor.php and ArticleTarget#getWikitextDataPromiseForDoc\n\t\t\t// --------------------------------------------------------------------------------\n\t\t\tbasetimestamp: this.baseTimeStamp,\n\t\t\t// `blockinfo` is not used by this client\n\t\t\tcanEdit: this.canEdit,\n\t\t\tcheckboxesDef: this.checkboxesDef,\n\t\t\tcheckboxesMessages: this.checkboxesMessages,\n\t\t\t// `content` is not needed here, we store `html` instead\n\t\t\tcopyrightWarning: this.copyrightWarning,\n\t\t\tetag: this.etag,\n\t\t\tfromEditedState: this.fromEditedState, // extra\n\t\t\tnotices: this.remoteNotices,\n\t\t\toldid: this.revid,\n\t\t\tpreloaded: this.preloaded,\n\t\t\tprotectedClasses: this.protectedClasses,\n\t\t\t// `result` is not used\n\t\t\tstarttimestamp: this.startTimeStamp,\n\t\t\tswitched: this.switched,\n\t\t\twouldautocreate: this.wouldautocreate\n\t\t}\n\t}, html );\n};\n\n/**\n * Disable an access key by removing the attribute from any element containing it\n *\n * @param {string} key Access key\n */\nve.init.mw.ArticleTarget.prototype.disableAccessKey = function ( key ) {\n\t$( '[accesskey=' + key + ']' ).each( ( i, el ) => {\n\t\tconst $el = $( el );\n\n\t\t$el\n\t\t\t.attr( 'data-old-accesskey', $el.attr( 'accesskey' ) )\n\t\t\t.removeAttr( 'accesskey' );\n\t} );\n};\n\n/**\n * Re-enable all access keys\n */\nve.init.mw.ArticleTarget.prototype.restoreAccessKeys = function () {\n\t$( '[data-old-accesskey]' ).each( ( i, el ) => {\n\t\tconst $el = $( el );\n\n\t\t$el\n\t\t\t.attr( 'accesskey', $el.attr( 'data-old-accesskey' ) )\n\t\t\t.removeAttr( 'data-old-accesskey' );\n\t} );\n};\n\n/**\n * Handle an unsuccessful load request.\n *\n * This method is called within the context of a target instance.\n *\n * @param {string} code Error code from mw.Api\n * @param {Object} errorDetails API response\n * @fires ve.init.mw.ArticleTarget#loadError\n */\nve.init.mw.ArticleTarget.prototype.loadFail = function () {\n\tthis.loading = null;\n\tthis.emit( 'loadError' );\n};\n\n/**\n * Replace the page content with new HTML.\n *\n * @method\n * @param {string} html Rendered HTML from server\n * @param {string} categoriesHtml Rendered categories HTML from server\n * @param {string} displayTitle HTML to show as the page title\n * @param {Object} lastModified Object containing user-formatted date\n *  and time strings, or undefined if we made no change.\n * @param {string} contentSub HTML to show as the content subtitle\n * @param {Array} sections Section data to display in the TOC\n */\nve.init.mw.ArticleTarget.prototype.replacePageContent = function (\n\thtml, categoriesHtml, displayTitle, lastModified, contentSub, sections\n) {\n\t// eslint-disable-next-line no-jquery/no-append-html\n\tthis.$editableContent.find( '.mw-parser-output' ).first().replaceWith( html );\n\tmw.hook( 'wikipage.content' ).fire( this.$editableContent );\n\n\tif ( displayTitle ) {\n\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t$( '#firstHeading' ).html( displayTitle );\n\t}\n\n\t// Categories are only shown in AMC on mobile\n\tif ( $( '#catlinks' ).length ) {\n\t\tconst $categories = $( $.parseHTML( categoriesHtml ) );\n\t\tmw.hook( 'wikipage.categories' ).fire( $categories );\n\t\t$( '#catlinks' ).replaceWith( $categories );\n\t}\n\n\tmw.util.clearSubtitle();\n\tmw.util.addSubtitle( contentSub );\n\n\tthis.setRealRedirectInterface();\n\n\tmw.hook( 'wikipage.tableOfContents' ).fire( sections );\n};\n\n/**\n * Handle successful DOM save event.\n *\n * @param {Object} data Save data from the API\n * @param {boolean} data.nocontent Indicates that page HTML and related properties were omitted\n * @param {string} data.content Rendered page HTML from server\n * @param {string} data.categorieshtml Rendered categories HTML from server\n * @param {number} data.newrevid New revision id, undefined if unchanged\n * @param {boolean} data.isRedirect Whether this page is a redirect or not\n * @param {string} data.displayTitleHtml What HTML to show as the page title\n * @param {Object} data.lastModified Object containing user-formatted date\n *  and time strings, or undefined if we made no change.\n * @param {string} data.contentSub HTML to show as the content subtitle\n * @param {Array} data.modules The modules to be loaded on the page\n * @param {Object} data.jsconfigvars The mw.config values needed on the page\n * @param {Array} data.sections Section data to display in the TOC\n * @param {boolean} data.tempusercreated True if we just became logged in as a temporary user\n * @param {string} data.tempusercreatedredirect URL to visit to finish creating temp account\n * @fires ve.init.mw.ArticleTarget#save\n */\nve.init.mw.ArticleTarget.prototype.saveComplete = function ( data ) {\n\tthis.editSummaryValue = null;\n\tthis.initialEditSummary = null;\n\n\tthis.saveDeferred.resolve();\n\tthis.emit( 'save', data );\n\n\t// This is a page creation, a restoration, or we loaded the editor from a non-view page,\n\t// or we just became logged in as a temporary user: refresh the page.\n\tif ( data.nocontent || data.tempusercreated ) {\n\t\t// Teardown the target, ensuring auto-save data is cleared\n\t\tthis.teardown().then( () => {\n\t\t\tif ( data.newrevid !== undefined ) {\n\t\t\t\tlet action;\n\t\t\t\tif ( this.restoring ) {\n\t\t\t\t\taction = 'restored';\n\t\t\t\t} else if ( !this.pageExists ) {\n\t\t\t\t\taction = 'created';\n\t\t\t\t} else {\n\t\t\t\t\taction = 'saved';\n\t\t\t\t}\n\t\t\t\trequire( 'mediawiki.action.view.postEdit' ).fireHookOnPageReload( action, data.tempusercreated );\n\t\t\t}\n\n\t\t\tif ( data.tempusercreatedredirect ) {\n\t\t\t\tlocation.href = data.tempusercreatedredirect;\n\t\t\t} else {\n\t\t\t\tconst newUrl = new URL( this.viewUrl );\n\t\t\t\tif ( data.newrevid !== undefined ) {\n\t\t\t\t\t// For GrowthExperiments\n\t\t\t\t\tnewUrl.searchParams.set( 'venotify', 'saved' );\n\t\t\t\t}\n\t\t\t\tif ( data.isRedirect ) {\n\t\t\t\t\tnewUrl.searchParams.set( 'redirect', 'no' );\n\t\t\t\t}\n\t\t\t\tlocation.href = newUrl;\n\t\t\t}\n\t\t} );\n\t} else {\n\t\t// Update watch link to match 'watch checkbox' in save dialog.\n\t\t// User logged in if module loaded.\n\t\tif ( mw.loader.getState( 'mediawiki.page.watch.ajax' ) === 'ready' ) {\n\t\t\tconst watch = require( 'mediawiki.page.watch.ajax' );\n\n\t\t\twatch.updatePageWatchStatus(\n\t\t\t\tdata.watched,\n\t\t\t\tdata.watchlistexpiry\n\t\t\t);\n\t\t}\n\n\t\t// If we were explicitly editing an older version, make sure we won't\n\t\t// load the same old version again, now that we've saved the next edit\n\t\t// will be against the latest version.\n\t\t// If there is an ?oldid= parameter in the URL, this will cause restorePage() to remove it.\n\t\tthis.restoring = false;\n\n\t\t// Clear requestedRevId in case it was set by a retry or something; after saving\n\t\t// we don't want to go back into oldid mode anyway\n\t\tthis.requestedRevId = undefined;\n\n\t\tif ( data.newrevid !== undefined ) {\n\t\t\tmw.config.set( {\n\t\t\t\twgCurRevisionId: data.newrevid,\n\t\t\t\twgRevisionId: data.newrevid\n\t\t\t} );\n\t\t\tthis.revid = data.newrevid;\n\t\t\tthis.currentRevisionId = data.newrevid;\n\t\t}\n\n\t\t// Update module JS config values and notify ResourceLoader of any new\n\t\t// modules needed to be added to the page\n\t\tmw.config.set( data.jsconfigvars );\n\t\tmw.loader.load( data.modules );\n\n\t\tmw.config.set( {\n\t\t\twgIsRedirect: !!data.isRedirect\n\t\t} );\n\n\t\tif ( this.saveDialog ) {\n\t\t\tthis.saveDialog.reset();\n\t\t}\n\n\t\tthis.replacePageContent(\n\t\t\tdata.content,\n\t\t\tdata.categorieshtml,\n\t\t\tdata.displayTitleHtml,\n\t\t\tdata.lastModified,\n\t\t\tdata.contentSub,\n\t\t\tdata.sections\n\t\t);\n\n\t\t// Tear down the target now that we're done saving\n\t\t// Not passing trackMechanism because this isn't an abort action\n\t\tthis.tryTeardown( true );\n\t}\n};\n\n/**\n * Handle an unsuccessful save request.\n *\n * @param {HTMLDocument} doc HTML document we tried to save\n * @param {Object} saveData Options that were used\n * @param {string} code Error code\n * @param {Object|null} data Full API response data, or XHR error details\n * @fires ve.init.mw.ArticleTarget#saveError\n */\nve.init.mw.ArticleTarget.prototype.saveFail = function ( doc, saveData, code, data ) {\n\tthis.pageDeletedWarning = false;\n\n\tlet handled = false;\n\t// Handle empty response\n\tif ( !data ) {\n\t\tthis.showSaveError( this.extractErrorMessages( null ) );\n\t\thandled = true;\n\t}\n\n\tif ( !handled && data.errors ) {\n\t\tfor ( let i = 0; i < data.errors.length; i++ ) {\n\t\t\tconst error = data.errors[ i ];\n\n\t\t\tif ( error.code === 'assertanonfailed' || error.code === 'assertuserfailed' || error.code === 'assertnameduserfailed' ) {\n\t\t\t\tthis.refreshUser().then( ( username ) => {\n\t\t\t\t\t// Reattempt the save after successfully refreshing the\n\t\t\t\t\t// user, but only if it's a temporary account (T345975)\n\t\t\t\t\tif ( error.code === 'assertanonfailed' && mw.util.isTemporaryUser( username ) ) {\n\t\t\t\t\t\tthis.startSave( this.getSaveOptions() );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.saveErrorNewUser( username );\n\t\t\t\t\t}\n\t\t\t\t}, () => {\n\t\t\t\t\tthis.showSaveError( this.extractErrorMessages( data ) );\n\t\t\t\t} );\n\t\t\t\thandled = true;\n\t\t\t} else if ( error.code === 'editconflict' ) {\n\t\t\t\tthis.editConflict();\n\t\t\t\thandled = true;\n\t\t\t} else if ( error.code === 'pagedeleted' ) {\n\t\t\t\tthis.pageDeletedWarning = true;\n\t\t\t\t// The API error message 'apierror-pagedeleted' is poor, make our own\n\t\t\t\tthis.showSaveError( mw.msg( 'visualeditor-recreate', mw.msg( 'ooui-dialog-process-continue' ) ), true );\n\t\t\t\thandled = true;\n\t\t\t} else if ( error.code === 'hookaborted' ) {\n\t\t\t\tthis.saveErrorHookAborted( data );\n\t\t\t\thandled = true;\n\t\t\t} else if ( error.code === 'readonly' ) {\n\t\t\t\tthis.showSaveError( this.extractErrorMessages( data ), true );\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !handled ) {\n\t\tconst saveErrorHandlerFactory = ve.init.mw.saveErrorHandlerFactory;\n\t\tfor ( const name in saveErrorHandlerFactory.registry ) {\n\t\t\tconst handler = saveErrorHandlerFactory.lookup( name );\n\t\t\tif ( handler.static.matchFunction( data ) ) {\n\t\t\t\thandler.static.process( data, this );\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Handle (other) unknown and/or unrecoverable errors\n\tif ( !handled ) {\n\t\tthis.showSaveError( this.extractErrorMessages( data ) );\n\t\thandled = true;\n\t}\n\n\tlet errorCodes;\n\tif ( data.errors ) {\n\t\terrorCodes = OO.unique( data.errors.map( ( err ) => err.code ) ).join( ',' );\n\t} else if ( ve.getProp( data, 'visualeditoredit', 'edit', 'captcha' ) ) {\n\t\t// Eww\n\t\terrorCodes = 'captcha';\n\t} else {\n\t\terrorCodes = 'http-' + ( ( data.xhr && data.xhr.status ) || 0 );\n\t}\n\tthis.emit( 'saveError', errorCodes );\n};\n\n/**\n * Show a save process error message\n *\n * @param {string|jQuery|Node[]} msg Message content (string of HTML, jQuery object or array of\n *  Node objects)\n * @param {boolean} [warning=false] Whether or not this is a warning.\n */\nve.init.mw.ArticleTarget.prototype.showSaveError = function ( msg, warning ) {\n\tthis.saveDeferred.reject( [ new OO.ui.Error( msg, { warning: warning } ) ] );\n};\n\n/**\n * Extract the error messages from an erroneous API response\n *\n * @param {Object} data API response data\n * @return {jQuery}\n */\nve.init.mw.ArticleTarget.prototype.extractErrorMessages = function ( data ) {\n\tconst $errorMsgs = ( new mw.Api() ).getErrorMessage( data );\n\t// Warning, this assumes there are only Element nodes in the jQuery set\n\t$errorMsgs.toArray().forEach( ve.targetLinksToNewWindow );\n\treturn $errorMsgs;\n};\n\n/**\n * Handle hook abort save error. Intended to be overridden by extensions implementing the\n * VisualEditorApiVisualEditorEditPreSave hook.\n *\n * @param {Object} data API response data\n */\nve.init.mw.ArticleTarget.prototype.saveErrorHookAborted = function ( data ) {\n\tthis.showSaveError( this.extractErrorMessages( data ) );\n};\n\n/**\n * Handle assert error indicating another user is logged in.\n *\n * @param {string|null} username Name of newly logged-in user, or a temporary account name,\n *   or null if logged-out and temporary accounts are disabled\n */\nve.init.mw.ArticleTarget.prototype.saveErrorNewUser = function ( username ) {\n\tconst $msg = mw.message(\n\t\tusername === null ?\n\t\t\t'visualeditor-savedialog-identify-anon' :\n\t\t\tmw.util.isTemporaryUser( username ) ?\n\t\t\t\t'visualeditor-savedialog-identify-temp' :\n\t\t\t\t'visualeditor-savedialog-identify-user',\n\t\tusername\n\t).parseDom();\n\n\tthis.showSaveError( $msg, true );\n};\n\n/**\n * Handle an edit conflict\n */\nve.init.mw.ArticleTarget.prototype.editConflict = function () {\n\tthis.saveDialog.popPending();\n\tthis.saveDialog.swapPanel( 'conflict' );\n};\n\n/**\n * Handle clicks on the review button in the save dialog.\n *\n * @fires ve.init.mw.ArticleTarget#saveReview\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogReview = function () {\n\tif ( !this.saveDialog.hasDiff ) {\n\t\tthis.emit( 'saveReview' );\n\t\tthis.saveDialog.pushPending();\n\t\t// Acquire a temporary user username before diffing, so that signatures and\n\t\t// user-related magic words display the temp user instead of IP user in the diff. (T331397)\n\t\tmw.user.acquireTempUserName().then( () => {\n\t\t\tif ( this.pageExists ) {\n\t\t\t\t// Has no callback, handled via this.showChangesDiff\n\t\t\t\tthis.showChanges( this.getDocToSave() );\n\t\t\t} else {\n\t\t\t\tthis.serialize( this.getDocToSave() ).then( ( data ) => {\n\t\t\t\t\tthis.onSaveDialogReviewComplete( data.content );\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t} else {\n\t\tthis.saveDialog.swapPanel( 'review' );\n\t}\n};\n\n/**\n * Handle clicks on the show preview button in the save dialog.\n *\n * @fires ve.init.mw.ArticleTarget#savePreview\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogPreview = function () {\n\tconst api = this.getContentApi();\n\n\tif ( !this.saveDialog.$previewViewer.children().length ) {\n\t\tthis.emit( 'savePreview' );\n\t\tthis.saveDialog.pushPending();\n\n\t\tconst params = {};\n\n\t\tconst sectionTitle = this.sectionTitle && this.sectionTitle.getValue();\n\t\tif ( sectionTitle ) {\n\t\t\tparams.section = 'new';\n\t\t\tparams.sectiontitle = sectionTitle;\n\t\t}\n\t\tif ( mw.config.get( 'wgUserVariant' ) ) {\n\t\t\tparams.variant = mw.config.get( 'wgUserVariant' );\n\t\t}\n\n\t\t// Acquire a temporary user username before previewing, so that signatures and\n\t\t// user-related magic words display the temp user instead of IP user in the preview. (T331397)\n\t\tmw.user.acquireTempUserName().then( () => api.post( ve.extendObject( params, {\n\t\t\taction: 'parse',\n\t\t\ttitle: this.getPageName(),\n\t\t\ttext: this.getDocToSave(),\n\t\t\tpst: true,\n\t\t\tpreview: true,\n\t\t\tsectionpreview: this.section !== null,\n\t\t\tdisableeditsection: true,\n\t\t\tuselang: mw.config.get( 'wgUserLanguage' ),\n\t\t\tuseskin: mw.config.get( 'skin' ),\n\t\t\tmobileformat: OO.ui.isMobile(),\n\t\t\tprop: [ 'text', 'categorieshtml', 'displaytitle', 'subtitle', 'modules', 'jsconfigvars' ]\n\t\t} ) ) ).then( ( response ) => {\n\t\t\tthis.saveDialog.showPreview( response );\n\t\t}, ( errorCode, details ) => {\n\t\t\tthis.saveDialog.showPreview( this.extractErrorMessages( details ) );\n\t\t} ).always( () => {\n\t\t\tthis.bindSaveDialogClearDiff();\n\t\t} );\n\t} else {\n\t\tthis.saveDialog.swapPanel( 'preview' );\n\t}\n};\n\n/**\n * Clear the save dialog's diff cache when the document changes\n */\nve.init.mw.ArticleTarget.prototype.bindSaveDialogClearDiff = function () {\n\t// Invalidate the viewer wikitext on next change\n\tthis.getSurface().getModel().getDocument().once( 'transact',\n\t\tthis.saveDialog.clearDiff.bind( this.saveDialog )\n\t);\n\tif ( this.sectionTitle ) {\n\t\tthis.sectionTitle.once( 'change', this.saveDialog.clearDiff.bind( this.saveDialog ) );\n\t}\n};\n\n/**\n * Handle completed serialize request for diff views for new page creations.\n *\n * @param {string} wikitext\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogReviewComplete = function ( wikitext ) {\n\tthis.bindSaveDialogClearDiff();\n\tthis.saveDialog.setDiffAndReview(\n\t\tve.createDeferred().resolve( $( '<pre>' ).text( wikitext ) ).promise(),\n\t\tthis.getVisualDiffGeneratorPromise(),\n\t\tthis.getSurface().getModel().getDocument().getHtmlDocument()\n\t);\n};\n\n/**\n * Get a visual diff object for the current document state\n *\n * @return {jQuery.Promise} Promise resolving with a generator for a ve.dm.VisualDiff visual diff\n */\nve.init.mw.ArticleTarget.prototype.getVisualDiffGeneratorPromise = function () {\n\treturn mw.loader.using( 'ext.visualEditor.diffLoader' ).then( () => {\n\t\tconst mode = this.getSurface().getMode();\n\n\t\tif ( !this.originalDmDocPromise ) {\n\t\t\tif ( mode === 'source' ) {\n\t\t\t\t// Always load full doc in source mode for correct reference diffing (T260008)\n\t\t\t\tthis.originalDmDocPromise = mw.libs.ve.diffLoader.fetchRevision( this.revid, this.getPageName() );\n\t\t\t} else {\n\t\t\t\tif ( !this.fromEditedState ) {\n\t\t\t\t\tconst dmDoc = this.constructor.static.createModelFromDom( this.doc, 'visual' );\n\t\t\t\t\tlet dmDocOrNode;\n\t\t\t\t\tif ( this.section !== null && this.enableVisualSectionEditing ) {\n\t\t\t\t\t\tdmDocOrNode = dmDoc.getNodesByType( 'section' )[ 0 ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdmDocOrNode = dmDoc;\n\t\t\t\t\t}\n\t\t\t\t\tthis.originalDmDocPromise = ve.createDeferred().resolve( dmDocOrNode ).promise();\n\t\t\t\t} else {\n\t\t\t\t\tthis.originalDmDocPromise = mw.libs.ve.diffLoader.fetchRevision( this.revid, this.getPageName(), this.section );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( mode === 'source' ) {\n\t\t\t// Acquire a temporary user username before diffing, so that signatures and\n\t\t\t// user-related magic words display the temp user instead of IP user in the diff. (T331397)\n\t\t\tconst newRevPromise = mw.user.acquireTempUserName().then( () => this.getContentApi().post( {\n\t\t\t\taction: 'visualeditor',\n\t\t\t\tpaction: 'parse',\n\t\t\t\tpage: this.getPageName(),\n\t\t\t\twikitext: this.getSurface().getDom(),\n\t\t\t\tsection: this.section,\n\t\t\t\tstash: 0,\n\t\t\t\tpst: true\n\t\t\t} ) ).then(\n\t\t\t\t// Source mode always fetches the whole document, so set section=null to unwrap sections\n\t\t\t\t( response ) => mw.libs.ve.diffLoader.getModelFromResponse( response, null )\n\t\t\t);\n\n\t\t\treturn mw.libs.ve.diffLoader.getVisualDiffGeneratorPromise( this.originalDmDocPromise, newRevPromise );\n\t\t} else {\n\t\t\treturn this.originalDmDocPromise.then(\n\t\t\t\t( originalDmDoc ) => () => new ve.dm.VisualDiff( originalDmDoc, this.getSurface().getModel().getDocument().getAttachedRoot() )\n\t\t\t);\n\t\t}\n\t} );\n};\n\n/**\n * Handle clicks on the resolve conflict button in the conflict dialog.\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogResolveConflict = function () {\n\tconst fields = { wpSave: 1 };\n\n\tif ( this.getSurface().getMode() === 'source' && this.section !== null ) {\n\t\t// TODO: This should happen in #getSaveFields, check if moving it there breaks anything\n\t\tfields.section = this.section;\n\t}\n\t// Get Wikitext from the DOM, and set up a submit call when it's done\n\tthis.serialize( this.getDocToSave() ).then( ( data ) => {\n\t\tthis.submitWithSaveFields( fields, data.content );\n\t} );\n};\n\n/**\n * Handle dialog retry events\n * So we can handle trying to save again after page deletion warnings\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogRetry = function () {\n\tif ( this.pageDeletedWarning ) {\n\t\tthis.recreating = true;\n\t\tthis.pageExists = false;\n\t}\n};\n\n/**\n * Load the editor.\n *\n * This method initiates an API request for the page data unless dataPromise is passed in,\n * in which case it waits for that promise instead.\n *\n * @param {jQuery.Promise} [dataPromise] Promise for pending request, if any\n * @return {jQuery.Promise} Data promise\n */\nve.init.mw.ArticleTarget.prototype.load = function ( dataPromise ) {\n\tif ( this.getDefaultMode() === 'visual' && this.section === 'new' ) {\n\t\tthrow new Error( 'Adding new section is not supported in visual mode' );\n\t}\n\t// Prevent duplicate requests\n\tif ( this.loading ) {\n\t\treturn this.loading;\n\t}\n\tthis.events.trackActivationStart( mw.libs.ve.activationStart );\n\tmw.libs.ve.activationStart = null;\n\n\tconst url = new URL( location.href );\n\tdataPromise = dataPromise || mw.libs.ve.targetLoader.requestPageData( this.getDefaultMode(), this.getPageName(), {\n\t\tsessionStore: true,\n\t\tsection: this.section,\n\t\toldId: this.requestedRevId,\n\t\ttargetName: this.constructor.static.trackingName,\n\t\teditintro: url.searchParams.get( 'editintro' ),\n\t\tpreload: url.searchParams.get( 'preload' ),\n\t\tpreloadparams: mw.util.getArrayParam( 'preloadparams', url.searchParams )\n\t} );\n\n\tthis.loading = dataPromise;\n\tdataPromise.then(\n\t\tthis.loadSuccess.bind( this ),\n\t\tthis.loadFail.bind( this )\n\t);\n\n\treturn dataPromise;\n};\n\n/**\n * Clear the state of this target, preparing it to be reactivated later.\n */\nve.init.mw.ArticleTarget.prototype.clearState = function () {\n\tthis.restoreAccessKeys();\n\tthis.clearPreparedCacheKey();\n\tthis.loading = null;\n\tthis.saving = null;\n\tthis.clearDiff();\n\tthis.serializing = false;\n\tthis.submitting = false;\n\tthis.baseTimeStamp = null;\n\tthis.startTimeStamp = null;\n\tthis.checkboxes = null;\n\tthis.initialSourceRange = null;\n\tthis.doc = null;\n\tthis.originalDmDocPromise = null;\n\tthis.originalHtml = null;\n\tthis.toolbarSaveButton = null;\n\tthis.section = null;\n\tthis.visibleSection = null;\n\tthis.visibleSectionOffset = null;\n\tthis.editNotices = [];\n\tthis.remoteNotices = [];\n\tthis.localNoticeMessages = [];\n\tthis.recovered = false;\n\tthis.teardownPromise = null;\n};\n\n/**\n * Get a document to save, cached until the surface is modified\n *\n * The default implementation returns an HTMLDocument, but other targets\n * may use a different document model (e.g. plain text for source mode).\n *\n * @return {Object} Document to save\n */\nve.init.mw.ArticleTarget.prototype.getDocToSave = function () {\n\tif ( !this.docToSave ) {\n\t\tthis.docToSave = this.createDocToSave();\n\t\t// Cache clearing events\n\t\tconst surface = this.getSurface();\n\t\tsurface.getModel().getDocument().once( 'transact', this.clearDocToSave.bind( this ) );\n\t\tsurface.once( 'destroy', this.clearDocToSave.bind( this ) );\n\t}\n\treturn this.docToSave;\n};\n\n/**\n * Create a document to save\n *\n * @return {Object} Document to save\n */\nve.init.mw.ArticleTarget.prototype.createDocToSave = function () {\n\treturn this.getSurface().getDom();\n};\n\n/**\n * Clear the document to save from the cache\n */\nve.init.mw.ArticleTarget.prototype.clearDocToSave = function () {\n\tthis.docToSave = null;\n\tthis.clearPreparedCacheKey();\n};\n\n/**\n * Serialize the current document and store the result in the serialization cache on the server.\n *\n * This function returns a promise that is resolved once serialization is complete, with the\n * cache key passed as the first parameter.\n *\n * If there's already a request pending for the same (reference-identical) HTMLDocument, this\n * function will not initiate a new request but will return the promise for the pending request.\n * If a request for the same document has already been completed, this function will keep returning\n * the same promise (which will already have been resolved) until clearPreparedCacheKey() is called.\n *\n * @param {HTMLDocument} doc Document to serialize\n */\nve.init.mw.ArticleTarget.prototype.prepareCacheKey = function ( doc ) {\n\tconst start = ve.now();\n\n\tif ( this.getSurface().getMode() === 'source' ) {\n\t\treturn;\n\t}\n\n\tif ( this.preparedCacheKeyPromise && this.preparedCacheKeyPromise.doc === doc ) {\n\t\treturn;\n\t}\n\tthis.clearPreparedCacheKey();\n\n\tlet xhr;\n\tlet aborted = false;\n\tthis.preparedCacheKeyPromise = mw.libs.ve.targetSaver.deflateDoc( doc, this.doc )\n\t\t.then( ( deflatedHtml ) => {\n\t\t\tif ( aborted ) {\n\t\t\t\treturn ve.createDeferred().reject();\n\t\t\t}\n\t\t\txhr = this.getContentApi().postWithToken( 'csrf',\n\t\t\t\t{\n\t\t\t\t\taction: 'visualeditoredit',\n\t\t\t\t\tpaction: 'serializeforcache',\n\t\t\t\t\thtml: deflatedHtml,\n\t\t\t\t\tpage: this.getPageName(),\n\t\t\t\t\toldid: this.revid,\n\t\t\t\t\tetag: this.etag\n\t\t\t\t},\n\t\t\t\t{ contentType: 'multipart/form-data' }\n\t\t\t);\n\t\t\treturn xhr.then(\n\t\t\t\t( response ) => {\n\t\t\t\t\tconst trackData = { duration: ve.now() - start };\n\t\t\t\t\tif ( response.visualeditoredit && typeof response.visualeditoredit.cachekey === 'string' ) {\n\t\t\t\t\t\tthis.events.track( 'performance.system.serializeforcache', trackData );\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcacheKey: response.visualeditoredit.cachekey,\n\t\t\t\t\t\t\t// Pass the HTML for retries.\n\t\t\t\t\t\t\thtml: deflatedHtml\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.events.track( 'performance.system.serializeforcache.nocachekey', trackData );\n\t\t\t\t\t\treturn ve.createDeferred().reject();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tthis.events.track( 'performance.system.serializeforcache.fail', { duration: ve.now() - start } );\n\t\t\t\t\treturn ve.createDeferred().reject();\n\t\t\t\t}\n\t\t\t);\n\t\t} )\n\t\t.promise( {\n\t\t\tabort: () => {\n\t\t\t\tif ( xhr ) {\n\t\t\t\t\txhr.abort();\n\t\t\t\t}\n\t\t\t\taborted = true;\n\t\t\t},\n\t\t\tdoc: doc\n\t\t} );\n};\n\n/**\n * Get the prepared wikitext, if any. Same as prepareWikitext() but does not initiate a request\n * if one isn't already pending or finished. Instead, it returns a rejected promise in that case.\n *\n * @param {HTMLDocument} doc Document to serialize\n * @return {jQuery.Promise} Abortable promise, resolved with a plain object containing `cacheKey`,\n * and `html` for retries.\n */\nve.init.mw.ArticleTarget.prototype.getPreparedCacheKey = function ( doc ) {\n\tif ( this.preparedCacheKeyPromise && this.preparedCacheKeyPromise.doc === doc ) {\n\t\treturn this.preparedCacheKeyPromise;\n\t}\n\treturn ve.createDeferred().reject().promise();\n};\n\n/**\n * Clear the promise for the prepared wikitext cache key, and abort it if it's still in progress.\n */\nve.init.mw.ArticleTarget.prototype.clearPreparedCacheKey = function () {\n\tif ( this.preparedCacheKeyPromise ) {\n\t\tthis.preparedCacheKeyPromise.abort();\n\t\tthis.preparedCacheKeyPromise = null;\n\t}\n};\n\n/**\n * Try submitting an API request with a cache key for prepared wikitext, falling back to submitting\n * HTML directly if there is no cache key present or pending, or if the request for the cache key\n * fails, or if using the cache key fails with a badcachekey error.\n *\n * This function will use mw.Api#postWithToken to retry automatically when encountering a 'badtoken'\n * error.\n *\n * @param {HTMLDocument|string} doc Document to submit or string in source mode\n * @param {Object} extraData POST parameters to send. Do not include 'html', 'cachekey' or 'format'.\n * @param {string} [eventName] If set, log an event when the request completes successfully. The\n *  full event name used will be 'performance.system.{eventName}.withCacheKey' or .withoutCacheKey\n *  depending on whether or not a cache key was used.\n * @return {jQuery.Promise} Promise which resolves/rejects when saving is complete/fails\n */\nve.init.mw.ArticleTarget.prototype.tryWithPreparedCacheKey = function ( doc, extraData, eventName ) {\n\tif ( this.getSurface().getMode() === 'source' ) {\n\t\tconst data = ve.copy( extraData );\n\n\t\t// TODO: This should happen in #getSaveOptions, check if moving it there breaks anything\n\t\tif ( this.section !== null ) {\n\t\t\tdata.section = this.section;\n\t\t}\n\t\tif ( this.sectionTitle ) {\n\t\t\tdata.sectiontitle = this.sectionTitle.getValue();\n\t\t\tdata.summary = undefined;\n\t\t}\n\n\t\treturn mw.libs.ve.targetSaver.postWikitext(\n\t\t\tdoc,\n\t\t\tdata,\n\t\t\t{ api: this.getContentApi() }\n\t\t);\n\t}\n\n\t// getPreparedCacheKey resolves with { cacheKey: ..., html: ... } or rejects.\n\t// After modification it never rejects, just resolves with { html: ... } instead\n\tconst htmlOrCacheKeyPromise = this.getPreparedCacheKey( doc ).then(\n\t\t// Success, use promise as-is.\n\t\tnull,\n\t\t// Fail, get deflatedHtml promise\n\t\t() => mw.libs.ve.targetSaver.deflateDoc( doc, this.doc ).then( ( html ) => ( { html: html } ) ) );\n\n\treturn htmlOrCacheKeyPromise.then( ( htmlOrCacheKey ) => mw.libs.ve.targetSaver.postHtml(\n\t\thtmlOrCacheKey.html,\n\t\thtmlOrCacheKey.cacheKey,\n\t\textraData,\n\t\t{\n\t\t\tonCacheKeyFail: this.clearPreparedCacheKey.bind( this ),\n\t\t\tapi: this.getContentApi(),\n\t\t\ttrack: this.events.track.bind( this.events ),\n\t\t\teventName: eventName,\n\t\t\tnow: ve.now\n\t\t}\n\t) );\n};\n\n/**\n * Handle the save dialog's save event\n *\n * Validates the inputs then starts the save process\n *\n * @param {jQuery.Deferred} saveDeferred Deferred object to resolve/reject when the save\n *  succeeds/fails.\n * @fires ve.init.mw.ArticleTarget#saveInitiated\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogSave = function ( saveDeferred ) {\n\tif ( this.deactivating ) {\n\t\treturn;\n\t}\n\n\tconst saveOptions = this.getSaveOptions();\n\n\tif (\n\t\t+mw.user.options.get( 'forceeditsummary' ) &&\n\t\t( saveOptions.summary === '' || saveOptions.summary === this.initialEditSummary ) &&\n\t\t!this.saveDialog.messages.missingsummary\n\t) {\n\t\tthis.saveDialog.showMessage(\n\t\t\t'missingsummary',\n\t\t\tnew OO.ui.HtmlSnippet( ve.init.platform.getParsedMessage( 'missingsummary' ) )\n\t\t);\n\t\tthis.saveDialog.popPending();\n\t} else {\n\t\tthis.emit( 'saveInitiated' );\n\t\tthis.startSave( saveOptions );\n\t\tthis.saveDeferred = saveDeferred;\n\t}\n};\n\n/**\n * Start the save process\n *\n * @param {Object} saveOptions Save options\n */\nve.init.mw.ArticleTarget.prototype.startSave = function ( saveOptions ) {\n\tthis.save( this.getDocToSave(), saveOptions );\n};\n\n/**\n * Get save form fields from the save dialog form.\n *\n * @return {Object} Form data for submission to the MediaWiki action=edit UI\n */\nve.init.mw.ArticleTarget.prototype.getSaveFields = function () {\n\tconst fields = {};\n\n\tif ( this.section === 'new' ) {\n\t\t// MediaWiki action=edit UI doesn't have separate parameters for edit summary and new section\n\t\t// title. The edit summary parameter is supposed to contain the section title, and the real\n\t\t// summary is autogenerated.\n\t\tfields.wpSummary = this.sectionTitle ? this.sectionTitle.getValue() : '';\n\t} else {\n\t\tfields.wpSummary = this.saveDialog ?\n\t\t\tthis.saveDialog.editSummaryInput.getValue() :\n\t\t\t( this.editSummaryValue || this.initialEditSummary );\n\t}\n\n\tlet name;\n\t// Extra save fields added by extensions\n\tfor ( name in this.saveFields ) {\n\t\tfields[ name ] = this.saveFields[ name ]();\n\t}\n\n\tif ( this.recreating ) {\n\t\tfields.wpRecreate = true;\n\t}\n\n\tfor ( name in this.checkboxesByName ) {\n\t\t// DropdownInputWidget or CheckboxInputWidget\n\t\tif ( !this.checkboxesByName[ name ].isSelected || this.checkboxesByName[ name ].isSelected() ) {\n\t\t\tfields[ name ] = this.checkboxesByName[ name ].getValue();\n\t\t}\n\t}\n\n\treturn fields;\n};\n\n/**\n * Invoke #submit with the data from #getSaveFields\n *\n * @param {Object} fields Fields to add in addition to those from #getSaveFields\n * @param {string} wikitext Wikitext to submit\n * @return {boolean} Whether submission was started\n */\nve.init.mw.ArticleTarget.prototype.submitWithSaveFields = function ( fields, wikitext ) {\n\treturn this.submit( wikitext, ve.extendObject( this.getSaveFields(), fields ) );\n};\n\n/**\n * Get edit API options from the save dialog form.\n *\n * @return {Object} Save options for submission to the MediaWiki API\n */\nve.init.mw.ArticleTarget.prototype.getSaveOptions = function () {\n\tconst options = this.getSaveFields(),\n\t\tfieldMap = {\n\t\t\twpSummary: 'summary',\n\t\t\twpMinoredit: 'minor',\n\t\t\twpWatchthis: 'watchlist',\n\t\t\twpWatchlistExpiry: 'watchlistexpiry',\n\t\t\twpCaptchaId: 'captchaid',\n\t\t\twpCaptchaWord: 'captchaword'\n\t\t};\n\n\tfor ( const key in fieldMap ) {\n\t\tif ( options[ key ] !== undefined ) {\n\t\t\toptions[ fieldMap[ key ] ] = options[ key ];\n\t\t\tdelete options[ key ];\n\t\t}\n\t}\n\n\toptions.watchlist = 'watchlist' in options ? 'watch' : 'unwatch';\n\n\treturn options;\n};\n\n/**\n * Post DOM data to the Parsoid API.\n *\n * This method performs an asynchronous action and uses a callback function to handle the result.\n *\n *     this.save( dom, { summary: 'test', minor: true, watch: false } );\n *\n * @param {HTMLDocument} doc Document to save\n * @param {Object} options Saving options. All keys are passed through, including unrecognized ones.\n *  - {string} summary Edit summary\n *  - {boolean} minor Edit is a minor edit\n *  - {boolean} watch Watch the page\n * @return {jQuery.Promise} Save promise, see mw.libs.ve.targetSaver.postHtml\n */\nve.init.mw.ArticleTarget.prototype.save = function ( doc, options ) {\n\t// Prevent duplicate requests\n\tif ( this.saving ) {\n\t\treturn this.saving;\n\t}\n\n\tconst data = ve.extendObject( {}, options, {\n\t\tpage: this.getPageName(),\n\t\toldid: this.revid,\n\t\tbasetimestamp: this.baseTimeStamp,\n\t\tstarttimestamp: this.startTimeStamp,\n\t\tetag: this.etag,\n\t\tassert: mw.user.isAnon() ? 'anon' : 'user',\n\t\tassertuser: mw.user.getName() || undefined\n\t} );\n\n\tif ( !this.pageExists || this.restoring || !this.isViewPage ) {\n\t\t// This is a page creation, a restoration, or we loaded the editor from a non-view page.\n\t\t// We can't update the interface to reflect this new state, so we're going to reload the whole page.\n\t\t// Therefore we don't need the new revision's HTML content in the API response.\n\t\tdata.nocontent = true;\n\t}\n\n\tif ( this.wouldautocreate ) {\n\t\t// This means that we might need to redirect to an opaque URL,\n\t\t// so we must set up query parameters we want ahead of time.\n\t\t// TODO: `this.isRedirect` is only set in visual mode, not in source mode\n\t\tdata.returntoquery = this.isRedirect ? 'redirect=no' : '';\n\t\tdata.returntoanchor = this.getSectionHashFromPage();\n\t}\n\n\tconst config = mw.config.get( 'wgVisualEditorConfig' );\n\n\tconst taglist = data.vetags ? data.vetags.split( ',' ) : [];\n\n\tif ( config.useChangeTagging ) {\n\t\ttaglist.push(\n\t\t\tthis.getSurface().getMode() === 'source' ? 'visualeditor-wikitext' : 'visualeditor'\n\t\t);\n\t}\n\n\tif (\n\t\tthis.getSurface().getMode() === 'visual' &&\n\t\tmw.config.get( 'wgVisualEditorConfig' ).editCheckTagging\n\t) {\n\t\tconst documentModel = this.getSurface().getModel().getDocument();\n\t\t// New content needing a reference\n\t\tif ( mw.editcheck.hasAddedContentNeedingReference( documentModel ) ) {\n\t\t\ttaglist.push( 'editcheck-references' );\n\t\t}\n\t\t// New content, regardless of if it needs a reference\n\t\tif ( mw.editcheck.hasAddedContentNeedingReference( documentModel, true ) ) {\n\t\t\ttaglist.push( 'editcheck-newcontent' );\n\t\t}\n\t}\n\n\tdata.vetags = taglist.join( ',' );\n\n\tconst promise = this.saving = this.tryWithPreparedCacheKey( doc, data, 'save' );\n\tpromise.then(\n\t\tthis.saveComplete.bind( this ),\n\t\tthis.saveFail.bind( this, doc, data )\n\t).always( () => {\n\t\tthis.saving = null;\n\t} );\n\n\treturn promise;\n};\n\n/**\n * Show changes in the save dialog\n *\n * @param {Object} doc Document\n */\nve.init.mw.ArticleTarget.prototype.showChanges = function ( doc ) {\n\t// Invalidate the viewer diff on next change\n\tthis.getSurface().getModel().getDocument().once( 'transact', () => {\n\t\tthis.clearDiff();\n\t} );\n\tthis.saveDialog.setDiffAndReview(\n\t\tthis.getWikitextDiffPromise( doc ),\n\t\tthis.getVisualDiffGeneratorPromise(),\n\t\tthis.getSurface().getModel().getDocument().getHtmlDocument()\n\t);\n};\n\n/**\n * Clear all state associated with the diff\n */\nve.init.mw.ArticleTarget.prototype.clearDiff = function () {\n\tif ( this.saveDialog ) {\n\t\tthis.saveDialog.clearDiff();\n\t}\n\tthis.wikitextDiffPromise = null;\n};\n\n/**\n * Post DOM data to the Parsoid API to retrieve wikitext diff.\n *\n * @param {HTMLDocument} doc Document to compare against (via wikitext)\n * @return {jQuery.Promise} Promise which resolves with the wikitext diff, or rejects with an error\n * @fires ve.init.mw.ArticleTarget#showChanges\n * @fires ve.init.mw.ArticleTarget#showChangesError\n */\nve.init.mw.ArticleTarget.prototype.getWikitextDiffPromise = function ( doc ) {\n\tif ( !this.wikitextDiffPromise ) {\n\t\tthis.wikitextDiffPromise = this.tryWithPreparedCacheKey( doc, {\n\t\t\tpaction: 'diff',\n\t\t\tpage: this.getPageName(),\n\t\t\toldid: this.revid,\n\t\t\tetag: this.etag\n\t\t}, 'diff' ).then( ( data ) => {\n\t\t\tif ( !data.diff ) {\n\t\t\t\tthis.emit( 'noChanges' );\n\t\t\t}\n\t\t\treturn data.diff;\n\t\t} );\n\t\tthis.wikitextDiffPromise.then(\n\t\t\tthis.emit.bind( this, 'showChanges' ),\n\t\t\tthis.emit.bind( this, 'showChangesError' )\n\t\t);\n\t}\n\treturn this.wikitextDiffPromise;\n};\n\n/**\n * Post wikitext to MediaWiki.\n *\n * This method performs a synchronous action and will take the user to a new page when complete.\n *\n *     this.submit( wikitext, { wpSummary: 'test', wpMinorEdit: 1, wpSave: 1 } );\n *\n * @param {string} wikitext Wikitext to submit\n * @param {Object} fields Other form fields to add (e.g. wpSummary, wpWatchthis, etc.). To actually\n *  save the wikitext, add { wpSave: 1 }. To go to the diff view, add { wpDiff: 1 }.\n * @return {boolean} Submitting has been started\n */\nve.init.mw.ArticleTarget.prototype.submit = function ( wikitext, fields ) {\n\t// Prevent duplicate requests\n\tif ( this.submitting ) {\n\t\treturn false;\n\t}\n\t// Clear autosave now that we don't expect to need it again.\n\t// FIXME: This isn't transactional, so if the save fails we're left with no recourse.\n\tthis.clearDocState();\n\t// Save DOM\n\tthis.submitting = true;\n\tconst $form = $( '<form>' ).attr( { method: 'post', enctype: 'multipart/form-data' } ).addClass( 'oo-ui-element-hidden' );\n\tconst params = ve.extendObject( {\n\t\tformat: 'text/x-wiki',\n\t\tmodel: 'wikitext',\n\t\toldid: this.requestedRevId,\n\t\twpStarttime: this.startTimeStamp,\n\t\twpEdittime: this.baseTimeStamp,\n\t\twpTextbox1: wikitext,\n\t\twpEditToken: mw.user.tokens.get( 'csrfToken' ),\n\t\t// MediaWiki function-verification parameters, mostly relevant to the\n\t\t// classic editpage, but still required here:\n\t\twpUnicodeCheck: 'ℳ𝒲♥𝓊𝓃𝒾𝒸ℴ𝒹ℯ',\n\t\twpUltimateParam: true\n\t}, fields );\n\t// Add params as hidden fields\n\tfor ( const key in params ) {\n\t\t$form.append( $( '<input>' ).attr( { type: 'hidden', name: key, value: params[ key ] } ) );\n\t}\n\t// Submit the form, mimicking a traditional edit\n\t// Firefox requires the form to be attached\n\tconst submitUrl = mw.util.getUrl( this.getPageName(), {\n\t\taction: 'submit',\n\t\tveswitched: '1'\n\t} );\n\t$form.attr( 'action', submitUrl ).appendTo( 'body' ).trigger( 'submit' );\n\treturn true;\n};\n\n/**\n * Get Wikitext data from the Parsoid API.\n *\n * This method performs an asynchronous action and uses a callback function to handle the result.\n *\n *     this.serialize( doc ).then( ( data ) => {\n *         // Do something with data.content (wikitext)\n *     } );\n *\n * @param {HTMLDocument} doc Document to serialize\n * @param {Function} [callback] Optional callback to run after.\n *  Deprecated in favor of using the returned promise.\n * @return {jQuery.Promise} Serialize promise, see mw.libs.ve.targetSaver.postHtml\n */\nve.init.mw.ArticleTarget.prototype.serialize = function ( doc, callback ) {\n\t// Prevent duplicate requests\n\tif ( this.serializing ) {\n\t\treturn this.serializing;\n\t}\n\tconst promise = this.serializing = this.tryWithPreparedCacheKey( doc, {\n\t\tpaction: 'serialize',\n\t\tpage: this.getPageName(),\n\t\toldid: this.revid,\n\t\tetag: this.etag\n\t}, 'serialize' );\n\tpromise.then(\n\t\tthis.emit.bind( this, 'serializeComplete' ),\n\t\tthis.emit.bind( this, 'serializeError' )\n\t).always( () => {\n\t\tthis.serializing = null;\n\t} );\n\n\tif ( callback ) {\n\t\tOO.ui.warnDeprecation( 'Passing a callback to ve.init.mw.ArticleTarget#serialize is deprecated. Use the returned promise instead.' );\n\t\tpromise.then( ( data ) => {\n\t\t\tcallback.call( this, data.content );\n\t\t} );\n\t}\n\n\treturn promise;\n};\n\n/**\n * Get list of edit notices.\n *\n * @return {Array} List of edit notices\n */\nve.init.mw.ArticleTarget.prototype.getEditNotices = function () {\n\treturn this.editNotices;\n};\n\n// FIXME: split out view specific functionality, emit to subclass\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.track = function ( name ) {\n\tconst mode = this.surface ? this.surface.getMode() : this.getDefaultMode();\n\tve.track( name, { mode: mode } );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.createSurface = function ( dmDoc, config = {} ) {\n\tconst sections = dmDoc.getNodesByType( 'section' );\n\tlet attachedRoot;\n\tif ( sections.length && sections.length === 1 ) {\n\t\tattachedRoot = sections[ 0 ];\n\t\tif ( !attachedRoot.isSurfaceable() ) {\n\t\t\tthrow new Error( 'Not a surfaceable node' );\n\t\t}\n\t}\n\n\t// Parent method\n\tconst surface = ve.init.mw.ArticleTarget.super.prototype.createSurface.call(\n\t\tthis,\n\t\tdmDoc,\n\t\tve.extendObject( { attachedRoot: attachedRoot }, config )\n\t);\n\n\treturn surface;\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.getSurfaceClasses = function () {\n\tconst classes = ve.init.mw.ArticleTarget.super.prototype.getSurfaceClasses.call( this );\n\treturn [ ...classes, 'mw-body-content' ];\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.getSurfaceConfig = function ( config ) {\n\treturn ve.init.mw.ArticleTarget.super.prototype.getSurfaceConfig.call( this, ve.extendObject( {\n\t\t// Don't null selection on blur when editing a document.\n\t\t// Do use it in new section mode as there are multiple inputs\n\t\t// on the surface (header+content).\n\t\tnullSelectionOnBlur: this.section === 'new',\n\t\tclasses: this.getSurfaceClasses()\n\t\t\t// The following classes are used here:\n\t\t\t// * mw-textarea-proteced\n\t\t\t// * mw-textarea-cproteced\n\t\t\t// * mw-textarea-sproteced\n\t\t\t.concat( this.protectedClasses )\n\t\t\t// addClass doesn't like empty strings\n\t\t\t.filter( ( c ) => c )\n\t}, config ) );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.teardown = function () {\n\tif ( !this.teardownPromise ) {\n\t\tconst surface = this.getSurface();\n\n\t\t// Restore access keys\n\t\tif ( this.$saveAccessKeyElements ) {\n\t\t\tthis.$saveAccessKeyElements.attr( 'accesskey', ve.msg( 'accesskey-save' ) );\n\t\t\tthis.$saveAccessKeyElements = null;\n\t\t}\n\t\tif ( surface ) {\n\t\t\t// Disconnect history listener\n\t\t\tsurface.getModel().disconnect( this );\n\t\t}\n\n\t\tlet saveDialogPromise = ve.createDeferred().resolve().promise();\n\t\tif ( this.saveDialog ) {\n\t\t\tif ( this.saveDialog.isOpened() ) {\n\t\t\t\t// If the save dialog is still open (from saving) close it\n\t\t\t\tsaveDialogPromise = this.saveDialog.close().closed;\n\t\t\t}\n\t\t\t// Release the reference\n\t\t\tthis.saveDialog = null;\n\t\t}\n\n\t\t// Parent method\n\t\tthis.teardownPromise = ve.init.mw.ArticleTarget.super.prototype.teardown.call( this ).then( () => saveDialogPromise.then( () => {\n\t\t\tmw.hook( 've.deactivationComplete' ).fire( this.edited );\n\t\t} ) );\n\t}\n\treturn this.teardownPromise;\n};\n\n/**\n * Try to tear down the target, but leave ready for re-activation later\n *\n * Will first prompt the user if required, then call #teardown.\n *\n * @param {boolean} [noPrompt] Do not display a prompt to the user\n * @param {string} [trackMechanism] Abort mechanism; used for event tracking if present\n * @return {jQuery.Promise} Promise which resolves when the target has been torn down, rejects if the target won't be torn down\n */\nve.init.mw.ArticleTarget.prototype.tryTeardown = function ( noPrompt, trackMechanism ) {\n\tif ( !noPrompt && this.edited && mw.user.options.get( 'useeditwarning' ) ) {\n\t\treturn this.getSurface().dialogs.openWindow( 'abandonedit' )\n\t\t\t.closed.then( ( data ) => {\n\t\t\t\tif ( data && data.action === 'discard' ) {\n\t\t\t\t\treturn this.teardown( trackMechanism );\n\t\t\t\t}\n\t\t\t\treturn ve.createDeferred().reject().promise();\n\t\t\t} );\n\t} else {\n\t\treturn this.teardown( trackMechanism );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.setupToolbar = function () {\n\t// Parent method\n\tve.init.mw.ArticleTarget.super.prototype.setupToolbar.apply( this, arguments );\n\n\tthis.setupToolbarSaveButton();\n\tthis.updateToolbarSaveButtonState();\n\n\tif ( this.saveDialog ) {\n\t\tthis.editSummaryValue = this.saveDialog.editSummaryInput.getValue();\n\t\tthis.saveDialog.disconnect( this );\n\t\tthis.saveDialog = null;\n\t}\n};\n\n/**\n * Getting the message for the toolbar / save dialog save / publish button\n *\n * @param {boolean} [startProcess] Use version of the label for starting that process, i.e. with an ellipsis after it\n * @param {boolean} [forceShort] Force the short version of the label, always used on mobile\n * @return {Function|string} An i18n message or resolveable function\n */\nve.init.mw.ArticleTarget.prototype.getSaveButtonLabel = function ( startProcess, forceShort ) {\n\tconst suffix = startProcess ? '-start' : '';\n\n\tif ( forceShort || OO.ui.isMobile() ) {\n\t\t// The following messages can be used here:\n\t\t// * visualeditor-savedialog-label-publish-short\n\t\t// * visualeditor-savedialog-label-publish-short-start\n\t\t// * visualeditor-savedialog-label-save-short\n\t\t// * visualeditor-savedialog-label-save-short-start\n\t\tif ( mw.config.get( 'wgEditSubmitButtonLabelPublish' ) ) {\n\t\t\treturn OO.ui.deferMsg( 'visualeditor-savedialog-label-publish-short' + suffix );\n\t\t}\n\n\t\treturn OO.ui.deferMsg( 'visualeditor-savedialog-label-save-short' + suffix );\n\t}\n\n\t// The following messages can be used here\n\t// * publishpage\n\t// * publishpage-start\n\t// * publishchanges\n\t// * publishchanges-start\n\t// * savearticle\n\t// * savearticle-start\n\t// * savechanges\n\t// * savechanges-start\n\tif ( mw.config.get( 'wgEditSubmitButtonLabelPublish' ) ) {\n\t\treturn OO.ui.deferMsg( ( !this.pageExists ? 'publishpage' : 'publishchanges' ) + suffix );\n\t}\n\n\treturn OO.ui.deferMsg( ( !this.pageExists ? 'savearticle' : 'savechanges' ) + suffix );\n};\n\n/**\n * Setup the toolbarSaveButton property to point to the save tool\n *\n * @method\n * @abstract\n */\nve.init.mw.ArticleTarget.prototype.setupToolbarSaveButton = null;\n\n/**\n * Re-evaluate whether the article can be saved\n *\n * @return {boolean} The article can be saved\n */\nve.init.mw.ArticleTarget.prototype.isSaveable = function () {\n\tconst surface = this.getSurface();\n\tif ( !surface ) {\n\t\t// Called before we're attached, so meaningless; abandon for now\n\t\treturn false;\n\t}\n\n\tthis.edited =\n\t\t// Document was edited before loading\n\t\tthis.fromEditedState ||\n\t\t// Document was edited\n\t\tsurface.getModel().hasBeenModified() ||\n\t\t// Section title (if it exists) was edited\n\t\t( !!this.sectionTitle && this.sectionTitle.getValue() !== '' );\n\n\treturn this.edited || this.restoring;\n};\n\n/**\n * Update the toolbar save button to reflect if the article can be saved\n */\nve.init.mw.ArticleTarget.prototype.updateToolbarSaveButtonState = function () {\n\t// This should really be an emit( 'updateState' ) but that would cause\n\t// every tool to be updated on every transaction.\n\tthis.toolbarSaveButton.onUpdateState();\n\n\tconst isSaveable = this.isSaveable();\n\tif ( isSaveable !== this.wasSaveable ) {\n\t\tthis.emit( 'toolbarSaveButtonStateChanged' );\n\t\tthis.wasSaveable = isSaveable;\n\t}\n};\n\n/**\n * Get the pre-save process, which is executed before opening the save dialog\n *\n * If the process rejects, the save dialog is not opened.\n *\n * @return {OO.ui.Process}\n */\nve.init.mw.ArticleTarget.prototype.getPreSaveProcess = function () {\n\treturn this.preSaveProcess;\n};\n\n/**\n * Show a save dialog\n *\n * @param {string} [action] Window action to trigger after opening\n * @param {string} [checkboxName] Checkbox to toggle after opening\n *\n * @fires ve.init.mw.ArticleTarget#saveWorkflowBegin\n */\nve.init.mw.ArticleTarget.prototype.showSaveDialog = function ( action, checkboxName ) {\n\tlet firstLoad = false;\n\n\tif ( !this.isSaveable() || this.saveDialogIsOpening ) {\n\t\treturn;\n\t}\n\n\tconst currentWindow = this.getSurface().getDialogs().getCurrentWindow();\n\tif ( currentWindow && currentWindow.constructor.static.name === 'mwSave' && ( action === 'save' || action === null ) ) {\n\t\t// The current window is the save dialog, and we've gotten here via\n\t\t// the save action. Trigger a save action on the dialog, which will\n\t\t// either switch to the save panel or immediately save depending on\n\t\t// the currently active panel. We're doing this here instead of\n\t\t// relying on an accesskey on the save button, because that has some\n\t\t// cross-browser issues that makes it not work in Firefox.\n\t\tcurrentWindow.executeAction( 'save' );\n\t\treturn;\n\t}\n\n\tthis.saveDialogIsOpening = true;\n\n\tmw.hook( 've.preSaveProcess' ).deprecate( 'Use target.getPreSaveProcess() instead.' ).fire( this.preSaveProcess, this );\n\n\tthis.emit( 'saveWorkflowBegin' );\n\n\tthis.preSaveProcess.execute().then( () => {\n\t\tif ( this.deactivating || !this.active ) {\n\t\t\t// It's possible to trigger deactivating VE during the\n\t\t\t// preSaveProcess (e.g. by clicking the \"read\" tab), and in that\n\t\t\t// case we should immediately discard what we're doing.\n\t\t\treturn;\n\t\t}\n\t\t// Preload the serialization\n\t\tthis.prepareCacheKey( this.getDocToSave() );\n\n\t\t// Get the save dialog\n\t\tthis.getSurface().getDialogs().getWindow( 'mwSave' ).then( ( win ) => {\n\t\t\tconst windowAction = ve.ui.actionFactory.create( 'window', this.getSurface() );\n\n\t\t\tif ( !this.saveDialog ) {\n\t\t\t\tthis.saveDialog = win;\n\t\t\t\tfirstLoad = true;\n\n\t\t\t\t// Connect to save dialog\n\t\t\t\tthis.saveDialog.connect( this, {\n\t\t\t\t\tsave: 'onSaveDialogSave',\n\t\t\t\t\treview: 'onSaveDialogReview',\n\t\t\t\t\tpreview: 'onSaveDialogPreview',\n\t\t\t\t\tresolve: 'onSaveDialogResolveConflict',\n\t\t\t\t\tretry: 'onSaveDialogRetry',\n\t\t\t\t\t// The array syntax is a way to call `this.emit( 'saveWorkflowEnd' )`.\n\t\t\t\t\tclose: [ 'emit', 'saveWorkflowEnd' ],\n\t\t\t\t\tchangePanel: [ 'emit', 'saveWorkflowChangePanel' ]\n\t\t\t\t} );\n\n\t\t\t\t// Attach custom overlay\n\t\t\t\tthis.saveDialog.$element.append( this.$saveDialogOverlay );\n\t\t\t}\n\n\t\t\tconst data = this.getSaveDialogOpeningData();\n\n\t\t\tif (\n\t\t\t\t( action === 'review' && !data.canReview ) ||\n\t\t\t\t( action === 'preview' && !data.canPreview )\n\t\t\t) {\n\t\t\t\tthis.saveDialogIsOpening = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( firstLoad ) {\n\t\t\t\tfor ( const name in this.checkboxesByName ) {\n\t\t\t\t\tif ( this.initialCheckboxes[ name ] !== undefined ) {\n\t\t\t\t\t\tthis.checkboxesByName[ name ].setSelected( this.initialCheckboxes[ name ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet checkbox;\n\t\t\tif ( checkboxName && ( checkbox = this.checkboxesByName[ checkboxName ] ) ) {\n\t\t\t\tconst isSelected = !checkbox.isSelected();\n\t\t\t\t// Wait for native access key change to happen\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tcheckbox.setSelected( isSelected );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// When calling review/preview action, switch to those panels immediately\n\t\t\tif ( action === 'review' || action === 'preview' ) {\n\t\t\t\tdata.initialPanel = action;\n\t\t\t}\n\n\t\t\t// Open the dialog\n\t\t\tconst openPromise = windowAction.open( 'mwSave', data, action );\n\t\t\tif ( openPromise ) {\n\t\t\t\topenPromise.always( () => {\n\t\t\t\t\tthis.saveDialogIsOpening = false;\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t}, () => {\n\t\tthis.saveDialogIsOpening = false;\n\t} );\n};\n\n/**\n * Get opening data to pass to the save dialog\n *\n * @return {Object} Opening data\n */\nve.init.mw.ArticleTarget.prototype.getSaveDialogOpeningData = function () {\n\tconst mode = this.getSurface().getMode();\n\treturn {\n\t\tcanPreview: mode === 'source',\n\t\tcanReview: !( mode === 'source' && this.section === 'new' ),\n\t\tsectionTitle: this.sectionTitle && this.sectionTitle.getValue(),\n\t\tsaveButtonLabel: this.getSaveButtonLabel(),\n\t\tcopyrightWarning: this.copyrightWarning,\n\t\tcheckboxFields: this.checkboxFields,\n\t\tcheckboxesByName: this.checkboxesByName\n\t};\n};\n\n/**\n * Move the cursor in the editor to section specified by this.section.\n * Do nothing if this.section is undefined.\n */\nve.init.mw.ArticleTarget.prototype.restoreEditSection = function () {\n\tconst section = this.section !== null ? this.section : this.visibleSection;\n\tconst surface = this.getSurface();\n\tconst mode = surface.getMode();\n\n\tif (\n\t\tmode === 'source' ||\n\t\t( this.enableVisualSectionEditing && this.section !== null )\n\t) {\n\t\tthis.$scrollContainer.scrollTop( 0 );\n\t}\n\n\tif ( section === null || section === 'new' || section === '0' || section === 'T-0' ) {\n\t\treturn;\n\t}\n\n\tconst setExactScrollOffset = this.section === null && this.visibleSection !== null && this.visibleSectionOffset !== null,\n\t\t// User clicked section edit link with visual section editing not available:\n\t\t// Take them to the top of the section using goToHeading\n\t\tgoToStartOfHeading = this.section !== null && !this.enableVisualSectionEditing,\n\t\tsetEditSummary = this.section !== null;\n\n\tlet headingText;\n\tif ( mode === 'visual' ) {\n\t\tconst dmDoc = surface.getModel().getDocument();\n\t\t// In mw.libs.ve.unwrapParsoidSections we copy the data-mw-section-id from the section element\n\t\t// to the heading. Iterate over headings to find the one with the correct attribute\n\t\t// in originalDomElements.\n\t\tconst headingModel = dmDoc.getNodesByType( 'mwHeading' ).find( ( heading ) => {\n\t\t\tconst domElements = heading.getOriginalDomElements( dmDoc.getStore() );\n\t\t\treturn domElements && domElements.length && domElements[ 0 ].nodeType === Node.ELEMENT_NODE &&\n\t\t\t\tdomElements[ 0 ].getAttribute( 'data-mw-section-id' ) === section;\n\t\t} );\n\t\tif ( headingModel ) {\n\t\t\tconst headingView = surface.getView().getDocument().getDocumentNode().getNodeFromOffset( headingModel.getRange().start );\n\t\t\tif ( setEditSummary && !new URL( location.href ).searchParams.has( 'summary' ) ) {\n\t\t\t\theadingText = headingView.$element.text();\n\t\t\t}\n\t\t\tif ( setExactScrollOffset ) {\n\t\t\t\tthis.scrollToHeading( headingView, this.visibleSectionOffset );\n\t\t\t} else if ( goToStartOfHeading ) {\n\t\t\t\tthis.goToHeading( headingView );\n\t\t\t}\n\t\t}\n\t} else if ( mode === 'source' && setEditSummary ) {\n\t\t// With elements of extractSectionTitle + stripSectionName TODO:\n\t\t// Arguably, we should just throw this through the API and then do\n\t\t// the same extract-text pass we do in visual mode. Would save us\n\t\t// having to think about wikitext here.\n\t\theadingText = surface.getModel().getDocument().data.getText(\n\t\t\tfalse,\n\t\t\tsurface.getModel().getDocument().getDocumentNode().children[ 0 ].getRange()\n\t\t)\n\t\t\t// Extract the title\n\t\t\t.replace( /^\\s*=+\\s*(.*?)\\s*=+\\s*$/, '$1' )\n\t\t\t// Remove links\n\t\t\t.replace( /\\[\\[:?([^[|]+)\\|([^[]+)\\]\\]/g, '$2' )\n\t\t\t.replace( /\\[\\[:?([^[]+)\\|?\\]\\]/g, '$1' )\n\t\t\t.replace( new RegExp( '\\\\[(?:' + ve.init.platform.getUnanchoredExternalLinkUrlProtocolsRegExp().source + ')([^ ]+?) ([^\\\\[]+)\\\\]', 'ig' ), '$3' )\n\t\t\t// Cheap HTML removal\n\t\t\t.replace( /<[^>]+?>/g, '' );\n\t}\n\tif ( headingText ) {\n\t\tthis.initialEditSummary =\n\t\t\t'/* ' +\n\t\t\tve.graphemeSafeSubstring( headingText, 0, 244 ) +\n\t\t\t' */ ';\n\t}\n};\n\n/**\n * Move the cursor to a given heading and scroll to it.\n *\n * @param {ve.ce.HeadingNode} headingNode Heading node to scroll to\n */\nve.init.mw.ArticleTarget.prototype.goToHeading = function ( headingNode ) {\n\tconst surface = this.getSurface(),\n\t\tsurfaceView = surface.getView();\n\n\tlet offsetNode = headingNode,\n\t\tlastHeadingLevel = -1;\n\tlet nextNode;\n\t// Find next sibling which isn't a heading\n\twhile ( offsetNode instanceof ve.ce.HeadingNode && offsetNode.getModel().getAttribute( 'level' ) > lastHeadingLevel ) {\n\t\tlastHeadingLevel = offsetNode.getModel().getAttribute( 'level' );\n\t\t// Next sibling\n\t\tnextNode = offsetNode.parent.children[ offsetNode.parent.children.indexOf( offsetNode ) + 1 ];\n\t\tif ( !nextNode ) {\n\t\t\tbreak;\n\t\t}\n\t\toffsetNode = nextNode;\n\t}\n\tconst startOffset = offsetNode.getModel().getOffset();\n\n\tfunction setSelection() {\n\t\tsurfaceView.selectRelativeSelectableContentOffset( startOffset, 1 );\n\t}\n\n\tif ( surfaceView.isFocused() ) {\n\t\tsetSelection();\n\t\t// Focussing the document triggers showSelection which calls scrollIntoView\n\t\t// which uses a jQuery animation, so make sure this is aborted.\n\t\t$( OO.ui.Element.static.getClosestScrollableContainer( surfaceView.$element[ 0 ] ) ).stop( true );\n\t} else {\n\t\t// onDocumentFocus is debounced, so wait for that to happen before setting\n\t\t// the model selection, otherwise it will get reset\n\t\tsurfaceView.once( 'focus', setSelection );\n\t}\n\tthis.scrollToHeading( headingNode );\n};\n\n/**\n * Scroll to a given heading in the document.\n *\n * @param {ve.ce.HeadingNode} headingNode Heading node to scroll to\n * @param {number} [headingOffset=0] Set the top offset of the heading to a specific amount, relative\n *  to the surface viewport.\n */\nve.init.mw.ArticleTarget.prototype.scrollToHeading = function ( headingNode, headingOffset ) {\n\tthis.$scrollContainer.scrollTop(\n\t\theadingNode.$element.offset().top - parseInt( headingNode.$element.css( 'margin-top' ) ) -\n\t\t( this.getSurface().padding.top + ( headingOffset || 0 ) ) );\n};\n\n/**\n * Get the URL hash for the current section's ID using the page's HTML.\n *\n * TODO: Do this in a less skin-dependent way\n *\n * @return {string} URL hash with leading '#', or empty string if not found\n */\nve.init.mw.ArticleTarget.prototype.getSectionHashFromPage = function () {\n\t// Assume there are section edit links, as the user just did a section edit. This also means\n\t// that the section numbers line up correctly, as not every H_ tag is a numbered section.\n\tconst $sections = this.$editableContent.find( '.mw-editsection' );\n\n\tlet section;\n\tif ( this.section === 'new' ) {\n\t\t// A new section is appended to the end, so take the last one.\n\t\tsection = $sections.length;\n\t} else {\n\t\tsection = this.section;\n\t}\n\tif ( section > 0 ) {\n\t\tconst $section = $sections.eq( section - 1 )\n\t\t\t.closest( '.mw-heading' )\n\t\t\t.find( 'h1, h2, h3, h4, h5, h6' );\n\n\t\tif ( $section.length && $section.attr( 'id' ) ) {\n\t\t\treturn '#' + $section.attr( 'id' );\n\t\t}\n\t}\n\treturn '';\n};\n\n/**\n * Switches to the wikitext editor, either keeping (default) or discarding changes.\n *\n * @param {boolean} [modified] Whether there were any changes at all, will be evaluated if not provided\n */\nve.init.mw.ArticleTarget.prototype.switchToWikitextEditor = function ( modified ) {\n\tif ( modified === undefined ) {\n\t\tmodified = this.fromEditedState || this.getSurface().getModel().hasBeenModified();\n\t}\n\t// When switching with changes we always pass the full page as changes in visual section mode\n\t// can still affect the whole document (e.g. removing a reference)\n\tif ( modified ) {\n\t\tthis.section = null;\n\t}\n\n\tif ( this.isModeAvailable( 'source' ) ) {\n\t\tif ( !modified ) {\n\t\t\tthis.reloadSurface( 'source' );\n\t\t} else {\n\t\t\tconst dataPromise = this.getWikitextDataPromiseForDoc( modified );\n\t\t\tthis.reloadSurface( 'source', dataPromise );\n\t\t}\n\t} else {\n\t\tthis.switchToFallbackWikitextEditor( modified );\n\t}\n};\n\n// Deprecated alias\nve.init.mw.ArticleTarget.prototype.editSource = function () {\n\tOO.ui.warnDeprecation( 'ArticleTarget#editSource: Use #switchToWikitextEditor instead.' );\n\tthis.switchToWikitextEditor( ...arguments );\n};\n\n/**\n * Get a data promise for wikitext editing based on the current doc state\n *\n * @param {boolean} modified Whether there were any changes\n * @return {jQuery.Promise} Data promise\n */\nve.init.mw.ArticleTarget.prototype.getWikitextDataPromiseForDoc = function ( modified ) {\n\treturn this.serialize( this.getDocToSave() ).then( ( data ) => {\n\t\t// HACK - add parameters the API doesn't provide for a VE->WT switch\n\t\t// --------------------------------------------------------------------------------\n\t\t// This should match the API result in ApiVisualEditor.php and ArticleTarget#storeDocState\n\t\t// --------------------------------------------------------------------------------\n\t\tdata.basetimestamp = this.baseTimeStamp;\n\t\t// `blockinfo` is not used by this client\n\t\tdata.canEdit = this.canEdit;\n\t\tdata.checkboxesDef = this.checkboxesDef;\n\t\tdata.checkboxesMessages = this.checkboxesMessages; // needed in case we end up autosaving with this data\n\t\t// `content` is already set\n\t\tdata.copyrightWarning = this.copyrightWarning;\n\t\tdata.etag = this.etag;\n\t\tdata.fromEditedState = modified; // this replaces data.preloaded\n\t\tdata.notices = this.remoteNotices;\n\t\tdata.oldid = this.revid;\n\t\tdata.protectedClasses = this.protectedClasses;\n\t\t// `result` is not used\n\t\tdata.starttimestamp = this.startTimeStamp;\n\t\tdata.wouldautocreate = this.wouldautocreate;\n\t\t// Wrap up like a response object as that is what dataPromise is expected to be\n\t\treturn { visualeditoredit: data };\n\t} );\n};\n\n/**\n * Switches to the fallback wikitext editor, either keeping (default) or discarding changes.\n *\n * @param {boolean} [modified=false] Whether there were any changes at all.\n * @return {jQuery.Promise} Promise which rejects if the switch fails\n */\nve.init.mw.ArticleTarget.prototype.switchToFallbackWikitextEditor = function () {\n\treturn ve.createDeferred().resolve().promise();\n};\n\n/**\n * Switch to the visual editor.\n */\nve.init.mw.ArticleTarget.prototype.switchToVisualEditor = function () {\n\tif ( !this.edited ) {\n\t\tthis.reloadSurface( 'visual' );\n\t\treturn;\n\t}\n\n\tconst url = new URL( location.href );\n\tconst dataPromise = mw.libs.ve.targetLoader.requestParsoidData( this.getPageName(), {\n\t\toldId: this.revid,\n\t\ttargetName: this.constructor.static.trackingName,\n\t\tmodified: this.edited,\n\t\twikitext: this.getDocToSave(),\n\t\tsection: this.section,\n\t\teditintro: url.searchParams.get( 'editintro' ),\n\t\tpreload: url.searchParams.get( 'preload' ),\n\t\tpreloadparams: mw.util.getArrayParam( 'preloadparams', url.searchParams )\n\t} );\n\n\tthis.reloadSurface( 'visual', dataPromise );\n};\n\n/**\n * Switch to a different wikitext section\n *\n * @param {string|null} section Section to switch to: a number, 'T-'-prefixed number, 'new'\n *   or null (whole document)\n * @param {boolean} [noPrompt=false] Switch without prompting (changes will be lost either way)\n */\nve.init.mw.ArticleTarget.prototype.switchToWikitextSection = function ( section, noPrompt ) {\n\tif ( section === this.section ) {\n\t\treturn;\n\t}\n\tlet promise;\n\tif ( !noPrompt && this.edited && mw.user.options.get( 'useeditwarning' ) ) {\n\t\tpromise = this.getSurface().dialogs.openWindow( 'abandonedit' )\n\t\t\t.closed.then( ( data ) => data && data.action === 'discard' );\n\t} else {\n\t\tpromise = ve.createDeferred().resolve( true ).promise();\n\t}\n\tpromise.then( ( confirmed ) => {\n\t\tif ( confirmed ) {\n\t\t\t// Section has changed and edits have been discarded, so edit summary is no longer valid\n\t\t\t// TODO: Preserve summary if document changes can be preserved\n\t\t\tif ( this.saveDialog ) {\n\t\t\t\tthis.saveDialog.reset();\n\t\t\t}\n\t\t\t// TODO: If switching to a non-null section, get the new section title\n\t\t\tthis.initialEditSummary = null;\n\t\t\tthis.section = section;\n\t\t\tthis.reloadSurface( 'source' );\n\t\t\tthis.updateTabs();\n\t\t}\n\t} );\n};\n\n/**\n * Reload the target surface in the new editor mode\n *\n * @param {string} newMode New mode\n * @param {jQuery.Promise} [dataPromise] Data promise, if any\n */\nve.init.mw.ArticleTarget.prototype.reloadSurface = function ( newMode, dataPromise ) {\n\tthis.setDefaultMode( newMode );\n\tthis.clearDiff();\n\tconst promise = this.load( dataPromise );\n\tthis.getSurface().createProgress(\n\t\tpromise,\n\t\tve.msg( newMode === 'source' ? 'visualeditor-mweditmodesource-progress' : 'visualeditor-mweditmodeve-progress' ),\n\t\ttrue /* non-cancellable */\n\t);\n};\n\n/**\n * Display the given redirect subtitle and redirect page content header on the page.\n *\n * @param {jQuery} $sub Redirect subtitle, see #buildRedirectSub\n * @param {jQuery} $msg Redirect page content header, see #buildRedirectMsg\n */\nve.init.mw.ArticleTarget.prototype.updateRedirectInterface = function ( $sub, $msg ) {\n\t// For the subtitle, replace the real one with ours.\n\t// This is more complicated than it should be because we have to fiddle with the <br>.\n\tconst $currentSub = $( '#redirectsub' );\n\tif ( $currentSub.length ) {\n\t\tif ( $sub.length ) {\n\t\t\t$currentSub.replaceWith( $sub );\n\t\t} else {\n\t\t\t$currentSub.prev().filter( 'br' ).remove();\n\t\t\t$currentSub.remove();\n\t\t}\n\t} else {\n\t\tconst $subtitle = $( '#contentSub' );\n\t\tif ( $sub.length ) {\n\t\t\tif ( $subtitle.children().length ) {\n\t\t\t\t$subtitle.append( $( '<br>' ) );\n\t\t\t}\n\t\t\t$subtitle.append( $sub );\n\t\t}\n\t}\n\n\tif ( $msg.length ) {\n\t\t$msg\n\t\t\t// We need to be able to tell apart the real one and our fake one\n\t\t\t.addClass( 've-redirect-header' )\n\t\t\t.on( 'click', ( e ) => {\n\t\t\t\tconst windowAction = ve.ui.actionFactory.create( 'window', this.getSurface() );\n\t\t\t\twindowAction.open( 'meta', { page: 'settings' } );\n\t\t\t\te.preventDefault();\n\t\t\t} );\n\t}\n\t// For the content header, the real one is hidden, insert ours before it.\n\tconst $currentMsg = $( '.ve-redirect-header' );\n\tif ( $currentMsg.length ) {\n\t\t$currentMsg.replaceWith( $msg );\n\t} else {\n\t\t// Hack: This is normally inside #mw-content-text, but that's hidden while editing.\n\t\t$( '#mw-content-text' ).before( $msg );\n\t}\n};\n\n/**\n * Set temporary redirect interface to match the current state of redirection in the editor.\n *\n * @param {string|null} title Current redirect target, or null if none\n */\nve.init.mw.ArticleTarget.prototype.setFakeRedirectInterface = function ( title ) {\n\tthis.isRedirect = !!title;\n\tthis.updateRedirectInterface(\n\t\ttitle ? this.constructor.static.buildRedirectSub() : $(),\n\t\ttitle ? this.constructor.static.buildRedirectMsg( title ) : $()\n\t);\n};\n\n/**\n * Set the redirect interface to match the page's redirect state.\n */\nve.init.mw.ArticleTarget.prototype.setRealRedirectInterface = function () {\n\tthis.updateRedirectInterface(\n\t\tmw.config.get( 'wgIsRedirect' ) ? this.constructor.static.buildRedirectSub() : $(),\n\t\t// Remove our custom content header - the original one in #mw-content-text will be shown\n\t\t$()\n\t);\n};\n\n/**\n * Render a list of categories\n *\n * Duplicate items are not shown.\n *\n * @param {ve.dm.MetaItem[]} categoryItems Array of category metaitems to display\n * @return {jQuery.Promise} A promise which will be resolved with the rendered categories\n */\nve.init.mw.ArticleTarget.prototype.renderCategories = function ( categoryItems ) {\n\tconst promises = [],\n\t\tcategories = { hidden: {}, normal: {} };\n\tcategoryItems.forEach( ( categoryItem, index ) => {\n\t\tconst attributes = ve.copy( ve.getProp( categoryItem, 'element', 'attributes' ) );\n\t\tattributes.index = index;\n\t\tpromises.push( ve.init.platform.linkCache.get( attributes.category ).then( ( result ) => {\n\t\t\tconst group = result.hidden ? categories.hidden : categories.normal;\n\t\t\t// In case of duplicates, first entry wins (like in MediaWiki)\n\t\t\tif ( !group[ attributes.category ] || group[ attributes.category ].index > attributes.index ) {\n\t\t\t\tgroup[ attributes.category ] = attributes;\n\t\t\t}\n\t\t} ) );\n\t} );\n\treturn ve.promiseAll( promises ).then( () => {\n\t\tconst $output = $( '<div>' ).addClass( 'catlinks' );\n\t\tfunction renderPageLink( page ) {\n\t\t\tconst title = mw.Title.newFromText( page );\n\t\t\tconst $link = $( '<a>' ).attr( 'rel', 'mw:WikiLink' ).text( title.getMainText() );\n\t\t\tve.setAttributeSafe( $link[ 0 ], 'href', title.getUrl() );\n\t\t\t// Style missing links. The data should already have been fetched\n\t\t\t// as part of the earlier processing of categoryItems.\n\t\t\tve.init.platform.linkCache.styleElement( title.getPrefixedText(), $link, false );\n\t\t\treturn $link;\n\t\t}\n\t\tfunction renderPageLinks( pages ) {\n\t\t\tconst $list = $( '<ul>' );\n\t\t\tfor ( let i = 0; i < pages.length; i++ ) {\n\t\t\t\tconst $link = renderPageLink( pages[ i ] );\n\t\t\t\t$list.append( $( '<li>' ).append( $link ) );\n\t\t\t}\n\t\t\treturn $list;\n\t\t}\n\t\tfunction categorySort( group, a, b ) {\n\t\t\treturn group[ a ].index - group[ b ].index;\n\t\t}\n\t\tconst categoriesNormal = Object.keys( categories.normal );\n\t\tif ( categoriesNormal.length ) {\n\t\t\tcategoriesNormal.sort( categorySort.bind( null, categories.normal ) );\n\t\t\tconst $normal = $( '<div>' ).addClass( 'mw-normal-catlinks' );\n\t\t\tconst $pageLink = renderPageLink( ve.msg( 'pagecategorieslink' ) ).text( ve.msg( 'pagecategories', categoriesNormal.length ) );\n\t\t\tconst $pageLinks = renderPageLinks( categoriesNormal );\n\t\t\t$normal.append(\n\t\t\t\t$pageLink,\n\t\t\t\t$( document.createTextNode( ve.msg( 'colon-separator' ) ) ),\n\t\t\t\t$pageLinks\n\t\t\t);\n\t\t\t$output.append( $normal );\n\t\t}\n\t\tconst categoriesHidden = Object.keys( categories.hidden );\n\t\tif ( categoriesHidden.length ) {\n\t\t\tcategoriesHidden.sort( categorySort.bind( null, categories.hidden ) );\n\t\t\tconst $hidden = $( '<div>' ).addClass( 'mw-hidden-catlinks' );\n\t\t\tif ( mw.user.options.get( 'showhiddencats' ) ) {\n\t\t\t\t$hidden.addClass( 'mw-hidden-cats-user-shown' );\n\t\t\t} else if ( mw.config.get( 'wgNamespaceIds' ).category === mw.config.get( 'wgNamespaceNumber' ) ) {\n\t\t\t\t$hidden.addClass( 'mw-hidden-cats-ns-shown' );\n\t\t\t} else {\n\t\t\t\t$hidden.addClass( 'mw-hidden-cats-hidden' );\n\t\t\t}\n\t\t\tconst $hiddenPageLinks = renderPageLinks( categoriesHidden );\n\t\t\t$hidden.append(\n\t\t\t\t$( document.createTextNode( ve.msg( 'hidden-categories', categoriesHidden.length ) ) ),\n\t\t\t\t$( document.createTextNode( ve.msg( 'colon-separator' ) ) ),\n\t\t\t\t$hiddenPageLinks\n\t\t\t);\n\t\t\t$output.append( $hidden );\n\t\t}\n\t\treturn $output;\n\t} );\n};\n\n// Used in tryTeardown\nve.ui.windowFactory.register( mw.widgets.AbandonEditDialog );\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":"implicit-arrow-linebreak","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-mw/init/targets/ve.init.mw.DesktopArticleTarget.js","messages":[{"ruleId":"es-x/no-iterator-prototype-reduce","severity":2,"message":"ES2025 'Iterator.prototype.reduce' method is forbidden.","line":58,"column":27,"nodeType":"MemberExpression","messageId":"forbidden","endLine":59,"endColumn":10},{"ruleId":"es-x/no-iterator-prototype-toarray","severity":2,"message":"ES2025 'Iterator.prototype.toArray' method is forbidden.","line":58,"column":27,"nodeType":"MemberExpression","messageId":"forbidden","endLine":58,"endColumn":63},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":387,"column":1,"nodeType":"Block","endLine":387,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":389,"column":1,"nodeType":"Block","endLine":389,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":827,"column":1,"nodeType":"Block","endLine":827,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":893,"column":1,"nodeType":"Block","endLine":893,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":53,"column":7,"nodeType":"CallExpression","endLine":53,"endColumn":24,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":54,"column":29,"nodeType":"CallExpression","endLine":54,"endColumn":46,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":58,"column":27,"nodeType":"CallExpression","endLine":58,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":319,"column":7,"nodeType":"CallExpression","endLine":319,"endColumn":22,"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":319,"column":7,"nodeType":"CallExpression","endLine":319,"endColumn":63,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":320,"column":3,"nodeType":"CallExpression","endLine":320,"endColumn":18,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":401,"column":3,"nodeType":"CallExpression","endLine":401,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":409,"column":4,"nodeType":"CallExpression","endLine":409,"endColumn":15,"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":432,"column":2,"nodeType":"CallExpression","endLine":436,"endColumn":68,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":432,"column":2,"nodeType":"CallExpression","endLine":432,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":592,"column":2,"nodeType":"CallExpression","endLine":592,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":631,"column":3,"nodeType":"CallExpression","endLine":631,"endColumn":60,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":636,"column":3,"nodeType":"CallExpression","endLine":636,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":807,"column":21,"nodeType":"CallExpression","endLine":807,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-sizzle","severity":2,"message":"Selector extensions are not allowed","line":816,"column":4,"nodeType":"CallExpression","endLine":816,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":820,"column":3,"nodeType":"CallExpression","endLine":820,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":848,"column":4,"nodeType":"CallExpression","endLine":848,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"local/no-unsanitized-href","severity":2,"message":"Don't set 'href' without sanitizing; use ve.setAttributeSafe.","line":853,"column":5,"nodeType":"CallExpression","messageId":"noHref","endLine":853,"endColumn":52,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":921,"column":2,"nodeType":"CallExpression","endLine":921,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1019,"column":29,"nodeType":"CallExpression","endLine":1019,"endColumn":45,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1117,"column":3,"nodeType":"CallExpression","endLine":1117,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1150,"column":44,"nodeType":"CallExpression","endLine":1150,"endColumn":84,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1240,"column":9,"nodeType":"CallExpression","endLine":1240,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1241,"column":4,"nodeType":"CallExpression","endLine":1241,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1248,"column":3,"nodeType":"CallExpression","endLine":1248,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":1248,"column":3,"nodeType":"CallExpression","endLine":1248,"endColumn":65,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1423,"column":51,"nodeType":"CallExpression","endLine":1423,"endColumn":81,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":2,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization DesktopArticleTarget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/* eslint-disable no-jquery/no-global-selector */\n\n/**\n * MediaWiki desktop article target.\n *\n * @class\n * @extends ve.init.mw.ArticleTarget\n *\n * @constructor\n * @param {Object} [config]\n */\nve.init.mw.DesktopArticleTarget = function VeInitMwDesktopArticleTarget( config ) {\n\t// Parent constructor\n\tve.init.mw.DesktopArticleTarget.super.call( this, config );\n\n\t// Parent constructor bound key event handlers, but we don't want them bound until\n\t// we activate; so unbind them again\n\tthis.unbindHandlers();\n\n\tthis.onWatchToggleHandler = this.onWatchToggle.bind( this );\n\n\t// Properties\n\tthis.onBeforeUnloadFallback = null;\n\tthis.onBeforeUnload = this.onBeforeUnload.bind( this );\n\tthis.onUnloadHandler = this.onUnload.bind( this );\n\tthis.activating = false;\n\tthis.deactivating = false;\n\tthis.deactivatingDeferred = null;\n\tthis.recreating = false;\n\tthis.activatingDeferred = null;\n\tthis.toolbarSetupDeferred = null;\n\tthis.suppressNormalStartupDialogs = false;\n\tthis.editingTabDialog = null;\n\tthis.welcomeDialog = null;\n\tthis.welcomeDialogPromise = null;\n\n\t// If this is true then #transformPage / #restorePage will not call pushState\n\t// This is to avoid adding a new history entry for the url we just got from onpopstate\n\t// (which would mess up with the expected order of Back/Forwards browsing)\n\tthis.actFromPopState = false;\n\tthis.popState = {\n\t\ttag: 'visualeditor'\n\t};\n\tthis.scrollTop = null;\n\tthis.section = null;\n\tif ( $( '#wpSummary' ).length ) {\n\t\tthis.initialEditSummary = $( '#wpSummary' ).val();\n\t} else {\n\t\tthis.initialEditSummary = this.currentUrl.searchParams.get( 'summary' );\n\t}\n\tthis.initialCheckboxes = $( '.editCheckboxes input' ).toArray()\n\t\t.reduce( ( initialCheckboxes, node ) => {\n\t\t\tinitialCheckboxes[ node.name ] = node.checked;\n\t\t\treturn initialCheckboxes;\n\t\t}, {} );\n\n\tthis.tabLayout = mw.config.get( 'wgVisualEditorConfig' ).tabLayout;\n\tthis.events = new ve.init.mw.ArticleTargetEvents( this );\n\tthis.$originalContent = $( '<div>' ).addClass( 've-init-mw-desktopArticleTarget-originalContent' );\n\tthis.$editableContent.addClass( 've-init-mw-desktopArticleTarget-editableContent' );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 've-init-mw-desktopArticleTarget' )\n\t\t.append( this.$originalContent );\n\n\t// We replace the current state with one that's marked with our tag. This way, when users\n\t// use the Back button to exit the editor we can restore Read mode. This is because we want\n\t// to ignore foreign states in onWindowPopState. Without this, the Read state is foreign.\n\t// FIXME: There should be a much better solution than this.\n\thistory.replaceState( this.popState, '', this.currentUrl );\n\n\tthis.setupSkinTabs();\n\n\twindow.addEventListener( 'popstate', this.onWindowPopState.bind( this ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.init.mw.DesktopArticleTarget, ve.init.mw.ArticleTarget );\n\n/* Static Properties */\n\nve.init.mw.DesktopArticleTarget.static.toolbarGroups = ve.copy( ve.init.mw.DesktopArticleTarget.static.toolbarGroups );\nve.init.mw.DesktopArticleTarget.static.toolbarGroups.push(\n\t{\n\t\tname: 'help',\n\t\talign: 'after',\n\t\texcludeFromTargetWidget: true,\n\t\ttype: 'mwHelpList',\n\t\ticon: 'help',\n\t\tindicator: null,\n\t\ttitle: ve.msg( 'visualeditor-help-tool' ),\n\t\tinclude: [ { group: 'help' } ],\n\t\tpromote: [ 'mwUserGuide' ]\n\t},\n\t{\n\t\tname: 'notices',\n\t\talign: 'after',\n\t\texcludeFromTargetWidget: true,\n\t\tinclude: [ { group: 'notices' } ]\n\t},\n\t{\n\t\tname: 'pageMenu',\n\t\talign: 'after',\n\t\texcludeFromTargetWidget: true,\n\t\ttype: 'list',\n\t\ticon: 'menu',\n\t\tindicator: null,\n\t\ttitle: ve.msg( 'visualeditor-pagemenu-tooltip' ),\n\t\tlabel: ve.msg( 'visualeditor-pagemenu-tooltip' ),\n\t\tinvisibleLabel: true,\n\t\tinclude: [ { group: 'utility' } ],\n\t\tdemote: [ 'changeDirectionality', 'findAndReplace' ]\n\t},\n\t{\n\t\tname: 'editMode',\n\t\talign: 'after',\n\t\texcludeFromTargetWidget: true,\n\t\ttype: 'list',\n\t\ticon: 'edit',\n\t\ttitle: ve.msg( 'visualeditor-mweditmode-tooltip' ),\n\t\tlabel: ve.msg( 'visualeditor-mweditmode-tooltip' ),\n\t\tinvisibleLabel: true,\n\t\tinclude: [ { group: 'editMode' } ]\n\t},\n\t{\n\t\tname: 'save',\n\t\talign: 'after',\n\t\texcludeFromTargetWidget: true,\n\t\ttype: 'bar',\n\t\tinclude: [ { group: 'save' } ]\n\t}\n);\n\nve.init.mw.DesktopArticleTarget.static.platformType = 'desktop';\n\n/* Events */\n\n/**\n * @event ve.init.mw.DesktopArticleTarget#deactivate\n */\n\n/**\n * @event ve.init.mw.DesktopArticleTarget#transformPage\n */\n\n/**\n * @event ve.init.mw.DesktopArticleTarget#restorePage\n */\n\n/**\n * Fired when user clicks the button to open the save dialog.\n *\n * @event ve.init.mw.DesktopArticleTarget#saveWorkflowBegin\n */\n\n/**\n * Fired when user exits the save workflow\n *\n * @event ve.init.mw.DesktopArticleTarget#saveWorkflowEnd\n */\n\n/**\n * Fired when user initiates review changes in save workflow\n *\n * @event ve.init.mw.DesktopArticleTarget#saveReview\n */\n\n/**\n * Fired when user initiates saving of the document\n *\n * @event ve.init.mw.DesktopArticleTarget#saveInitiated\n */\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.addSurface = function ( dmDoc, config ) {\n\tconst skinPadding = {\n\t\t// Vector-2022 content area less padding, so popups can render too close\n\t\t// to the edge of the text (T258501). The default of 10px is reduced to 3px.\n\t\t// We still need a bit of padding to keep popups from touching the sidebar.\n\t\t'vector-2022': 3,\n\t\tmonobook: -10\n\t};\n\tconst skin = mw.config.get( 'skin' );\n\tconfig = ve.extendObject( {\n\t\toverlayPadding: skin in skinPadding ? skinPadding[ skin ] : undefined\n\t}, config );\n\treturn ve.init.mw.DesktopArticleTarget.super.prototype.addSurface.call( this, dmDoc, config );\n};\n\n/**\n * Set the container for the target, appending the target to it\n *\n * @param {jQuery} $container\n */\nve.init.mw.DesktopArticleTarget.prototype.setContainer = function ( $container ) {\n\t$container.append( this.$element );\n\tthis.$container = $container;\n};\n\n/**\n * Verify that a PopStateEvent correlates to a state we created.\n *\n * @param {any} popState From PopStateEvent#state\n * @return {boolean}\n */\nve.init.mw.DesktopArticleTarget.prototype.verifyPopState = function ( popState ) {\n\treturn popState && popState.tag === 'visualeditor';\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.setupToolbar = function ( surface ) {\n\tconst mode = surface.getMode(),\n\t\twasSetup = !!this.toolbar;\n\n\tve.track( 'trace.setupToolbar.enter', { mode: mode } );\n\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.setupToolbar.call( this, surface );\n\n\tconst toolbar = this.getToolbar();\n\n\t// Allow the toolbar to start floating now if necessary\n\tthis.onContainerScroll();\n\n\tve.track( 'trace.setupToolbar.exit', { mode: mode } );\n\tif ( !wasSetup ) {\n\t\ttoolbar.$element\n\t\t\t.addClass( 've-init-mw-desktopArticleTarget-toolbar-open' );\n\t\tif ( !toolbar.isFloating() ) {\n\t\t\ttoolbar.$element.css( 'height', '' );\n\t\t}\n\t\tthis.toolbarSetupDeferred.resolve();\n\n\t\tthis.toolbarSetupDeferred.then( () => {\n\t\t\tconst newSurface = this.getSurface();\n\t\t\t// Check the surface wasn't torn down while the toolbar was animating\n\t\t\tif ( newSurface ) {\n\t\t\t\tve.track( 'trace.initializeToolbar.enter', { mode: mode } );\n\t\t\t\tthis.getToolbar().initialize();\n\t\t\t\tnewSurface.getView().emit( 'position' );\n\t\t\t\tnewSurface.getContext().updateDimensions();\n\t\t\t\tve.track( 'trace.initializeToolbar.exit', { mode: mode } );\n\t\t\t\tve.track( 'trace.activate.exit', { mode: mode } );\n\t\t\t}\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.attachToolbar = function () {\n\t// Set edit notices, will be shown after welcome dialog.\n\t// Make sure notices actually exists, because this might be a mode-switch and\n\t// we've already removed it.\n\tconst editNotices = this.getEditNotices(),\n\t\tactionTools = this.toolbar.tools;\n\tif ( editNotices && editNotices.length && actionTools.notices ) {\n\t\tactionTools.notices.setNotices( editNotices );\n\t} else if ( actionTools.notices ) {\n\t\tactionTools.notices.destroy();\n\t\tactionTools.notices = null;\n\t}\n\n\t// Move the toolbar to top of target, before heading etc.\n\t// Avoid re-attaching as it breaks CSS animations\n\tif ( !this.toolbar.$element.parent().is( this.$element ) ) {\n\t\tthis.toolbar.$element\n\t\t\t// Set 0 before attach (expanded in #setupToolbar)\n\t\t\t.css( 'height', '0' )\n\t\t\t.addClass( 've-init-mw-desktopArticleTarget-toolbar' );\n\t\tthis.$element.prepend( this.toolbar.$element );\n\n\t\t// Calculate if the 'oo-ui-toolbar-narrow' class is needed (OOUI does it too late for our\n\t\t// toolbar because the methods are called in the wrong order, see T92282).\n\t\tthis.toolbar.onWindowResize();\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.setupToolbarSaveButton = function () {\n\tthis.toolbarSaveButton = this.toolbar.getToolGroupByName( 'save' ).items[ 0 ];\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.updateTabs = function () {\n\tmw.libs.ve.updateTabs( true, this.getDefaultMode(), this.section === 'new' );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.loadSuccess = function () {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.loadSuccess.apply( this, arguments );\n\n\tthis.wikitextFallbackLoading = false;\n\t// Duplicate of this code in ve.init.mw.DesktopArticleTarget.init.js\n\t// eslint-disable-next-line no-jquery/no-class-state\n\tif ( $( '#ca-edit' ).hasClass( 'visualeditor-showtabdialog' ) ) {\n\t\t$( '#ca-edit' ).removeClass( 'visualeditor-showtabdialog' );\n\t\t// Set up a temporary window manager\n\t\tconst windowManager = new OO.ui.WindowManager();\n\t\t$( OO.ui.getTeleportTarget() ).append( windowManager.$element );\n\t\tthis.editingTabDialog = new mw.libs.ve.EditingTabDialog();\n\t\twindowManager.addWindows( [ this.editingTabDialog ] );\n\t\twindowManager.openWindow( this.editingTabDialog )\n\t\t\t.closed.then( ( data ) => {\n\t\t\t\t// Detach the temporary window manager\n\t\t\t\twindowManager.destroy();\n\n\t\t\t\tif ( data && data.action === 'prefer-wt' ) {\n\t\t\t\t\tthis.switchToWikitextEditor( false );\n\t\t\t\t} else if ( data && data.action === 'multi-tab' ) {\n\t\t\t\t\tlocation.reload();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// Pretend the user saw the welcome dialog before suppressing it.\n\t\tmw.libs.ve.stopShowingWelcomeDialog();\n\t\tthis.suppressNormalStartupDialogs = true;\n\t}\n};\n\n/**\n * Handle the watch button being toggled on/off.\n *\n * @param {boolean} isWatched\n * @param {string} expiry\n * @param {string} expirySelected\n */\nve.init.mw.DesktopArticleTarget.prototype.onWatchToggle = function ( isWatched ) {\n\tif ( !this.active && !this.activating ) {\n\t\treturn;\n\t}\n\tif ( this.checkboxesByName && this.checkboxesByName.wpWatchthis ) {\n\t\tthis.checkboxesByName.wpWatchthis.setSelected(\n\t\t\t!!mw.user.options.get( 'watchdefault' ) ||\n\t\t\t( !!mw.user.options.get( 'watchcreations' ) && !this.pageExists ) ||\n\t\t\tisWatched\n\t\t);\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.bindHandlers = function () {\n\tve.init.mw.DesktopArticleTarget.super.prototype.bindHandlers.call( this );\n\tif ( this.onWatchToggleHandler ) {\n\t\tmw.hook( 'wikipage.watchlistChange' ).add( this.onWatchToggleHandler );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.unbindHandlers = function () {\n\tve.init.mw.DesktopArticleTarget.super.prototype.unbindHandlers.call( this );\n\tif ( this.onWatchToggleHandler ) {\n\t\tmw.hook( 'wikipage.watchlistChange' ).remove( this.onWatchToggleHandler );\n\t}\n};\n\n/**\n * Switch to edit mode.\n *\n * @param {jQuery.Promise} [dataPromise] Promise for pending request from\n *   mw.libs.ve.targetLoader#requestPageData, if any\n * @return {jQuery.Promise}\n */\nve.init.mw.DesktopArticleTarget.prototype.activate = function ( dataPromise ) {\n\t// We may be re-activating an old target, during which time ve.init.target\n\t// has been overridden.\n\tve.init.target = ve.init.articleTarget;\n\n\tif ( !this.active && !this.activating ) {\n\t\tthis.activating = true;\n\t\tthis.activatingDeferred = ve.createDeferred();\n\t\tthis.toolbarSetupDeferred = ve.createDeferred();\n\n\t\t$( 'html' ).addClass( 've-activating' );\n\t\tve.promiseAll( [ this.activatingDeferred, this.toolbarSetupDeferred ] ).then( () => {\n\t\t\tif ( !this.suppressNormalStartupDialogs ) {\n\t\t\t\tthis.maybeShowWelcomeDialog();\n\t\t\t\tthis.maybeShowMetaDialog();\n\t\t\t}\n\t\t\tthis.afterActivate();\n\t\t}, () => {\n\t\t\t$( 'html' ).removeClass( 've-activating' );\n\t\t} );\n\n\t\t// Handlers were unbound in constructor. Will be unbound again in teardown.\n\t\tthis.bindHandlers();\n\n\t\tthis.originalEditondbclick = mw.user.options.get( 'editondblclick' );\n\t\tmw.user.options.set( 'editondblclick', 0 );\n\n\t\t// User interface changes\n\t\tthis.changeDocumentTitle();\n\t\tthis.transformPage();\n\n\t\tthis.load( dataPromise );\n\t}\n\treturn this.activatingDeferred.promise();\n};\n\n/**\n * Edit mode has finished activating\n */\nve.init.mw.DesktopArticleTarget.prototype.afterActivate = function () {\n\t// eslint-disable-next-line mediawiki/class-doc\n\t$( 'html' )\n\t\t// Remove ve-activating when loading for the first time,\n\t\t// and when switching remove previous mode's class.\n\t\t.removeClass( 've-activating ve-active-visual ve-active-source' )\n\t\t.addClass( 've-active ve-active-' + this.getSurface().getMode() );\n\n\t// Disable TemplateStyles in the original content\n\t// (We do this here because toggling 've-active' class above hides it)\n\tthis.$editableContent.find( 'style[data-mw-deduplicate^=\"TemplateStyles:\"]' ).prop( 'disabled', true );\n\n\tthis.afterSurfaceReady();\n\n\tif ( !this.editingTabDialog ) {\n\t\tif ( this.sectionTitle ) {\n\t\t\tthis.sectionTitle.focus();\n\t\t} else {\n\t\t\t// We have to focus the page after hiding the original content, otherwise\n\t\t\t// in firefox the contentEditable container was below the view page, and\n\t\t\t// 'focus' scrolled the screen down.\n\t\t\t// Support: Firefox\n\t\t\tthis.getSurface().getView().focus();\n\t\t}\n\t\t// Transfer and initial source range to the surface (e.g. from tempWikitextEditor)\n\t\tif ( this.initialSourceRange && this.getSurface().getMode() === 'source' ) {\n\t\t\tconst surfaceModel = this.getSurface().getModel();\n\t\t\tconst range = surfaceModel.getRangeFromSourceOffsets( this.initialSourceRange.from, this.initialSourceRange.to );\n\t\t\tsurfaceModel.setLinearSelection( range );\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.setSurface = function ( surface ) {\n\tconst resetSurface = surface !== this.surface;\n\n\tif ( resetSurface ) {\n\t\tthis.$editableContent.after( surface.$element );\n\t}\n\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.setSurface.apply( this, arguments );\n\n\tif ( resetSurface ) {\n\t\tthis.setupNewSection( surface );\n\t}\n};\n\n/**\n * Setup new section input for a surface, if required\n *\n * @param {ve.ui.Surface} surface\n */\nve.init.mw.DesktopArticleTarget.prototype.setupNewSection = function ( surface ) {\n\tif ( surface.getMode() === 'visual' && this.section === 'new' ) {\n\t\tthrow new Error( 'Adding new section is not supported in visual mode' );\n\t}\n\tif ( surface.getMode() === 'source' && this.section === 'new' ) {\n\t\tif ( !this.sectionTitle ) {\n\t\t\tthis.sectionTitle = new OO.ui.TextInputWidget( {\n\t\t\t\t$element: $( '<h2>' ),\n\t\t\t\tclasses: [ 've-init-mw-desktopArticleTarget-sectionTitle' ],\n\t\t\t\tplaceholder: ve.msg( 'visualeditor-section-title-placeholder' ),\n\t\t\t\tspellcheck: true\n\t\t\t} );\n\t\t\tif ( this.recovered ) {\n\t\t\t\tthis.sectionTitle.setValue(\n\t\t\t\t\tve.init.platform.sessionStorage.get( 've-docsectiontitle' ) || ''\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.sectionTitle.connect( this, { change: 'onSectionTitleChange' } );\n\t\t}\n\t\tsurface.setPlaceholder( ve.msg( 'visualeditor-section-body-placeholder' ) );\n\t\tthis.$editableContent.before( this.sectionTitle.$element );\n\n\t\tif ( this.currentUrl.searchParams.has( 'preloadtitle' ) ) {\n\t\t\tthis.sectionTitle.setValue( this.currentUrl.searchParams.get( 'preloadtitle' ) );\n\t\t}\n\t\tsurface.once( 'destroy', this.teardownNewSection.bind( this, surface ) );\n\t} else {\n\t\tve.init.platform.sessionStorage.remove( 've-docsectiontitle' );\n\t}\n};\n\n/**\n * Handle section title changes\n */\nve.init.mw.DesktopArticleTarget.prototype.onSectionTitleChange = function () {\n\tve.init.platform.sessionStorage.set( 've-docsectiontitle', this.sectionTitle.getValue() );\n\tthis.updateToolbarSaveButtonState();\n};\n\n/**\n * Teardown new section inputs\n *\n * @param {ve.ui.Surface} surface\n */\nve.init.mw.DesktopArticleTarget.prototype.teardownNewSection = function ( surface ) {\n\tsurface.setPlaceholder( '' );\n\tif ( this.sectionTitle ) {\n\t\tthis.sectionTitle.$element.remove();\n\t\tthis.sectionTitle = null;\n\t}\n};\n\n/**\n * @inheritdoc\n *\n * A prompt will not be shown if tryTeardown() is called while activation is still in progress.\n * If tryTeardown() is called while the target is deactivating, or while it's not active and\n * not activating, nothing happens.\n */\nve.init.mw.DesktopArticleTarget.prototype.tryTeardown = function ( noPrompt, trackMechanism ) {\n\tif ( this.deactivating || ( !this.active && !this.activating ) ) {\n\t\treturn this.teardownPromise || ve.createDeferred().resolve().promise();\n\t}\n\n\t// Just in case these weren't closed before\n\tif ( this.welcomeDialog ) {\n\t\tthis.welcomeDialog.close();\n\t}\n\tif ( this.editingTabDialog ) {\n\t\tthis.editingTabDialog.close();\n\t}\n\tthis.editingTabDialog = null;\n\n\t// Parent method\n\treturn ve.init.mw.DesktopArticleTarget.super.prototype.tryTeardown.call( this, noPrompt || this.activating, trackMechanism );\n};\n\n/**\n * @inheritdoc\n *\n * @param {string} [trackMechanism]\n * @fires ve.init.mw.DesktopArticleTarget#deactivate\n */\nve.init.mw.DesktopArticleTarget.prototype.teardown = function ( trackMechanism ) {\n\t// Event tracking\n\tlet abortType, abortedMode;\n\tif ( trackMechanism ) {\n\t\tif ( this.activating ) {\n\t\t\tabortType = 'preinit';\n\t\t} else if ( !this.edited ) {\n\t\t\tabortType = 'nochange';\n\t\t} else if ( this.saving ) {\n\t\t\tabortType = 'abandonMidsave';\n\t\t} else {\n\t\t\t// switchwith and switchwithout do not go through this code path,\n\t\t\t// they go through switchToWikitextEditor() instead\n\t\t\tabortType = 'abandon';\n\t\t}\n\t\tabortedMode = this.surface ? this.surface.getMode() : this.getDefaultMode();\n\t}\n\n\t// Cancel activating, start deactivating\n\tthis.deactivating = true;\n\tthis.deactivatingDeferred = ve.createDeferred();\n\tthis.activating = false;\n\tthis.activatingDeferred.reject();\n\t$( 'html' ).addClass( 've-deactivating' ).removeClass( 've-activated ve-active' );\n\n\tthis.emit( 'deactivate' );\n\n\t// Restore TemplateStyles of the original content\n\t// (We do this here because toggling 've-active' class above displays it)\n\tthis.$editableContent.find( 'style[data-mw-deduplicate^=\"TemplateStyles:\"]' ).prop( 'disabled', false );\n\n\t// User interface changes\n\tthis.restorePage();\n\tthis.restoreDocumentTitle();\n\n\tmw.user.options.set( 'editondblclick', this.originalEditondbclick );\n\tthis.originalEditondbclick = undefined;\n\n\t// TODO: Use better checks to see if these restorations are required.\n\tif ( this.getSurface() ) {\n\t\tif ( this.active ) {\n\t\t\tthis.teardownUnloadHandlers();\n\t\t}\n\t}\n\n\t// Parent method\n\treturn ve.init.mw.DesktopArticleTarget.super.prototype.teardown.call( this ).then( () => {\n\t\t// After teardown\n\t\tthis.active = false;\n\n\t\t// If there is a load in progress, try to abort it\n\t\tif ( this.loading && this.loading.abort ) {\n\t\t\tthis.loading.abort();\n\t\t}\n\n\t\tthis.clearState();\n\t\tthis.initialEditSummary = new URL( location.href ).searchParams.get( 'summary' );\n\t\tthis.editSummaryValue = null;\n\n\t\t// Move original content back out of the target\n\t\tthis.$element.parent().append( this.$originalContent.children() );\n\n\t\t$( '.ve-init-mw-desktopArticleTarget-uneditableContent' )\n\t\t\t.removeClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\n\t\tthis.deactivating = false;\n\t\tthis.deactivatingDeferred.resolve();\n\t\t$( 'html' ).removeClass( 've-deactivating' );\n\n\t\t// Event tracking\n\t\tif ( trackMechanism ) {\n\t\t\tve.track( 'editAttemptStep', {\n\t\t\t\taction: 'abort',\n\t\t\t\ttype: abortType,\n\t\t\t\tmechanism: trackMechanism,\n\t\t\t\tmode: abortedMode\n\t\t\t} );\n\t\t}\n\n\t\tif ( !this.isViewPage ) {\n\t\t\tconst newUrl = new URL( this.viewUrl );\n\t\t\tif ( mw.config.get( 'wgIsRedirect' ) ) {\n\t\t\t\tnewUrl.searchParams.set( 'redirect', 'no' );\n\t\t\t}\n\t\t\tlocation.href = newUrl;\n\t\t}\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.loadFail = function ( code, errorDetails ) {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.loadFail.apply( this, arguments );\n\n\tif ( this.wikitextFallbackLoading ) {\n\t\t// Failed twice now\n\t\tmw.log.warn( 'Failed to fall back to wikitext', code, errorDetails );\n\t\tconst newUrl = new URL( this.viewUrl );\n\t\tnewUrl.searchParams.set( 'action', 'edit' );\n\t\tnewUrl.searchParams.set( 'veswitched', '1' );\n\t\tlocation.href = newUrl;\n\t\treturn;\n\t}\n\n\tif ( !this.activating ) {\n\t\t// Load failed after activation abandoned (e.g. user pressed escape).\n\t\t// Nothing more to do.\n\t\treturn;\n\t}\n\n\tconst $confirmPromptMessage = this.extractErrorMessages( errorDetails );\n\n\tOO.ui.confirm( $confirmPromptMessage, {\n\t\tactions: [\n\t\t\t{ action: 'accept', label: ve.msg( 'ooui-dialog-process-retry' ), flags: 'primary' },\n\t\t\t{ action: 'reject', label: ve.msg( 'ooui-dialog-message-reject' ), flags: 'safe' }\n\t\t]\n\t} ).then( ( confirmed ) => {\n\t\tif ( confirmed ) {\n\t\t\t// Retry load\n\t\t\tthis.load();\n\t\t} else {\n\t\t\t// User pressed \"cancel\"\n\t\t\tif ( this.getSurface() ) {\n\t\t\t\t// Restore the mode of the current surface\n\t\t\t\tthis.setDefaultMode( this.getSurface().getMode() );\n\t\t\t\tthis.activatingDeferred.reject();\n\t\t\t} else {\n\t\t\t\t// We're switching from read mode or the 2010 wikitext editor:\n\t\t\t\t// just give up and stay where you are\n\t\t\t\tthis.tryTeardown( true );\n\t\t\t}\n\t\t}\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.surfaceReady = function () {\n\tif ( !this.activating ) {\n\t\t// Activation was aborted before we got here. Do nothing\n\t\t// TODO are there things we need to clean up?\n\t\treturn;\n\t}\n\n\tconst surface = this.getSurface();\n\n\tthis.activating = false;\n\n\t// TODO: mwTocWidget should probably live in a ve.ui.MWSurface subclass\n\tif ( mw.config.get( 'wgVisualEditorConfig' ).enableTocWidget ) {\n\t\tsurface.mwTocWidget = new ve.ui.MWTocWidget( this.getSurface() );\n\t\tsurface.once( 'destroy', () => {\n\t\t\tsurface.mwTocWidget.$element.remove();\n\t\t} );\n\t}\n\n\tconst metaList = this.getSurface().getModel().getDocument().getMetaList();\n\n\tmetaList.connect( this, {\n\t\tinsert: 'onMetaItemInserted',\n\t\tremove: 'onMetaItemRemoved'\n\t} );\n\t// Rebuild the category list from the page we got from the API. This makes\n\t// it work regardless of whether we came here from activating on an\n\t// existing page, or loading via an edit URL.\n\tthis.rebuildCategories( metaList.getItemsInGroup( 'mwCategory' ), true );\n\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.surfaceReady.apply( this, arguments );\n\n\tconst redirectMetaItems = metaList.getItemsInGroup( 'mwRedirect' );\n\tif ( redirectMetaItems.length ) {\n\t\tthis.setFakeRedirectInterface( redirectMetaItems[ 0 ].getAttribute( 'title' ) );\n\t} else {\n\t\tthis.setFakeRedirectInterface( null );\n\t}\n\n\tthis.setupUnloadHandlers();\n\n\tthis.activatingDeferred.resolve();\n\tthis.events.trackActivationComplete();\n};\n\n/**\n * Update the redirect and category interfaces when a meta item is inserted into the page.\n *\n * @param {ve.dm.MetaItem} metaItem Item that was inserted\n */\nve.init.mw.DesktopArticleTarget.prototype.onMetaItemInserted = function ( metaItem ) {\n\tswitch ( metaItem.getType() ) {\n\t\tcase 'mwRedirect':\n\t\t\tthis.setFakeRedirectInterface( metaItem.getAttribute( 'title' ) );\n\t\t\tbreak;\n\t\tcase 'mwCategory': {\n\t\t\tconst metaList = this.getSurface().getModel().getDocument().getMetaList();\n\t\t\tthis.rebuildCategories( metaList.getItemsInGroup( 'mwCategory' ) );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Update the redirect and category interfaces when a meta item is removed from the page.\n *\n * @param {ve.dm.MetaItem} metaItem Item that was removed\n * @param {number} offset Linear model offset that the item was at\n * @param {number} index Index within that offset the item was at\n */\nve.init.mw.DesktopArticleTarget.prototype.onMetaItemRemoved = function ( metaItem ) {\n\tswitch ( metaItem.getType() ) {\n\t\tcase 'mwRedirect':\n\t\t\tthis.setFakeRedirectInterface( null );\n\t\t\tbreak;\n\t\tcase 'mwCategory': {\n\t\t\tconst metaList = this.getSurface().getModel().getDocument().getMetaList();\n\t\t\tthis.rebuildCategories( metaList.getItemsInGroup( 'mwCategory' ) );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Redisplay the category list on the page\n *\n * This is used for the preview while editing. Leaving the editor either restores the initial\n * categories, or uses the ones generated by the save API.\n *\n * @param {ve.dm.MetaItem[]} categoryItems Array of category metaitems to display\n */\nve.init.mw.DesktopArticleTarget.prototype.rebuildCategories = function ( categoryItems ) {\n\tthis.renderCategories( categoryItems ).then( ( $categories ) => {\n\t\t// Clone the existing catlinks for any specific properties which might\n\t\t// be needed by the rest of the page. Also gives us a not-attached\n\t\t// version, which we can pass to wikipage.categories as it requests.\n\t\tconst $catlinks = $( '#catlinks' ).clone().empty().removeClass( 'categories-allhidden' )\n\t\t\t.append( $categories.children() );\n\t\t// If all categories are hidden, we need to hide the box.\n\t\t$catlinks.toggleClass( 'catlinks-allhidden',\n\t\t\t$catlinks.find( '.mw-normal-catlinks' ).length === 0 &&\n\t\t\t// Some situations make the hidden-categories visible (a user\n\t\t\t// preference, and being on a category page) so rather than\n\t\t\t// encoding that logic here just check whether they're visible:\n\t\t\t// eslint-disable-next-line no-jquery/no-sizzle\n\t\t\t$catlinks.find( '.mw-hidden-catlinks:visible' ).length === 0\n\t\t);\n\t\tthis.transformCategoryLinks( $catlinks );\n\t\tmw.hook( 'wikipage.categories' ).fire( $catlinks );\n\t\t$( '#catlinks' ).replaceWith( $catlinks );\n\t} );\n};\n\n/**\n * Handle clicks on the view tab.\n *\n * @param {jQuery.Event} e Mouse click event\n */\nve.init.mw.DesktopArticleTarget.prototype.onViewTabClick = function ( e ) {\n\tif ( ( !this.active && !this.activating ) || !ve.isUnmodifiedLeftClick( e ) ) {\n\t\treturn;\n\t}\n\tthis.tryTeardown( false, 'navigate-read' );\n\te.preventDefault();\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.saveComplete = function ( data ) {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.saveComplete.apply( this, arguments );\n\n\t// If there is no content, then parent method will reload the whole page\n\tif ( !data.nocontent ) {\n\t\t// Fix permalinks\n\t\tif ( data.newrevid !== undefined ) {\n\t\t\t$( '#t-permalink' ).add( '#coll-download-as-rl' ).find( 'a' ).each( ( i, el ) => {\n\t\t\t\tconst permalinkUrl = new URL( el.href );\n\t\t\t\tpermalinkUrl.searchParams.set( 'oldid', data.newrevid );\n\t\t\t\t// permalinkUrl is safe\n\t\t\t\t// eslint-disable-next-line local/no-unsanitized-href\n\t\t\t\t$( el ).attr( 'href', permalinkUrl.toString() );\n\t\t\t} );\n\t\t}\n\n\t\tif ( data.newrevid !== undefined ) {\n\t\t\t// (T370771) Update wgCurRevisionId and wgRevisionId (!)\n\t\t\t// Mirror of DiscussionTools's cb5d585b93d83f9a7b4df10a71a0d574295f861c\n\t\t\tmw.config.set( {\n\t\t\t\twgCurRevisionId: data.newrevid,\n\t\t\t\twgRevisionId: data.newrevid\n\t\t\t} );\n\n\t\t\t// Actually fire the postEdit hook, now that the save is complete\n\t\t\trequire( 'mediawiki.action.view.postEdit' ).fireHook( 'saved' );\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.serialize = function () {\n\t// Parent method\n\tconst promise = ve.init.mw.DesktopArticleTarget.super.prototype.serialize.apply( this, arguments );\n\n\treturn promise.then( null, ( error, response ) => {\n\t\tconst $errorMessages = this.extractErrorMessages( response );\n\t\tOO.ui.alert( $errorMessages );\n\n\t\t// It's possible to get here while the save dialog has never been opened (if the user uses\n\t\t// the switch to source mode option)\n\t\tif ( this.saveDialog ) {\n\t\t\tthis.saveDialog.popPending();\n\t\t}\n\t} );\n};\n\n/**\n * Handle clicks on the MwMeta button in the toolbar.\n *\n * @param {jQuery.Event} e Mouse click event\n */\nve.init.mw.DesktopArticleTarget.prototype.onToolbarMetaButtonClick = function () {\n\tthis.getSurface().getDialogs().openWindow( 'meta' );\n};\n\n/**\n * Modify tabs in the skin to support in-place editing.\n *\n * 'Read' and 'Edit source' (when not using single edit tab) bound here,\n * 'Edit' and single edit tab are bound in mw.DesktopArticleTarget.init.\n */\nve.init.mw.DesktopArticleTarget.prototype.setupSkinTabs = function () {\n\tconst namespaceNumber = mw.config.get( 'wgNamespaceNumber' );\n\tconst namespaceName = mw.config.get( 'wgCanonicalNamespace' );\n\tconst isTalkNamespace = mw.Title.isTalkNamespace( namespaceNumber );\n\t// Title::getNamespaceKey()\n\tlet namespaceKey = namespaceName.toLowerCase() || 'main';\n\tif ( namespaceKey === 'file' ) {\n\t\tnamespaceKey = 'image';\n\t}\n\tlet namespaceTabId;\n\t// SkinTemplate::buildContentNavigationUrls()\n\tif ( isTalkNamespace ) {\n\t\tnamespaceTabId = 'ca-talk';\n\t} else {\n\t\tnamespaceTabId = 'ca-nstab-' + namespaceKey;\n\t}\n\t$( '#ca-view' ).add( '#' + namespaceTabId ).find( 'a' )\n\t\t.on( 'click.ve-target', this.onViewTabClick.bind( this ) );\n\n\t// Used by Extension:GuidedTour\n\tmw.hook( 've.skinTabSetupComplete' ).fire();\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.getSaveDialogOpeningData = function () {\n\tconst data = ve.init.mw.DesktopArticleTarget.super.prototype.getSaveDialogOpeningData.apply( this, arguments );\n\tdata.editSummary = this.editSummaryValue || this.initialEditSummary;\n\treturn data;\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.teardownToolbar = function () {\n\tconst deferred = ve.createDeferred();\n\n\tif ( !this.toolbar ) {\n\t\treturn deferred.resolve().promise();\n\t}\n\n\tthis.toolbar.$element\n\t\t.addClass( 've-init-mw-desktopArticleTarget-toolbar-preclose' )\n\t\t.css( 'height', this.toolbar.$bar[ 0 ].offsetHeight );\n\trequestAnimationFrame( () => {\n\t\tthis.toolbar.$element\n\t\t\t.css( 'height', '0' )\n\t\t\t.addClass( 've-init-mw-desktopArticleTarget-toolbar-close' );\n\t\tthis.toolbar.$element.one( 'transitionend', () => {\n\t\t\t// Parent method\n\t\t\tve.init.mw.DesktopArticleTarget.super.prototype.teardownToolbar.call( this );\n\t\t\tdeferred.resolve();\n\t\t} );\n\t} );\n\treturn deferred.promise();\n};\n\n/**\n * Change the document title to state that we are now editing.\n */\nve.init.mw.DesktopArticleTarget.prototype.changeDocumentTitle = function () {\n\tconst title = mw.Title.newFromText( this.getPageName() );\n\tconst pageTitleMsg = mw.message( 'pagetitle',\n\t\tve.msg(\n\t\t\tthis.pageExists ? 'editing' : 'creating',\n\t\t\ttitle.getPrefixedText()\n\t\t)\n\t);\n\n\t// T317600\n\tif ( pageTitleMsg.isParseable() ) {\n\t\t// Use the real title if we loaded a view page, otherwise reconstruct it\n\t\tthis.originalDocumentTitle = this.isViewPage ? document.title : ve.msg( 'pagetitle', title.getPrefixedText() );\n\t\t// Reconstruct an edit title\n\t\tdocument.title = pageTitleMsg.text();\n\t} else {\n\t\tmw.log.warn( 'VisualEditor: MediaWiki:Pagetitle contains unsupported syntax. ' +\n\t\t\t'https://www.mediawiki.org/wiki/Manual:Messages_API#Feature_support_in_JavaScript' );\n\t}\n};\n\n/**\n * Restore the original document title.\n */\nve.init.mw.DesktopArticleTarget.prototype.restoreDocumentTitle = function () {\n\tif ( this.originalDocumentTitle ) {\n\t\tdocument.title = this.originalDocumentTitle;\n\t}\n};\n\n/**\n * Page modifications for switching to edit mode.\n *\n * @fires ve.init.mw.DesktopArticleTarget#transformPage\n */\nve.init.mw.DesktopArticleTarget.prototype.transformPage = function () {\n\tthis.updateTabs();\n\tthis.emit( 'transformPage' );\n\n\t// TODO: Deprecate in favour of ve.activationComplete\n\t// Only used by one gadget\n\tmw.hook( 've.activate' ).fire();\n\n\t// Move all native content inside the target\n\t// Exclude notification area to work around T143837\n\tthis.$originalContent.append(\n\t\tthis.$element.siblings()\n\t\t\t.not( '.mw-notification-area' )\n\t\t\t.not( '.ve-init-mw-desktopArticleTarget-toolbarPlaceholder' )\n\t);\n\n\t// To preserve event handlers (e.g. HotCat) if editing is cancelled, detach the original container\n\t// and replace it with a clone during editing\n\tthis.$originalCategories = $( '#catlinks' );\n\tthis.$originalCategories.after( this.$originalCategories.clone() );\n\tthis.$originalCategories.detach();\n\n\t// Mark every non-direct ancestor between editableContent and the container as uneditable\n\tlet $content = this.$editableContent;\n\twhile ( $content && $content.length && !$content.parent().is( this.$container ) ) {\n\t\t$content.prevAll( ':not( .ve-init-mw-tempWikitextEditorWidget )' ).addClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t\t$content.nextAll( ':not( .ve-init-mw-tempWikitextEditorWidget )' ).addClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t\t$content = $content.parent();\n\t}\n\n\tthis.restoreEditTabsIfNeeded( $content );\n\tthis.updateHistoryState();\n};\n\n/**\n * Checks the edit/view tabs have not been marked as disabled. The view tab provides a way\n * to exit the VisualEditor so its important it is not marked as uneditable.\n *\n * @param {jQuery} $content area\n */\nve.init.mw.DesktopArticleTarget.prototype.restoreEditTabsIfNeeded = function ( $content ) {\n\tconst $viewTab = $content.find( '.ve-init-mw-desktopArticleTarget-uneditableContent #ca-view' );\n\tif ( $viewTab.length ) {\n\t\t$viewTab.parents( '.ve-init-mw-desktopArticleTarget-uneditableContent' ).removeClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t}\n};\n\n/**\n * Category link section transformations for switching to edit mode. Broken out\n * so it can be re-applied when displaying changes to the categories.\n *\n * @param {jQuery} $catlinks Category links container element\n */\nve.init.mw.DesktopArticleTarget.prototype.transformCategoryLinks = function ( $catlinks ) {\n\t// Un-disable the catlinks wrapper, but not the links\n\tif ( this.getSurface() && this.getSurface().getMode() === 'visual' ) {\n\t\t$catlinks.removeClass( 've-init-mw-desktopArticleTarget-uneditableContent' )\n\t\t\t.on( 'click.ve-target', () => {\n\t\t\t\tconst windowAction = ve.ui.actionFactory.create( 'window', this.getSurface() );\n\t\t\t\twindowAction.open( 'meta', { page: 'categories' } );\n\t\t\t\treturn false;\n\t\t\t} )\n\t\t\t.find( 'a' ).addClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t} else {\n\t\t$catlinks.addClass( 've-init-mw-desktopArticleTarget-uneditableContent' ).off( 'click.ve-target' );\n\t}\n};\n\n/**\n * Update the history state based on the editor mode\n */\nve.init.mw.DesktopArticleTarget.prototype.updateHistoryState = function () {\n\tconst veaction = this.getDefaultMode() === 'visual' ? 'edit' : 'editsource',\n\t\tsection = this.section;\n\n\t// Push veaction=edit(source) url in history (if not already present).\n\t// If we got here from DesktopArticleTarget.init, then it will be already present.\n\tif (\n\t\t!this.actFromPopState &&\n\t\t(\n\t\t\tthis.currentUrl.searchParams.get( 'veaction' ) !== veaction ||\n\t\t\tthis.currentUrl.searchParams.get( 'section' ) !== section\n\t\t) &&\n\t\tthis.currentUrl.searchParams.get( 'action' ) !== 'edit'\n\t) {\n\t\t// Set the current URL\n\t\tconst url = this.currentUrl;\n\n\t\tif ( mw.libs.ve.isSingleEditTab ) {\n\t\t\turl.searchParams.set( 'action', 'edit' );\n\t\t\tmw.config.set( 'wgAction', 'edit' );\n\t\t} else {\n\t\t\turl.searchParams.set( 'veaction', veaction );\n\t\t\turl.searchParams.delete( 'action' );\n\t\t\tmw.config.set( 'wgAction', 'view' );\n\t\t}\n\t\tif ( this.section !== null ) {\n\t\t\turl.searchParams.set( 'section', this.section );\n\t\t} else {\n\t\t\turl.searchParams.delete( 'section' );\n\t\t}\n\n\t\thistory.pushState( this.popState, '', url );\n\t}\n\tthis.actFromPopState = false;\n};\n\n/**\n * Page modifications for switching back to view mode.\n *\n * @fires ve.init.mw.DesktopArticleTarget#restorePage\n */\nve.init.mw.DesktopArticleTarget.prototype.restorePage = function () {\n\t// Restore any previous redirectMsg/redirectsub\n\tthis.setRealRedirectInterface();\n\tif ( this.$originalCategories ) {\n\t\t$( '#catlinks' ).replaceWith( this.$originalCategories );\n\t}\n\n\t// TODO: Deprecate in favour of ve.deactivationComplete\n\tmw.hook( 've.deactivate' ).fire();\n\tthis.emit( 'restorePage' );\n\n\t// Push article url into history\n\tif ( !this.actFromPopState ) {\n\t\t// Remove the VisualEditor query parameters\n\t\tconst url = this.currentUrl;\n\t\tif ( url.searchParams.has( 'veaction' ) ) {\n\t\t\turl.searchParams.delete( 'veaction' );\n\t\t}\n\t\tif ( this.section !== null ) {\n\t\t\t// Translate into a hash for the new URL:\n\t\t\t// This should be after replacePageContent if this is post-save, so we can just look\n\t\t\t// at the headers on the page.\n\t\t\tconst hash = this.getSectionHashFromPage();\n\t\t\tif ( hash ) {\n\t\t\t\turl.hash = hash;\n\t\t\t\tthis.viewUrl.hash = hash;\n\t\t\t\tconst target = document.getElementById( hash.slice( 1 ) );\n\n\t\t\t\tif ( target ) {\n\t\t\t\t\t// Scroll the page to the edited section\n\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\ttarget.scrollIntoView( true );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t\turl.searchParams.delete( 'section' );\n\t\t}\n\t\tif ( url.searchParams.has( 'action' ) && $( '#wpTextbox1:not(.ve-dummyTextbox)' ).length === 0 ) {\n\t\t\t// If we're not overlaid on an edit page, remove action=edit\n\t\t\turl.searchParams.delete( 'action' );\n\t\t\tmw.config.set( 'wgAction', 'view' );\n\t\t}\n\t\tif ( url.searchParams.has( 'oldid' ) && !this.restoring ) {\n\t\t\t// We have an oldid in the query string but it's the most recent one, so remove it\n\t\t\turl.searchParams.delete( 'oldid' );\n\t\t}\n\n\t\t// Remove parameters which are only intended for the editor, not for read mode\n\t\turl.searchParams.delete( 'editintro' );\n\t\turl.searchParams.delete( 'preload' );\n\t\turl.searchParams.delete( 'preloadparams[]' );\n\t\turl.searchParams.delete( 'preloadtitle' );\n\t\turl.searchParams.delete( 'summary' );\n\n\t\t// If there are any other query parameters left, re-use that URL object.\n\t\t// Otherwise use the canonical style view URL (T44553, T102363).\n\t\tconst keys = [];\n\t\turl.searchParams.forEach( ( val, key ) => {\n\t\t\tkeys.push( key );\n\t\t} );\n\t\tif ( !keys.length || ( keys.length === 1 && keys[ 0 ] === 'title' ) ) {\n\t\t\thistory.pushState( this.popState, '', this.viewUrl );\n\t\t} else {\n\t\t\thistory.pushState( this.popState, '', url );\n\t\t}\n\t}\n};\n\n/**\n * @param {Event} e Native event object\n */\nve.init.mw.DesktopArticleTarget.prototype.onWindowPopState = function ( e ) {\n\tif ( !this.verifyPopState( e.state ) ) {\n\t\t// Ignore popstate events fired for states not created by us\n\t\t// This also filters out the initial fire in Chrome (T59901).\n\t\treturn;\n\t}\n\n\tconst oldUrl = this.currentUrl;\n\n\tthis.currentUrl = new URL( location.href );\n\tlet veaction = this.currentUrl.searchParams.get( 'veaction' );\n\tconst action = this.currentUrl.searchParams.get( 'action' );\n\n\tif ( !veaction && action === 'edit' ) {\n\t\tveaction = this.getDefaultMode() === 'source' ? 'editsource' : 'edit';\n\t}\n\n\tif ( this.isModeAvailable( 'source' ) && this.active ) {\n\t\tif ( veaction === 'editsource' && this.getDefaultMode() === 'visual' ) {\n\t\t\tthis.actFromPopState = true;\n\t\t\tthis.switchToWikitextEditor();\n\t\t} else if ( veaction === 'edit' && this.getDefaultMode() === 'source' ) {\n\t\t\tthis.actFromPopState = true;\n\t\t\tthis.switchToVisualEditor();\n\t\t}\n\t}\n\tif ( !this.active && ( veaction === 'edit' || veaction === 'editsource' ) ) {\n\t\tthis.actFromPopState = true;\n\t\tthis.emit( 'reactivate' );\n\t}\n\tif ( this.active && veaction !== 'edit' && veaction !== 'editsource' ) {\n\t\tthis.actFromPopState = true;\n\t\t// \"Undo\" the pop-state, as the event is not cancellable\n\t\thistory.pushState( this.popState, '', oldUrl );\n\t\tthis.currentUrl = oldUrl;\n\t\tthis.tryTeardown( false, 'navigate-back' ).then( () => {\n\t\t\t// Teardown was successful, re-apply the undone state\n\t\t\thistory.back();\n\t\t} ).always( () => {\n\t\t\tthis.actFromPopState = false;\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.replacePageContent = function (\n\thtml, categoriesHtml, displayTitle, lastModified /* , contentSub, sections */\n) {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.replacePageContent.apply( this, arguments );\n\n\tif ( lastModified ) {\n\t\t// If we were not viewing the most recent revision before (a requirement\n\t\t// for lastmod to have been added by MediaWiki), we will be now.\n\t\tif ( !$( '#footer-info-lastmod' ).length ) {\n\t\t\t$( '#footer-info' ).prepend(\n\t\t\t\t$( '<li>' ).attr( 'id', 'footer-info-lastmod' )\n\t\t\t);\n\t\t}\n\n\t\t// Intentionally treated as HTML (message is parsed)\n\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t$( '#footer-info-lastmod' ).html( ' ' + lastModified.message );\n\t}\n\n\tthis.$originalCategories = null;\n\n\t// Re-set any edit section handlers now that the page content has been replaced\n\tmw.libs.ve.setupEditLinks();\n};\n\n/**\n * Add onunload and onbeforeunload handlers.\n */\nve.init.mw.DesktopArticleTarget.prototype.setupUnloadHandlers = function () {\n\tif ( window.onbeforeunload !== this.onBeforeUnload ) {\n\t\t// Remember any already set beforeunload handler\n\t\tthis.onBeforeUnloadFallback = window.onbeforeunload;\n\t\t// Attach our handlers\n\t\twindow.onbeforeunload = this.onBeforeUnload;\n\t\twindow.addEventListener( 'unload', this.onUnloadHandler );\n\t}\n};\n/**\n * Remove onunload and onbeforunload handlers.\n */\nve.init.mw.DesktopArticleTarget.prototype.teardownUnloadHandlers = function () {\n\t// Restore whatever previous onbeforeunload hook existed\n\twindow.onbeforeunload = this.onBeforeUnloadFallback;\n\tthis.onBeforeUnloadFallback = null;\n\twindow.removeEventListener( 'unload', this.onUnloadHandler );\n};\n\n/**\n * Show the beta dialog as needed\n */\nve.init.mw.DesktopArticleTarget.prototype.maybeShowWelcomeDialog = function () {\n\tconst editorMode = this.getDefaultMode(),\n\t\twindowManager = this.getSurface().dialogs;\n\n\tthis.welcomeDialogPromise = ve.createDeferred();\n\n\tif ( mw.libs.ve.shouldShowWelcomeDialog() ) {\n\t\tthis.welcomeDialog = new mw.libs.ve.WelcomeDialog();\n\t\twindowManager.addWindows( [ this.welcomeDialog ] );\n\t\twindowManager.openWindow(\n\t\t\tthis.welcomeDialog,\n\t\t\t{\n\t\t\t\tswitchable: editorMode === 'source' ? this.isModeAvailable( 'visual' ) : true,\n\t\t\t\teditor: editorMode\n\t\t\t}\n\t\t)\n\t\t\t.closed.then( ( data ) => {\n\t\t\t\tthis.welcomeDialogPromise.resolve();\n\t\t\t\tthis.welcomeDialog = null;\n\t\t\t\tif ( data && data.action === 'switch-wte' ) {\n\t\t\t\t\tthis.switchToWikitextEditor( false );\n\t\t\t\t} else if ( data && data.action === 'switch-ve' ) {\n\t\t\t\t\tthis.switchToVisualEditor();\n\t\t\t\t}\n\t\t\t} );\n\t\tmw.libs.ve.stopShowingWelcomeDialog();\n\t} else {\n\t\tthis.welcomeDialogPromise.reject();\n\t}\n};\n\n/**\n * Show the meta dialog as needed on load.\n */\nve.init.mw.DesktopArticleTarget.prototype.maybeShowMetaDialog = function () {\n\tif ( this.welcomeDialogPromise ) {\n\t\t// Pop out the notices when the welcome dialog is closed\n\t\tthis.welcomeDialogPromise\n\t\t\t.always( () => {\n\t\t\t\tif (\n\t\t\t\t\tthis.switched &&\n\t\t\t\t\t!mw.user.options.get( 'visualeditor-hidevisualswitchpopup' )\n\t\t\t\t) {\n\t\t\t\t\t// Show \"switched\" popup\n\t\t\t\t\tconst popup = new mw.libs.ve.SwitchPopupWidget( 'visual' );\n\t\t\t\t\tthis.toolbar.tools.editModeSource.toolGroup.$element.append( popup.$element );\n\t\t\t\t\tpopup.toggle( true );\n\t\t\t\t} else if ( this.toolbar.tools.notices ) {\n\t\t\t\t\t// Show notices\n\t\t\t\t\tthis.toolbar.tools.notices.getPopup().toggle( true );\n\t\t\t\t}\n\t\t\t} );\n\t}\n\n\tconst redirectMetaItems = this.getSurface().getModel().getDocument().getMetaList().getItemsInGroup( 'mwRedirect' );\n\tif ( redirectMetaItems.length ) {\n\t\tconst windowAction = ve.ui.actionFactory.create( 'window', this.getSurface() );\n\t\twindowAction.open( 'meta', { page: 'settings' } );\n\t}\n};\n\n/**\n * Handle before unload event.\n *\n * @return {string|undefined} Message\n */\nve.init.mw.DesktopArticleTarget.prototype.onBeforeUnload = function () {\n\t// Check if someone already set on onbeforeunload hook\n\tif ( this.onBeforeUnloadFallback ) {\n\t\t// Get the result of their onbeforeunload hook\n\t\tconst fallbackResult = this.onBeforeUnloadFallback();\n\t\t// If it returned something, exit here and return their message\n\t\tif ( fallbackResult !== undefined ) {\n\t\t\treturn fallbackResult;\n\t\t}\n\t}\n\t// Check if there's been an edit\n\tif (\n\t\tthis.getSurface() &&\n\t\t$.contains( document, this.getSurface().$element.get( 0 ) ) &&\n\t\tthis.edited &&\n\t\t!this.submitting &&\n\t\tmw.user.options.get( 'useeditwarning' )\n\t) {\n\t\t// Return our message\n\t\treturn ve.msg( 'mw-widgets-abandonedit' );\n\t}\n};\n\n/**\n * Handle unload event.\n */\nve.init.mw.DesktopArticleTarget.prototype.onUnload = function () {\n\tif ( !this.submitting ) {\n\t\tve.track( 'editAttemptStep', {\n\t\t\taction: 'abort',\n\t\t\ttype: this.edited ? 'unknown-edited' : 'unknown',\n\t\t\tmechanism: 'navigate',\n\t\t\tmode: this.surface ? this.surface.getMode() : this.getDefaultMode()\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.switchToVisualEditor = function () {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.switchToVisualEditor.apply( this, arguments );\n\n\tif ( this.isModeAvailable( 'visual' ) ) {\n\t\tve.track( 'activity.editor-switch', { action: 'visual-desktop' } );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.switchToWikitextEditor = function () {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.switchToWikitextEditor.apply( this, arguments );\n\n\tif ( this.isModeAvailable( 'source' ) ) {\n\t\tve.track( 'activity.editor-switch', { action: 'source-nwe-desktop' } );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.switchToWikitextSection = function () {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.switchToWikitextSection.apply( this, arguments );\n\n\tve.track( 'activity.editor-switch', { action: 'source-nwe-desktop' } );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.switchToFallbackWikitextEditor = function ( modified ) {\n\tconst oldId = mw.config.get( 'wgRevisionId' ) || $( 'input[name=parentRevId]' ).val();\n\tconst prefPromise = mw.libs.ve.setEditorPreference( 'wikitext' );\n\n\tif ( !modified ) {\n\t\tve.track( 'activity.editor-switch', { action: 'source-desktop' } );\n\t\tve.track( 'editAttemptStep', {\n\t\t\taction: 'abort',\n\t\t\ttype: 'switchnochange',\n\t\t\tmechanism: 'navigate',\n\t\t\tmode: 'visual'\n\t\t} );\n\t\tthis.submitting = true;\n\t\treturn prefPromise.then( () => {\n\t\t\tconst url = new URL( this.viewUrl );\n\t\t\turl.searchParams.set( 'action', 'edit' );\n\t\t\t// No changes, safe to stay in section mode\n\t\t\tif ( this.section !== null ) {\n\t\t\t\turl.searchParams.set( 'section', this.section );\n\t\t\t} else {\n\t\t\t\turl.searchParams.delete( 'section' );\n\t\t\t}\n\t\t\turl.searchParams.set( 'veswitched', '1' );\n\t\t\tif ( oldId && oldId !== mw.config.get( 'wgCurRevisionId' ) ) {\n\t\t\t\turl.searchParams.set( 'oldid', oldId );\n\t\t\t}\n\t\t\tif ( mw.libs.ve.isWelcomeDialogSuppressed() ) {\n\t\t\t\turl.searchParams.set( 'vehidebetadialog', '1' );\n\t\t\t}\n\t\t\tlocation.href = url.toString();\n\t\t} );\n\t} else {\n\t\treturn this.serialize( this.getDocToSave() ).then( ( data ) => {\n\t\t\tve.track( 'activity.editor-switch', { action: 'source-desktop' } );\n\t\t\tve.track( 'editAttemptStep', {\n\t\t\t\taction: 'abort',\n\t\t\t\ttype: 'switchwith',\n\t\t\t\tmechanism: 'navigate',\n\t\t\t\tmode: 'visual'\n\t\t\t} );\n\t\t\tthis.submitWithSaveFields( { wpDiff: true, wpAutoSummary: '' }, data.content );\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.reloadSurface = function ( newMode ) {\n\tthis.activating = true;\n\tthis.activatingDeferred = ve.createDeferred();\n\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.reloadSurface.apply( this, arguments );\n\n\tthis.activatingDeferred.then( () => {\n\t\tif ( newMode === 'source' ) {\n\t\t\tmw.hook( 've.wikitextInteractive' ).fire();\n\t\t}\n\n\t\tthis.updateHistoryState();\n\t\tthis.afterActivate();\n\t\tthis.setupTriggerListeners();\n\t} );\n\tthis.toolbarSetupDeferred.resolve();\n};\n\n/* Registration */\n\nve.init.mw.targetFactory.register( ve.init.mw.DesktopArticleTarget );\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":"implicit-arrow-linebreak","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-mw/init/targets/ve.init.mw.MobileArticleTarget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":37,"column":26,"nodeType":"CallExpression","endLine":37,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":440,"column":3,"nodeType":"CallExpression","endLine":440,"endColumn":28,"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":"implicit-arrow-linebreak","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-mw/init/targets/ve.init.mw.Target.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":526,"column":1,"nodeType":"Block","endLine":526,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":564,"column":1,"nodeType":"Block","endLine":564,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":606,"column":1,"nodeType":"Block","endLine":606,"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":347,"column":89,"nodeType":"ObjectExpression","endLine":353,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization Target class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Initialization MediaWiki target.\n *\n * @class\n * @extends ve.init.Target\n *\n * @constructor\n * @param {Object} config\n * @param {string[]} [config.surfaceClasses=[]] Surface classes to apply\n */\nve.init.mw.Target = function VeInitMwTarget( config ) {\n\tthis.surfaceClasses = config.surfaceClasses || [];\n\n\t// Parent constructor\n\tve.init.mw.Target.super.call( this, config );\n\n\tthis.active = false;\n\tthis.pageName = mw.config.get( 'wgRelevantPageName' );\n\tthis.recovered = false;\n\tthis.fromEditedState = false;\n\tthis.originalHtml = null;\n\n\t// Initialization\n\tthis.$element.addClass( 've-init-mw-target' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.init.mw.Target, ve.init.Target );\n\n/* Events */\n\n/**\n * Fired when the target has been torn down\n *\n * @event ve.init.mw.Target#teardown\n */\n\n/* Static Properties */\n\n/**\n * Symbolic name for this target class.\n *\n * @static\n * @property {string}\n * @inheritable\n */\nve.init.mw.Target.static.name = null;\n\nve.init.mw.Target.static.toolbarGroups = [\n\t{\n\t\tname: 'history',\n\t\tinclude: [ { group: 'history' } ]\n\t},\n\t{\n\t\tname: 'format',\n\t\ttype: 'menu',\n\t\ttitle: OO.ui.deferMsg( 'visualeditor-toolbar-format-tooltip' ),\n\t\tinclude: [ { group: 'format' } ],\n\t\tpromote: [ 'paragraph' ],\n\t\tdemote: [ 'preformatted', 'blockquote', 'heading1' ]\n\t},\n\t{\n\t\tname: 'style',\n\t\ttype: 'list',\n\t\ticon: 'textStyle',\n\t\ttitle: OO.ui.deferMsg( 'visualeditor-toolbar-style-tooltip' ),\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-toolbar-style-tooltip' ),\n\t\tinvisibleLabel: true,\n\t\tinclude: [ { group: 'textStyle' } ],\n\t\tforceExpand: [ 'bold', 'italic', 'clear' ],\n\t\tpromote: [ 'bold', 'italic', 'superscript', 'subscript' ],\n\t\tdemote: [ 'clear' ]\n\t},\n\t{\n\t\tname: 'link',\n\t\tinclude: [ 'link' ]\n\t},\n\t{\n\t\tname: 'structure',\n\t\ttype: 'list',\n\t\ticon: 'listBullet',\n\t\ttitle: OO.ui.deferMsg( 'visualeditor-toolbar-structure' ),\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-toolbar-structure' ),\n\t\tinvisibleLabel: true,\n\t\tinclude: [ { group: 'structure' } ],\n\t\tdemote: [ 'outdent', 'indent' ]\n\t},\n\t{\n\t\tname: 'insert',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-toolbar-insert' ),\n\t\ttitle: OO.ui.deferMsg( 'visualeditor-toolbar-insert' ),\n\t\tnarrowConfig: {\n\t\t\tinvisibleLabel: true,\n\t\t\ticon: 'add'\n\t\t},\n\t\tinclude: '*',\n\t\tforceExpand: [ 'media', 'transclusion', 'insertTable' ],\n\t\tpromote: [ 'media', 'transclusion', 'insertTable' ]\n\t},\n\t{\n\t\tname: 'specialCharacter',\n\t\tinclude: [ 'specialCharacter' ]\n\t}\n];\n\nve.init.mw.Target.static.importRules = ve.copy( ve.init.mw.Target.static.importRules );\n\nve.init.mw.Target.static.importRules.external.removeOriginalDomElements = true;\n\nve.init.mw.Target.static.importRules.external.blacklist = ve.extendObject( {\n\t// Annotations\n\t'textStyle/underline': true,\n\t'meta/language': true,\n\t'textStyle/datetime': true,\n\t'link/mwExternal': !mw.config.get( 'wgVisualEditorConfig' ).allowExternalLinkPaste,\n\t// Node\n\tarticle: true,\n\tsection: true\n}, ve.init.mw.Target.static.importRules.external.blacklist );\n\nve.init.mw.Target.static.importRules.external.htmlBlacklist.remove = ve.extendObject( {\n\t// TODO: Create a plugin system for extending the blacklist, so this code\n\t// can be moved to the Cite extension.\n\t// Remove reference numbers copied from MW read mode (T150418)\n\t'sup.reference:not( [typeof] )': true,\n\t// ...sometimes we need a looser match if the HTML has been mangled\n\t// in a third-party editor e.g. LibreOffice (T232461)\n\t'a[ href *= \"#cite_note\" ]': true\n}, ve.init.mw.Target.static.importRules.external.htmlBlacklist.remove );\n\n// This is required to prevent an invalid insertion (as mwHeading can only be at the root) (T339155)\n// TODO: This should be handled by the DM based on ve.dm.MWHeadingNode.static.suggestedParentNodeTypes,\n// rather than just throwing an exception.\n// This would also not prevent pasting from a VE standalone editor as that is considered\n// an internal paste.\nve.init.mw.Target.static.importRules.external.htmlBlacklist.unwrap = ve.extendObject( {\n\t'li h1, li h2, li h3, li h4, li h5, li h6': true,\n\t'blockquote h1, blockquote h2, blockquote h3, blockquote h4, blockquote h5, blockquote h6': true\n}, ve.init.mw.Target.static.importRules.external.htmlBlacklist.unwrap );\n\n/**\n * Type of integration. Used for event tracking.\n *\n * @static\n * @property {string}\n * @inheritable\n */\nve.init.mw.Target.static.integrationType = null;\n\n/**\n * Type of platform. Used for event tracking.\n *\n * @static\n * @property {string}\n * @inheritable\n */\nve.init.mw.Target.static.platformType = null;\n\n/* Static Methods */\n\n/**\n * Fix the base URL from Parsoid if necessary.\n *\n * Absolutizes the base URL if it's relative, and sets a base URL based on wgArticlePath\n * if there was no base URL at all.\n *\n * @param {HTMLDocument} doc Parsoid document\n */\nve.init.mw.Target.static.fixBase = function ( doc ) {\n\tve.fixBase( doc, document, ve.resolveUrl(\n\t\t// Don't replace $1 with the page name, because that'll break if\n\t\t// the page name contains a slash\n\t\tmw.config.get( 'wgArticlePath' ).replace( '$1', '' ),\n\t\tdocument\n\t) );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Target.static.createModelFromDom = function ( doc, mode, options ) {\n\tconst conf = mw.config.get( 'wgVisualEditor' );\n\n\toptions = ve.extendObject( {\n\t\tlang: conf.pageLanguageCode,\n\t\tdir: conf.pageLanguageDir\n\t}, options );\n\n\t// Parent method\n\treturn ve.init.mw.Target.super.static.createModelFromDom.call( this, doc, mode, options );\n};\n\n// Deprecated alias\nve.init.mw.Target.prototype.createModelFromDom = function () {\n\treturn this.constructor.static.createModelFromDom.apply( this.constructor.static, arguments );\n};\n\n/**\n * @inheritdoc\n * @param {string} documentString\n * @param {string} mode\n * @param {string|null} [section] Section. Use null to unwrap all sections.\n * @param {boolean} [onlySection=false] Only return the requested section, otherwise returns the\n *  whole document with just the requested section still wrapped (visual mode only).\n * @return {HTMLDocument|string} HTML document, or document string (source mode)\n */\nve.init.mw.Target.static.parseDocument = function ( documentString, mode, section, onlySection ) {\n\tlet doc;\n\tif ( mode === 'source' ) {\n\t\t// Parent method\n\t\tdoc = ve.init.mw.Target.super.static.parseDocument.call( this, documentString, mode );\n\t} else {\n\t\tdoc = ve.createDocumentFromHtml( documentString );\n\t\tif ( section !== undefined ) {\n\t\t\tif ( onlySection ) {\n\t\t\t\tconst sectionNode = doc.body.querySelector( '[data-mw-section-id=\"' + section + '\"]' );\n\t\t\t\tdoc.body.innerHTML = '';\n\t\t\t\tif ( sectionNode ) {\n\t\t\t\t\tdoc.body.appendChild( sectionNode );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Strip Parsoid sections\n\t\t\t\tmw.libs.ve.unwrapParsoidSections( doc.body, section );\n\t\t\t}\n\t\t}\n\t\t// Strip legacy IDs, for example in section headings\n\t\tmw.libs.ve.stripParsoidFallbackIds( doc.body );\n\t\t// Re-duplicate deduplicated TemplateStyles, for correct rendering when editing a section or\n\t\t// when templates are removed during the edit\n\t\tmw.libs.ve.reduplicateStyles( doc.body );\n\t\t// Fix relative or missing base URL if needed\n\t\tthis.fixBase( doc );\n\t\t// Test: Remove tags injected by plugins during parse (T298147)\n\t\tArray.prototype.forEach.call( doc.querySelectorAll( 'script' ), ( element ) => {\n\t\t\tfunction truncate( text, l ) {\n\t\t\t\treturn text.length > l ? text.slice( 0, l ) + '…' : text;\n\t\t\t}\n\t\t\tconst errorMessage = 'DOM content matching deny list found during parse:\\n' + truncate( element.outerHTML, 100 ) +\n\t\t\t\t'\\nContext:\\n' + truncate( element.parentNode.outerHTML, 200 );\n\t\t\tmw.log.error( errorMessage );\n\t\t\tconst err = new Error( errorMessage );\n\t\t\terr.name = 'VeDomDenyListWarning';\n\t\t\tmw.errorLogger.logError( err, 'error.visualeditor' );\n\t\t\telement.parentNode.removeChild( element );\n\t\t} );\n\t}\n\n\treturn doc;\n};\n\n/* Methods */\n\n/**\n * Handle both DOM and modules being loaded and ready.\n *\n * @param {HTMLDocument|string} doc HTML document or source text\n */\nve.init.mw.Target.prototype.documentReady = function ( doc ) {\n\tthis.setupSurface( doc );\n};\n\n/**\n * Once surface is ready, initialize the UI\n *\n * @fires ve.init.Target#surfaceReady\n */\nve.init.mw.Target.prototype.surfaceReady = function () {\n\tthis.emit( 'surfaceReady' );\n};\n\n/**\n * @deprecated Moved to mw.libs.ve.targetSaver.getHtml\n * @param {HTMLDocument} newDoc\n * @param {HTMLDocument} [oldDoc]\n * @return {string}\n */\nve.init.mw.Target.prototype.getHtml = function ( newDoc, oldDoc ) {\n\tOO.ui.warnDeprecation( 've.init.mw.Target#getHtml is deprecated. Use mw.libs.ve.targetSaver.getHtml.' );\n\treturn mw.libs.ve.targetSaver.getHtml( newDoc, oldDoc );\n};\n\n/**\n * Track an event\n *\n * @param {string} name Event name\n */\nve.init.mw.Target.prototype.track = function () {};\n\n/**\n * Get a list of CSS classes to be added to surfaces, and target widget surfaces\n *\n * @return {string[]} CSS classes\n */\nve.init.mw.Target.prototype.getSurfaceClasses = function () {\n\treturn this.surfaceClasses;\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Target.prototype.createTargetWidget = function ( config ) {\n\treturn new ve.ui.MWTargetWidget( ve.extendObject( {\n\t\t// Reset to visual mode for target widgets\n\t\tmodes: [ 'visual' ],\n\t\tdefaultMode: 'visual',\n\t\ttoolbarGroups: this.toolbarGroups.filter( ( group ) => !group.excludeFromTargetWidget &&\n\t\t\t// Deprecated: Don't rely on alignment to exclude from target widgets, use\n\t\t\t// excludeFromTargetWidget instead.\n\t\t\tgroup.align !== 'after' ),\n\t\tsurfaceClasses: this.getSurfaceClasses()\n\t}, config ) );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Target.prototype.createSurface = function ( dmDoc, config = {} ) {\n\tif ( config && config.mode === 'source' ) {\n\t\tconst importRules = ve.copy( this.constructor.static.importRules );\n\t\timportRules.all = importRules.all || {};\n\t\t// Preserve empty linebreaks on paste in source editor\n\t\timportRules.all.keepEmptyContentBranches = true;\n\t\tconfig = this.getSurfaceConfig( ve.extendObject( {}, config, {\n\t\t\timportRules: importRules\n\t\t} ) );\n\t\treturn new ve.ui.MWWikitextSurface( this, dmDoc, config );\n\t}\n\n\treturn new ve.ui.MWSurface( this, dmDoc, this.getSurfaceConfig( config ) );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Target.prototype.getSurfaceConfig = function ( config ) {\n\t// If we're not asking for a specific mode's config, use the default mode.\n\tconfig = ve.extendObject( { mode: this.defaultMode }, config );\n\t// eslint-disable-next-line mediawiki/class-doc\n\treturn ve.init.mw.Target.super.prototype.getSurfaceConfig.call( this, ve.extendObject( {\n\t\t// Provide the wikitext versions of the registries, if we're using source mode\n\t\tcommandRegistry: config.mode === 'source' ? ve.ui.wikitextCommandRegistry : ve.ui.commandRegistry,\n\t\tsequenceRegistry: config.mode === 'source' ? ve.ui.wikitextSequenceRegistry : ve.ui.sequenceRegistry,\n\t\tdataTransferHandlerFactory: config.mode === 'source' ? ve.ui.wikitextDataTransferHandlerFactory : ve.ui.dataTransferHandlerFactory,\n\t\tclasses: this.getSurfaceClasses()\n\t}, config ) );\n};\n\n/**\n * Switch to editing mode.\n *\n * @param {HTMLDocument|string} doc HTML document or source text\n */\nve.init.mw.Target.prototype.setupSurface = function ( doc ) {\n\tsetTimeout( () => {\n\t\t// Build model\n\t\tthis.track( 'trace.convertModelFromDom.enter' );\n\t\tconst dmDoc = this.constructor.static.createModelFromDom( doc, this.getDefaultMode() );\n\t\tthis.track( 'trace.convertModelFromDom.exit' );\n\n\t\t// Build DM tree now (otherwise it gets lazily built when building the CE tree)\n\t\tthis.track( 'trace.buildModelTree.enter' );\n\t\tdmDoc.buildNodeTree();\n\t\tthis.track( 'trace.buildModelTree.exit' );\n\n\t\tsetTimeout( () => {\n\t\t\tthis.addSurface( dmDoc );\n\t\t} );\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Target.prototype.addSurface = function () {\n\t// Clear dummy surfaces\n\t// TODO: Move to DesktopArticleTarget\n\tthis.clearSurfaces();\n\n\t// Create ui.Surface (also creates ce.Surface and dm.Surface and builds CE tree)\n\tthis.track( 'trace.createSurface.enter' );\n\t// Parent method\n\tconst surface = ve.init.mw.Target.super.prototype.addSurface.apply( this, arguments );\n\t// Add classes specific to surfaces attached directly to the target,\n\t// as opposed to TargetWidget surfaces\n\tif ( !surface.inTargetWidget ) {\n\t\tsurface.$element.addClass( 've-init-mw-target-surface' );\n\t}\n\tthis.track( 'trace.createSurface.exit' );\n\n\tthis.setSurface( surface );\n\n\tsetTimeout( () => {\n\t\t// Initialize surface\n\t\tthis.track( 'trace.initializeSurface.enter' );\n\n\t\tthis.active = true;\n\t\t// Now that the surface is attached to the document and ready,\n\t\t// let it initialize itself\n\t\tsurface.initialize();\n\n\t\tthis.track( 'trace.initializeSurface.exit' );\n\t\tthis.surfaceReady();\n\t} );\n\n\treturn surface;\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Target.prototype.setSurface = function ( surface ) {\n\tif ( !surface.$element.parent().length ) {\n\t\tthis.$element.append( surface.$element );\n\t}\n\n\t// Parent method\n\tve.init.mw.Target.super.prototype.setSurface.apply( this, arguments );\n};\n\n/**\n * Intialise autosave, recovering changes if applicable\n *\n * @param {Object} [config] Configuration options\n * @param {boolean} [config.suppressNotification=false] Don't notify the user if changes are recovered\n * @param {string} [config.docId] Document ID for storage grouping\n * @param {ve.init.SafeStorage} [config.storage] Storage interface\n * @param {number} [config.storageExpiry] Storage expiry time in seconds (optional)\n */\nve.init.mw.Target.prototype.initAutosave = function ( config = {} ) {\n\tconst surfaceModel = this.getSurface().getModel();\n\n\tif ( config.docId ) {\n\t\tsurfaceModel.setAutosaveDocId( config.docId );\n\t}\n\n\tif ( config.storage ) {\n\t\tsurfaceModel.setStorage( config.storage, config.storageExpiry );\n\t}\n\n\tif ( this.recovered ) {\n\t\t// Restore auto-saved transactions if document state was recovered\n\t\ttry {\n\t\t\tsurfaceModel.restoreChanges();\n\t\t\tif ( !config.suppressNotification ) {\n\t\t\t\tve.init.platform.notify(\n\t\t\t\t\tve.msg( 'visualeditor-autosave-recovered-text' ),\n\t\t\t\t\tve.msg( 'visualeditor-autosave-recovered-title' )\n\t\t\t\t);\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tmw.log.warn( e );\n\t\t\tve.init.platform.notify(\n\t\t\t\tve.msg( 'visualeditor-autosave-not-recovered-text' ),\n\t\t\t\tve.msg( 'visualeditor-autosave-not-recovered-title' ),\n\t\t\t\t{ type: 'error' }\n\t\t\t);\n\t\t}\n\t} else {\n\t\t// ...otherwise store this document state for later recovery\n\t\tif ( this.fromEditedState ) {\n\t\t\t// Store immediately if the document was previously edited\n\t\t\t// (e.g. in a different mode)\n\t\t\tthis.storeDocState( this.originalHtml );\n\t\t} else {\n\t\t\t// Only store after the first change if this is an unmodified document\n\t\t\tsurfaceModel.once( 'undoStackChange', () => {\n\t\t\t\t// Check the surface hasn't been destroyed\n\t\t\t\tif ( this.getSurface() ) {\n\t\t\t\t\tthis.storeDocState( this.originalHtml );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\t// Start auto-saving transactions\n\tsurfaceModel.startStoringChanges();\n\t// TODO: Listen to autosaveFailed event to notify user\n};\n\n/**\n * Store a snapshot of the current document state.\n *\n * @param {string} [html] Document HTML, will generate from current state if not provided\n */\nve.init.mw.Target.prototype.storeDocState = function ( html ) {\n\tconst mode = this.getSurface().getMode();\n\tthis.getSurface().getModel().storeDocState( { mode: mode }, html );\n};\n\n/**\n * Clear any stored document state\n */\nve.init.mw.Target.prototype.clearDocState = function () {\n\tif ( this.getSurface() ) {\n\t\tthis.getSurface().getModel().removeDocStateAndChanges();\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Target.prototype.teardown = function () {\n\t// If target is closed cleanly (after save or deliberate close) then remove autosave state\n\tthis.clearDocState();\n\n\t// Parent method\n\treturn ve.init.mw.Target.super.prototype.teardown.call( this ).then( () => {\n\t\tthis.emit( 'teardown' );\n\t} );\n};\n\n/**\n * Refresh our knowledge about the logged-in user.\n *\n * This should be called in response to a user assertion error, to look up\n * the new user name, and update the current user variables in mw.config.\n *\n * @param {ve.dm.Document} [doc] Document to associate with the API request\n * @return {jQuery.Promise} Promise resolved with new username, or null if anonymous\n */\nve.init.mw.Target.prototype.refreshUser = function ( doc ) {\n\treturn this.getContentApi( doc ).get( {\n\t\taction: 'query',\n\t\tmeta: 'userinfo'\n\t} ).then( ( data ) => {\n\t\tconst userInfo = data.query && data.query.userinfo;\n\n\t\tif ( userInfo.anon !== undefined ) {\n\t\t\t// New session is an anonymous user\n\t\t\tmw.config.set( {\n\t\t\t\t// wgUserId is unset for anonymous users, not set to null\n\t\t\t\twgUserId: undefined,\n\t\t\t\t// wgUserName is explicitly set to null for anonymous users,\n\t\t\t\t// functions like mw.user.isAnon rely on this.\n\t\t\t\twgUserName: null\n\t\t\t} );\n\n\t\t\t// Call this only after clearing wgUserId, otherwise it does nothing\n\t\t\treturn mw.user.acquireTempUserName();\n\t\t} else {\n\t\t\t// New session is a logged in user (or a temporary user)\n\t\t\tmw.config.set( {\n\t\t\t\twgUserId: userInfo.id,\n\t\t\t\twgUserName: userInfo.name\n\t\t\t} );\n\n\t\t\treturn mw.user.getName();\n\t\t}\n\t} );\n};\n\n/**\n * Get a wikitext fragment from a document\n *\n * @param {ve.dm.Document} doc\n * @param {boolean} [useRevision=true] Whether to use the revision ID + ETag\n * @return {jQuery.Promise} Abortable promise which resolves with a wikitext string\n */\nve.init.mw.Target.prototype.getWikitextFragment = function ( doc, useRevision ) {\n\t// Shortcut for empty document\n\tif ( !doc.data.hasContent() ) {\n\t\treturn ve.createDeferred().resolve( '' );\n\t}\n\n\tconst params = {\n\t\taction: 'visualeditoredit',\n\t\tpaction: 'serialize',\n\t\thtml: mw.libs.ve.targetSaver.getHtml(\n\t\t\tve.dm.converter.getDomFromModel( doc )\n\t\t),\n\t\tpage: this.getPageName()\n\t};\n\n\tif ( useRevision === undefined || useRevision ) {\n\t\tparams.oldid = this.revid;\n\t\tparams.etag = this.etag;\n\t}\n\n\tconst xhr = this.getContentApi( doc ).postWithToken( 'csrf',\n\t\tparams,\n\t\t{ contentType: 'multipart/form-data' }\n\t);\n\n\treturn xhr.then( ( response ) => {\n\t\tif ( response.visualeditoredit ) {\n\t\t\treturn response.visualeditoredit.content;\n\t\t}\n\t\treturn ve.createDeferred().reject();\n\t} ).promise( { abort: xhr.abort } );\n};\n\n/**\n * Parse a fragment of wikitext into HTML\n *\n * @param {string} wikitext\n * @param {boolean} pst Perform pre-save transform\n * @param {ve.dm.Document} [doc] Parse for a specific document, defaults to current surface's\n * @param {Object} [ajaxOptions]\n * @return {jQuery.Promise} Abortable promise\n */\nve.init.mw.Target.prototype.parseWikitextFragment = function ( wikitext, pst, doc, ajaxOptions = {} ) {\n\tconst api = this.getContentApi( doc );\n\tconst abortable = api.makeAbortablePromise( ajaxOptions );\n\n\t// Acquire a temporary user username before previewing or diffing, so that signatures and\n\t// user-related magic words display the temp user instead of IP user in the preview. (T331397)\n\tlet tempUserNamePromise;\n\tif ( pst ) {\n\t\ttempUserNamePromise = mw.user.acquireTempUserName();\n\t} else {\n\t\ttempUserNamePromise = ve.createDeferred().resolve( null );\n\t}\n\n\treturn tempUserNamePromise\n\t\t.then( () => api.post( {\n\t\t\taction: 'visualeditor',\n\t\t\tpaction: 'parsefragment',\n\t\t\tpage: this.getPageName( doc ),\n\t\t\twikitext: wikitext,\n\t\t\tpst: pst\n\t\t}, ajaxOptions ) )\n\t\t.promise( abortable );\n};\n\n/**\n * Get the page name associated with a specific document\n *\n * @param {ve.dm.Document} [doc] Document, defaults to current surface's\n * @return {string} Page name\n */\nve.init.mw.Target.prototype.getPageName = function () {\n\treturn this.pageName;\n};\n\n/**\n * Get an API object associated with the wiki where the document\n * content is hosted.\n *\n * This would be overridden if editing content on another wiki.\n *\n * @param {ve.dm.Document} [doc] API for a specific document, should default to document of current surface.\n * @param {Object} [options] API options\n * @param {Object} [options.parameters] Default query parameters for all API requests. Defaults\n *  include action=query, format=json, and formatversion=2 if not specified otherwise.\n * @return {mw.Api}\n */\nve.init.mw.Target.prototype.getContentApi = function ( doc, options = {} ) {\n\toptions.parameters = ve.extendObject( { formatversion: 2 }, options.parameters );\n\treturn new mw.Api( options );\n};\n\n/**\n * Get an API object associated with the local wiki.\n *\n * For example you would always use getLocalApi for actions\n * associated with the current user.\n *\n * @param {Object} [options] API options\n * @return {mw.Api}\n */\nve.init.mw.Target.prototype.getLocalApi = function ( options = {} ) {\n\toptions.parameters = ve.extendObject( { formatversion: 2 }, options.parameters );\n\treturn new mw.Api( options );\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":"implicit-arrow-linebreak","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-mw/init/ve.init.mw.ArticleTargetEvents.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'revision_id' is not in camel case.","line":124,"column":3,"nodeType":"Identifier","messageId":"notCamelCase","endLine":124,"endColumn":14,"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":"implicit-arrow-linebreak","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-mw/init/ve.init.mw.Platform.init.js","messages":[],"suppressedMessages":[{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":9,"column":1,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":9,"endColumn":27,"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":"implicit-arrow-linebreak","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-mw/init/ve.init.mw.Platform.js","messages":[{"ruleId":"es-x/no-iterator-prototype-toarray","severity":2,"message":"ES2025 'Iterator.prototype.toArray' method is forbidden.","line":109,"column":9,"nodeType":"MemberExpression","messageId":"forbidden","endLine":109,"endColumn":54}],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":109,"column":9,"nodeType":"CallExpression","endLine":109,"endColumn":35,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":213,"column":9,"nodeType":"CallExpression","endLine":213,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-each-util","severity":2,"message":"Prefer Array#forEach to $.each","line":280,"column":3,"nodeType":"CallExpression","endLine":325,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-each-util","severity":2,"message":"Prefer Array#forEach to $.each","line":283,"column":4,"nodeType":"CallExpression","endLine":297,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization Platform class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Initialization MediaWiki platform.\n *\n * @class\n * @extends ve.init.Platform\n *\n * @constructor\n */\nve.init.mw.Platform = function VeInitMwPlatform() {\n\t// Parent constructor\n\tve.init.mw.Platform.super.call( this );\n\n\t// Properties\n\tthis.externalLinkUrlProtocolsRegExp = new RegExp(\n\t\t'^(' + mw.config.get( 'wgUrlProtocols' ) + ')',\n\t\t'i'\n\t);\n\tthis.unanchoredExternalLinkUrlProtocolsRegExp = new RegExp(\n\t\t'(' + mw.config.get( 'wgUrlProtocols' ) + ')',\n\t\t'i'\n\t);\n\tthis.parsedMessages = {};\n\tthis.linkCache = new ve.init.mw.LinkCache();\n\tthis.imageInfoCache = new ve.init.mw.ImageInfoCache();\n\tthis.galleryImageInfoCache = new ve.init.mw.GalleryImageInfoCache();\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.init.mw.Platform, ve.init.Platform );\n\n/* Methods */\n\n/** @inheritdoc */\nve.init.mw.Platform.prototype.getExternalLinkUrlProtocolsRegExp = function () {\n\treturn this.externalLinkUrlProtocolsRegExp;\n};\n\n/** @inheritdoc */\nve.init.mw.Platform.prototype.getUnanchoredExternalLinkUrlProtocolsRegExp = function () {\n\treturn this.unanchoredExternalLinkUrlProtocolsRegExp;\n};\n\n/** @inheritdoc */\nve.init.mw.Platform.prototype.notify = function ( message, title, options ) {\n\treturn mw.notify( message, ve.extendObject( { title: title }, options ) );\n};\n\n/**\n * Regular expression matching RESTBase IDs\n *\n * This isn't perfect, see T147607\n *\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getMetadataIdRegExp = function () {\n\treturn mw.libs.ve.restbaseIdRegExp;\n};\n\n/** @inheritdoc */\nve.init.mw.Platform.prototype.addMessages = function ( messages ) {\n\treturn mw.messages.set( messages );\n};\n\n/**\n * @method\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getMessage = mw.msg.bind( mw );\n\n/**\n * @method\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getUserName = function () {\n\treturn mw.user.getName();\n};\n\n/**\n * @method\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.parseNumber = function ( value ) {\n\tconst number = $.tablesorter.getParser( 'number' ).format( value );\n\t// formatDigit returns -Infinity when parsing fails, change this to NaN\n\treturn number !== -Infinity ? number : NaN;\n};\n\n/**\n * @method\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.formatNumber = function ( number ) {\n\treturn mw.language.convertNumber( number );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getHtmlMessage = function ( key, ...args ) {\n\t// eslint-disable-next-line mediawiki/msg-doc\n\treturn mw.message( key, ...args ).parseDom().toArray();\n};\n\n/**\n * @method\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getConfig = mw.config.get.bind( mw.config );\n\n/**\n * All values are JSON-parsed. To get raw values, use mw.user.options.get directly.\n *\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getUserConfig = function ( keys ) {\n\tif ( Array.isArray( keys ) ) {\n\t\tconst values = mw.user.options.get( keys );\n\t\tconst parsedValues = {};\n\t\tObject.keys( values ).forEach( ( value ) => {\n\t\t\ttry {\n\t\t\t\tparsedValues[ value ] = JSON.parse( values[ value ] );\n\t\t\t} catch ( e ) {\n\t\t\t\t// We might encounter corrupted values in the store\n\t\t\t\tparsedValues[ value ] = null;\n\t\t\t}\n\t\t} );\n\t\treturn parsedValues;\n\t} else {\n\t\ttry {\n\t\t\treturn JSON.parse( mw.user.options.get( keys ) );\n\t\t} catch ( e ) {\n\t\t\t// We might encounter corrupted values in the store\n\t\t\treturn null;\n\t\t}\n\t}\n};\n\n/**\n * Options must be registered in onGetPreferences\n *\n * All values are JSON encoded. To set raw values, use mw.user.options.set directly.\n *\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.setUserConfig = function ( keyOrValueMap, value ) {\n\t// T214963: Don't try to set user preferences for logged-out users, it doesn't work\n\tif ( !mw.user.isNamed() ) {\n\t\treturn false;\n\t}\n\n\tif ( typeof keyOrValueMap === 'object' ) {\n\t\tif ( OO.compare( keyOrValueMap, this.getUserConfig( Object.keys( keyOrValueMap ) ) ) ) {\n\t\t\treturn false;\n\t\t}\n\t\t// JSON encode all the values for API storage\n\t\tconst jsonValues = {};\n\t\tObject.keys( keyOrValueMap ).forEach( ( key ) => {\n\t\t\tjsonValues[ key ] = JSON.stringify( keyOrValueMap[ key ] );\n\t\t} );\n\t\tve.init.target.getLocalApi().saveOptions( jsonValues );\n\t\treturn mw.user.options.set( jsonValues );\n\t} else {\n\t\tif ( value === this.getUserConfig( keyOrValueMap ) ) {\n\t\t\treturn false;\n\t\t}\n\t\t// JSON encode the value for API storage\n\t\tconst jsonValue = JSON.stringify( value );\n\t\tve.init.target.getLocalApi().saveOption( keyOrValueMap, jsonValue );\n\t\treturn mw.user.options.set( keyOrValueMap, jsonValue );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.canUseUserConfig = mw.user.isNamed;\n\nve.init.mw.Platform.prototype.createLocalStorage = function () {\n\treturn this.createConflictableStorage( mw.storage );\n};\n\nve.init.mw.Platform.prototype.createSessionStorage = function () {\n\treturn this.createConflictableStorage( mw.storage.session );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.addParsedMessages = function ( messages ) {\n\tfor ( const key in messages ) {\n\t\tthis.parsedMessages[ key ] = messages[ key ];\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getParsedMessage = function ( key ) {\n\tif ( Object.prototype.hasOwnProperty.call( this.parsedMessages, key ) ) {\n\t\t// Prefer parsed results from VisualEditorDataModule if available.\n\t\treturn this.parsedMessages[ key ];\n\t}\n\t// Fallback to regular messages, with mw.message html escaping applied.\n\t// eslint-disable-next-line mediawiki/msg-doc\n\treturn mw.message( key ).escaped();\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getLanguageCodes = function () {\n\treturn Object.keys(\n\t\tmw.language.getData( mw.config.get( 'wgUserLanguage' ), 'languageNames' ) ||\n\t\t$.uls.data.getAutonyms()\n\t);\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getLanguageName = function ( code ) {\n\tconst languageNames = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'languageNames' ) ||\n\t\t$.uls.data.getAutonyms();\n\treturn languageNames[ code ] || code;\n};\n\n/**\n * @method\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getLanguageAutonym = $.uls.data.getAutonym;\n\n/**\n * @method\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getLanguageDirection = $.uls.data.getDir;\n\n/**\n * @method\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.getUserLanguages = mw.language.getFallbackLanguageChain;\n\n/**\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.fetchSpecialCharList = function () {\n\treturn mw.loader.using( 'mediawiki.language.specialCharacters' ).then( () => {\n\t\tconst specialCharacterGroups = require( 'mediawiki.language.specialCharacters' ),\n\t\t\tcharacters = {},\n\t\t\totherGroupName = mw.msg( 'visualeditor-special-characters-group-other' ),\n\t\t\totherMsg = mw.message( 'visualeditor-quick-access-characters.json' ).plain(),\n\t\t\t// TODO: This information should be available upstream in mw.language.specialCharacters\n\t\t\trtlGroups = [ 'arabic', 'arabicextended', 'hebrew' ];\n\n\t\ttry {\n\t\t\tconst other = JSON.parse( otherMsg );\n\t\t\tif ( other ) {\n\t\t\t\tcharacters.other = {\n\t\t\t\t\tlabel: otherGroupName,\n\t\t\t\t\tsymbols: this.processSpecialCharSymbols( other ),\n\t\t\t\t\tattributes: { dir: mw.config.get( 'wgVisualEditorConfig' ).pageLanguageDir }\n\t\t\t\t};\n\t\t\t}\n\t\t} catch ( err ) {\n\t\t\tve.log( 've.init.mw.Platform: Could not parse the Special Character list.' );\n\t\t\tve.log( err );\n\t\t}\n\n\t\t// eslint-disable-next-line no-jquery/no-each-util\n\t\t$.each( specialCharacterGroups, ( groupName, groupCharacters ) => {\n\t\t\tconst groupObject = {}; // button label => character data to insert\n\t\t\t// eslint-disable-next-line no-jquery/no-each-util\n\t\t\t$.each( groupCharacters, ( charKey, charVal ) => {\n\t\t\t\tlet key, val;\n\t\t\t\t// VE has a different format and it would be a pain to change it now\n\t\t\t\tif ( typeof charVal === 'string' ) {\n\t\t\t\t\tkey = charVal;\n\t\t\t\t\tval = charVal;\n\t\t\t\t} else if ( typeof charVal === 'object' && 0 in charVal && 1 in charVal ) {\n\t\t\t\t\tkey = charVal[ 0 ];\n\t\t\t\t\tval = charVal[ 1 ];\n\t\t\t\t} else {\n\t\t\t\t\tkey = charVal.label;\n\t\t\t\t\tval = charVal;\n\t\t\t\t}\n\t\t\t\tgroupObject[ key ] = val;\n\t\t\t} );\n\t\t\t// The following messages are used here:\n\t\t\t// * special-characters-group-arabic\n\t\t\t// * special-characters-group-arabicextended\n\t\t\t// * special-characters-group-bangla\n\t\t\t// * special-characters-group-canadianaboriginal\n\t\t\t// * special-characters-group-cyrillic\n\t\t\t// * special-characters-group-devanagari\n\t\t\t// * special-characters-group-greek\n\t\t\t// * special-characters-group-greekextended\n\t\t\t// * special-characters-group-gujarati\n\t\t\t// * special-characters-group-hebrew\n\t\t\t// * special-characters-group-ipa\n\t\t\t// * special-characters-group-khmer\n\t\t\t// * special-characters-group-lao\n\t\t\t// * special-characters-group-latin\n\t\t\t// * special-characters-group-latinextended\n\t\t\t// * special-characters-group-persian\n\t\t\t// * special-characters-group-sinhala\n\t\t\t// * special-characters-group-symbols\n\t\t\t// * special-characters-group-tamil\n\t\t\t// * special-characters-group-telugu\n\t\t\t// * special-characters-group-thai\n\t\t\tcharacters[ groupName ] = {\n\t\t\t\tlabel: mw.msg( 'special-characters-group-' + groupName ),\n\t\t\t\tsymbols: this.processSpecialCharSymbols( groupObject ),\n\t\t\t\tattributes: { dir: rtlGroups.includes( groupName ) ? 'rtl' : 'ltr' }\n\t\t\t};\n\t\t} );\n\n\t\treturn characters;\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.Platform.prototype.decodeEntities = function ( html ) {\n\tconst character = ve.safeDecodeEntities( html );\n\treturn [\n\t\t{\n\t\t\ttype: 'mwEntity',\n\t\t\tattributes: { character: character }\n\t\t},\n\t\t{\n\t\t\ttype: '/mwEntity'\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":"implicit-arrow-linebreak","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-mw/init/ve.init.mw.SaveErrorHandler.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":"implicit-arrow-linebreak","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-mw/init/ve.init.mw.TargetFactory.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":"implicit-arrow-linebreak","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-mw/init/ve.init.mw.ViewportZoomHandler.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":106,"column":1,"nodeType":"Block","endLine":106,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":119,"column":1,"nodeType":"Block","endLine":119,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":128,"column":1,"nodeType":"Block","endLine":128,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":33,"column":23,"nodeType":"CallExpression","endLine":33,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization ViewportZoomHandler class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Prevent iOS browsers from wrongly zooming in the page when the surface is focussed. (T216446)\n *\n * When the user places a cursor for text input anywhere on the page, iOS browsers zoom in the page\n * to ensure the text size is legible and the cursor can be comfortably placed in the right place\n * with a finger.\n *\n * There's a browser bug that, on some devices (e.g. iPhone XS, but not iPhone SE), causes this\n * zoom to occur even though our text is already using the required minimum font size (16px).\n * Additionally, the zoom occurs when placing the cursor in image captions, which intentionally\n * use a smaller font size.\n *\n * In both cases the zoom is more problematic than helpful, because it causes parts of the toolbar\n * to disappear outside the viewport.\n *\n * To prevent it, temporarily add a tag like `<meta name=\"viewport\" content=\"maximum-scale=1.0\">`\n * to the page when the user is about to focus the editing surface. However, on iOS Chrome, this\n * also prevents intentional pinch-zoom. To avoid this, immediately remove the tag again after\n * focussing, or if it looks like the user is trying to zoom (used multi-touch or caused a scroll).\n *\n * @class\n * @constructor\n */\nve.init.mw.ViewportZoomHandler = function VeInitMwViewportZoomHandler() {\n\t// eslint-disable-next-line no-jquery/no-global-selector\n\tthis.$viewportMeta = $( 'meta[name=\"viewport\"]' );\n\tif ( !this.$viewportMeta.length ) {\n\t\tthis.$viewportMeta = $( '<meta>' ).attr( 'name', 'viewport' ).appendTo( document.head );\n\t}\n\tthis.origViewportMetaContent = this.$viewportMeta.attr( 'content' );\n\n\tthis.onTouchStartHandler = this.onTouchStart.bind( this );\n\tthis.onTouchMoveHandler = this.onTouchMove.bind( this );\n\tthis.onTouchEndHandler = this.onTouchEnd.bind( this );\n};\n\n/* Methods */\n\n/**\n * Change the `<meta name=\"viewport\">` tag to prevent automatic zooming.\n */\nve.init.mw.ViewportZoomHandler.prototype.preventZoom = function () {\n\tthis.$viewportMeta.attr( 'content', ( i, val ) => {\n\t\t// Remove existing maximum-scale, if any, and add 'maximum-scale=1.0'. Don't change other values.\n\t\tif ( val ) {\n\t\t\tval = val.replace( /maximum-scale=[\\d.]+(,\\s*|$)/, '' );\n\t\t\tval += ', ';\n\t\t} else {\n\t\t\tval = '';\n\t\t}\n\t\treturn val + 'maximum-scale=1.0';\n\t} );\n};\n\n/**\n * Change the `<meta name=\"viewport\">` tag to allow automatic zooming once again.\n */\nve.init.mw.ViewportZoomHandler.prototype.allowZoom = function () {\n\tthis.$viewportMeta.attr( 'content', this.origViewportMetaContent );\n};\n\n/**\n * Start listening to events and preventing zooming.\n *\n * @param {ve.ui.Surface} surface\n */\nve.init.mw.ViewportZoomHandler.prototype.attach = function ( surface ) {\n\tthis.surface = surface;\n\n\tthis.surface.getView().$element.on( {\n\t\ttouchstart: this.onTouchStartHandler,\n\t\ttouchmove: this.onTouchMoveHandler,\n\t\ttouchend: this.onTouchEndHandler\n\t} );\n\tthis.surface.getModel().connect( this, {\n\t\tfocus: 'onFocus'\n\t} );\n};\n\n/**\n * Stop listening to events.\n */\nve.init.mw.ViewportZoomHandler.prototype.detach = function () {\n\tthis.surface.getView().$element.off( {\n\t\ttouchstart: this.onTouchStartHandler,\n\t\ttouchmove: this.onTouchMoveHandler,\n\t\ttouchend: this.onTouchEndHandler\n\t} );\n\tthis.surface.getModel().disconnect( this, {\n\t\tfocus: 'onFocus'\n\t} );\n\n\tthis.surface = null;\n};\n\n/**\n * Handle touch start events.\n *\n * @param {jQuery.Event} e Touch start event\n */\nve.init.mw.ViewportZoomHandler.prototype.onTouchStart = function ( e ) {\n\tif ( e.touches.length === 1 ) {\n\t\tthis.wasMoved = false;\n\t}\n\n\tthis.allowZoom();\n};\n\n/**\n * Handle touch move events.\n *\n * @param {jQuery.Event} e Touch move event\n */\nve.init.mw.ViewportZoomHandler.prototype.onTouchMove = function () {\n\tthis.wasMoved = true;\n};\n\n/**\n * Handle touch end events.\n *\n * @param {jQuery.Event} e Touch end event\n */\nve.init.mw.ViewportZoomHandler.prototype.onTouchEnd = function ( e ) {\n\tif ( e.touches.length === 0 && !this.wasMoved ) {\n\t\t// There was a single touch point, that hasn't moved, and now it's gone.\n\t\t// Looks like we're going to focus the surface, so prevent automatic zoom.\n\t\tthis.preventZoom();\n\t} else {\n\t\t// Otherwise, allow zoom, so that the user can pinch-zoom\n\t\tthis.allowZoom();\n\t}\n};\n\n/**\n * Handle surface model focus events.\n */\nve.init.mw.ViewportZoomHandler.prototype.onFocus = function () {\n\tthis.allowZoom();\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":"implicit-arrow-linebreak","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-mw/init/ve.init.mw.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":"implicit-arrow-linebreak","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-mw/preinit/.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":"implicit-arrow-linebreak","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/ve-mw/preinit/ve.init.MWEditModeTool.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":131,"column":7,"nodeType":"CallExpression","endLine":131,"endColumn":35,"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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.MWEditingTabDialog.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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.MWVESwitchPopupWidget.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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.MWWelcomeDialog.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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.mw.ArticleTargetLoader.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":116,"column":1,"nodeType":"Block","endLine":116,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":239,"column":1,"nodeType":"Block","endLine":239,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":319,"column":1,"nodeType":"Block","endLine":319,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":513,"column":1,"nodeType":"Block","endLine":513,"endColumn":1}],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":170,"column":15,"nodeType":"CallExpression","endLine":170,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":398,"column":7,"nodeType":"CallExpression","endLine":398,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki ArticleTargetLoader.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n// TODO: ve.now and ve.track should be moved to mw.libs.ve\n/* global ve */\n\n/**\n * Target loader.\n *\n * Light-weight loader that loads ResourceLoader modules for VisualEditor\n * and HTML and page data from the API. Also handles plugin registration.\n *\n * @class mw.libs.ve.targetLoader\n * @singleton\n * @hideconstructor\n */\n( function () {\n\tmw.libs.ve = mw.libs.ve || {};\n\n\tconst conf = mw.config.get( 'wgVisualEditorConfig' ),\n\t\tpluginCallbacks = [],\n\t\tmodules = [\n\t\t\t'ext.visualEditor.articleTarget',\n\t\t\t// Add modules from $wgVisualEditorPluginModules\n\t\t\t...conf.pluginModules.filter( mw.loader.getState )\n\t\t];\n\n\tconst url = new URL( location.href );\n\n\tmw.libs.ve.initialUrl = url;\n\n\t// Provide the new wikitext editor\n\tif (\n\t\tmw.user.options.get( 'visualeditor-newwikitext' ) ||\n\t\turl.searchParams.get( 'veaction' ) === 'editsource'\n\t) {\n\t\tmodules.push( 'ext.visualEditor.mwwikitext' );\n\t}\n\n\t// Collab\n\tif (\n\t\tmw.user.options.get( 'visualeditor-collab' ) ||\n\t\turl.searchParams.has( 'collabSession' )\n\t) {\n\t\tmodules.push( 'ext.visualEditor.collab' );\n\t}\n\n\t// A/B test enrollment for edit check (T389231)\n\t// Note: this happens here rather than inside editcheck so that the bucket will\n\t// get logged for EditAttemptStep init events\n\tif ( conf.editCheck && conf.editCheckABTest ) {\n\t\tlet inABTest;\n\t\tif ( mw.user.isAnon() ) {\n\t\t\t// can't just use mw.user.sessionId() because we need this to last across sessions\n\t\t\tconst token = mw.cookie.get( 'VEECid', '', mw.user.generateRandomSessionId() );\n\t\t\t// Store the token so our state is consistent across pages\n\t\t\tmw.cookie.set( 'VEECid', token, { path: '/', expires: 90 * 86400, prefix: '' } );\n\t\t\tinABTest = parseInt( token.slice( 0, 8 ), 16 ) % 2 === 1;\n\t\t} else {\n\t\t\tinABTest = mw.user.getId() % 2 === 1;\n\t\t}\n\t\tconf.editCheckABTestGroup = inABTest ? 'test' : 'control';\n\t\t// Communicate the bucket to instrumentation:\n\t\tmw.config.set(\n\t\t\t'wgVisualEditorEditCheckABTestBucket',\n\t\t\t'2025-09-editcheck-' + conf.editCheckABTest + '-' + ( inABTest ? 'test' : 'control' )\n\t\t);\n\t}\n\n\tconst editCheck = conf.editCheck || !!url.searchParams.get( 'ecenable' ) || !!window.MWVE_FORCE_EDIT_CHECK_ENABLED;\n\tif ( conf.editCheckTagging || editCheck ) {\n\t\tmodules.push( 'ext.visualEditor.editCheck' );\n\t}\n\n\tconst namespaces = mw.config.get( 'wgNamespaceIds' );\n\t// Load signature tool if *any* namespace supports it.\n\t// It will be shown disabled on namespaces that don't support it.\n\tif (\n\t\tObject.keys( namespaces ).some( ( name ) => mw.Title.wantSignaturesNamespace( namespaces[ name ] ) )\n\t) {\n\t\tmodules.push( 'ext.visualEditor.mwsignature' );\n\t}\n\n\tmw.libs.ve.targetLoader = {\n\t\t/**\n\t\t * Add a plugin module or callback.\n\t\t *\n\t\t * If a module name is passed, that module will be loaded alongside the other modules.\n\t\t *\n\t\t * If a callback is passed, it will be executed after the modules have loaded. The callback\n\t\t * may optionally return a jQuery.Promise; if it does, loading won't be complete until\n\t\t * that promise is resolved.\n\t\t *\n\t\t * @param {string|Function} plugin Plugin module name or callback\n\t\t */\n\t\taddPlugin: function ( plugin ) {\n\t\t\tif ( typeof plugin === 'string' ) {\n\t\t\t\tmodules.push( plugin );\n\t\t\t} else {\n\t\t\t\tpluginCallbacks.push( plugin );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Load modules needed for VisualEditor, as well as plugins.\n\t\t *\n\t\t * This loads the base VE modules as well as any registered plugin modules.\n\t\t * Once those are loaded, any registered plugin callbacks are executed,\n\t\t * and we wait for all promises returned by those callbacks to resolve.\n\t\t *\n\t\t * @param {string} mode Initial editor mode, for tracking\n\t\t * @return {jQuery.Promise} Promise resolved when the loading process is complete\n\t\t */\n\t\tloadModules: function ( mode ) {\n\t\t\tmw.hook( 've.loadModules' ).fire( this.addPlugin.bind( this ) );\n\t\t\tve.track( 'trace.moduleLoad.enter', { mode: mode } );\n\t\t\treturn mw.loader.using( modules )\n\t\t\t\t.then( () => {\n\t\t\t\t\tve.track( 'trace.moduleLoad.exit', { mode: mode } );\n\t\t\t\t\tpluginCallbacks.push( ve.init.platform.getInitializedPromise.bind( ve.init.platform ) );\n\t\t\t\t\t// Execute plugin callbacks and collect promises\n\t\t\t\t\treturn $.when( ...pluginCallbacks.map( ( callback ) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn callback();\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\tmw.log.warn( 'Failed to load VE plugin:', e );\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) );\n\t\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Creates an OOUI checkbox inside an inline field layout\n\t\t *\n\t\t * @param {Object[]} checkboxesDef Checkbox definitions from the API\n\t\t * @param {Object} [widgetConfig] Additional widget config\n\t\t * @return {Object} Result object with checkboxFields (OO.ui.FieldLayout[]) and\n\t\t *  checkboxesByName (keyed object of OO.ui.CheckboxInputWidget).\n\t\t */\n\t\tcreateCheckboxFields: function ( checkboxesDef, widgetConfig ) {\n\t\t\tconst checkboxFields = [],\n\t\t\t\tcheckboxesByName = {};\n\n\t\t\tif ( checkboxesDef ) {\n\t\t\t\tObject.keys( checkboxesDef ).forEach( ( name ) => {\n\t\t\t\t\tconst options = checkboxesDef[ name ];\n\t\t\t\t\tlet accesskey = null,\n\t\t\t\t\t\ttitle = null;\n\n\t\t\t\t\t// The messages documented below are just the ones defined in core.\n\t\t\t\t\t// Extensions may add other checkboxes.\n\t\t\t\t\tif ( options.tooltip ) {\n\t\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t\t// * accesskey-minoredit\n\t\t\t\t\t\t// * accesskey-watch\n\t\t\t\t\t\taccesskey = mw.message( 'accesskey-' + options.tooltip ).text();\n\t\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t\t// * tooltip-minoredit\n\t\t\t\t\t\t// * tooltip-watch\n\t\t\t\t\t\ttitle = mw.message( 'tooltip-' + options.tooltip ).text();\n\t\t\t\t\t}\n\t\t\t\t\tif ( options[ 'title-message' ] ) {\n\t\t\t\t\t\t// Not used in core\n\t\t\t\t\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\t\t\t\t\ttitle = mw.message( options[ 'title-message' ] ).text();\n\t\t\t\t\t}\n\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t// * minoredit\n\t\t\t\t\t// * watchthis\n\t\t\t\t\tconst $label = mw.message( options[ 'label-message' ] ).parseDom();\n\n\t\t\t\t\tconst config = $.extend( {\n\t\t\t\t\t\taccessKey: accesskey,\n\t\t\t\t\t\t// The following classes are used here:\n\t\t\t\t\t\t// * ve-ui-mwSaveDialog-checkbox-wpMinoredit\n\t\t\t\t\t\t// * ve-ui-mwSaveDialog-checkbox-wpWatchthis\n\t\t\t\t\t\t// * ve-ui-mwSaveDialog-checkbox-wpWatchlistExpiry\n\t\t\t\t\t\tclasses: [ 've-ui-mwSaveDialog-checkbox-' + name ]\n\t\t\t\t\t}, widgetConfig );\n\n\t\t\t\t\tlet checkbox;\n\t\t\t\t\tswitch ( options.class ) {\n\t\t\t\t\t\tcase 'OOUI\\\\DropdownInputWidget':\n\t\t\t\t\t\t\tcheckbox = new OO.ui.DropdownInputWidget( $.extend( config, {\n\t\t\t\t\t\t\t\tvalue: options.default,\n\t\t\t\t\t\t\t\toptions: options.options\n\t\t\t\t\t\t\t} ) );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tcheckbox = new OO.ui.CheckboxInputWidget( $.extend( config, {\n\t\t\t\t\t\t\t\tselected: options.default\n\t\t\t\t\t\t\t} ) );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcheckboxFields.push(\n\t\t\t\t\t\tnew OO.ui.FieldLayout( checkbox, {\n\t\t\t\t\t\t\talign: 'inline',\n\t\t\t\t\t\t\tlabel: $label,\n\t\t\t\t\t\t\ttitle: title,\n\t\t\t\t\t\t\tinvisibleLabel: !!options.invisibleLabel,\n\t\t\t\t\t\t\t// * ve-ui-mwSaveDialog-field-wpMinoredit\n\t\t\t\t\t\t\t// * ve-ui-mwSaveDialog-field-wpWatchthis\n\t\t\t\t\t\t\t// * ve-ui-mwSaveDialog-field-wpWatchlistExpiry\n\t\t\t\t\t\t\tclasses: [ 've-ui-mwSaveDialog-field-' + name ]\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t\tcheckboxesByName[ name ] = checkbox;\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcheckboxFields: checkboxFields,\n\t\t\t\tcheckboxesByName: checkboxesByName\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Request the page data and various metadata from the MediaWiki API (which will use\n\t\t * Parsoid or RESTBase).\n\t\t *\n\t\t * @param {string} mode Target mode: 'visual' or 'source'\n\t\t * @param {string} pageName Page name to request, in prefixed DB key form (underscores instead of spaces)\n\t\t * @param {Object} [options]\n\t\t * @param {boolean} [options.sessionStore] Store result in session storage (by page+mode+section) for auto-save\n\t\t * @param {null|string} [options.section] Section to edit; number, 'T-'-prefixed, null or 'new' (currently just source mode)\n\t\t * @param {number} [options.oldId] Old revision ID. Current if omitted.\n\t\t * @param {string} [options.targetName] Optional target name for tracking\n\t\t * @param {boolean} [options.modified] The page has been modified before loading (e.g. in source mode)\n\t\t * @param {string} [options.wikitext] Wikitext to convert to HTML. The original document is fetched if undefined.\n\t\t * @param {string} [options.editintro] Name of a page to use as edit intro message\n\t\t * @param {string} [options.preload] Name of a page to use as preloaded content if pageName is empty\n\t\t * @param {string[]} [options.preloadparams] Parameters to substitute into preload if it's used\n\t\t * @return {jQuery.Promise} Abortable promise resolved with a JSON object\n\t\t */\n\t\trequestPageData: function ( mode, pageName, options = {} ) {\n\t\t\tif ( mode === 'visual' && options.section === 'new' ) {\n\t\t\t\tthrow new Error( 'Adding new section is not supported in visual mode' );\n\t\t\t}\n\t\t\tconst apiRequest = mode === 'source' ?\n\t\t\t\tthis.requestWikitext.bind( this, pageName, options ) :\n\t\t\t\tthis.requestParsoidData.bind( this, pageName, options );\n\n\t\t\tif ( options.sessionStore ) {\n\t\t\t\tlet sessionState;\n\t\t\t\ttry {\n\t\t\t\t\t// ve.init.platform.getSessionObject is not available yet\n\t\t\t\t\tsessionState = JSON.parse( mw.storage.session.get( 've-docstate' ) );\n\t\t\t\t} catch ( e ) {}\n\n\t\t\t\tif ( sessionState ) {\n\t\t\t\t\tconst request = sessionState.request || {};\n\t\t\t\t\t// Check true section editing is in use\n\t\t\t\t\tconst enableVisualSectionEditing = conf.enableVisualSectionEditing;\n\t\t\t\t\tconst section = request.mode === 'source' || enableVisualSectionEditing === true || enableVisualSectionEditing === options.targetName ?\n\t\t\t\t\t\toptions.section : null;\n\t\t\t\t\t// Check the requested page, mode and section match the stored one\n\t\t\t\t\tif (\n\t\t\t\t\t\trequest.pageName === pageName &&\n\t\t\t\t\t\trequest.mode === mode &&\n\t\t\t\t\t\trequest.section === section\n\t\t\t\t\t\t// NB we don't cache by oldid so that cached results can be recovered\n\t\t\t\t\t\t// even if the page has been since edited\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst dataPromise = $.Deferred().resolve( {\n\t\t\t\t\t\t\tvisualeditor: $.extend(\n\t\t\t\t\t\t\t\t{ content: mw.storage.session.get( 've-dochtml' ) },\n\t\t\t\t\t\t\t\tsessionState.response,\n\t\t\t\t\t\t\t\t{ recovered: true }\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} ).promise();\n\t\t\t\t\t\t// If the document hasn't been edited since the user first loaded it, recover\n\t\t\t\t\t\t// their changes automatically.\n\t\t\t\t\t\tif ( sessionState.response.oldid === mw.config.get( 'wgCurRevisionId' ) ) {\n\t\t\t\t\t\t\treturn dataPromise;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Otherwise, prompt them if they want to recover, or reload the document\n\t\t\t\t\t\t\t// to see the latest version\n\t\t\t\t\t\t\t// This prompt will throw off all of our timing data, so just disable tracking\n\t\t\t\t\t\t\t// for this session\n\t\t\t\t\t\t\tve.track = function () {};\n\t\t\t\t\t\t\treturn mw.loader.using( 'oojs-ui-windows' ).then( () => OO.ui.confirm( mw.msg( 'visualeditor-autosave-modified-prompt-message' ), {\n\t\t\t\t\t\t\t\ttitle: mw.msg( 'visualeditor-autosave-modified-prompt-title' ),\n\t\t\t\t\t\t\t\tactions: [\n\t\t\t\t\t\t\t\t\t{ action: 'accept', label: mw.msg( 'visualeditor-autosave-modified-prompt-accept' ), flags: [ 'primary', 'progressive' ] },\n\t\t\t\t\t\t\t\t\t{ action: 'reject', label: mw.msg( 'visualeditor-autosave-modified-prompt-reject' ), flags: 'destructive' }\n\t\t\t\t\t\t\t\t] }\n\t\t\t\t\t\t\t).then( ( confirmed ) => {\n\t\t\t\t\t\t\t\tif ( confirmed ) {\n\t\t\t\t\t\t\t\t\treturn dataPromise;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// If they requested the latest version, invalidate the autosave state\n\t\t\t\t\t\t\t\t\tmw.storage.session.remove( 've-docstate' );\n\t\t\t\t\t\t\t\t\treturn apiRequest();\n\t\t\t\t\t\t\t\t}\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\n\t\t\treturn apiRequest();\n\t\t},\n\n\t\t/**\n\t\t * Request the page HTML and various metadata from the MediaWiki API (which will use\n\t\t * Parsoid or RESTBase).\n\t\t *\n\t\t * @param {string} pageName See #requestPageData\n\t\t * @param {Object} [options] See #requestPageData\n\t\t * @param {boolean} [noRestbase=false] Don't query RESTBase directly\n\t\t * @param {boolean} [noMetadata=false] Don't fetch document metadata when querying RESTBase. Metadata\n\t\t *  is not required for some use cases, e.g. diffing.\n\t\t * @return {jQuery.Promise} Abortable promise resolved with a JSON object\n\t\t */\n\t\trequestParsoidData: function ( pageName, options = {}, noRestbase = false, noMetadata = false ) {\n\t\t\tconst section = options.section !== undefined ? options.section : null,\n\t\t\t\tuseRestbase = !noRestbase && ( conf.fullRestbaseUrl || conf.restbaseUrl ) && section === null;\n\n\t\t\tconst data = {\n\t\t\t\taction: 'visualeditor',\n\t\t\t\tpaction: useRestbase ? 'metadata' : 'parse',\n\t\t\t\tpage: pageName,\n\t\t\t\tbadetag: options.badetag,\n\t\t\t\tuselang: mw.config.get( 'wgUserLanguage' ),\n\t\t\t\teditintro: options.editintro,\n\t\t\t\tpreload: options.preload,\n\t\t\t\tpreloadparams: options.preloadparams,\n\t\t\t\tformatversion: 2\n\t\t\t};\n\n\t\t\t// Only request the API to explicitly load the currently visible revision if we're restoring\n\t\t\t// from oldid. Otherwise we should load the latest version. This prevents us from editing an\n\t\t\t// old version if an edit was made while the user was viewing the page and/or the user is\n\t\t\t// seeing (slightly) stale cache.\n\t\t\tif ( options.oldId !== undefined ) {\n\t\t\t\tdata.oldid = options.oldId;\n\t\t\t}\n\t\t\t// Load DOM\n\t\t\tconst start = ve.now();\n\t\t\tve.track( 'trace.apiLoad.enter', { mode: 'visual' } );\n\n\t\t\tlet apiXhr, apiPromise;\n\t\t\tlet switched = false,\n\t\t\t\tfromEditedState = false;\n\t\t\tif ( !useRestbase && options.wikitext !== undefined ) {\n\t\t\t\t// Non-RESTBase custom wikitext parse\n\t\t\t\tdata.paction = 'parse';\n\t\t\t\tdata.stash = true;\n\t\t\t\tswitched = true;\n\t\t\t\tfromEditedState = options.modified;\n\t\t\t\tdata.wikitext = options.wikitext;\n\t\t\t\tdata.section = options.section;\n\t\t\t\tdata.oldid = options.oldId;\n\t\t\t\tapiXhr = new mw.Api().post( data );\n\t\t\t} else {\n\t\t\t\tif ( useRestbase && noMetadata ) {\n\t\t\t\t\tapiPromise = $.Deferred().resolve( { visualeditor: {} } ).promise();\n\t\t\t\t} else {\n\t\t\t\t\tapiXhr = new mw.Api().get( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !apiPromise ) {\n\t\t\t\tapiPromise = apiXhr.then( ( response ) => {\n\t\t\t\t\tve.track( 'trace.apiLoad.exit', { mode: 'visual' } );\n\t\t\t\t\tmw.track( 'timing.ve.' + options.targetName + '.performance.system.apiLoad',\n\t\t\t\t\t\tve.now() - start );\n\t\t\t\t\tif ( response.visualeditor ) {\n\t\t\t\t\t\tresponse.visualeditor.switched = switched;\n\t\t\t\t\t\tresponse.visualeditor.fromEditedState = fromEditedState;\n\t\t\t\t\t}\n\t\t\t\t\treturn response;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tlet dataPromise, abort;\n\t\t\tif ( useRestbase ) {\n\t\t\t\tve.track( 'trace.restbaseLoad.enter', { mode: 'visual' } );\n\n\t\t\t\tconst headers = {\n\t\t\t\t\t// Should be synchronised with DirectParsoidClient.php\n\t\t\t\t\tAccept: 'text/html; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/HTML/2.8.0\"',\n\t\t\t\t\t'Accept-Language': mw.config.get( 'wgVisualEditor' ).pageLanguageCode,\n\t\t\t\t\t'Api-User-Agent': 'VisualEditor-MediaWiki/' + mw.config.get( 'wgVersion' )\n\t\t\t\t};\n\n\t\t\t\tlet restbaseXhr, pageHtmlUrl;\n\t\t\t\t// Convert specified Wikitext to HTML\n\t\t\t\tif (\n\t\t\t\t\t// wikitext can be an empty string\n\t\t\t\t\toptions.wikitext !== undefined &&\n\t\t\t\t\t// eslint-disable-next-line no-jquery/no-global-selector\n\t\t\t\t\t!$( '[name=wpSection]' ).val()\n\t\t\t\t) {\n\t\t\t\t\tif ( conf.fullRestbaseUrl ) {\n\t\t\t\t\t\tpageHtmlUrl = conf.fullRestbaseUrl + 'v1/transform/wikitext/to/html/';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpageHtmlUrl = conf.restbaseUrl.replace( 'v1/page/html/', 'v1/transform/wikitext/to/html/' );\n\t\t\t\t\t}\n\t\t\t\t\tswitched = true;\n\t\t\t\t\tfromEditedState = options.modified;\n\t\t\t\t\twindow.onbeforeunload = null;\n\t\t\t\t\t$( window ).off( 'beforeunload' );\n\t\t\t\t\trestbaseXhr = $.ajax( {\n\t\t\t\t\t\turl: pageHtmlUrl + encodeURIComponent( pageName ) +\n\t\t\t\t\t\t\t( data.oldid === undefined ? '' : '/' + data.oldid ),\n\t\t\t\t\t\ttype: 'POST',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\ttitle: pageName,\n\t\t\t\t\t\t\twikitext: options.wikitext,\n\t\t\t\t\t\t\tstash: 'true'\n\t\t\t\t\t\t},\n\t\t\t\t\t\theaders: headers,\n\t\t\t\t\t\tdataType: 'text'\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\t// Fetch revision\n\t\t\t\t\tif ( conf.fullRestbaseUrl ) {\n\t\t\t\t\t\tpageHtmlUrl = conf.fullRestbaseUrl + 'v1/page/html/';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpageHtmlUrl = conf.restbaseUrl;\n\t\t\t\t\t}\n\t\t\t\t\trestbaseXhr = $.ajax( {\n\t\t\t\t\t\turl: pageHtmlUrl + encodeURIComponent( pageName ) +\n\t\t\t\t\t\t\t( data.oldid === undefined ? '' : '/' + data.oldid ) +\n\t\t\t\t\t\t\t'?redirect=false&stash=true',\n\t\t\t\t\t\ttype: 'GET',\n\t\t\t\t\t\theaders: headers,\n\t\t\t\t\t\tdataType: 'text'\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tconst restbasePromise = restbaseXhr.then(\n\t\t\t\t\t( response, status, jqxhr ) => {\n\t\t\t\t\t\tve.track( 'trace.restbaseLoad.exit', { mode: 'visual' } );\n\t\t\t\t\t\tmw.track( 'timing.ve.' + options.targetName + '.performance.system.restbaseLoad',\n\t\t\t\t\t\t\tve.now() - start );\n\t\t\t\t\t\treturn [ response, jqxhr.getResponseHeader( 'etag' ) ];\n\t\t\t\t\t},\n\t\t\t\t\t( xhr, code, _ ) => {\n\t\t\t\t\t\tif ( xhr.status === 404 ) {\n\t\t\t\t\t\t\t// Page does not exist, so let the user start with a blank document.\n\t\t\t\t\t\t\treturn $.Deferred().resolve( [ '', undefined ] ).promise();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmw.log.warn( 'RESTBase load failed: ' + xhr.statusText );\n\t\t\t\t\t\t\treturn $.Deferred().reject( code, xhr, _ ).promise();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tdataPromise = $.when( apiPromise, restbasePromise )\n\t\t\t\t\t.then( ( apiData, restbaseData ) => {\n\t\t\t\t\t\tif ( apiData.visualeditor ) {\n\t\t\t\t\t\t\tif ( restbaseData[ 0 ] || !apiData.visualeditor.content ) {\n\t\t\t\t\t\t\t\t// If we have actual content loaded, use it.\n\t\t\t\t\t\t\t\t// Otherwise, allow fallback content if present.\n\t\t\t\t\t\t\t\t// If no fallback content, this will give us an empty string for\n\t\t\t\t\t\t\t\t// content, which is desirable.\n\t\t\t\t\t\t\t\tapiData.visualeditor.content = restbaseData[ 0 ];\n\t\t\t\t\t\t\t\tapiData.visualeditor.etag = restbaseData[ 1 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tapiData.visualeditor.switched = switched;\n\t\t\t\t\t\t\tapiData.visualeditor.fromEditedState = fromEditedState;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn apiData;\n\t\t\t\t\t} );\n\t\t\t\tabort = function () {\n\t\t\t\t\tif ( apiXhr ) {\n\t\t\t\t\t\tapiXhr.abort();\n\t\t\t\t\t}\n\t\t\t\t\trestbaseXhr.abort();\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tdataPromise = apiPromise;\n\t\t\t\tif ( apiXhr ) {\n\t\t\t\t\tabort = apiXhr.abort;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn dataPromise.then( ( resp ) => {\n\t\t\t\t// Adapted from RESTBase mwUtil.parseETag()\n\t\t\t\tconst etagRegexp = /^(?:W\\/)?\"?([^\"/]+)(?:\\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}))(?:\\/([^\"]+))?\"?$/;\n\n\t\t\t\t// `etag` is expected to be undefined when creating a new page.\n\t\t\t\t// We can detect that case by `content` being empty, and not retry.\n\t\t\t\tif ( useRestbase && resp.visualeditor.content && (\n\t\t\t\t\t!resp.visualeditor.etag ||\n\t\t\t\t\t!etagRegexp.test( resp.visualeditor.etag )\n\t\t\t\t) ) {\n\t\t\t\t\t// Direct request to RESTBase returned a mangled or missing etag.\n\t\t\t\t\t// Retry via the MediaWiki API.\n\t\t\t\t\treturn mw.libs.ve.targetLoader.requestParsoidData(\n\t\t\t\t\t\tpageName,\n\t\t\t\t\t\t$.extend( {}, options, { badetag: resp.visualeditor.etag || '' } ),\n\t\t\t\t\t\ttrue\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tresp.veMode = 'visual';\n\t\t\t\treturn resp;\n\t\t\t} ).promise( { abort: abort } );\n\t\t},\n\n\t\t/**\n\t\t * Request the page wikitext and various metadata from the MediaWiki API.\n\t\t *\n\t\t * @param {string} pageName See #requestPageData\n\t\t * @param {Object} [options] See #requestPageData\n\t\t * @return {jQuery.Promise} Abortable promise resolved with a JSON object\n\t\t */\n\t\trequestWikitext: function ( pageName, options = {} ) {\n\t\t\tconst data = {\n\t\t\t\taction: 'visualeditor',\n\t\t\t\tpaction: 'wikitext',\n\t\t\t\tpage: pageName,\n\t\t\t\tuselang: mw.config.get( 'wgUserLanguage' ),\n\t\t\t\teditintro: options.editintro,\n\t\t\t\tpreload: options.preload,\n\t\t\t\tpreloadparams: options.preloadparams,\n\t\t\t\tformatversion: 2\n\t\t\t};\n\n\t\t\t// section should never really be undefined, but check just in case\n\t\t\tif ( options.section !== null && options.section !== undefined ) {\n\t\t\t\tdata.section = options.section;\n\t\t\t}\n\n\t\t\tif ( options.oldId !== undefined ) {\n\t\t\t\tdata.oldid = options.oldId;\n\t\t\t}\n\n\t\t\tconst dataPromise = new mw.Api().get( data );\n\t\t\treturn dataPromise.then( ( resp ) => {\n\t\t\t\tresp.veMode = 'source';\n\t\t\t\treturn resp;\n\t\t\t} ).promise( { abort: dataPromise.abort } );\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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.mw.ArticleTargetSaver.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":33,"column":1,"nodeType":"Block","endLine":33,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":119,"column":1,"nodeType":"Block","endLine":119,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":133,"column":1,"nodeType":"Block","endLine":133,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":156,"column":1,"nodeType":"Block","endLine":156,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":172,"column":1,"nodeType":"Block","endLine":172,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":215,"column":1,"nodeType":"Block","endLine":215,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-undef","severity":2,"message":"'ve' is not defined.","line":111,"column":31,"nodeType":"Identifier","messageId":"undef","endLine":111,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki ArticleTargetSaver.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Target saver.\n *\n * Light-weight saver.\n *\n * @class mw.libs.ve.targetSaver\n * @singleton\n * @hideconstructor\n */\n( function () {\n\tmw.libs.ve = mw.libs.ve || {};\n\n\tmw.libs.ve.targetSaver = {\n\t\t/**\n\t\t * Preload the library required for deflating so the user doesn't\n\t\t * have to wait when postHtml is called.\n\t\t */\n\t\tpreloadDeflate: function () {\n\t\t\tmw.loader.load( 'mediawiki.deflate' );\n\t\t},\n\n\t\t/**\n\t\t * Compress a string with deflate.\n\t\t *\n\t\t * @param {string} html HTML to deflate\n\t\t * @return {jQuery.Promise} Promise resolved with deflated HTML\n\t\t */\n\t\tdeflate: function ( html ) {\n\t\t\treturn mw.loader.using( 'mediawiki.deflate' ).then( () => mw.deflateAsync( html ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Get HTML to send to Parsoid.\n\t\t *\n\t\t * If the document was generated from scratch (e.g. inside VisualEditor's converter), the\n\t\t * source document can be passed in to transplant the head tag, as well as the attributes\n\t\t * on the html and body tags.\n\t\t *\n\t\t * @param {HTMLDocument} newDoc Document generated by ve.dm.Converter. Will be modified.\n\t\t * @param {HTMLDocument} [oldDoc] Old document to copy attributes from.\n\t\t * @return {string} Full HTML document\n\t\t */\n\t\tgetHtml: function ( newDoc, oldDoc ) {\n\t\t\tfunction copyAttributes( from, to ) {\n\t\t\t\tArray.prototype.forEach.call( from.attributes, ( attr ) => {\n\t\t\t\t\tto.setAttribute( attr.name, attr.value );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( oldDoc ) {\n\t\t\t\t// Copy the head from the old document\n\t\t\t\tfor ( let i = 0, len = oldDoc.head.childNodes.length; i < len; i++ ) {\n\t\t\t\t\tnewDoc.head.appendChild( oldDoc.head.childNodes[ i ].cloneNode( true ) );\n\t\t\t\t}\n\t\t\t\t// Copy attributes from the old document for the html, head and body\n\t\t\t\tcopyAttributes( oldDoc.documentElement, newDoc.documentElement );\n\t\t\t\tcopyAttributes( oldDoc.head, newDoc.head );\n\t\t\t\tcopyAttributes( oldDoc.body, newDoc.body );\n\t\t\t}\n\n\t\t\t// Filter out junk that may have been added by browser plugins\n\t\t\t$( newDoc )\n\t\t\t\t.find( [\n\t\t\t\t\t'script', // T54884, T65229, T96533, T103430\n\t\t\t\t\t'noscript', // T144891\n\t\t\t\t\t'object', // T65229\n\t\t\t\t\t'style:not( [ data-mw ] ):not( [ data-mw-deduplicate ] )', // T55252, but allow <style data-mw(-deduplicate)/> e.g. TemplateStyles T188143\n\t\t\t\t\t'embed', // T53521, T54791, T65121\n\t\t\t\t\t'a[href^=\"javascript:\"]', // T200971\n\t\t\t\t\t'img[src^=\"data:\"]', // T192392\n\t\t\t\t\t'div[id=\"myEventWatcherDiv\"]', // T53423\n\t\t\t\t\t'div[id=\"sendToInstapaperResults\"]', // T63776\n\t\t\t\t\t'div[id=\"kloutify\"]', // T69006\n\t\t\t\t\t'div[id^=\"mittoHidden\"]', // T70900\n\t\t\t\t\t'div.hon.certificateLink', // HON (T209619)\n\t\t\t\t\t'div.donut-container', // Web of Trust (T189148)\n\t\t\t\t\t'div.shield-container' // Web of Trust (T297862)\n\t\t\t\t].join( ',' ) )\n\t\t\t\t.each( ( j, el ) => {\n\t\t\t\t\tfunction truncate( text, l ) {\n\t\t\t\t\t\treturn text.length > l ? text.slice( 0, l ) + '…' : text;\n\t\t\t\t\t}\n\t\t\t\t\tconst errorMessage = 'DOM content matching deny list found:\\n' + truncate( el.outerHTML, 100 ) +\n\t\t\t\t\t\t'\\nContext:\\n' + truncate( el.parentNode.outerHTML, 200 );\n\t\t\t\t\tmw.log.error( errorMessage );\n\t\t\t\t\tconst err = new Error( errorMessage );\n\t\t\t\t\terr.name = 'VeDomDenyListWarning';\n\t\t\t\t\tmw.errorLogger.logError( err, 'error.visualeditor' );\n\t\t\t\t\t$( el ).remove();\n\t\t\t\t} );\n\n\t\t\t// data-mw-section-id is copied to headings by mw.libs.ve.unwrapParsoidSections\n\t\t\t// Remove these to avoid triggering selser.\n\t\t\t$( newDoc ).find( '[data-mw-section-id]:not( section )' ).removeAttr( 'data-mw-section-id' );\n\n\t\t\t// Deduplicate styles (we re-duplicated them in ve.init.mw.Target.static.parseDocument)\n\t\t\t// to let selser recognize the nodes and avoid dirty diffs.\n\t\t\tmw.libs.ve.deduplicateStyles( newDoc.body );\n\n\t\t\t// Add doctype manually\n\t\t\t// ve.properOuterHtml is loaded separately in ve.utils.parsing.js\n\t\t\t// eslint-disable-next-line no-undef\n\t\t\treturn '<!doctype html>' + ve.properOuterHtml( newDoc.documentElement );\n\t\t},\n\n\t\t/**\n\t\t * Serialize and deflate an HTML document\n\t\t *\n\t\t * @param {HTMLDocument} doc Document generated by ve.dm.Converter. Will be modified.\n\t\t * @param {HTMLDocument} [oldDoc] Old document to copy attributes from.\n\t\t * @return {jQuery.Promise} Promise resolved with deflated HTML\n\t\t */\n\t\tdeflateDoc: function ( doc, oldDoc ) {\n\t\t\treturn this.deflate( this.getHtml( doc, oldDoc ) );\n\t\t},\n\n\t\t/**\n\t\t * Post an HTML document to the API.\n\t\t *\n\t\t * Serializes the document to HTML, deflates it, then passes to #postHtml.\n\t\t *\n\t\t * @param {HTMLDocument} doc Document to save\n\t\t * @param {Object} [extraData] Extra data to send to the API\n\t\t * @param {Object} [options]\n\t\t * @return {jQuery.Promise} Promise which resolves if the post was successful\n\t\t */\n\t\tsaveDoc: function ( doc, extraData, options ) {\n\t\t\treturn this.deflateDoc( doc ).then( ( html ) => this.postHtml(\n\t\t\t\thtml,\n\t\t\t\tnull,\n\t\t\t\textraData,\n\t\t\t\toptions\n\t\t\t) );\n\t\t},\n\n\t\t/**\n\t\t * Post wikitext to the API.\n\t\t *\n\t\t * By default uses action=visualeditoredit, paction=save.\n\t\t *\n\t\t * @param {string} wikitext Wikitext to post. Deflating is optional but recommended.\n\t\t * @param {Object} [extraData] Extra data to send to the API\n\t\t * @param {Object} [options]\n\t\t * @param {mw.Api} [options.api] Api to use\n\t\t * @param {Function} [options.now] Function returning current time in milliseconds for tracking, e.g. ve.now\n\t\t * @param {Function} [options.track] Tracking function\n\t\t * @param {string} [options.eventName] Event name for tracking\n\t\t * @return {jQuery.Promise} Promise which resolves with API save data, or rejects with error details\n\t\t */\n\t\tpostWikitext: function ( wikitext, extraData, options ) {\n\t\t\treturn this.postContent( $.extend( { wikitext: wikitext }, extraData ), options );\n\t\t},\n\n\t\t/**\n\t\t * Post HTML to the API.\n\t\t *\n\t\t * By default uses action=visualeditoredit, paction=save.\n\t\t *\n\t\t * @param {string} html HTML to post. Deflating is optional but recommended.\n\t\t *  Should be included for retries even if a cache key is provided.\n\t\t * @param {string} [cacheKey] Optional cache key of HTML stashed on server.\n\t\t * @param {Object} [extraData] Extra data to send to the API\n\t\t * @param {Object} [options]\n\t\t * @return {jQuery.Promise} Promise which resolves with API save data, or rejects with error details\n\t\t */\n\t\tpostHtml: function ( html, cacheKey, extraData = {}, options = {} ) {\n\t\t\tlet data;\n\t\t\tif ( cacheKey ) {\n\t\t\t\tdata = $.extend( { cachekey: cacheKey }, extraData );\n\t\t\t} else {\n\t\t\t\tdata = $.extend( { html: html }, extraData );\n\t\t\t}\n\t\t\treturn this.postContent( data, options ).then(\n\t\t\t\tnull,\n\t\t\t\t( code, response ) => {\n\t\t\t\t\t// This cache key is evidently bad, clear it\n\t\t\t\t\tif ( options.onCacheKeyFail ) {\n\t\t\t\t\t\toptions.onCacheKeyFail();\n\t\t\t\t\t}\n\t\t\t\t\tif ( code === 'badcachekey' ) {\n\t\t\t\t\t\t// If the cache key failed, try again without the cache key\n\t\t\t\t\t\treturn this.postHtml(\n\t\t\t\t\t\t\thtml,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\textraData,\n\t\t\t\t\t\t\toptions\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Failed for some other reason - let caller handle it.\n\t\t\t\t\treturn $.Deferred().reject( code, response ).promise();\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Post content to the API, using mw.Api#postWithToken to retry automatically when encountering\n\t\t * a 'badtoken' error.\n\t\t *\n\t\t * By default uses action=visualeditoredit, paction=save.\n\t\t *\n\t\t * @param {string} data Content data\n\t\t * @param {Object} [options]\n\t\t * @param {mw.Api} [options.api] Api to use\n\t\t * @param {Function} [options.now] Function returning current time in milliseconds for tracking, e.g. ve.now\n\t\t * @param {Function} [options.track] Tracking function\n\t\t * @param {string} [options.eventName] Event name for tracking\n\t\t * @return {jQuery.Promise} Promise which resolves with API save data, or rejects with error details\n\t\t */\n\t\tpostContent: function ( data, options = {} ) {\n\t\t\tconst api = options.api || new mw.Api();\n\n\t\t\tlet start;\n\t\t\tif ( options.now ) {\n\t\t\t\tstart = options.now();\n\t\t\t}\n\n\t\t\tdata = $.extend(\n\t\t\t\t{\n\t\t\t\t\taction: 'visualeditoredit',\n\t\t\t\t\tpaction: 'save',\n\t\t\t\t\tuseskin: mw.config.get( 'skin' ),\n\t\t\t\t\t// Same as OO.ui.isMobile()\n\t\t\t\t\tmobileformat: !!mw.config.get( 'wgMFMode' ),\n\t\t\t\t\tformatversion: 2,\n\t\t\t\t\terrorformat: 'html',\n\t\t\t\t\terrorlang: mw.config.get( 'wgUserLanguage' ),\n\t\t\t\t\terrorsuselocal: true\n\t\t\t\t},\n\t\t\t\tdata\n\t\t\t);\n\n\t\t\tconst action = data.action;\n\n\t\t\tconst request = api.postWithToken( 'csrf', data, {\n\t\t\t\tcontentType: 'multipart/form-data',\n\t\t\t\ttrackEditAttemptStepSessionId: true\n\t\t\t} );\n\n\t\t\treturn request.then(\n\t\t\t\t( response, jqxhr ) => {\n\t\t\t\t\tconst responseData = response[ action ];\n\n\t\t\t\t\t// Log data about the request if eventName was set\n\t\t\t\t\tif ( options.track && options.eventName ) {\n\t\t\t\t\t\tconst eventData = {\n\t\t\t\t\t\t\tbytes: require( 'mediawiki.String' ).byteLength( jqxhr.responseText ),\n\t\t\t\t\t\t\tduration: options.now() - start\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst fullEventName = 'performance.system.' + options.eventName +\n\t\t\t\t\t\t\t( responseData.cachekey ? '.withCacheKey' : '.withoutCacheKey' );\n\t\t\t\t\t\toptions.track( fullEventName, eventData );\n\t\t\t\t\t}\n\n\t\t\t\t\tlet error;\n\t\t\t\t\tif ( !responseData ) {\n\t\t\t\t\t\terror = {\n\t\t\t\t\t\t\tcode: 'invalidresponse',\n\t\t\t\t\t\t\thtml: mw.message( 'api-clientside-error-invalidresponse' ).parse()\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if ( responseData.result !== 'success' ) {\n\t\t\t\t\t\t// This should only happen when saving an edit and getting a captcha from ConfirmEdit\n\t\t\t\t\t\t// extension (`data.result === 'error'`). It's a silly special case...\n\t\t\t\t\t\treturn $.Deferred().reject( 'no-error-no-success', response ).promise();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// paction specific errors\n\t\t\t\t\t\tswitch ( responseData.paction ) {\n\t\t\t\t\t\t\tcase 'save':\n\t\t\t\t\t\t\tcase 'serialize':\n\t\t\t\t\t\t\t\tif ( typeof responseData.content !== 'string' ) {\n\t\t\t\t\t\t\t\t\terror = {\n\t\t\t\t\t\t\t\t\t\tcode: 'invalidcontent',\n\t\t\t\t\t\t\t\t\t\thtml: mw.message( 'api-clientside-error-invalidresponse' ).parse()\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'diff':\n\t\t\t\t\t\t\t\tif ( typeof responseData.diff !== 'string' ) {\n\t\t\t\t\t\t\t\t\terror = {\n\t\t\t\t\t\t\t\t\t\tcode: 'invalidcontent',\n\t\t\t\t\t\t\t\t\t\thtml: mw.message( 'api-clientside-error-invalidresponse' ).parse()\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( error ) {\n\t\t\t\t\t\t// Use the same format as API errors\n\t\t\t\t\t\treturn $.Deferred().reject( error.code, { errors: [ error ] } ).promise();\n\t\t\t\t\t}\n\t\t\t\t\treturn responseData;\n\t\t\t\t},\n\t\t\t\t( code, response ) => {\n\t\t\t\t\tconst responseText = OO.getProp( response, 'xhr', 'responseText' );\n\n\t\t\t\t\tif ( responseText && options.track && options.eventName ) {\n\t\t\t\t\t\tconst eventData = {\n\t\t\t\t\t\t\tbytes: require( 'mediawiki.String' ).byteLength( responseText ),\n\t\t\t\t\t\t\tduration: options.now() - start\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet fullEventName;\n\t\t\t\t\t\tif ( code === 'badcachekey' ) {\n\t\t\t\t\t\t\tfullEventName = 'performance.system.' + options.eventName + '.badCacheKey';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfullEventName = 'performance.system.' + options.eventName + '.withoutCacheKey';\n\t\t\t\t\t\t}\n\t\t\t\t\t\toptions.track( fullEventName, eventData );\n\t\t\t\t\t}\n\t\t\t\t\treturn $.Deferred().reject( code, response ).promise();\n\t\t\t\t}\n\t\t\t);\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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":252,"column":1,"nodeType":"Block","endLine":252,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":282,"column":1,"nodeType":"Block","endLine":282,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":411,"column":1,"nodeType":"Block","endLine":411,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":573,"column":1,"nodeType":"Block","endLine":573,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":1077,"column":1,"nodeType":"Block","endLine":1077,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":1180,"column":1,"nodeType":"Block","endLine":1180,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":1367,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":1367,"endColumn":48}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":61,"column":3,"nodeType":"CallExpression","endLine":61,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":89,"column":3,"nodeType":"CallExpression","endLine":89,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":181,"column":3,"nodeType":"CallExpression","endLine":181,"endColumn":72,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":182,"column":3,"nodeType":"CallExpression","endLine":182,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":185,"column":3,"nodeType":"CallExpression","endLine":185,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":231,"column":3,"nodeType":"CallExpression","endLine":231,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":232,"column":3,"nodeType":"CallExpression","endLine":232,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":239,"column":3,"nodeType":"CallExpression","endLine":239,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":243,"column":8,"nodeType":"CallExpression","endLine":243,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":244,"column":52,"nodeType":"CallExpression","endLine":244,"endColumn":69,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":398,"column":15,"nodeType":"CallExpression","endLine":398,"endColumn":38,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":433,"column":9,"nodeType":"CallExpression","endLine":433,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":478,"column":12,"nodeType":"CallExpression","endLine":478,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":479,"column":16,"nodeType":"CallExpression","endLine":479,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":481,"column":13,"nodeType":"CallExpression","endLine":481,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":483,"column":13,"nodeType":"CallExpression","endLine":483,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":487,"column":12,"nodeType":"CallExpression","endLine":487,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":490,"column":11,"nodeType":"CallExpression","endLine":490,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":495,"column":3,"nodeType":"CallExpression","endLine":495,"endColumn":18,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":498,"column":3,"nodeType":"CallExpression","endLine":498,"endColumn":47,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":516,"column":3,"nodeType":"CallExpression","endLine":516,"endColumn":80,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":533,"column":13,"nodeType":"CallExpression","endLine":533,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":601,"column":48,"nodeType":"CallExpression","endLine":601,"endColumn":66,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":628,"column":4,"nodeType":"CallExpression","endLine":628,"endColumn":58,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":856,"column":45,"nodeType":"CallExpression","endLine":856,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"local/no-unsanitized-href","severity":2,"message":"Don't set 'href' without sanitizing; use ve.setAttributeSafe.","line":960,"column":7,"nodeType":"CallExpression","messageId":"noHref","endLine":960,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":983,"column":6,"nodeType":"CallExpression","endLine":983,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":988,"column":6,"nodeType":"CallExpression","endLine":988,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":995,"column":6,"nodeType":"CallExpression","endLine":995,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1022,"column":20,"nodeType":"CallExpression","endLine":1022,"endColumn":35,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1023,"column":22,"nodeType":"CallExpression","endLine":1023,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1036,"column":5,"nodeType":"CallExpression","endLine":1036,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1053,"column":27,"nodeType":"CallExpression","endLine":1053,"endColumn":66,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1154,"column":21,"nodeType":"CallExpression","endLine":1154,"endColumn":39,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1162,"column":24,"nodeType":"CallExpression","endLine":1162,"endColumn":52,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1168,"column":5,"nodeType":"CallExpression","endLine":1168,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1470,"column":3,"nodeType":"CallExpression","endLine":1470,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1472,"column":3,"nodeType":"CallExpression","endLine":1472,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1500,"column":28,"nodeType":"CallExpression","endLine":1500,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1518,"column":26,"nodeType":"CallExpression","endLine":1518,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1523,"column":4,"nodeType":"CallExpression","endLine":1523,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1527,"column":62,"nodeType":"CallExpression","endLine":1527,"endColumn":80,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1528,"column":22,"nodeType":"CallExpression","endLine":1528,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"local/no-unsanitized-href","severity":2,"message":"Don't set 'href' without sanitizing; use ve.setAttributeSafe.","line":1569,"column":61,"nodeType":"Property","messageId":"noHref","endLine":1569,"endColumn":76,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1580,"column":5,"nodeType":"CallExpression","endLine":1580,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1597,"column":9,"nodeType":"CallExpression","endLine":1597,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1632,"column":12,"nodeType":"CallExpression","endLine":1632,"endColumn":27,"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":1632,"column":12,"nodeType":"CallExpression","endLine":1632,"endColumn":68,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1633,"column":8,"nodeType":"CallExpression","endLine":1633,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1671,"column":64,"nodeType":"CallExpression","endLine":1671,"endColumn":82,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki DesktopArticleTarget init.\n *\n * This file must remain as widely compatible as the base compatibility\n * for MediaWiki itself (see mediawiki/core:/resources/startup.js).\n * Avoid use of: SVG, HTML5 DOM, ContentEditable etc.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/* eslint-disable no-jquery/no-global-selector */\n// TODO: ve.now and ve.track should be moved to mw.libs.ve\n/* global ve */\n\n/**\n * Platform preparation for the MediaWiki view page. This loads (when user needs it) the\n * actual MediaWiki integration and VisualEditor library.\n */\n( function () {\n\tconst configData = require( './data.json' ),\n\t\tveactionToMode = {\n\t\t\tedit: 'visual',\n\t\t\teditsource: 'source'\n\t\t};\n\tlet init = null,\n\t\tconf = null,\n\t\ttabMessages = null,\n\t\tpageExists = null,\n\t\tviewUrl = null,\n\t\tveEditUrl = null,\n\t\ttabPreference = null;\n\tlet veEditSourceUrl, targetPromise, currentUrl,\n\t\tinitialWikitext, oldId,\n\t\tisLoading, tempWikitextEditor, tempWikitextEditorData,\n\t\t$toolbarPlaceholder, $toolbarPlaceholderBar,\n\t\tcontentTop, wasFloating,\n\t\tactive = false,\n\t\ttargetLoaded = false,\n\t\tplugins = [],\n\t\twelcomeDialogDisabled = false,\n\t\teducationPopupsDisabled = false,\n\t\t// Defined after document-ready below\n\t\t$targetContainer = null;\n\n\tif ( mw.config.get( 'wgMFMode' ) ) {\n\t\tmw.log.warn( 'Attempted to load desktop target on mobile.' );\n\t\treturn;\n\t}\n\n\t/**\n\t * Show the loading progress bar\n\t */\n\tfunction showLoading() {\n\t\tif ( isLoading ) {\n\t\t\treturn;\n\t\t}\n\n\t\tisLoading = true;\n\n\t\t$( 'html' ).addClass( 've-activated ve-loading' );\n\t\tif ( !init.$loading ) {\n\t\t\tinit.progressBar = new mw.libs.ve.ProgressBarWidget();\n\t\t\tinit.$loading = $( '<div>' )\n\t\t\t\t.addClass( 've-init-mw-desktopArticleTarget-loading-overlay' )\n\t\t\t\t.append( init.progressBar.$element );\n\t\t}\n\t\t$( document ).on( 'keydown', onDocumentKeyDown );\n\n\t\t$toolbarPlaceholderBar.append( init.$loading );\n\t}\n\n\t/**\n\t * Increment loading progress by one step\n\t *\n\t * See mw.libs.ve.ProgressBarWidget for steps.\n\t */\n\tfunction incrementLoadingProgress() {\n\t\tinit.progressBar.incrementLoadingProgress();\n\t}\n\n\t/**\n\t * Clear and hide the loading progress bar\n\t */\n\tfunction clearLoading() {\n\t\tinit.progressBar.clearLoading();\n\t\tisLoading = false;\n\t\t$( document ).off( 'keydown', onDocumentKeyDown );\n\t\t$( 'html' ).removeClass( 've-loading' );\n\t\tif ( init.$loading ) {\n\t\t\tinit.$loading.detach();\n\t\t}\n\n\t\tif ( tempWikitextEditor ) {\n\t\t\tteardownTempWikitextEditor();\n\t\t}\n\t\thideToolbarPlaceholder();\n\t}\n\n\t/**\n\t * Handle window scroll events\n\t *\n\t * @param {Event} e\n\t */\n\tfunction onWindowScroll() {\n\t\tconst scrollTop = $( document.documentElement ).scrollTop();\n\t\tconst floating = scrollTop > contentTop;\n\t\tif ( floating !== wasFloating ) {\n\t\t\tconst width = $targetContainer.outerWidth();\n\t\t\t$toolbarPlaceholder.toggleClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder-floating', floating );\n\t\t\t$toolbarPlaceholderBar.css( 'width', width );\n\t\t\twasFloating = floating;\n\t\t}\n\t}\n\n\tconst onWindowScrollListener = mw.util.throttle( onWindowScroll, 250 );\n\n\t/**\n\t * Show a placeholder for the VE toolbar\n\t */\n\tfunction showToolbarPlaceholder() {\n\t\tif ( !$toolbarPlaceholder ) {\n\t\t\t// Create an equal-height placeholder for the toolbar to avoid vertical jump\n\t\t\t// when the real toolbar is ready.\n\t\t\t$toolbarPlaceholder = $( '<div>' ).addClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder' );\n\t\t\t$toolbarPlaceholderBar = $( '<div>' ).addClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder-bar' );\n\t\t\t$toolbarPlaceholder.append( $toolbarPlaceholderBar );\n\t\t}\n\t\t// Toggle -floating class before append (if required) to avoid content moving later\n\t\tcontentTop = $targetContainer.offset().top;\n\t\twasFloating = null;\n\t\tonWindowScroll();\n\n\t\tconst scrollTopBefore = $( document.documentElement ).scrollTop();\n\n\t\t$targetContainer.prepend( $toolbarPlaceholder );\n\n\t\twindow.addEventListener( 'scroll', onWindowScrollListener, { passive: true } );\n\n\t\tif ( wasFloating ) {\n\t\t\t// Browser might not support scroll anchoring:\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor/Guide_to_scroll_anchoring\n\t\t\t// ...so compute the new scroll offset ourselves.\n\t\t\twindow.scrollTo( 0, scrollTopBefore + $toolbarPlaceholder.outerHeight() );\n\t\t}\n\n\t\t// Add class for transition after first render\n\t\tsetTimeout( () => {\n\t\t\t$toolbarPlaceholder.addClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder-open' );\n\t\t} );\n\t}\n\n\t/**\n\t * Hide the placeholder for the VE toolbar\n\t */\n\tfunction hideToolbarPlaceholder() {\n\t\tif ( $toolbarPlaceholder ) {\n\t\t\twindow.removeEventListener( 'scroll', onWindowScrollListener );\n\t\t\t$toolbarPlaceholder.detach();\n\t\t\t$toolbarPlaceholder.removeClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder-open' );\n\t\t}\n\t}\n\n\t/**\n\t * Create a temporary `<textarea>` wikitext editor while source mode loads\n\t *\n\t * @param {Object} data Initialisation data for VE\n\t */\n\tfunction setupTempWikitextEditor( data ) {\n\t\tlet wikitext = data.content;\n\t\t// Add trailing linebreak to non-empty wikitext documents for consistency\n\t\t// with old editor and usability. Will be stripped on save. T156609\n\t\tif ( wikitext ) {\n\t\t\twikitext += '\\n';\n\t\t}\n\t\ttempWikitextEditor = new mw.libs.ve.MWTempWikitextEditorWidget( { value: wikitext } );\n\t\ttempWikitextEditorData = data;\n\n\t\t// Bring forward some transformations that show the editor is now ready\n\t\t// Grey out the page title if it is below the editing toolbar (depending on skin), to show it is uneditable.\n\t\t$( '.ve-init-mw-desktopArticleTarget-targetContainer #firstHeading' ).addClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t\t$( '#mw-content-text' )\n\t\t\t.before( tempWikitextEditor.$element )\n\t\t\t.addClass( 'oo-ui-element-hidden' );\n\t\t$( 'html' ).addClass( 've-tempSourceEditing' ).removeClass( 've-loading' );\n\n\t\t// Resize the textarea to fit content. We could do this more often (e.g. on change)\n\t\t// but hopefully this temporary textarea won't be visible for too long.\n\t\ttempWikitextEditor.adjustSize().moveCursorToStart();\n\t\tve.track( 'editAttemptStep', { action: 'ready', mode: 'source', platform: 'desktop' } );\n\t\tmw.libs.ve.tempWikitextEditor = tempWikitextEditor;\n\t\tmw.hook( 've.wikitextInteractive' ).fire();\n\t}\n\n\t/**\n\t * Synchronise state of temporary wikitexteditor back to the VE initialisation data object\n\t */\n\tfunction syncTempWikitextEditor() {\n\t\tlet wikitext = tempWikitextEditor.getValue();\n\n\t\t// Strip trailing linebreak. Will get re-added in ArticleTarget#parseDocument.\n\t\tif ( wikitext.endsWith( '\\n' ) ) {\n\t\t\twikitext = wikitext.slice( 0, -1 );\n\t\t}\n\n\t\tif ( wikitext !== tempWikitextEditorData.content ) {\n\t\t\t// Write changes back to response data object,\n\t\t\t// which will be used to construct the surface.\n\t\t\ttempWikitextEditorData.content = wikitext;\n\t\t\t// TODO: Consider writing changes using a\n\t\t\t// transaction so they can be undone.\n\t\t\t// For now, just mark surface as pre-modified\n\t\t\ttempWikitextEditorData.fromEditedState = true;\n\t\t}\n\n\t\t// Store the last-seen selection and pass to the target\n\t\ttempWikitextEditorData.initialSourceRange = tempWikitextEditor.getRange();\n\n\t\ttempWikitextEditor.$element.prop( 'readonly', true );\n\t}\n\n\t/**\n\t * Teardown the temporary wikitext editor\n\t */\n\tfunction teardownTempWikitextEditor() {\n\t\t// Destroy widget and placeholder\n\t\ttempWikitextEditor.$element.remove();\n\t\tmw.libs.ve.tempWikitextEditor = tempWikitextEditor = null;\n\t\ttempWikitextEditorData = null;\n\n\t\t$( '#mw-content-text' ).removeClass( 'oo-ui-element-hidden' );\n\t\t$( 'html' ).removeClass( 've-tempSourceEditing' );\n\t}\n\n\t/**\n\t * Abort loading the editor\n\t */\n\tfunction abortLoading() {\n\t\t$( 'html' ).removeClass( 've-activated' );\n\t\tactive = false;\n\t\tupdateTabs( false );\n\t\t// Push read tab URL to history\n\t\tif ( $( '#ca-view a' ).length ) {\n\t\t\thistory.pushState( { tag: 'visualeditor' }, '', $( '#ca-view a' ).attr( 'href' ) );\n\t\t}\n\t\tclearLoading();\n\t}\n\n\t/**\n\t * Handle keydown events on the document\n\t *\n\t * @param {jQuery.Event} e Keydown event\n\t */\n\tfunction onDocumentKeyDown( e ) {\n\t\tif ( e.which === 27 /* OO.ui.Keys.ESCAPE */ ) {\n\t\t\tabortLoading();\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\t/**\n\t * Get a section value from a URL\n\t *\n\t * @param {URL} url URL\n\t * @return {string|null} Section if valid, null otherwise\n\t */\n\tfunction getSectionFromUrl( url ) {\n\t\tconst section = url.searchParams.get( 'section' );\n\t\t// Section must be a number, 'new' or 'T-' prefixed\n\t\tif ( section && /^(new|\\d+|T-\\d+)$/.test( section ) ) {\n\t\t\treturn section;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Use deferreds to avoid loading and instantiating Target multiple times.\n\t *\n\t * @private\n\t * @param {string} mode Target mode: 'visual' or 'source'\n\t * @param {string} section Section to edit\n\t * @return {jQuery.Promise}\n\t */\n\tfunction getTarget( mode, section ) {\n\t\tif ( !targetPromise ) {\n\t\t\t// The TargetLoader module is loaded in the bottom queue, so it should have been\n\t\t\t// requested already but it might not have finished loading yet\n\t\t\ttargetPromise = mw.loader.using( 'ext.visualEditor.targetLoader' )\n\t\t\t\t.then( () => {\n\t\t\t\t\tmw.libs.ve.targetLoader.addPlugin(\n\t\t\t\t\t\t// Run VisualEditorPreloadModules, but if they fail, we still want to continue\n\t\t\t\t\t\t// loading, so convert failure to success\n\t\t\t\t\t\t() => mw.loader.using( conf.preloadModules ).catch(\n\t\t\t\t\t\t\t() => $.Deferred().resolve()\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\t// Add modules specific to desktop (modules shared between desktop\n\t\t\t\t\t// and mobile are already added by TargetLoader)\n\t\t\t\t\t[\n\t\t\t\t\t\t'ext.visualEditor.desktopArticleTarget',\n\t\t\t\t\t\t// Add requested plugins\n\t\t\t\t\t\t...plugins\n\t\t\t\t\t].forEach( mw.libs.ve.targetLoader.addPlugin );\n\t\t\t\t\tplugins = [];\n\t\t\t\t\treturn mw.libs.ve.targetLoader.loadModules( mode );\n\t\t\t\t} )\n\t\t\t\t.then( () => {\n\t\t\t\t\tif ( !active ) {\n\t\t\t\t\t\t// Loading was aborted\n\t\t\t\t\t\t// TODO: Make loaders abortable instead of waiting\n\t\t\t\t\t\ttargetPromise = null;\n\t\t\t\t\t\treturn $.Deferred().reject().promise();\n\t\t\t\t\t}\n\n\t\t\t\t\tconst target = ve.init.mw.targetFactory.create(\n\t\t\t\t\t\tconf.contentModels[ mw.config.get( 'wgPageContentModel' ) ], {\n\t\t\t\t\t\t\tmodes: getAvailableModes(),\n\t\t\t\t\t\t\tdefaultMode: mode\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\ttarget.on( 'deactivate', () => {\n\t\t\t\t\t\tactive = false;\n\t\t\t\t\t\tupdateTabs( false );\n\t\t\t\t\t} );\n\t\t\t\t\ttarget.on( 'reactivate', () => {\n\t\t\t\t\t\tcurrentUrl = new URL( location.href );\n\t\t\t\t\t\tactivateTarget(\n\t\t\t\t\t\t\tgetEditModeFromUrl( currentUrl ),\n\t\t\t\t\t\t\tgetSectionFromUrl( currentUrl )\n\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\t\t\t\t\ttarget.setContainer( $targetContainer );\n\t\t\t\t\ttargetLoaded = true;\n\t\t\t\t\treturn target;\n\t\t\t\t}, ( e ) => {\n\t\t\t\t\tmw.log.warn( 'VisualEditor failed to load: ' + e );\n\t\t\t\t\treturn $.Deferred().reject( e ).promise();\n\t\t\t\t} );\n\t\t}\n\n\t\ttargetPromise.then( ( target ) => {\n\t\t\ttarget.section = section;\n\t\t} );\n\n\t\treturn targetPromise;\n\t}\n\n\t/**\n\t * @private\n\t * @param {Object} initData\n\t * @param {URL} [url]\n\t */\n\tfunction trackActivateStart( initData, url = currentUrl ) {\n\t\tif ( url.searchParams.get( 'wvprov' ) === 'sticky-header' ) {\n\t\t\tinitData.mechanism += '-sticky-header';\n\t\t}\n\t\tve.track( 'trace.activate.enter', { mode: initData.mode } );\n\t\tinitData.action = 'init';\n\t\tinitData.integration = 'page';\n\t\tve.track( 'editAttemptStep', initData );\n\t\tmw.libs.ve.activationStart = ve.now();\n\t}\n\n\t/**\n\t * Get the skin-specific message for an edit tab\n\t *\n\t * @param {string} tabMsg Base tab message key\n\t * @return {string} Message text\n\t */\n\tfunction getTabMessage( tabMsg ) {\n\t\tlet tabMsgKey = tabMessages[ tabMsg ];\n\t\tconst skinMsgKeys = {\n\t\t\tedit: 'edit',\n\t\t\tcreate: 'create',\n\t\t\teditlocaldescription: 'edit-local',\n\t\t\tcreatelocaldescription: 'create-local'\n\t\t};\n\t\tconst key = skinMsgKeys[ tabMsg ];\n\t\tif ( !tabMsgKey && key ) {\n\t\t\t// Some skins don't use the default skin message keys.\n\t\t\t// The following messages can be used here:\n\t\t\t// * vector-view-edit\n\t\t\t// * vector-view-create\n\t\t\t// * vector-view-edit-local\n\t\t\t// * vector-view-create-local\n\t\t\t// * messages for other skins\n\t\t\ttabMsgKey = mw.config.get( 'skin' ) + '-view-' + key;\n\t\t\tif ( !mw.message( tabMsgKey ).exists() ) {\n\t\t\t\t// The following messages can be used here:\n\t\t\t\t// * skin-view-edit\n\t\t\t\t// * skin-view-create\n\t\t\t\t// * skin-view-edit-local\n\t\t\t\t// * skin-view-create-local\n\t\t\t\ttabMsgKey = 'skin-view-' + key;\n\t\t\t}\n\t\t}\n\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\tconst msg = mw.message( tabMsgKey );\n\t\tif ( !msg.isParseable() ) {\n\t\t\tmw.log.warn( 'VisualEditor: MediaWiki:' + tabMsgKey + ' contains unsupported syntax. ' +\n\t\t\t\t'https://www.mediawiki.org/wiki/Manual:Messages_API#Feature_support_in_JavaScript' );\n\t\t\treturn undefined;\n\t\t}\n\t\treturn msg.text();\n\t}\n\n\t/**\n\t * Set the user's new preferred editor\n\t *\n\t * @param {string} editor Preferred editor, 'visualeditor' or 'wikitext'\n\t * @return {jQuery.Promise} Promise which resolves when the preference has been set\n\t */\n\tfunction setEditorPreference( editor ) {\n\t\t// If visual mode isn't available, don't set the editor preference as the\n\t\t// user has expressed no choice by opening this editor. (T246259)\n\t\t// Strictly speaking the same thing should happen if visual mode is\n\t\t// available but source mode isn't, but that is never the case.\n\t\tif ( !init.isVisualAvailable() ) {\n\t\t\treturn $.Deferred().resolve().promise();\n\t\t}\n\n\t\tif ( editor !== 'visualeditor' && editor !== 'wikitext' ) {\n\t\t\tthrow new Error( 'setEditorPreference called with invalid option: ', editor );\n\t\t}\n\n\t\tlet key = pageExists ? 'edit' : 'create',\n\t\t\tsectionKey = 'editsection';\n\n\t\tif (\n\t\t\tmw.config.get( 'wgVisualEditorConfig' ).singleEditTab &&\n\t\t\ttabPreference === 'remember-last'\n\t\t) {\n\t\t\tif ( $( '#ca-view-foreign' ).length ) {\n\t\t\t\tkey += 'localdescription';\n\t\t\t}\n\t\t\tif ( editor === 'wikitext' ) {\n\t\t\t\tkey += 'source';\n\t\t\t\tsectionKey += 'source';\n\t\t\t}\n\n\t\t\tconst fallbackSelector = function ( selector, fallback ) {\n\t\t\t\tconst $result = $( selector );\n\t\t\t\treturn $result.length > 0 ? $result : $( fallback );\n\t\t\t};\n\n\t\t\t// Depending on skin these might contain text nested in a span\n\t\t\tfallbackSelector( '#ca-edit a span', '#ca-edit a' ).text( getTabMessage( key ) );\n\t\t\tfallbackSelector( '.mw-editsection a span', '.mw-editsection a' ).text( getTabMessage( sectionKey ) );\n\t\t}\n\n\t\tmw.cookie.set( 'VEE', editor, { path: '/', expires: 30 * 86400, prefix: '' } );\n\n\t\t// Save user preference if logged in\n\t\tif (\n\t\t\tmw.user.isNamed() &&\n\t\t\tmw.user.options.get( 'visualeditor-editor' ) !== editor\n\t\t) {\n\t\t\t// Same as ve.init.target.getLocalApi()\n\t\t\treturn new mw.Api().saveOption( 'visualeditor-editor', editor ).then( () => {\n\t\t\t\tmw.user.options.set( 'visualeditor-editor', editor );\n\t\t\t} );\n\t\t}\n\t\treturn $.Deferred().resolve().promise();\n\t}\n\n\t/**\n\t * Update state of editing tabs\n\t *\n\t * @param {boolean} editing Whether the editor is loaded\n\t * @param {string} [mode='visual'] Edit mode ('visual' or 'source')\n\t * @param {boolean} [isNewSection] Adding a new section\n\t */\n\tfunction updateTabs( editing, mode, isNewSection ) {\n\t\tlet $tab;\n\n\t\tif ( editing ) {\n\t\t\tif ( isNewSection ) {\n\t\t\t\t$tab = $( '#ca-addsection' );\n\t\t\t} else if ( $( '#ca-ve-edit' ).length ) {\n\t\t\t\tif ( !mode || mode === 'visual' ) {\n\t\t\t\t\t$tab = $( '#ca-ve-edit' );\n\t\t\t\t} else {\n\t\t\t\t\t$tab = $( '#ca-edit' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Single edit tab\n\t\t\t\t$tab = $( '#ca-edit' );\n\t\t\t}\n\t\t} else {\n\t\t\t$tab = $( '#ca-view' );\n\t\t}\n\n\t\t// Deselect current mode (e.g. \"view\" or \"history\") in skins that have\n\t\t// separate tab sections for content actions and namespaces, like Vector.\n\t\t$( '#p-views' ).find( 'li.selected' ).removeClass( 'selected' );\n\t\t// In skins like MonoBook that don't have the separate tab sections,\n\t\t// deselect the known tabs for editing modes (when switching or exiting editor).\n\t\t$( '#ca-edit, #ca-ve-edit, #ca-addsection' ).not( $tab ).removeClass( 'selected' );\n\n\t\t$tab.addClass( 'selected' );\n\t}\n\n\t/**\n\t * Scroll to a specific heading before VE loads\n\t *\n\t * Similar to ve.init.mw.ArticleTarget.prototype.scrollToHeading\n\t *\n\t * @param {string} section Parsed section (string)\n\t */\n\tfunction scrollToSection( section ) {\n\t\tif ( section === '0' || section === 'new' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet $heading;\n\t\t$( '#mw-content-text .mw-editsection a:not( .mw-editsection-visualeditor )' ).each( ( i, el ) => {\n\t\t\tconst linkUrl = new URL( el.href );\n\t\t\tif ( section === getSectionFromUrl( linkUrl ) ) {\n\t\t\t\t$heading = $( el ).closest( '.mw-heading' );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t\t// When loading on action=edit URLs, there is no page content\n\t\tif ( !$heading || !$heading.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet offset = 0;\n\t\tconst enableVisualSectionEditing = mw.config.get( 'wgVisualEditorConfig' ).enableVisualSectionEditing;\n\t\tif ( enableVisualSectionEditing === true || enableVisualSectionEditing === 'desktop' ) {\n\t\t\t// Heading will jump to the top of the page in visual section editing.\n\t\t\t// This measurement already includes the height of $toolbarPlaceholder.\n\t\t\toffset = $( '#mw-content-text' ).offset().top;\n\t\t} else {\n\t\t\t// Align with top of heading margin. Doesn't apply in visual section editing as the margin collapses.\n\t\t\toffset = parseInt( $heading.css( 'margin-top' ) ) + $toolbarPlaceholder.outerHeight();\n\t\t}\n\n\t\t// Support for CSS `scroll-behavior: smooth;` and JS `window.scroll( { behavior: 'smooth' } )`\n\t\t// is correlated:\n\t\t// * https://caniuse.com/css-scroll-behavior\n\t\t// * https://caniuse.com/mdn-api_window_scroll_options_behavior_parameter\n\t\tconst supportsSmoothScroll = 'scrollBehavior' in document.documentElement.style;\n\t\tconst newScrollTop = $heading.offset().top - offset;\n\t\tif ( supportsSmoothScroll ) {\n\t\t\twindow.scroll( {\n\t\t\t\ttop: newScrollTop,\n\t\t\t\tbehavior: 'smooth'\n\t\t\t} );\n\t\t} else {\n\t\t\t// Ideally we would use OO.ui.Element.static.getRootScrollableElement here\n\t\t\t// as it has slightly better browser support (Chrome < 60)\n\t\t\tconst scrollContainer = document.documentElement;\n\n\t\t\t$( scrollContainer ).animate( {\n\t\t\t\tscrollTop: newScrollTop\n\t\t\t} );\n\t\t}\n\t}\n\n\t/**\n\t * Load and activate the target.\n\t *\n\t * If you need to call methods on the target before activate is called, call getTarget()\n\t * yourself, chain your work onto that promise, and pass that chained promise in as targetPromise.\n\t * E.g. `activateTarget( getTarget().then( function( target ) { target.doAThing(); } ) );`\n\t *\n\t * @private\n\t * @param {string} mode Target mode: 'visual' or 'source'\n\t * @param {string} [section] Section to edit.\n\t *  If visual section editing is not enabled, we will jump to the start of this section, and still\n\t *  the heading to prefix the edit summary.\n\t * @param {jQuery.Promise} [tPromise] Promise that will be resolved with a ve.init.mw.DesktopArticleTarget\n\t * @param {boolean} [modified=false] The page has been modified before loading (e.g. in source mode)\n\t */\n\tfunction activateTarget( mode, section, tPromise, modified ) {\n\t\tlet dataPromise;\n\n\t\tupdateTabs( true, mode, section === 'new' );\n\n\t\t// Only call requestPageData early if the target object isn't there yet.\n\t\t// If the target object is there, this is a second or subsequent load, and the\n\t\t// internal state of the target object can influence the load request.\n\t\tif ( !targetLoaded ) {\n\t\t\t// The TargetLoader module is loaded in the bottom queue, so it should have been\n\t\t\t// requested already but it might not have finished loading yet\n\t\t\tdataPromise = mw.loader.using( 'ext.visualEditor.targetLoader' )\n\t\t\t\t.then( () => mw.libs.ve.targetLoader.requestPageData( mode, mw.config.get( 'wgRelevantPageName' ), {\n\t\t\t\t\tsessionStore: true,\n\t\t\t\t\tsection: section,\n\t\t\t\t\toldId: oldId,\n\t\t\t\t\t// Should be ve.init.mw.DesktopArticleTarget.static.trackingName, but the\n\t\t\t\t\t// class hasn't loaded yet.\n\t\t\t\t\t// This is used for stats tracking, so do not change!\n\t\t\t\t\ttargetName: 'mwTarget',\n\t\t\t\t\tmodified: modified,\n\t\t\t\t\teditintro: currentUrl.searchParams.get( 'editintro' ),\n\t\t\t\t\tpreload: currentUrl.searchParams.get( 'preload' ),\n\t\t\t\t\tpreloadparams: mw.util.getArrayParam( 'preloadparams', currentUrl.searchParams ),\n\t\t\t\t\t// If switching to visual with modifications, check if we have wikitext to convert\n\t\t\t\t\twikitext: mode === 'visual' && modified ? $( '#wpTextbox1' ).textSelection( 'getContents' ) : undefined\n\t\t\t\t} ) );\n\n\t\t\tdataPromise\n\t\t\t\t.then( ( response ) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// Check target promise hasn't already failed (isLoading=false)\n\t\t\t\t\t\tisLoading &&\n\t\t\t\t\t\t// TODO: Support tempWikitextEditor when section=new (T185633)\n\t\t\t\t\t\tmode === 'source' && section !== 'new' &&\n\t\t\t\t\t\t// Can't use temp editor when recovering an autosave\n\t\t\t\t\t\t!( response.visualeditor && response.visualeditor.recovered )\n\t\t\t\t\t) {\n\t\t\t\t\t\tsetupTempWikitextEditor( response.visualeditor );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.then( incrementLoadingProgress );\n\t\t}\n\n\t\t// Do this before section scrolling\n\t\tshowToolbarPlaceholder();\n\t\tmw.hook( 've.activationStart' ).fire();\n\n\t\tlet visibleSection = null;\n\t\tlet visibleSectionOffset = null;\n\t\tif ( section === null ) {\n\t\t\tlet firstVisibleEditSection = null;\n\t\t\t$( '#firstHeading, #mw-content-text .mw-editsection' ).each( ( i, el ) => {\n\t\t\t\tconst top = el.getBoundingClientRect().top;\n\t\t\t\tif ( top > 0 ) {\n\t\t\t\t\tfirstVisibleEditSection = el;\n\t\t\t\t\t// break\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif ( firstVisibleEditSection && firstVisibleEditSection.id !== 'firstHeading' ) {\n\t\t\t\tconst firstVisibleSectionLink = firstVisibleEditSection.querySelector( 'a' );\n\t\t\t\tconst linkUrl = new URL( firstVisibleSectionLink.href );\n\t\t\t\tvisibleSection = getSectionFromUrl( linkUrl );\n\n\t\t\t\tconst firstVisibleHeading = $( firstVisibleEditSection ).closest( '.mw-heading' )[ 0 ];\n\t\t\t\tvisibleSectionOffset = firstVisibleHeading.getBoundingClientRect().top;\n\t\t\t}\n\t\t} else if ( mode === 'visual' ) {\n\t\t\tscrollToSection( section );\n\t\t}\n\n\t\tshowLoading( mode );\n\t\tincrementLoadingProgress();\n\t\tactive = true;\n\n\t\ttPromise = tPromise || getTarget( mode, section );\n\t\ttPromise\n\t\t\t.then( ( target ) => {\n\t\t\t\ttarget.visibleSection = visibleSection;\n\t\t\t\ttarget.visibleSectionOffset = visibleSectionOffset;\n\n\t\t\t\tincrementLoadingProgress();\n\t\t\t\t// If target was already loaded, ensure the mode is correct\n\t\t\t\ttarget.setDefaultMode( mode );\n\t\t\t\t// syncTempWikitextEditor modified the result object in the dataPromise\n\t\t\t\tif ( tempWikitextEditor ) {\n\t\t\t\t\tsyncTempWikitextEditor();\n\t\t\t\t}\n\n\t\t\t\tconst deactivating = target.deactivatingDeferred || $.Deferred().resolve();\n\t\t\t\treturn deactivating.then( () => {\n\t\t\t\t\ttarget.currentUrl = new URL( location.href );\n\t\t\t\t\tconst activatePromise = target.activate( dataPromise );\n\n\t\t\t\t\t// toolbarSetupDeferred resolves slightly before activatePromise, use done\n\t\t\t\t\t// to run in the same paint cycle as the VE toolbar being drawn\n\t\t\t\t\ttarget.toolbarSetupDeferred.then( () => {\n\t\t\t\t\t\thideToolbarPlaceholder();\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn activatePromise;\n\t\t\t\t} );\n\t\t\t} )\n\t\t\t.then( () => {\n\t\t\t\tif ( mode === 'visual' ) {\n\t\t\t\t\t// `action: 'ready'` has already been fired for source mode in setupTempWikitextEditor\n\t\t\t\t\tve.track( 'editAttemptStep', { action: 'ready', mode: mode } );\n\t\t\t\t} else if ( !tempWikitextEditor ) {\n\t\t\t\t\t// We're in source mode, but skipped the\n\t\t\t\t\t// tempWikitextEditor, so make sure we do relevant\n\t\t\t\t\t// tracking / hooks:\n\t\t\t\t\tve.track( 'editAttemptStep', { action: 'ready', mode: mode } );\n\t\t\t\t\tmw.hook( 've.wikitextInteractive' ).fire();\n\t\t\t\t}\n\t\t\t\tve.track( 'editAttemptStep', { action: 'loaded', mode: mode } );\n\t\t\t} )\n\t\t\t.always( clearLoading );\n\t}\n\n\t/**\n\t * @private\n\t * @param {string} mode Target mode: 'visual' or 'source'\n\t * @param {string} [section]\n\t * @param {boolean} [modified=false] The page has been modified before loading (e.g. in source mode)\n\t * @param {URL} [linkUrl] URL to navigate to, potentially with extra parameters\n\t */\n\tfunction activatePageTarget( mode, section, modified, linkUrl ) {\n\t\ttrackActivateStart( { type: 'page', mechanism: mw.config.get( 'wgArticleId' ) ? 'click' : 'new', mode: mode }, linkUrl );\n\n\t\tif ( !active ) {\n\t\t\t// Replace the current state with one that is tagged as ours, to prevent the\n\t\t\t// back button from breaking when used to exit VE. FIXME: there should be a better\n\t\t\t// way to do this. See also similar code in the DesktopArticleTarget constructor.\n\t\t\thistory.replaceState( { tag: 'visualeditor' }, '', currentUrl );\n\t\t\t// Set action=edit or veaction=edit/editsource\n\t\t\t// Use linkUrl to preserve parameters like 'editintro' (T56029)\n\t\t\thistory.pushState( { tag: 'visualeditor' }, '', linkUrl || ( mode === 'source' ? veEditSourceUrl : veEditUrl ) );\n\t\t\t// Update URL instance\n\t\t\tcurrentUrl = linkUrl || veEditUrl;\n\n\t\t\tactivateTarget( mode, section, undefined, modified );\n\t\t}\n\t}\n\n\t/**\n\t * Get the last mode a user used\n\t *\n\t * @return {string|null} 'visualeditor', 'wikitext' or null\n\t */\n\tfunction getLastEditor() {\n\t\t// This logic matches VisualEditorHooks::getLastEditor\n\t\tlet editor = mw.cookie.get( 'VEE', '' );\n\t\t// Set editor to user's preference or site's default (ignore the cookie) if …\n\t\tif (\n\t\t\t// … user is logged in,\n\t\t\tmw.user.isNamed() ||\n\t\t\t// … no cookie is set, or\n\t\t\t!editor ||\n\t\t\t// value is invalid.\n\t\t\t!( editor === 'visualeditor' || editor === 'wikitext' )\n\t\t) {\n\t\t\teditor = mw.user.options.get( 'visualeditor-editor' );\n\t\t}\n\t\treturn editor;\n\t}\n\n\t/**\n\t * Get the preferred editor for this edit page\n\t *\n\t * For the preferred *available* editor, use getAvailableEditPageEditor.\n\t *\n\t * @return {string|null} 'visualeditor', 'wikitext' or null\n\t */\n\tfunction getEditPageEditor() {\n\t\t// This logic matches VisualEditorHooks::getEditPageEditor\n\t\t// !!+ casts '0' to false\n\t\tconst isRedLink = !!+currentUrl.searchParams.get( 'redlink' );\n\t\t// On dual-edit-tab wikis, the edit page must mean the user wants wikitext,\n\t\t// unless following a redlink\n\t\tif ( !mw.config.get( 'wgVisualEditorConfig' ).singleEditTab && !isRedLink ) {\n\t\t\treturn 'wikitext';\n\t\t}\n\t\t// Adding a new section is not supported in visual mode\n\t\tif ( currentUrl.searchParams.get( 'section' ) === 'new' ) {\n\t\t\treturn 'wikitext';\n\t\t}\n\t\t// Force switched from VE\n\t\tif ( currentUrl.searchParams.has( 'veswitched' ) ) {\n\t\t\treturn 'wikitext';\n\t\t}\n\n\t\tswitch ( tabPreference ) {\n\t\t\tcase 'prefer-ve':\n\t\t\t\treturn 'visualeditor';\n\t\t\tcase 'prefer-wt':\n\t\t\t\treturn 'wikitext';\n\t\t\tcase 'multi-tab':\n\t\t\t\t// 'multi-tab'\n\t\t\t\t// TODO: See VisualEditor.hooks.php\n\t\t\t\treturn isRedLink ?\n\t\t\t\t\tgetLastEditor() :\n\t\t\t\t\t'wikitext';\n\t\t\tcase 'remember-last':\n\t\t\tdefault:\n\t\t\t\treturn getLastEditor();\n\t\t}\n\t}\n\n\t/**\n\t * Get the preferred editor which is also available on this edit page\n\t *\n\t * @return {string} 'visual' or 'source'\n\t */\n\tfunction getAvailableEditPageEditor() {\n\t\tswitch ( getEditPageEditor() ) {\n\t\t\tcase 'visualeditor':\n\t\t\t\tif ( init.isVisualAvailable() ) {\n\t\t\t\t\treturn 'visual';\n\t\t\t\t}\n\t\t\t\tif ( init.isWikitextAvailable() ) {\n\t\t\t\t\treturn 'source';\n\t\t\t\t}\n\t\t\t\treturn null;\n\n\t\t\tcase 'wikitext':\n\t\t\tdefault:\n\t\t\t\treturn init.isWikitextAvailable() ? 'source' : null;\n\t\t}\n\t}\n\n\t/**\n\t * Check if a boolean preference is set in user options, mw.storage or a cookie\n\t *\n\t * @param {string} prefName Preference name\n\t * @param {string} storageKey mw.storage key\n\t * @param {string} cookieName Cookie name\n\t * @return {boolean} Preference is set\n\t */\n\tfunction checkPreferenceOrStorage( prefName, storageKey, cookieName ) {\n\t\tstorageKey = storageKey || prefName;\n\t\tcookieName = cookieName || storageKey;\n\t\treturn !!( mw.user.options.get( prefName ) ||\n\t\t\t(\n\t\t\t\t!mw.user.isNamed() && (\n\t\t\t\t\tmw.storage.get( storageKey ) ||\n\t\t\t\t\tmw.cookie.get( cookieName, '' )\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * Set a boolean preference to true in user options, mw.storage or a cookie\n\t *\n\t * @param {string} prefName Preference name\n\t * @param {string} storageKey mw.storage key\n\t * @param {string} cookieName Cookie name\n\t */\n\tfunction setPreferenceOrStorage( prefName, storageKey, cookieName ) {\n\t\tstorageKey = storageKey || prefName;\n\t\tcookieName = cookieName || storageKey;\n\t\tif ( !mw.user.isNamed() ) {\n\t\t\t// Try local storage first; if that fails, set a cookie\n\t\t\tif ( !mw.storage.set( storageKey, 1 ) ) {\n\t\t\t\tmw.cookie.set( cookieName, 1, { path: '/', expires: 30 * 86400, prefix: '' } );\n\t\t\t}\n\t\t} else {\n\t\t\tnew mw.Api().saveOption( prefName, '1' );\n\t\t\tmw.user.options.set( prefName, '1' );\n\t\t}\n\t}\n\n\tconf = mw.config.get( 'wgVisualEditorConfig' );\n\ttabMessages = conf.tabMessages;\n\tviewUrl = new URL( mw.util.getUrl( mw.config.get( 'wgRelevantPageName' ) ), location.href );\n\tcurrentUrl = new URL( location.href );\n\t// T156998: Don't trust 'oldid' query parameter, it'll be wrong if 'diff' or 'direction'\n\t// is set to 'next' or 'prev'.\n\toldId = mw.config.get( 'wgRevisionId' ) || $( 'input[name=parentRevId]' ).val();\n\tif ( oldId === mw.config.get( 'wgCurRevisionId' ) || mw.config.get( 'wgEditLatestRevision' ) ) {\n\t\t// The page may have been edited by someone else after we loaded it, setting this to \"undefined\"\n\t\t// indicates that we should load the actual latest revision.\n\t\toldId = undefined;\n\t}\n\tpageExists = !!mw.config.get( 'wgRelevantArticleId' );\n\tconst isViewPage = mw.config.get( 'wgIsArticle' ) && !currentUrl.searchParams.has( 'diff' );\n\tconst wgAction = mw.config.get( 'wgAction' );\n\tconst isEditPage = wgAction === 'edit' || wgAction === 'submit';\n\tconst pageCanLoadEditor = isViewPage || isEditPage;\n\tconst pageIsProbablyEditable = mw.config.get( 'wgIsProbablyEditable' ) ||\n\t\tmw.config.get( 'wgRelevantPageIsProbablyEditable' );\n\n\t// Cast \"0\" (T89513)\n\tconst enable = !!+mw.user.options.get( 'visualeditor-enable' );\n\tconst tempdisable = !!+mw.user.options.get( 'visualeditor-betatempdisable' );\n\tconst autodisable = !!+mw.user.options.get( 'visualeditor-autodisable' );\n\ttabPreference = mw.user.options.get( 'visualeditor-tabs' );\n\n\t/**\n\t * The only edit tab shown to the user is for visual mode\n\t *\n\t * @return {boolean}\n\t */\n\tfunction isOnlyTabVE() {\n\t\treturn conf.singleEditTab && getAvailableEditPageEditor() === 'visual';\n\t}\n\n\t/**\n\t * The only edit tab shown to the user is for source mode\n\t *\n\t * @return {boolean}\n\t */\n\tfunction isOnlyTabWikitext() {\n\t\treturn conf.singleEditTab && getAvailableEditPageEditor() === 'source';\n\t}\n\n\tinit = {\n\t\t/**\n\t\t * Add a plugin module or function.\n\t\t *\n\t\t * Plugins are run after VisualEditor is loaded, but before it is initialized. This allows\n\t\t * plugins to add classes and register them with the factories and registries.\n\t\t *\n\t\t * The parameter to this function can be a ResourceLoader module name or a function.\n\t\t *\n\t\t * If it's a module name, it will be loaded together with the VisualEditor core modules when\n\t\t * VE is loaded. No special care is taken to ensure that the module runs after the VE\n\t\t * classes are loaded, so if this is desired, the module should depend on\n\t\t * ext.visualEditor.core .\n\t\t *\n\t\t * If it's a function, it will be invoked once the VisualEditor core modules and any\n\t\t * plugin modules registered through this function have been loaded, but before the editor\n\t\t * is intialized. The function can optionally return a jQuery.Promise . VisualEditor will\n\t\t * only be initialized once all promises returned by plugin functions have been resolved.\n\t\t *\n\t\t *     // Register ResourceLoader module\n\t\t *     mw.libs.ve.addPlugin( 'ext.gadget.foobar' );\n\t\t *\n\t\t *     // Register a callback\n\t\t *     mw.libs.ve.addPlugin( ( target ) => {\n\t\t *         ve.dm.Foobar = .....\n\t\t *     } );\n\t\t *\n\t\t *     // Register a callback that loads another script\n\t\t *     mw.libs.ve.addPlugin( () => $.getScript( 'http://example.com/foobar.js' ) );\n\t\t *\n\t\t * @param {string|Function} plugin Module name or callback that optionally returns a promise\n\t\t */\n\t\taddPlugin: function ( plugin ) {\n\t\t\tplugins.push( plugin );\n\t\t},\n\n\t\t/**\n\t\t * Adjust edit page links in the current document\n\t\t *\n\t\t * This will run multiple times in a page lifecycle, notably when the\n\t\t * page first loads and after post-save content replacement occurs. It\n\t\t * needs to avoid doing anything which will cause problems if it's run\n\t\t * twice or more.\n\t\t */\n\t\tsetupEditLinks: function () {\n\t\t\t// NWE\n\t\t\tif ( init.isWikitextAvailable() && !isOnlyTabVE() ) {\n\t\t\t\t$(\n\t\t\t\t\t// Edit section links, except VE ones when both editors visible\n\t\t\t\t\t'.mw-editsection a:not( .mw-editsection-visualeditor ),' +\n\t\t\t\t\t// Edit tab\n\t\t\t\t\t'#ca-edit a,' +\n\t\t\t\t\t// Add section is currently a wikitext-only feature\n\t\t\t\t\t'#ca-addsection a'\n\t\t\t\t).each( ( i, el ) => {\n\t\t\t\t\tif ( !el.href ) {\n\t\t\t\t\t\t// Not a real link, probably added by a gadget or another extension (T328094)\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst linkUrl = new URL( el.href );\n\t\t\t\t\tif ( linkUrl.searchParams.has( 'action' ) ) {\n\t\t\t\t\t\tlinkUrl.searchParams.delete( 'action' );\n\t\t\t\t\t\tlinkUrl.searchParams.set( 'veaction', 'editsource' );\n\t\t\t\t\t\t// linkUrl is safe\n\t\t\t\t\t\t// eslint-disable-next-line local/no-unsanitized-href\n\t\t\t\t\t\t$( el ).attr( 'href', linkUrl.toString() );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Set up the tabs appropriately if the user has VE on\n\t\t\tif ( init.isAvailable ) {\n\t\t\t\t// … on two-edit-tab wikis, or single-edit-tab wikis, where the user wants both …\n\t\t\t\tif (\n\t\t\t\t\t!init.isSingleEditTab && init.isVisualAvailable() &&\n\t\t\t\t\t// T253941: This option does not actually disable the editor, only leaves the tabs/links unchanged\n\t\t\t\t\t!( conf.disableForAnons && mw.user.isAnon() )\n\t\t\t\t) {\n\t\t\t\t\t// … set the skin up with both tabs and both section edit links.\n\t\t\t\t\tinit.setupMultiTabSkin();\n\t\t\t\t} else if (\n\t\t\t\t\tpageCanLoadEditor && (\n\t\t\t\t\t\t( init.isVisualAvailable() && isOnlyTabVE() ) ||\n\t\t\t\t\t\t( init.isWikitextAvailable() && isOnlyTabWikitext() )\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\t// … on single-edit-tab wikis, where VE or NWE is the user's preferred editor\n\t\t\t\t\t// Handle section edit link clicks\n\t\t\t\t\t$( '.mw-editsection a' ).off( '.ve-target' ).on( 'click.ve-target', ( e ) => {\n\t\t\t\t\t\t// isOnlyTabVE is computed on click as it may have changed since load\n\t\t\t\t\t\tinit.onEditSectionLinkClick( isOnlyTabVE() ? 'visual' : 'source', e );\n\t\t\t\t\t} );\n\t\t\t\t\t// Allow instant switching to edit mode, without refresh\n\t\t\t\t\t$( '#ca-edit' ).off( '.ve-target' ).on( 'click.ve-target', ( e ) => {\n\t\t\t\t\t\tinit.onEditTabClick( isOnlyTabVE() ? 'visual' : 'source', e );\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tif ( !mw.user.isAnon() && pageCanLoadEditor && init.isVisualAvailable() && ( !init.isSingleEditTab || isOnlyTabVE() ) ) {\n\t\t\t\t\t// Show a category-edit link for logged in users who would be given VE if they clicked an \"edit\" link\n\t\t\t\t\t$( '#catlinks' ).prepend(\n\t\t\t\t\t\t$( '<span>' )\n\t\t\t\t\t\t\t.addClass( 've-init-mw-desktopArticleTarget-categoryEdit mw-editsection-like' )\n\t\t\t\t\t\t\t.on( 'click', init.onCategoryEditLinkClick )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t$( '<span>' ).addClass( 'mw-editsection-bracket' ).text( '[' ),\n\t\t\t\t\t\t\t\t$( '<a>' ).text( mw.msg( 'editsection' ) ),\n\t\t\t\t\t\t\t\t$( '<span>' ).addClass( 'mw-editsection-bracket' ).text( ']' )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Setup multiple edit tabs and section links (edit + edit source)\n\t\t */\n\t\tsetupMultiTabSkin: function () {\n\t\t\tinit.setupMultiTabs();\n\t\t\tinit.setupMultiSectionLinks();\n\t\t},\n\n\t\t/**\n\t\t * Setup multiple edit tabs (edit + edit source)\n\t\t */\n\t\tsetupMultiTabs: function () {\n\t\t\t// Minerva puts the '#ca-...' ids on <a> nodes, other skins put them on <li>\n\t\t\tconst $caEdit = $( '#ca-edit' );\n\t\t\tconst $caVeEdit = $( '#ca-ve-edit' );\n\n\t\t\tif ( pageCanLoadEditor ) {\n\t\t\t\t// Allow instant switching to edit mode, without refresh\n\t\t\t\t$caVeEdit.off( '.ve-target' ).on( 'click.ve-target', init.onEditTabClick.bind( init, 'visual' ) );\n\t\t\t}\n\t\t\tif ( pageCanLoadEditor ) {\n\t\t\t\t// Always bind \"Edit source\" tab, because we want to handle switching with changes\n\t\t\t\t$caEdit.off( '.ve-target' ).on( 'click.ve-target', init.onEditTabClick.bind( init, 'source' ) );\n\t\t\t}\n\t\t\tif ( pageCanLoadEditor && init.isWikitextAvailable() ) {\n\t\t\t\t// Only bind \"Add topic\" tab if NWE is available, because VE doesn't support section\n\t\t\t\t// so we never have to switch from it when editing a section\n\t\t\t\t$( '#ca-addsection' ).off( '.ve-target' ).on( 'click.ve-target', init.onEditTabClick.bind( init, 'source' ) );\n\t\t\t}\n\n\t\t\tif ( init.isVisualAvailable() ) {\n\t\t\t\tif ( conf.tabPosition === 'before' ) {\n\t\t\t\t\t$caEdit.addClass( 'collapsible' );\n\t\t\t\t} else {\n\t\t\t\t\t$caVeEdit.addClass( 'collapsible' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Setup multiple section links (edit + edit source)\n\t\t */\n\t\tsetupMultiSectionLinks: function () {\n\t\t\tif ( pageCanLoadEditor ) {\n\t\t\t\tconst $editsections = $( '#mw-content-text .mw-editsection' );\n\n\t\t\t\t// Only init without refresh if we're on a view page. Though section edit links\n\t\t\t\t// are rarely shown on non-view pages, they appear in one other case, namely\n\t\t\t\t// when on a diff against the latest version of a page. In that case we mustn't\n\t\t\t\t// init without refresh as that'd initialise for the wrong rev id (T52925)\n\t\t\t\t// and would preserve the wrong DOM with a diff on top.\n\t\t\t\t$editsections.find( '.mw-editsection-visualeditor' )\n\t\t\t\t\t.off( '.ve-target' ).on( 'click.ve-target', init.onEditSectionLinkClick.bind( init, 'visual' ) );\n\t\t\t\tif ( init.isWikitextAvailable() ) {\n\t\t\t\t\t// TOOD: Make this less fragile\n\t\t\t\t\t$editsections.find( 'a:not( .mw-editsection-visualeditor )' )\n\t\t\t\t\t\t.off( '.ve-target' ).on( 'click.ve-target', init.onEditSectionLinkClick.bind( init, 'source' ) );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check whether a jQuery event represents a plain left click, without\n\t\t * any modifiers or a programmatically triggered click.\n\t\t *\n\t\t * This is a duplicate of a function in ve.utils, because this file runs\n\t\t * before any of VE core or OOui has been loaded.\n\t\t *\n\t\t * @param {jQuery.Event} e\n\t\t * @return {boolean} Whether it was an unmodified left click\n\t\t */\n\t\tisUnmodifiedLeftClick: function ( e ) {\n\t\t\treturn e && ( (\n\t\t\t\te.which && e.which === 1 && !( e.shiftKey || e.altKey || e.ctrlKey || e.metaKey )\n\t\t\t) || e.isTrigger );\n\t\t},\n\n\t\t/**\n\t\t * Handle click events on an edit tab\n\t\t *\n\t\t * @param {string} mode Edit mode, 'visual' or 'source'\n\t\t * @param {Event} e Event\n\t\t */\n\t\tonEditTabClick: function ( mode, e ) {\n\t\t\tif ( !init.isUnmodifiedLeftClick( e ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !active && mode === 'source' && !init.isWikitextAvailable() ) {\n\t\t\t\t// We're not active so we don't need to manage a switch, and\n\t\t\t\t// we don't have source mode available so we don't need to\n\t\t\t\t// activate VE. Just follow the link.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\tif ( isLoading ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst section = $( e.target ).closest( '#ca-addsection' ).length ? 'new' : null;\n\n\t\t\tif ( active ) {\n\t\t\t\ttargetPromise.then( ( target ) => {\n\t\t\t\t\tif ( target.getDefaultMode() === 'source' ) {\n\t\t\t\t\t\tif ( mode === 'visual' ) {\n\t\t\t\t\t\t\ttarget.switchToVisualEditor();\n\t\t\t\t\t\t} else if ( mode === 'source' ) {\n\t\t\t\t\t\t\t// Requested section may have changed --\n\t\t\t\t\t\t\t// switchToWikitextSection will do nothing if the\n\t\t\t\t\t\t\t// section is unchanged.\n\t\t\t\t\t\t\ttarget.switchToWikitextSection( section );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( target.getDefaultMode() === 'visual' ) {\n\t\t\t\t\t\tif ( mode === 'source' ) {\n\t\t\t\t\t\t\tif ( section ) {\n\t\t\t\t\t\t\t\t// switching from visual via the \"add section\" tab\n\t\t\t\t\t\t\t\ttarget.switchToWikitextSection( section );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttarget.editSource();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Visual-to-visual doesn't need to do anything,\n\t\t\t\t\t\t// because we don't have any section concerns. Just\n\t\t\t\t\t\t// no-op it.\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tconst link = $( e.target ).closest( 'a' )[ 0 ];\n\t\t\t\tconst linkUrl = link && link.href ? new URL( link.href ) : undefined;\n\t\t\t\tif ( section !== null ) {\n\t\t\t\t\tinit.activateVe( mode, linkUrl, section );\n\t\t\t\t} else {\n\t\t\t\t\t// Do not pass `section` to handle switching from section editing in WikiEditor if needed\n\t\t\t\t\tinit.activateVe( mode, linkUrl );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Activate VE\n\t\t *\n\t\t * @param {string} mode Target mode: 'visual' or 'source'\n\t\t * @param {URL} [linkUrl] URL to navigate to, potentially with extra parameters\n\t\t * @param {string} [section]\n\t\t */\n\t\tactivateVe: function ( mode, linkUrl, section ) {\n\t\t\tconst wikitext = $( '#wpTextbox1' ).textSelection( 'getContents' ),\n\t\t\t\tmodified = mw.config.get( 'wgAction' ) === 'submit' ||\n\t\t\t\t\t(\n\t\t\t\t\t\tmw.config.get( 'wgAction' ) === 'edit' &&\n\t\t\t\t\t\twikitext !== initialWikitext\n\t\t\t\t\t);\n\n\t\t\tif ( section === undefined ) {\n\t\t\t\tconst sectionVal = $( 'input[name=wpSection]' ).val();\n\t\t\t\tsection = sectionVal !== '' && sectionVal !== undefined ? sectionVal : null;\n\t\t\t}\n\n\t\t\t// Close any open jQuery.UI dialogs (e.g. WikiEditor's find and replace)\n\t\t\tif ( $.fn.dialog ) {\n\t\t\t\t$( '.ui-dialog-content' ).dialog( 'close' );\n\t\t\t}\n\n\t\t\t// Release the edit warning on #wpTextbox1 which was setup in mediawiki.action.edit.editWarning.js\n\t\t\t$( window ).off( 'beforeunload.editwarning' );\n\t\t\tactivatePageTarget( mode, section, modified, linkUrl );\n\t\t},\n\n\t\t/**\n\t\t * Handle section edit links being clicked\n\t\t *\n\t\t * @param {string} mode Edit mode\n\t\t * @param {jQuery.Event} e Click event\n\t\t * @param {string} [section] Override edit section, taken from link URL if not specified\n\t\t */\n\t\tonEditSectionLinkClick: function ( mode, e, section ) {\n\t\t\tconst link = $( e.target ).closest( 'a' )[ 0 ];\n\t\t\tif ( !link || !link.href ) {\n\t\t\t\t// Not a real link, probably added by a gadget or another extension (T328094)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst linkUrl = new URL( link.href );\n\t\t\tconst title = mw.Title.newFromText( linkUrl.searchParams.get( 'title' ) || '' );\n\n\t\t\tif (\n\t\t\t\t// Modified click (e.g. ctrl+click)\n\t\t\t\t!init.isUnmodifiedLeftClick( e ) ||\n\t\t\t\t// Not an edit action\n\t\t\t\t!( linkUrl.searchParams.has( 'action' ) || linkUrl.searchParams.has( 'veaction' ) ) ||\n\t\t\t\t// Edit target is on another host (e.g. commons file)\n\t\t\t\tlinkUrl.host !== location.host ||\n\t\t\t\t// Title param doesn't match current page\n\t\t\t\ttitle && title.getPrefixedText() !== new mw.Title( mw.config.get( 'wgRelevantPageName' ) ).getPrefixedText()\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\tif ( isLoading ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttrackActivateStart( { type: 'section', mechanism: section === 'new' ? 'new' : 'click', mode: mode }, linkUrl );\n\n\t\t\tif ( !active ) {\n\t\t\t\t// Replace the current state with one that is tagged as ours, to prevent the\n\t\t\t\t// back button from breaking when used to exit VE. FIXME: there should be a better\n\t\t\t\t// way to do this. See also similar code in the DesktopArticleTarget constructor.\n\t\t\t\thistory.replaceState( { tag: 'visualeditor' }, '', currentUrl );\n\t\t\t\t// Use linkUrl to preserve the 'section' parameter and others like 'editintro' (T56029)\n\t\t\t\thistory.pushState( { tag: 'visualeditor' }, '', linkUrl );\n\t\t\t\t// Update URL instance\n\t\t\t\tcurrentUrl = linkUrl;\n\n\t\t\t\t// Use section from URL\n\t\t\t\tif ( section === undefined ) {\n\t\t\t\t\tsection = getSectionFromUrl( linkUrl );\n\t\t\t\t}\n\t\t\t\tconst tPromise = getTarget( mode, section );\n\t\t\t\tactivateTarget( mode, section, tPromise );\n\t\t\t}\n\t\t},\n\n\t\tonCategoryEditLinkClick: function ( e ) {\n\t\t\tif ( !init.isUnmodifiedLeftClick( e ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\tif ( isLoading ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// should perhaps have a new 'type' for 'categories' added?\n\t\t\ttrackActivateStart( { type: 'page', mechanism: 'click', mode: 'visual' } );\n\t\t\tif ( currentUrl.searchParams.get( 'action' ) !== 'edit' && !( currentUrl.searchParams.get( 'veaction' ) in veactionToMode ) ) {\n\t\t\t\tif ( history.pushState ) {\n\t\t\t\t\t// Replace the current state with one that is tagged as ours, to prevent the\n\t\t\t\t\t// back button from breaking when used to exit VE. FIXME: there should be a better\n\t\t\t\t\t// way to do this. See also similar code in the DesktopArticleTarget constructor.\n\t\t\t\t\thistory.replaceState( { tag: 'visualeditor' }, document.title, currentUrl );\n\t\t\t\t\t// Set veaction to edit\n\t\t\t\t\thistory.pushState( { tag: 'visualeditor' }, document.title, veEditUrl );\n\t\t\t\t}\n\n\t\t\t\t// Update mw.Uri instance\n\t\t\t\tcurrentUrl = veEditUrl;\n\t\t\t}\n\t\t\tinit.disableWelcomeDialog();\n\t\t\tactivateTarget( 'visual', null, getTarget( 'visual', null ).then( ( target ) => {\n\t\t\t\ttarget.once( 'surfaceReady', () => {\n\t\t\t\t\tconst windowAction = ve.ui.actionFactory.create( 'window', target.getSurface() );\n\t\t\t\t\twindowAction.open( 'meta', { page: 'categories' } );\n\t\t\t\t} );\n\t\t\t\treturn target;\n\t\t\t} ) );\n\t\t},\n\n\t\t/**\n\t\t * Check whether the welcome dialog should be shown.\n\t\t *\n\t\t * The welcome dialog can be disabled in configuration; or by calling disableWelcomeDialog();\n\t\t * or using a query string parameter; or if we've recorded that we've already shown it before\n\t\t * in a user preference, local storage or a cookie.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshouldShowWelcomeDialog: function () {\n\t\t\treturn !(\n\t\t\t\t// Disabled in config?\n\t\t\t\t!mw.config.get( 'wgVisualEditorConfig' ).showBetaWelcome ||\n\t\t\t\t// Disabled for the current request?\n\t\t\t\tthis.isWelcomeDialogSuppressed() ||\n\t\t\t\t// Joining a collab session\n\t\t\t\tcurrentUrl.searchParams.has( 'collabSession' ) ||\n\t\t\t\t// Hidden using preferences, local storage or cookie?\n\t\t\t\tcheckPreferenceOrStorage( 'visualeditor-hidebetawelcome', 've-beta-welcome-dialog' )\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Check whether the welcome dialog is temporarily disabled.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisWelcomeDialogSuppressed: function () {\n\t\t\treturn !!(\n\t\t\t\t// Disabled by calling disableWelcomeDialog()?\n\t\t\t\twelcomeDialogDisabled ||\n\t\t\t\t// Hidden using URL parameter?\n\t\t\t\tnew URL( location.href ).searchParams.has( 'vehidebetadialog' ) ||\n\t\t\t\t// Check for deprecated hidewelcomedialog parameter (T249954)\n\t\t\t\tnew URL( location.href ).searchParams.has( 'hidewelcomedialog' )\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Record that we've already shown the welcome dialog to this user, so that it won't be shown\n\t\t * to them again.\n\t\t *\n\t\t * Uses a preference for logged-in users; uses local storage or a cookie for anonymous users.\n\t\t */\n\t\tstopShowingWelcomeDialog: function () {\n\t\t\tsetPreferenceOrStorage( 'visualeditor-hidebetawelcome', 've-beta-welcome-dialog' );\n\t\t},\n\n\t\t/**\n\t\t * Prevent the welcome dialog from being shown on this page view only.\n\t\t *\n\t\t * Causes shouldShowWelcomeDialog() to return false, but doesn't save anything to preferences\n\t\t * or local storage, so future page views are not affected.\n\t\t */\n\t\tdisableWelcomeDialog: function () {\n\t\t\twelcomeDialogDisabled = true;\n\t\t},\n\n\t\t/**\n\t\t * Check whether the user education popups (ve.ui.MWEducationPopupWidget) should be shown.\n\t\t *\n\t\t * The education popups can be disabled by calling disableWelcomeDialog(), or if we've\n\t\t * recorded that we've already shown it before in a user preference, local storage or a cookie.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshouldShowEducationPopups: function () {\n\t\t\treturn !(\n\t\t\t\t// Disabled by calling disableEducationPopups()?\n\t\t\t\teducationPopupsDisabled ||\n\t\t\t\t// Hidden using preferences, local storage, or cookie?\n\t\t\t\tcheckPreferenceOrStorage( 'visualeditor-hideusered', 've-hideusered' )\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Record that we've already shown the education popups to this user, so that it won't be\n\t\t * shown to them again.\n\t\t *\n\t\t * Uses a preference for logged-in users; uses local storage or a cookie for anonymous users.\n\t\t */\n\t\tstopShowingEducationPopups: function () {\n\t\t\tsetPreferenceOrStorage( 'visualeditor-hideusered', 've-hideusered' );\n\t\t},\n\n\t\t/**\n\t\t * Prevent the education popups from being shown on this page view only.\n\t\t *\n\t\t * Causes shouldShowEducationPopups() to return false, but doesn't save anything to\n\t\t * preferences or local storage, so future page views are not affected.\n\t\t */\n\t\tdisableEducationPopups: function () {\n\t\t\teducationPopupsDisabled = true;\n\t\t}\n\t};\n\n\t/**\n\t * Check if a URL doesn't contain any params which would prevent VE from loading, e.g. 'undo'\n\t *\n\t * @param {URL} url\n\t * @return {boolean} URL contains no unsupported params\n\t */\n\tfunction isSupportedEditPage( url ) {\n\t\treturn configData.unsupportedEditParams.every( ( param ) => !url.searchParams.has( param ) );\n\t}\n\n\tinit.isSingleEditTab = conf.singleEditTab && tabPreference !== 'multi-tab';\n\n\t// On a view page, extend the current URL so extra parameters are carried over\n\t// On a non-view page, use viewUrl\n\tveEditUrl = new URL( pageCanLoadEditor ? currentUrl : viewUrl );\n\tif ( oldId ) {\n\t\tveEditUrl.searchParams.set( 'oldid', oldId );\n\t}\n\tveEditUrl.searchParams.delete( 'veaction' );\n\tveEditUrl.searchParams.delete( 'action' );\n\tif ( init.isSingleEditTab ) {\n\t\tveEditUrl.searchParams.set( 'action', 'edit' );\n\t\tveEditSourceUrl = veEditUrl;\n\t} else {\n\t\tveEditSourceUrl = new URL( veEditUrl );\n\t\tveEditUrl.searchParams.set( 'veaction', 'edit' );\n\t\tveEditSourceUrl.searchParams.set( 'veaction', 'editsource' );\n\t}\n\n\t// Whether VisualEditor should be available for the current user, page, wiki, mediawiki skin,\n\t// browser etc.\n\tinit.isAvailable = VisualEditorSupportCheck();\n\t// Extensions can disable VE in certain circumstances using the VisualEditorBeforeEditor hook (T174180)\n\n\tconst enabledForUser = (\n\t\t// User has 'visualeditor-enable' preference enabled (for alpha opt-in)\n\t\t// User has 'visualeditor-betatempdisable' preference disabled\n\t\t// User has 'visualeditor-autodisable' preference disabled\n\t\t( conf.isBeta ? enable : !tempdisable ) && !autodisable\n\t);\n\n\t// Partially duplicated in includes/Services/VisualEditorAvailabilityLookup::isAvailable\n\tinit.isVisualAvailable = ( url = currentUrl ) => (\n\t\tinit.isAvailable &&\n\n\t\t// If forced by the URL parameter, skip the namespace check (T221892) and preference check\n\t\t( url.searchParams.get( 'veaction' ) === 'edit' || (\n\t\t\t// Only in enabled namespaces\n\t\t\tconf.namespaces.includes( new mw.Title( mw.config.get( 'wgRelevantPageName' ) ).getNamespaceId() ) &&\n\n\t\t\t// Enabled per user preferences\n\t\t\tenabledForUser\n\t\t) ) &&\n\n\t\t// Only if the current page isn't using unsupported URL parameters\n\t\tisSupportedEditPage( url ) &&\n\n\t\t// Only for pages with a supported content model\n\t\tObject.prototype.hasOwnProperty.call( conf.contentModels, mw.config.get( 'wgPageContentModel' ) ) &&\n\n\t\t// Adding a section is not supported in visual mode\n\t\tgetSectionFromUrl( url ) !== 'new'\n\t);\n\n\t// Partially duplicated in includes/Hooks.php#isWikitextAvailable\n\tinit.isWikitextAvailable = ( url = currentUrl ) => (\n\t\tinit.isAvailable &&\n\n\t\t// If forced by the URL parameter, skip the checks (T239796)\n\t\t( url.searchParams.get( 'veaction' ) === 'editsource' || (\n\t\t\t// Enabled on site\n\t\t\tconf.enableWikitext &&\n\n\t\t\t// User preference\n\t\t\tmw.user.options.get( 'visualeditor-newwikitext' )\n\t\t) ) &&\n\n\t\t// Only on wikitext pages\n\t\tmw.config.get( 'wgPageContentModel' ) === 'wikitext'\n\t);\n\n\tfunction getAvailableModes() {\n\t\tconst availableModes = [];\n\t\tif ( init.isVisualAvailable() ) {\n\t\t\tavailableModes.push( 'visual' );\n\t\t}\n\t\tif ( init.isWikitextAvailable() ) {\n\t\t\tavailableModes.push( 'source' );\n\t\t}\n\t\treturn availableModes;\n\t}\n\n\t// FIXME: We should do this more elegantly\n\tinit.setEditorPreference = setEditorPreference;\n\n\tinit.updateTabs = updateTabs;\n\n\t// Note: Though VisualEditor itself only needed this exposure for a very small reason\n\t// (namely to access the old init.unsupportedList from the unit tests...) this has become one\n\t// of the nicest ways to easily detect whether the VisualEditor initialisation code is present.\n\t//\n\t// The VE global was once available always, but now that platform integration initialisation\n\t// is properly separated, it doesn't exist until the platform loads VisualEditor core.\n\t//\n\t// Most of mw.libs.ve is considered subject to change and private.  An exception is that\n\t// mw.libs.ve.isVisualAvailable is public, and indicates whether the VE editor itself can be loaded\n\t// on this page. See above for why it may be false.\n\tmw.libs.ve = $.extend( mw.libs.ve || {}, init );\n\n\tif ( init.isVisualAvailable() ) {\n\t\t$( 'html' ).addClass( 've-available' );\n\t} else {\n\t\t$( 'html' ).addClass( 've-not-available' );\n\t\t// Don't return here because we do want the skin setup to consistently happen\n\t\t// for e.g. \"Edit\" > \"Edit source\" even when VE is not available.\n\t}\n\n\t/**\n\t * Get the edit mode for the given URL\n\t *\n\t * @param {URL} url Edit URL\n\t * @return {string|null} 'visual' or 'source', null if the editor is not being loaded\n\t */\n\tfunction getEditModeFromUrl( url ) {\n\t\tif ( mw.config.get( 'wgDiscussionToolsStartNewTopicTool' ) ) {\n\t\t\t// Avoid conflicts with DiscussionTools\n\t\t\treturn null;\n\t\t}\n\t\tif ( isViewPage && init.isAvailable ) {\n\t\t\t// On view pages if veaction is correctly set\n\t\t\tconst mode = veactionToMode[ url.searchParams.get( 'veaction' ) ] ||\n\t\t\t\t// Always load VE visual mode if collabSession is set\n\t\t\t\t( url.searchParams.has( 'collabSession' ) ? 'visual' : null );\n\t\t\tif ( mode && getAvailableModes().includes( mode ) ) {\n\t\t\t\treturn mode;\n\t\t\t}\n\t\t}\n\t\t// Edit pages\n\t\tif ( isEditPage && isSupportedEditPage( url ) ) {\n\t\t\t// User has disabled VE, or we are in view source only mode, or we have landed here with posted data\n\t\t\tif ( !enabledForUser || $( '#ca-viewsource' ).length || mw.config.get( 'wgAction' ) === 'submit' ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn getAvailableEditPageEditor();\n\t\t}\n\t\treturn null;\n\t}\n\n\t$( () => {\n\t\t$targetContainer = $(\n\t\t\tdocument.querySelector( '[data-mw-ve-target-container]' ) ||\n\t\t\tdocument.getElementById( 'content' )\n\t\t);\n\t\tif ( pageCanLoadEditor ) {\n\t\t\t$targetContainer.addClass( 've-init-mw-desktopArticleTarget-targetContainer' );\n\t\t}\n\n\t\tlet showWikitextWelcome = true;\n\t\tconst numEditButtons = $( '#ca-edit, #ca-ve-edit' ).length,\n\t\t\tsection = getSectionFromUrl( currentUrl );\n\n\t\tconst requiredSkinElements =\n\t\t\t$targetContainer.length &&\n\t\t\t$( '#mw-content-text' ).length &&\n\t\t\t// A link to open the editor is technically not necessary if it's going to open itself\n\t\t\t( isEditPage || numEditButtons );\n\n\t\tif ( currentUrl.searchParams.get( 'action' ) === 'edit' && $( '#wpTextbox1' ).length ) {\n\t\t\tinitialWikitext = $( '#wpTextbox1' ).textSelection( 'getContents' );\n\t\t}\n\n\t\tif ( ( init.isVisualAvailable() || init.isWikitextAvailable() ) &&\n\t\t\tpageCanLoadEditor &&\n\t\t\tpageIsProbablyEditable &&\n\t\t\t!requiredSkinElements\n\t\t) {\n\t\t\tmw.log.warn(\n\t\t\t\t'Your skin is incompatible with VisualEditor. ' +\n\t\t\t\t'See https://www.mediawiki.org/wiki/Extension:VisualEditor/Skin_requirements for the requirements.'\n\t\t\t);\n\t\t\t// If the edit buttons are not there it's likely a browser extension or gadget for anonymous user\n\t\t\t// has removed them. We're not interested in errors from this scenario so don't log.\n\t\t\t// If they exist log the error so we can address the problem.\n\t\t\tif ( numEditButtons > 0 ) {\n\t\t\t\tconst err = new Error( 'Incompatible with VisualEditor' );\n\t\t\t\terr.name = 'VeIncompatibleSkinWarning';\n\t\t\t\tmw.errorLogger.logError( err, 'error.visualeditor' );\n\t\t\t}\n\t\t} else if ( init.isAvailable ) {\n\t\t\tconst mode = getEditModeFromUrl( currentUrl );\n\t\t\tif ( mode ) {\n\t\t\t\tshowWikitextWelcome = false;\n\t\t\t\ttrackActivateStart( {\n\t\t\t\t\ttype: section === null ? 'page' : 'section',\n\t\t\t\t\tmechanism: ( section === 'new' || !mw.config.get( 'wgArticleId' ) ) ? 'url-new' : 'url',\n\t\t\t\t\tmode: mode\n\t\t\t\t} );\n\t\t\t\tactivateTarget( mode, section );\n\t\t\t} else if (\n\t\t\t\tinit.isVisualAvailable() &&\n\t\t\t\tpageCanLoadEditor &&\n\t\t\t\tinit.isSingleEditTab\n\t\t\t) {\n\t\t\t\t// In single edit tab mode we never have an edit tab\n\t\t\t\t// with accesskey 'v' so create one\n\t\t\t\t$( document.body ).append(\n\t\t\t\t\t$( '<a>' )\n\t\t\t\t\t\t// veEditUrl is safe\n\t\t\t\t\t\t// eslint-disable-next-line local/no-unsanitized-href\n\t\t\t\t\t\t.attr( { accesskey: mw.msg( 'accesskey-ca-ve-edit' ), href: veEditUrl } )\n\t\t\t\t\t\t// Accesskey fires a click event\n\t\t\t\t\t\t.on( 'click.ve-target', init.onEditTabClick.bind( init, 'visual' ) )\n\t\t\t\t\t\t.addClass( 'oo-ui-element-hidden' )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Add the switch button to WikiEditor on edit pages\n\t\t\tif (\n\t\t\t\tinit.isVisualAvailable() &&\n\t\t\t\tisEditPage &&\n\t\t\t\t$( '#wpTextbox1' ).length\n\t\t\t) {\n\t\t\t\tmw.loader.load( 'ext.visualEditor.switching' );\n\t\t\t\tmw.hook( 'wikiEditor.toolbarReady' ).add( ( $textarea ) => {\n\t\t\t\t\tmw.loader.using( 'ext.visualEditor.switching' ).then( () => {\n\t\t\t\t\t\tconst showPopup = currentUrl.searchParams.has( 'veswitched' ) && !mw.user.options.get( 'visualeditor-hidesourceswitchpopup' ),\n\t\t\t\t\t\t\ttoolFactory = new OO.ui.ToolFactory(),\n\t\t\t\t\t\t\ttoolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\t\t\t\t\ttoolFactory.register( mw.libs.ve.MWEditModeVisualTool );\n\t\t\t\t\t\ttoolFactory.register( mw.libs.ve.MWEditModeSourceTool );\n\t\t\t\t\t\tconst switchToolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\t\t\t\t\tclasses: [ 've-init-mw-editSwitch' ]\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tswitchToolbar.on( 'switchEditor', ( m ) => {\n\t\t\t\t\t\t\tif ( m === 'visual' ) {\n\t\t\t\t\t\t\t\t$( '#wpTextbox1' ).trigger( 'wikiEditor-switching-visualeditor' );\n\t\t\t\t\t\t\t\tinit.activateVe( 'visual' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tswitchToolbar.setup( [ {\n\t\t\t\t\t\t\tname: 'editMode',\n\t\t\t\t\t\t\ttype: 'list',\n\t\t\t\t\t\t\ticon: 'edit',\n\t\t\t\t\t\t\ttitle: mw.msg( 'visualeditor-mweditmode-tooltip' ),\n\t\t\t\t\t\t\tlabel: mw.msg( 'visualeditor-mweditmode-tooltip' ),\n\t\t\t\t\t\t\tinvisibleLabel: true,\n\t\t\t\t\t\t\tinclude: [ 'editModeVisual', 'editModeSource' ]\n\t\t\t\t\t\t} ] );\n\n\t\t\t\t\t\tconst popup = new mw.libs.ve.SwitchPopupWidget( 'source' );\n\n\t\t\t\t\t\tswitchToolbar.tools.editModeVisual.toolGroup.$element.append( popup.$element );\n\t\t\t\t\t\tswitchToolbar.emit( 'updateState' );\n\n\t\t\t\t\t\t$textarea.wikiEditor( 'addToToolbar', {\n\t\t\t\t\t\t\tsection: 'secondary',\n\t\t\t\t\t\t\tgroup: 'default',\n\t\t\t\t\t\t\ttools: {\n\t\t\t\t\t\t\t\tveEditSwitch: {\n\t\t\t\t\t\t\t\t\ttype: 'element',\n\t\t\t\t\t\t\t\t\telement: switchToolbar.$element\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tpopup.toggle( showPopup );\n\n\t\t\t\t\t\t// Duplicate of this code in ve.init.mw.DesktopArticleTarget.js\n\t\t\t\t\t\t// eslint-disable-next-line no-jquery/no-class-state\n\t\t\t\t\t\tif ( $( '#ca-edit' ).hasClass( 'visualeditor-showtabdialog' ) ) {\n\t\t\t\t\t\t\t$( '#ca-edit' ).removeClass( 'visualeditor-showtabdialog' );\n\t\t\t\t\t\t\t// Set up a temporary window manager\n\t\t\t\t\t\t\tconst windowManager = new OO.ui.WindowManager();\n\t\t\t\t\t\t\t$( OO.ui.getTeleportTarget() ).append( windowManager.$element );\n\t\t\t\t\t\t\tconst editingTabDialog = new mw.libs.ve.EditingTabDialog();\n\t\t\t\t\t\t\twindowManager.addWindows( [ editingTabDialog ] );\n\t\t\t\t\t\t\twindowManager.openWindow( editingTabDialog )\n\t\t\t\t\t\t\t\t.closed.then( ( data ) => {\n\t\t\t\t\t\t\t\t\t// Detach the temporary window manager\n\t\t\t\t\t\t\t\t\twindowManager.destroy();\n\n\t\t\t\t\t\t\t\t\tif ( data && data.action === 'prefer-ve' ) {\n\t\t\t\t\t\t\t\t\t\tlocation.href = veEditUrl;\n\t\t\t\t\t\t\t\t\t} else if ( data && data.action === 'multi-tab' ) {\n\t\t\t\t\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t\t\t\t\t}\n\t\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\n\t\t\t\t// Remember that the user wanted wikitext, at least this time\n\t\t\t\tmw.libs.ve.setEditorPreference( 'wikitext' );\n\n\t\t\t\t// If the user has loaded WikiEditor, clear any auto-save state they\n\t\t\t\t// may have from a previous VE session\n\t\t\t\t// We don't have access to the VE session storage methods, but invalidating\n\t\t\t\t// the docstate is sufficient to prevent the data from being used.\n\t\t\t\tmw.storage.session.remove( 've-docstate' );\n\t\t\t}\n\n\t\t\tinit.setupEditLinks();\n\t\t}\n\n\t\tif (\n\t\t\tpageCanLoadEditor &&\n\t\t\tshowWikitextWelcome &&\n\t\t\t// At least one editor is available (T201928)\n\t\t\t( init.isVisualAvailable() || init.isWikitextAvailable() || $( '#wpTextbox1' ).length ) &&\n\t\t\tisEditPage &&\n\t\t\tinit.shouldShowWelcomeDialog() &&\n\t\t\t// Not on protected pages\n\t\t\tpageIsProbablyEditable\n\t\t) {\n\t\t\tmw.loader.using( 'ext.visualEditor.welcome' ).then( () => {\n\t\t\t\t// Check shouldShowWelcomeDialog() again: any code that might have called\n\t\t\t\t// stopShowingWelcomeDialog() wouldn't have had an opportunity to do that\n\t\t\t\t// yet by the first time we checked\n\t\t\t\tif ( !init.shouldShowWelcomeDialog() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst windowManager = new OO.ui.WindowManager();\n\t\t\t\tconst welcomeDialog = new mw.libs.ve.WelcomeDialog();\n\t\t\t\t$( OO.ui.getTeleportTarget() ).append( windowManager.$element );\n\t\t\t\twindowManager.addWindows( [ welcomeDialog ] );\n\t\t\t\twindowManager.openWindow(\n\t\t\t\t\twelcomeDialog,\n\t\t\t\t\t{\n\t\t\t\t\t\tswitchable: init.isVisualAvailable(),\n\t\t\t\t\t\teditor: 'source'\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\t\t.closed.then( ( data ) => {\n\t\t\t\t\t\twindowManager.destroy();\n\t\t\t\t\t\tif ( data && data.action === 'switch-ve' ) {\n\t\t\t\t\t\t\tinit.activateVe( 'visual' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\tinit.stopShowingWelcomeDialog();\n\t\t\t} );\n\t\t}\n\n\t\tif ( currentUrl.searchParams.has( 'venotify' ) ) {\n\t\t\tcurrentUrl.searchParams.delete( 'venotify' );\n\t\t\t// Get rid of the ?venotify= from the URL\n\t\t\thistory.replaceState( null, '', currentUrl );\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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.mw.DiffLoader.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":48,"column":1,"nodeType":"Block","endLine":48,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":49,"column":1,"nodeType":"Block","endLine":49,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":81,"column":1,"nodeType":"Block","endLine":81,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":82,"column":1,"nodeType":"Block","endLine":82,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":83,"column":1,"nodeType":"Block","endLine":83,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":86,"column":1,"nodeType":"Block","endLine":86,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki DiffLoader.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/* global ve */\n\n/**\n * Diff loader.\n *\n * @class mw.libs.ve.diffLoader\n * @singleton\n * @hideconstructor\n */\n( function () {\n\tconst revCache = {};\n\n\tmw.libs.ve = mw.libs.ve || {};\n\n\tmw.libs.ve.diffLoader = {\n\t\t/**\n\t\t * Get a ve.dm.Document model from a Parsoid response\n\t\t *\n\t\t * @param {Object} response Parsoid response from the VisualEditor API\n\t\t * @param {string|null} section Section. Null for the whole document.\n\t\t * @return {ve.dm.Document|null} Document, or null if an invalid response\n\t\t */\n\t\tgetModelFromResponse: function ( response, section ) {\n\t\t\t// This method is only called after actually loading these, see `parseDocumentModulePromise`\n\t\t\tconst targetClass = ve.init.mw.ArticleTarget,\n\t\t\t\tdata = response ? ( response.visualeditor || response.visualeditoredit ) : null;\n\t\t\tif ( data && typeof data.content === 'string' ) {\n\t\t\t\tconst doc = targetClass.static.parseDocument( data.content, 'visual', section, section !== null );\n\t\t\t\tmw.libs.ve.stripRestbaseIds( doc );\n\t\t\t\treturn targetClass.static.createModelFromDom( doc, 'visual' );\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\n\t\t/**\n\t\t * Fetch a specific revision from Parsoid as a DM document, and cache in memory\n\t\t *\n\t\t * @param {number} revId Revision ID\n\t\t * @param {string} [pageName] Page name, defaults to wgRelevantPageName\n\t\t * @param {string|null} [section=null] Section. Null for the whole document.\n\t\t * @param {jQuery.Promise} [parseDocumentModulePromise] Promise which resolves when Target#parseDocument is available\n\t\t * @return {jQuery.Promise} Promise which resolves with a document model\n\t\t */\n\t\tfetchRevision: function ( revId, pageName, section, parseDocumentModulePromise ) {\n\t\t\tpageName = pageName || mw.config.get( 'wgRelevantPageName' );\n\t\t\tparseDocumentModulePromise = parseDocumentModulePromise || $.Deferred().resolve().promise();\n\t\t\tsection = section !== undefined ? section : null;\n\n\t\t\tconst cacheKey = revId + ( section !== null ? '/' + section : '' );\n\n\t\t\trevCache[ cacheKey ] = revCache[ cacheKey ] ||\n\t\t\t\tmw.libs.ve.targetLoader.requestParsoidData(\n\t\t\t\t\tpageName,\n\t\t\t\t\t{ oldId: revId, targetName: 'diff' },\n\t\t\t\t\tfalse,\n\t\t\t\t\t// noMetadata, we only use `content` in getModelFromResponse\n\t\t\t\t\ttrue\n\t\t\t\t).then(\n\t\t\t\t\t( response ) => parseDocumentModulePromise.then( () => mw.libs.ve.diffLoader.getModelFromResponse( response, section ) ),\n\t\t\t\t\t( ...args ) => {\n\t\t\t\t\t\t// Clear promise. Do not cache errors.\n\t\t\t\t\t\tdelete revCache[ cacheKey ];\n\t\t\t\t\t\t// Let caller handle the error code\n\t\t\t\t\t\treturn $.Deferred().reject( ...args );\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\treturn revCache[ cacheKey ];\n\t\t},\n\n\t\t/**\n\t\t * Get a visual diff generator promise\n\t\t *\n\t\t * @param {number|jQuery.Promise} oldIdOrPromise Old revision ID, or document model promise\n\t\t * @param {number|jQuery.Promise} newIdOrPromise New revision ID, or document model promise\n\t\t * @param {jQuery.Promise} [parseDocumentModulePromise] Promise which resolves when Target#parseDocument is available\n\t\t * @param {string} [oldPageName] Old revision's page name, defaults to wgRelevantPageName\n\t\t * @param {string} [newPageName] New revision's page name, defaults to oldPageName\n\t\t * @return {jQuery.Promise} Promise which resolves with a ve.dm.VisualDiff generator function\n\t\t */\n\t\tgetVisualDiffGeneratorPromise: function ( oldIdOrPromise, newIdOrPromise, parseDocumentModulePromise, oldPageName, newPageName ) {\n\t\t\tparseDocumentModulePromise = parseDocumentModulePromise || $.Deferred().resolve().promise();\n\t\t\toldPageName = oldPageName || mw.config.get( 'wgRelevantPageName' );\n\n\t\t\tconst oldRevPromise = typeof oldIdOrPromise === 'number' ? this.fetchRevision( oldIdOrPromise, oldPageName, null, parseDocumentModulePromise ) : oldIdOrPromise;\n\t\t\tconst newRevPromise = typeof newIdOrPromise === 'number' ? this.fetchRevision( newIdOrPromise, newPageName, null, parseDocumentModulePromise ) : newIdOrPromise;\n\n\t\t\treturn $.when( oldRevPromise, newRevPromise, parseDocumentModulePromise ).then( ( oldDoc, newDoc ) => {\n\t\t\t\t// TODO: Differ expects newDoc to be derived from oldDoc and contain all its store data.\n\t\t\t\t// We may want to remove that assumption from the differ?\n\t\t\t\tnewDoc.getStore().merge( oldDoc.getStore() );\n\t\t\t\treturn () => new ve.dm.VisualDiff( oldDoc, newDoc );\n\t\t\t} );\n\t\t}\n\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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.mw.DiffPage.init.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":55,"column":3,"nodeType":"CallExpression","endLine":55,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-undef","severity":2,"message":"'ve' is not defined.","line":79,"column":23,"nodeType":"Identifier","messageId":"undef","endLine":79,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":134,"column":34,"nodeType":"CallExpression","endLine":134,"endColumn":72,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":152,"column":3,"nodeType":"CallExpression","endLine":152,"endColumn":39,"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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.mw.ProgressBarWidget.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":"implicit-arrow-linebreak","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-mw/preinit/ve.init.mw.TempWikitextEditorWidget.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":"implicit-arrow-linebreak","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-mw/preinit/ve.utils.parsoid.js","messages":[],"suppressedMessages":[{"ruleId":"local/no-unsanitized-href","severity":2,"message":"Don't set 'href' without sanitizing; use ve.setAttributeSafe.","line":169,"column":4,"nodeType":"CallExpression","messageId":"noHref","endLine":169,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"local/no-unsanitized-href","severity":2,"message":"Don't set 'href' without sanitizing; use ve.setAttributeSafe.","line":239,"column":5,"nodeType":"CallExpression","messageId":"noHref","endLine":239,"endColumn":55,"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":"implicit-arrow-linebreak","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-mw/tests/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","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/ve-mw/tests/ce/ve.ce.ClipboardHandler.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":"implicit-arrow-linebreak","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":"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-mw/tests/ce/ve.ce.ContentBranchNode.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":"implicit-arrow-linebreak","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":"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-mw/tests/ce/ve.ce.Document.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/annotations/ve.dm.MWInternalLinkAnnotation.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/models/ve.dm.MWImageModel.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/models/ve.dm.MWTemplateModel.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/models/ve.dm.MWTemplateSpecModel.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/models/ve.dm.MWTransclusionContentModel.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/models/ve.dm.MWTransclusionModel.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/nodes/ve.dm.MWTransclusionNode.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/ve.dm.Converter.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/ve.dm.Document.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/ve.dm.SurfaceFragment.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":"implicit-arrow-linebreak","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":"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-mw/tests/dm/ve.dm.mwExample.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":"implicit-arrow-linebreak","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":"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-mw/tests/init/targets/ve.init.mw.DesktopArticleTarget.test.js","messages":[{"ruleId":"mediawiki/no-storage","severity":2,"message":"Avoid direct access to sessionStorage. Use mw.storage.session instead.","line":143,"column":35,"nodeType":"Identifier","messageId":"noStorage","endLine":143,"endColumn":49}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":108,"column":2,"nodeType":"CallExpression","endLine":108,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization DesktopArticleTarget tests.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\nQUnit.module( 've.init.mw.DesktopArticleTarget', ve.test.utils.newMwEnvironment( {\n\tconfig: {\n\t\twgVisualEditor: ve.extendObject( {}, mw.config.get( 'wgVisualEditor' ), {\n\t\t\tpageLanguageCode: 'he',\n\t\t\tpageLanguageDir: 'rtl'\n\t\t} ),\n\t\twgVisualEditorConfig: ve.extendObject( {}, mw.config.get( 'wgVisualEditorConfig' ), {\n\t\t\t// Disable welcome dialog\n\t\t\tshowBetaWelcome: false\n\t\t} ),\n\t\twgAction: 'view',\n\t\twgNamespaceNumber: 0,\n\t\twgCanonicalNamespace: ''\n\t},\n\tbeforeEach: function () {\n\t\tthis.originalLocation = location.href;\n\t},\n\tafterEach: function () {\n\t\t// Clean up after history.pushState in ve.init.mw.DesktopArticleTarget#restorePage,\n\t\t// which replaces JavaScriptTest with Badtitle and leaves it behind\n\t\tif ( location.href !== this.originalLocation ) {\n\t\t\thistory.replaceState( null, '', this.originalLocation );\n\t\t}\n\t}\n} ) );\n\nQUnit.test( 'init', ( assert ) => {\n\tconst response = {\n\t\t\tvisualeditor: {\n\t\t\t\tresult: 'success',\n\t\t\t\tnotices: [\n\t\t\t\t\t'<b>HTML string notice</b> message',\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'object notice',\n\t\t\t\t\t\tmessage: '<b>object notice</b> message'\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tcopyrightWarning: '<div id=\"editpage-copywarn\">Blah blah</div>',\n\t\t\t\tcheckboxesDef: {\n\t\t\t\t\twpMinoredit: {\n\t\t\t\t\t\tid: 'wpMinoredit',\n\t\t\t\t\t\t'label-message': 'minoredit',\n\t\t\t\t\t\ttooltip: 'minoredit',\n\t\t\t\t\t\t'label-id': 'mw-editpage-minoredit',\n\t\t\t\t\t\t'legacy-name': 'minor',\n\t\t\t\t\t\tdefault: false\n\t\t\t\t\t},\n\t\t\t\t\twpWatchthis: {\n\t\t\t\t\t\tid: 'wpWatchthis',\n\t\t\t\t\t\t'label-message': 'watchthis',\n\t\t\t\t\t\ttooltip: 'watch',\n\t\t\t\t\t\t'label-id': 'mw-editpage-watch',\n\t\t\t\t\t\t'legacy-name': 'watch',\n\t\t\t\t\t\tdefault: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcheckboxesMessages: {\n\t\t\t\t\t'accesskey-minoredit': 'i',\n\t\t\t\t\t'tooltip-minoredit': 'Mark this as a minor edit',\n\t\t\t\t\tminoredit: 'This is a minor edit',\n\t\t\t\t\t'accesskey-watch': 'w',\n\t\t\t\t\t'tooltip-watch': 'Add this page to your watchlist',\n\t\t\t\t\twatchthis: 'Watch this page'\n\t\t\t\t},\n\t\t\t\tprotectedClasses: '',\n\t\t\t\tbasetimestamp: '20161119005107',\n\t\t\t\tstarttimestamp: '20180831122319',\n\t\t\t\toldid: 1804,\n\t\t\t\tblockinfo: null,\n\t\t\t\twouldautocreate: false,\n\t\t\t\tcanEdit: true,\n\t\t\t\tcontent: '<!DOCTYPE html>\\n' + ve.dm.example.singleLine`\n\t\t\t\t\t<html prefix=\"dc: http://purl.org/dc/terms/ mw: http://mediawiki.org/rdf/\" about=\"http://localhost/MediaWiki/core/index.php/Special:Redirect/revision/1804\">\n\t\t\t\t\t\t<head prefix=\"mwr: http://localhost/MediaWiki/core/index.php/Special:Redirect/\"><meta property=\"mw:TimeUuid\" content=\"a4fc0409-ad18-11e8-9b45-dd8cefbedb6d\"/>\n\t\t\t\t\t\t\t<meta charset=\"utf-8\"/>\n\t\t\t\t\t\t\t<meta property=\"mw:pageNamespace\" content=\"0\"/>\n\t\t\t\t\t\t\t<meta property=\"mw:pageId\" content=\"643\"/>\n\t\t\t\t\t\t\t<link rel=\"dc:replaces\" resource=\"mwr:revision/0\"/>\n\t\t\t\t\t\t\t<meta property=\"dc:modified\" content=\"2016-11-19T00:51:07.000Z\"/>\n\t\t\t\t\t\t\t<meta property=\"mw:revisionSHA1\" content=\"da39a3ee5e6b4b0d3255bfef95601890afd80709\"/>\n\t\t\t\t\t\t\t<meta property=\"mw:html:version\" content=\"1.7.0\"/>\n\t\t\t\t\t\t\t<link rel=\"dc:isVersionOf\" href=\"http://localhost/MediaWiki/core/index.php/Empty\"/>\n\t\t\t\t\t\t\t<title>Empty</title>\n\t\t\t\t\t\t\t<base href=\"http://localhost/MediaWiki/core/index.php/\"/>\n\t\t\t\t\t\t\t<link rel=\"stylesheet\" href=\"//localhost/MediaWiki/core/load.php?modules=mediawiki.legacy.commonPrint%2Cshared%7Cmediawiki.skinning.content.parsoid%7Cmediawiki.skinning.interface%7Cskins.vector.styles%7Csite.styles%7Cext.cite.style%7Cext.cite.styles%7Cmediawiki.page.gallery.styles&amp;only=styles&amp;skin=vector\"/>\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t<body id=\"mwAA\" lang=\"he\" class=\"mw-content-rtl sitedir-rtl rtl mw-body-content parsoid-body mediawiki mw-parser-output\" dir=\"rtl\">\n\t\t\t\t\t\t\t<section data-mw-section-id=\"0\" id=\"mwAQ\"></section>\n\t\t\t\t\t\t</body>\n\t\t\t\t\t</html>\n\t\t\t\t`,\n\t\t\t\tpreloaded: false,\n\t\t\t\tetag: '\"1804/a4fc0409-ad18-11e8-9b45-dd8cefbedb6d\"'\n\t\t\t}\n\t\t},\n\t\ttarget = new ve.init.mw.DesktopArticleTarget(),\n\t\tdataPromise = ve.createDeferred().resolve( response ).promise(),\n\t\tdone = assert.async();\n\n\t// eslint-disable-next-line no-jquery/no-global-selector\n\t$( '#qunit-fixture' ).append( target.$element );\n\n\ttarget.on( 'surfaceReady', () => {\n\t\tassert.strictEqual( target.getSurface().getModel().getDocument().getLang(), 'he', 'Page language is passed through from config' );\n\t\tassert.strictEqual( target.getSurface().getModel().getDocument().getDir(), 'rtl', 'Page direction is passed through from config' );\n\t\ttarget.activatingDeferred.then( async () => {\n\t\t\tassert.equalDomElement(\n\t\t\t\ttarget.toolbar.tools.notices.noticeItems[ 0 ].$element[ 0 ],\n\t\t\t\t$( '<div class=\"ve-ui-mwNoticesPopupTool-item\"><b>HTML string notice</b> message</div>' )[ 0 ],\n\t\t\t\t'HTML string notice message is passed through from API'\n\t\t\t);\n\t\t\tassert.strictEqual( target.toolbar.tools.notices.noticeItems[ 0 ].type, undefined, 'Plain text notice type is undefined' );\n\t\t\tassert.equalDomElement(\n\t\t\t\ttarget.toolbar.tools.notices.noticeItems[ 1 ].$element[ 0 ],\n\t\t\t\t$( '<div class=\"ve-ui-mwNoticesPopupTool-item\"><b>object notice</b> message</div>' )[ 0 ],\n\t\t\t\t'Object notice message is passed through from API'\n\t\t\t);\n\t\t\tassert.strictEqual( target.toolbar.tools.notices.noticeItems[ 1 ].type, 'object notice', 'Object notice type is passed through from API' );\n\n\t\t\t// Open the save dialog and examine it (this bypasses a bunch of stuff, and may fail in funny\n\t\t\t// ways, but #showSaveDialog has many dependencies that I don't want to simulate here).\n\t\t\tconst dialogs = target.getSurface().getDialogs();\n\t\t\tconst instance = dialogs.openWindow( 'mwSave', target.getSaveDialogOpeningData() );\n\t\t\tawait instance.opened;\n\t\t\tconst dialog = dialogs.getCurrentWindow();\n\t\t\tassert.equalDomElement(\n\t\t\t\tdialog.$element.find( '#editpage-copywarn' )[ 0 ],\n\t\t\t\t$( '<div id=\"editpage-copywarn\">Blah blah</div>' )[ 0 ],\n\t\t\t\t'Copyright warning message is passed through from API'\n\t\t\t);\n\t\t\tdialogs.closeWindow( 'mwSave' );\n\t\t\tawait instance.closed;\n\n\t\t\t// Store doc state and examine it\n\t\t\ttarget.storeDocState();\n\t\t\tconst storedData = JSON.parse( sessionStorage.getItem( 've-docstate' ) );\n\t\t\tconst ignoredKeys = {\n\t\t\t\t// Not stored because it's always 'success'\n\t\t\t\tresult: true,\n\t\t\t\t// Not stored because it's stored elsewhere\n\t\t\t\tcontent: true,\n\t\t\t\t// Not stored because if you're blocked, the editor opens in read-only mode (or doesn't open\n\t\t\t\t// at all, on mobile), so we'll never have to restore from auto-save\n\t\t\t\tblockinfo: true\n\t\t\t};\n\t\t\tfor ( const key in response.visualeditor ) {\n\t\t\t\tif ( !ignoredKeys[ key ] ) {\n\t\t\t\t\tassert.deepEqual(\n\t\t\t\t\t\tstoredData.response[ key ],\n\t\t\t\t\t\tresponse.visualeditor[ key ],\n\t\t\t\t\t\tkey + ' can be restored from auto-save data'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait target.destroy();\n\t\t\tdone();\n\t\t} );\n\t} );\n\ttarget.activate( dataPromise );\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":"implicit-arrow-linebreak","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":"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-mw/tests/preinit/ve.utils.parsoid.test.js","messages":[],"suppressedMessages":[{"ruleId":"no-script-url","severity":2,"message":"Script URL is a form of eval.","line":227,"column":10,"nodeType":"Literal","messageId":"unexpectedScriptURL","endLine":227,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-script-url","severity":2,"message":"Script URL is a form of eval.","line":229,"column":12,"nodeType":"Literal","messageId":"unexpectedScriptURL","endLine":229,"endColumn":32,"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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/actions/ve.ui.FormatAction.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/actions/ve.ui.MWLinkAction.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.test.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'QUnit.Assert' is undefined.","line":21,"column":1,"nodeType":"Block","endLine":21,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWWikitextStringTransferHandler tests.\n *\n * @copyright See AUTHORS.txt\n */\n\nQUnit.module( 've.ui.MWWikitextStringTransferHandler', ve.test.utils.newMwEnvironment( {\n\tbeforeEach() {\n\t\t// Mock XHR for mw.Api()\n\t\tthis.server = this.sandbox.useFakeServer();\n\t\t// Random number, chosen by a fair dice roll.\n\t\t// Used to make #mwt ID deterministic\n\t\tthis.randomStub = sinon.stub( Math, 'random' ).returns( 0.04 );\n\t},\n\tafterEach() {\n\t\tthis.randomStub.restore();\n\t}\n} ) );\n\n/**\n * @param {QUnit.Assert} assert\n * @param {Object} caseItem\n * @param {Object} caseItem.server\n * @param {string} caseItem.pasteString\n * @param {string} caseItem.pasteType\n * @param {string} caseItem.parsoidResponse\n * @param {Array} caseItem.expectedData\n * @param {boolean} caseItem.assertDom\n * @param {string} caseItem.base\n * @param {string} caseItem.msg\n */\nve.test.utils.runWikitextStringHandlerTest = function ( assert, caseItem ) {\n\tif ( arguments.length > 2 ) {\n\t\tcaseItem = {\n\t\t\tserver: arguments[ 1 ],\n\t\t\tpasteString: arguments[ 2 ],\n\t\t\tpasteType: arguments[ 3 ],\n\t\t\tparsoidResponse: arguments[ 4 ],\n\t\t\texpectedData: arguments[ 5 ],\n\t\t\t// annotations\n\t\t\tassertDom: arguments[ 7 ],\n\t\t\tbase: arguments[ 8 ],\n\t\t\tmsg: arguments[ 9 ]\n\t\t};\n\t}\n\tconst done = assert.async(),\n\t\titem = ve.ui.DataTransferItem.static.newFromString( caseItem.pasteString, caseItem.pasteType ),\n\t\tdoc = ve.dm.Document.static.newBlankDocument(),\n\t\tmockSurface = {\n\t\t\tgetModel: () => ( {\n\t\t\t\t\tgetDocument: () => doc\n\t\t\t\t} ),\n\t\t\tcreateProgress: () => ve.createDeferred().promise()\n\t\t};\n\n\tve.fixBase( doc.getHtmlDocument(), doc.getHtmlDocument(), caseItem.base );\n\n\t// Check we match the wikitext string handler\n\tconst name = ve.ui.dataTransferHandlerFactory.getHandlerNameForItem( item );\n\tassert.strictEqual( name, 'wikitextString', caseItem.msg + ': triggers match function' );\n\n\t// Invoke the handler\n\tconst handler = ve.ui.dataTransferHandlerFactory.create( 'wikitextString', mockSurface, item );\n\n\thandler.getInsertableData().then( ( docOrData ) => {\n\t\tlet actualData, store;\n\t\tif ( docOrData instanceof ve.dm.Document ) {\n\t\t\tactualData = docOrData.getData();\n\t\t\tstore = docOrData.getStore();\n\t\t} else {\n\t\t\tactualData = docOrData;\n\t\t\tstore = new ve.dm.HashValueStore();\n\t\t}\n\t\tve.dm.example.postprocessAnnotations( actualData, store );\n\t\tif ( caseItem.assertDom ) {\n\t\t\tassert.equalLinearDataWithDom( store, actualData, caseItem.expectedData, caseItem.msg + ': data match (with DOM)' );\n\t\t} else {\n\t\t\tassert.equalLinearData( actualData, caseItem.expectedData, caseItem.msg + ': data match' );\n\t\t}\n\t\tdone();\n\t} );\n\n\tif ( caseItem.server && caseItem.parsoidResponse ) {\n\t\tcaseItem.server.respond( [ 200, { 'Content-Type': 'application/json' }, JSON.stringify( {\n\t\t\tvisualeditor: {\n\t\t\t\tresult: 'success',\n\t\t\t\tcontent: caseItem.parsoidResponse\n\t\t\t}\n\t\t} ) ] );\n\t}\n};\n\nQUnit.test.each( 'convert', [\n\t{\n\t\tmsg: 'Simple link',\n\t\t// Put link in the middle of text to verify that the\n\t\t// start-of-line and end-of-line anchors on the heading\n\t\t// identification pattern don't affect link identification\n\t\tpasteString: 'some [[Foo]] text',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<p>some <a rel=\"mw:WikiLink\" href=\"./Foo\" title=\"Foo\">Foo</a> text</p>',\n\t\texpectedData: [\n\t\t\t{ type: 'paragraph' },\n\t\t\t...'some ',\n\t\t\t...ve.dm.example.annotateText( 'Foo', {\n\t\t\t\ttype: 'link/mwInternal',\n\t\t\t\tattributes: {\n\t\t\t\t\tlookupTitle: 'Foo',\n\t\t\t\t\tnormalizedTitle: 'Foo',\n\t\t\t\t\ttitle: 'Foo'\n\t\t\t\t}\n\t\t\t} ),\n\t\t\t...' text',\n\t\t\t{ type: '/paragraph' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Simple link with no p-wrapping',\n\t\tpasteString: '*[[Foo]]',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<ul><li><a rel=\"mw:WikiLink\" href=\"./Foo\" title=\"Foo\">Foo</a></li></ul>',\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'list',\n\t\t\t\tattributes: { style: 'bullet' }\n\t\t\t},\n\t\t\t{ type: 'listItem' },\n\t\t\t{\n\t\t\t\ttype: 'paragraph',\n\t\t\t\tinternal: { generated: 'wrapper' }\n\t\t\t},\n\t\t\t...ve.dm.example.annotateText( 'Foo', {\n\t\t\t\ttype: 'link/mwInternal',\n\t\t\t\tattributes: {\n\t\t\t\t\tlookupTitle: 'Foo',\n\t\t\t\t\tnormalizedTitle: 'Foo',\n\t\t\t\t\ttitle: 'Foo'\n\t\t\t\t}\n\t\t\t} ),\n\t\t\t{ type: '/paragraph' },\n\t\t\t{ type: '/listItem' },\n\t\t\t{ type: '/list' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Simple template',\n\t\tpasteString: '{{Template}}',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<div typeof=\"mw:Transclusion\" about=\"#mwt1\">Template</div>',\n\t\tassertDom: true,\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'mwTransclusionBlock',\n\t\t\t\tattributes: {\n\t\t\t\t\tmw: {}\n\t\t\t\t},\n\t\t\t\toriginalDomElements: $.parseHTML( '<div typeof=\"mw:Transclusion\" about=\"#mwt40000000\">Template</div>' )\n\t\t\t},\n\t\t\t{ type: '/mwTransclusionBlock' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Headings, only RESTBase IDs stripped',\n\t\tpasteString: '==heading==',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<h2 id=\"mwAB\">foo</h2><h2 id=\"mw-meaningful-id\">bar</h2>',\n\t\tassertDom: true,\n\t\texpectedData: [\n\t\t\t{ type: 'mwHeading', attributes: { level: 2 }, originalDomElements: $.parseHTML( '<h2>foo</h2>' ) },\n\t\t\t...'foo',\n\t\t\t{ type: '/mwHeading' },\n\t\t\t{ type: 'mwHeading', attributes: { level: 2 }, originalDomElements: $.parseHTML( '<h2 id=\"mw-meaningful-id\">bar</h2>' ) },\n\t\t\t...'bar',\n\t\t\t{ type: '/mwHeading' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Headings, parsoid fallback ids don\\'t interfere with whitespace stripping',\n\t\tpasteString: '== Tudnivalók ==',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<h2 id=\"Tudnivalók\"><span id=\"Tudnival.C3.B3k\" typeof=\"mw:FallbackId\"></span> Tudnivalók </h2>',\n\t\tassertDom: true,\n\t\texpectedData: [\n\t\t\t{ type: 'mwHeading', attributes: { level: 2 }, originalDomElements: $.parseHTML( '<h2 id=\"Tudnivalók\"> Tudnivalók </h2>' ) },\n\t\t\t...'Tudnivalók',\n\t\t\t{ type: '/mwHeading' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Magic link (RFC)',\n\t\tpasteString: 'RFC 1234',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: false,\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'link/mwMagic',\n\t\t\t\tattributes: {\n\t\t\t\t\tcontent: 'RFC 1234'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: '/link/mwMagic'\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Magic link (PMID)',\n\t\tpasteString: 'PMID 1234',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: false,\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'link/mwMagic',\n\t\t\t\tattributes: {\n\t\t\t\t\tcontent: 'PMID 1234'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: '/link/mwMagic'\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Magic link (ISBN)',\n\t\tpasteString: 'ISBN 123456789X',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: false,\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'link/mwMagic',\n\t\t\t\tattributes: {\n\t\t\t\t\tcontent: 'ISBN 123456789X'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: '/link/mwMagic'\n\t\t\t}\n\t\t]\n\t}\n], function ( assert, caseItem ) {\n\tmw.config.set( {\n\t\twgArticlePath: '/wiki/$1'\n\t} );\n\n\tve.test.utils.runWikitextStringHandlerTest(\n\t\tassert,\n\t\t{\n\t\t\tserver: this.server,\n\t\t\tbase: ve.dm.mwExample.baseUri,\n\t\t\t...caseItem\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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/datatransferhandlers/ve.ui.UrlStringTransferHandler.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/dialogs/ve.ui.MWTransclusionDialog.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/inspectors/ve.ui.FragmentInspector.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/pages/ve.ui.MWAddParameterPage.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/pages/ve.ui.MWParameterPage.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/ve.ui.DiffElement.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/widgets/ve.ui.MWParameterCheckboxInputWidget.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/widgets/ve.ui.MWTemplateTitleInputWidget.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineButtonWidget.test.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":7,"column":15,"nodeType":"CallExpression","endLine":7,"endColumn":84,"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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineParameterSelectWidget.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineParameterWidget.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlinePartWidget.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlinePlaceholderWidget.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.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":"implicit-arrow-linebreak","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":"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-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineWidget.test.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":7,"column":15,"nodeType":"CallExpression","endLine":7,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'part_0' is not in camel case.","line":80,"column":22,"nodeType":"Identifier","messageId":"notCamelCase","endLine":80,"endColumn":28,"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":"implicit-arrow-linebreak","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":"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-mw/tests/ve.test.utils.js","messages":[{"ruleId":"es-x/no-iterator-prototype-toarray","severity":2,"message":"ES2025 'Iterator.prototype.toArray' method is forbidden.","line":45,"column":10,"nodeType":"MemberExpression","messageId":"forbidden","endLine":45,"endColumn":37}],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":2,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":41,"column":4,"nodeType":"CallExpression","endLine":41,"endColumn":85,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":88,"column":4,"nodeType":"CallExpression","endLine":88,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki test utilities.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n{\n\tconst MWDummyTarget = function MWDummyTarget() {\n\t\tMWDummyTarget.super.call( this );\n\t};\n\tOO.inheritClass( MWDummyTarget, ve.test.utils.DummyTarget );\n\tMWDummyTarget.prototype.setDefaultMode = () => {};\n\tMWDummyTarget.prototype.isSaveable = () => true;\n\t// Ensure a mock server is used (e.g. as in ve.ui.MWWikitextStringTransferHandler)\n\tMWDummyTarget.prototype.parseWikitextFragment = () => new mw.Api().post();\n\tMWDummyTarget.prototype.getContentApi = () => new mw.Api();\n\tMWDummyTarget.prototype.createSurface = ve.init.mw.Target.prototype.createSurface;\n\tMWDummyTarget.prototype.getSurfaceConfig = ve.init.mw.Target.prototype.getSurfaceConfig;\n\tMWDummyTarget.prototype.getSurfaceClasses = ve.init.mw.Target.prototype.getSurfaceClasses;\n\t// Copy import rules from mw target, for paste tests.\n\tMWDummyTarget.static.importRules = ve.init.mw.Target.static.importRules;\n\n\tve.test.utils.MWDummyTarget = MWDummyTarget;\n\n\tconst MWDummyPlatform = function MWDummyPlatform() {\n\t\tMWDummyPlatform.super.apply( this, arguments );\n\t\t// Disable some API requests from platform\n\t\tthis.imageInfoCache = null;\n\t};\n\tOO.inheritClass( MWDummyPlatform, ve.init.mw.Platform );\n\tMWDummyPlatform.prototype.getMessage = ( ...args ) => args.join( ',' );\n\tMWDummyPlatform.prototype.getHtmlMessage = ( ...args ) => {\n\t\tconst $wrapper = $( '<div>' );\n\t\targs.forEach( ( arg, i ) => {\n\t\t\tif ( i > 0 ) {\n\t\t\t\t$wrapper[ 0 ].appendChild( document.createTextNode( ',' ) );\n\t\t\t}\n\t\t\t// Strings are converted to text nodes\n\t\t\t// eslint-disable-next-line no-jquery/no-append-html\n\t\t\t$wrapper.append( typeof arg === 'string' ? document.createTextNode( arg ) : arg );\n\t\t} );\n\t\t// Merge text nodes\n\t\t$wrapper[ 0 ].normalize();\n\t\treturn $wrapper.contents().toArray();\n\t};\n\tve.test.utils.MWDummyPlatform = MWDummyPlatform;\n\n\t{\n\t\tconst setEditorPreference = mw.libs.ve.setEditorPreference,\n\t\t\tdummySetEditorPreference = () => ve.createDeferred().resolve().promise(),\n\t\t\toverrides = [\n\t\t\t\tve.dm.MWHeadingNode,\n\t\t\t\tve.dm.MWPreformattedNode,\n\t\t\t\tve.dm.MWTableNode,\n\t\t\t\tve.dm.MWExternalLinkAnnotation\n\t\t\t],\n\t\t\toverridden = [\n\t\t\t\tve.dm.InlineImageNode,\n\t\t\t\tve.dm.BlockImageNode\n\t\t\t];\n\n\t\tconst corePlatform = ve.init.platform,\n\t\t\tcoreTarget = ve.init.target,\n\t\t\tmwPlatform = new ve.test.utils.MWDummyPlatform();\n\t\t// Unregister mwPlatform\n\t\tve.init.platform = corePlatform;\n\n\t\tconst mwTarget = new ve.test.utils.MWDummyTarget();\n\t\t// Unregister mwTarget\n\t\tve.init.target = coreTarget;\n\n\t\tconst setupOverrides = function () {\n\t\t\tfor ( let i = 0; i < overrides.length; i++ ) {\n\t\t\t\tve.dm.modelRegistry.register( overrides[ i ] );\n\t\t\t}\n\t\t\tfor ( let i = 0; i < overridden.length; i++ ) {\n\t\t\t\tve.dm.modelRegistry.unregister( overridden[ i ] );\n\t\t\t}\n\t\t\tve.ui.windowFactory.unregister( ve.ui.LinkAnnotationInspector );\n\t\t\tve.ui.windowFactory.register( ve.ui.MWLinkAnnotationInspector );\n\n\t\t\tve.init.platform = mwPlatform;\n\t\t\tve.init.target = mwTarget;\n\t\t\tmw.libs.ve.setEditorPreference = dummySetEditorPreference;\n\t\t\t// Ensure the current target is appended to the current fixture\n\t\t\t// eslint-disable-next-line no-jquery/no-global-selector\n\t\t\t$( '#qunit-fixture' ).append( ve.init.target.$element );\n\t\t};\n\n\t\tconst teardownOverrides = function () {\n\t\t\tfor ( let i = 0; i < overrides.length; i++ ) {\n\t\t\t\tve.dm.modelRegistry.unregister( overrides[ i ] );\n\t\t\t}\n\t\t\tfor ( let i = 0; i < overridden.length; i++ ) {\n\t\t\t\tve.dm.modelRegistry.register( overridden[ i ] );\n\t\t\t}\n\t\t\tve.ui.windowFactory.unregister( ve.ui.MWLinkAnnotationInspector );\n\t\t\tve.ui.windowFactory.register( ve.ui.LinkAnnotationInspector );\n\n\t\t\tve.init.platform = corePlatform;\n\t\t\tve.init.target = coreTarget;\n\t\t\tmw.libs.ve.setEditorPreference = setEditorPreference;\n\t\t};\n\n\t\t// On load, teardown overrides so the first core tests run correctly\n\t\tteardownOverrides();\n\n\t\tve.test.utils.newMwEnvironment = function ( env = {} ) {\n\t\t\treturn QUnit.newMwEnvironment( ve.extendObject( {}, env, {\n\t\t\t\tbeforeEach: function () {\n\t\t\t\t\tsetupOverrides();\n\t\t\t\t\tif ( env.beforeEach ) {\n\t\t\t\t\t\tenv.beforeEach.call( this );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tafterEach: function () {\n\t\t\t\t\tteardownOverrides();\n\t\t\t\t\tif ( env.afterEach ) {\n\t\t\t\t\t\tenv.afterEach.call( this );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t};\n\t}\n\n\tconst getDomElementSummaryCore = ve.getDomElementSummary;\n\n\t/**\n\t * Override getDomElementSummary to extract HTML from data-mw/body.html\n\t * and make it comparable.\n\t *\n\t * @inheritdoc ve#getDomElementSummary\n\t */\n\tve.getDomElementSummary = function ( element, includeHtml ) {\n\t\t// \"Parent\" method\n\t\treturn getDomElementSummaryCore( element, includeHtml, ( name, value ) => {\n\t\t\tif ( name === 'data-mw' ) {\n\t\t\t\tconst obj = JSON.parse( value ),\n\t\t\t\t\thtml = ve.getProp( obj, 'body', 'html' );\n\t\t\t\tif ( html ) {\n\t\t\t\t\tobj.body.html = ve.getDomElementSummary( $( '<div>' ).html( html )[ 0 ] );\n\t\t\t\t}\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t\treturn value;\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":"implicit-arrow-linebreak","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":"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-mw/treeDiffer-global.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":"implicit-arrow-linebreak","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-mw/ui/actions/ve.ui.MWLinkAction.js","messages":[],"suppressedMessages":[{"ruleId":"no-useless-escape","severity":2,"message":"Unnecessary escape character: \\[.","line":86,"column":11,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":86,"endColumn":12,"suggestions":[{"messageId":"removeEscape","fix":{"range":[2562,2563],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[2562,2562],"text":"\\"},"desc":"Replace the `\\` with `\\\\` to include the actual backslash character."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-useless-escape","severity":2,"message":"Unnecessary escape character: \\[.","line":87,"column":11,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":87,"endColumn":12,"suggestions":[{"messageId":"removeEscape","fix":{"range":[2597,2598],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[2597,2597],"text":"\\"},"desc":"Replace the `\\` with `\\\\` to include the actual backslash character."}],"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":"implicit-arrow-linebreak","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-mw/ui/actions/ve.ui.MWSaveDialogAction.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":"implicit-arrow-linebreak","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-mw/ui/actions/ve.ui.MWWikitextAction.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":"implicit-arrow-linebreak","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-mw/ui/commands/ve.ui.MWLinkCommand.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":"implicit-arrow-linebreak","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-mw/ui/commands/ve.ui.MWWikitextWarningCommand.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":37,"column":19,"nodeType":"CallExpression","endLine":37,"endColumn":108,"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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWAlienExtensionContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWAnnotationContextItem.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":62,"column":4,"nodeType":"CallExpression","endLine":62,"endColumn":99,"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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWDefinedTransclusionContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWGalleryContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWIncludesContextItem.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":60,"column":15,"nodeType":"CallExpression","endLine":60,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":73,"column":15,"nodeType":"CallExpression","endLine":73,"endColumn":32,"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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWInternalLinkContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWLanguageVariantNodeContextItem.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":112,"column":16,"nodeType":"CallExpression","endLine":112,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":137,"column":23,"nodeType":"CallExpression","endLine":137,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":139,"column":16,"nodeType":"CallExpression","endLine":139,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":145,"column":16,"nodeType":"CallExpression","endLine":145,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":169,"column":14,"nodeType":"CallExpression","endLine":169,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":176,"column":16,"nodeType":"CallExpression","endLine":176,"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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWMagicLinkNodeContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWMediaContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWNumberedExternalLinkNodeContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWPreContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWSignatureContextItem.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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWTransclusionContextItem.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":85,"column":2,"nodeType":"CallExpression","endLine":89,"endColumn":5,"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":"implicit-arrow-linebreak","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-mw/ui/contextitems/ve.ui.MWWikitextPasteContextItem.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":"implicit-arrow-linebreak","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-mw/ui/datatransferhandlers/ve.ui.MWMediaTransferHandler.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":"implicit-arrow-linebreak","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-mw/ui/datatransferhandlers/ve.ui.MWWikitextPlainTextStringTransferHandler.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":"implicit-arrow-linebreak","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-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWCommandHelpDialog.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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWExtensionDialog.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":113,"column":1,"nodeType":"Block","endLine":113,"endColumn":1}],"suppressedMessages":[{"ruleId":"arrow-body-style","severity":2,"message":"Unexpected block statement surrounding arrow body; move the returned value immediately after the `=>`.","line":86,"column":36,"nodeType":"ArrowFunctionExpression","messageId":"unexpectedSingleBlock","endLine":94,"endColumn":5,"fix":{"range":[2277,2513],"text":"this.confirmAbandon().then( ( confirm ) => {\n\t\t\t\t\tif ( confirm ) {\n\t\t\t\t\t\t/* We may need to rethink this if something in the\n\t\t\t\t\t\t   dependency chain adds to the current behaviour */\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t}\n\t\t\t\t} )"},"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWExtensionDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Dialog for editing generic MediaWiki extensions.\n *\n * @class\n * @abstract\n * @extends ve.ui.NodeDialog\n * @mixes ve.ui.MWExtensionWindow\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWExtensionDialog = function VeUiMWExtensionDialog() {\n\t// Parent constructor\n\tve.ui.MWExtensionDialog.super.apply( this, arguments );\n\n\t// Mixin constructors\n\tve.ui.MWExtensionWindow.call( this );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWExtensionDialog, ve.ui.NodeDialog );\n\nOO.mixinClass( ve.ui.MWExtensionDialog, ve.ui.MWExtensionWindow );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWExtensionDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.MWExtensionDialog.super.prototype.initialize.call( this );\n\n\t// Mixin method\n\tve.ui.MWExtensionWindow.prototype.initialize.call( this );\n\n\t// Initialization\n\tthis.$element.addClass( 've-ui-mwExtensionDialog' );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWExtensionDialog.prototype.getSetupProcess = function ( data = {} ) {\n\t// Parent process\n\tconst process = ve.ui.MWExtensionDialog.super.prototype.getSetupProcess.call( this, data );\n\t// Mixin process\n\treturn ve.ui.MWExtensionWindow.prototype.getSetupProcess.call( this, data, process );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWExtensionDialog.prototype.getReadyProcess = function ( data = {} ) {\n\t// Parent process\n\tconst process = ve.ui.MWExtensionDialog.super.prototype.getReadyProcess.call( this, data );\n\t// Mixin process\n\treturn ve.ui.MWExtensionWindow.prototype.getReadyProcess.call( this, data, process );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWExtensionDialog.prototype.getTeardownProcess = function ( data = {} ) {\n\t// Parent process\n\tconst process = ve.ui.MWExtensionDialog.super.prototype.getTeardownProcess.call( this, data );\n\t// Mixin process\n\treturn ve.ui.MWExtensionWindow.prototype.getTeardownProcess.call( this, data, process );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWExtensionDialog.prototype.getActionProcess = function ( action ) {\n\tif ( action === '' ) {\n\t\tif ( this.hasMeaningfulEdits() ) {\n\t\t\t// eslint-disable-next-line arrow-body-style\n\t\t\treturn new OO.ui.Process( () => {\n\t\t\t\treturn this.confirmAbandon().then( ( confirm ) => {\n\t\t\t\t\tif ( confirm ) {\n\t\t\t\t\t\t/* We may need to rethink this if something in the\n\t\t\t\t\t\t   dependency chain adds to the current behaviour */\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Parent process\n\tconst process = ve.ui.MWExtensionDialog.super.prototype.getActionProcess.call( this, action );\n\t// Mixin process\n\treturn ve.ui.MWExtensionWindow.prototype.getActionProcess.call( this, action, process ).next( () => {\n\t\tif ( action === 'done' ) {\n\t\t\tthis.close( { action: 'done' } );\n\t\t}\n\t} );\n};\n\n/**\n * Show a confirmation prompt before closing the dialog.\n * Displays a default prompt of `mw-widgets-abandonedit`.\n *\n * @param {jQuery|string|Function} [prompt] Prompt, defaults to visualeditor-dialog-extension-abandonedit\n * @return {jQuery.Promise} Close promise\n */\nve.ui.MWExtensionDialog.prototype.confirmAbandon = function ( prompt ) {\n\tif ( prompt === undefined ) {\n\t\tprompt = ve.msg( 'visualeditor-dialog-extension-abandonedit' );\n\t}\n\treturn OO.ui.confirm( prompt, {\n\t\tactions: [\n\t\t\t{\n\t\t\t\taction: 'reject',\n\t\t\t\tlabel: ve.msg( 'mw-widgets-abandonedit-keep' ),\n\t\t\t\tflags: 'safe'\n\t\t\t},\n\t\t\t{\n\t\t\t\taction: 'accept',\n\t\t\t\tlabel: ve.msg( 'mw-widgets-abandonedit-discard' ),\n\t\t\t\tflags: 'destructive'\n\t\t\t}\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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWExtensionPreviewDialog.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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWFloatingHelpDialog.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":9,"column":1,"nodeType":"Block","endLine":9,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWFloatingHelpDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Popup help dialog launched by a {@see ve.ui.MWFloatingHelpElement}\n *\n * @class\n * @extends OO.ui.ProcessDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @param {string} config.label\n * @param {jQuery} config.$message\n */\nve.ui.MWFloatingHelpDialog = function VeUiMWFloatingHelpDialog( config ) {\n\t// Parent constructor\n\tve.ui.MWFloatingHelpDialog.super.call( this, config );\n\n\tthis.label = config.label;\n\tthis.$message = config.$message;\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWFloatingHelpDialog, OO.ui.ProcessDialog );\n\n/* Static properties */\n\nve.ui.MWFloatingHelpDialog.static.name = 'floatingHelp';\n\nve.ui.MWFloatingHelpDialog.static.actions = [\n\t{\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-action-cancel' ),\n\t\tflags: [ 'safe', 'close' ]\n\t}\n];\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWFloatingHelpDialog.prototype.initialize = function () {\n\tve.ui.MWFloatingHelpDialog.super.prototype.initialize.call( this );\n\tconst content = new OO.ui.PanelLayout( { padded: true, expanded: false } );\n\tcontent.$element.append( this.$message );\n\tthis.$body.append( content.$element );\n\tthis.$foot.remove();\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWFloatingHelpDialog.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWFloatingHelpDialog.super.prototype.getSetupProcess.call( this, data ).next( () => {\n\t\tthis.title.setLabel( this.label );\n\t} );\n};\n\nve.ui.MWFloatingHelpDialog.prototype.getSizeProperties = function () {\n\tconst sizeProps = ve.ui.MWFloatingHelpDialog.super.prototype.getSizeProperties.call( this );\n\tif ( !OO.ui.isMobile() ) {\n\t\treturn ve.extendObject( {}, sizeProps, { width: '350px', maxHeight: '50%' } );\n\t}\n\treturn sizeProps;\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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWGalleryDialog.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":618,"column":1,"nodeType":"Block","endLine":618,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWGalleryDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Dialog for editing MediaWiki galleries.\n *\n * @class\n * @extends ve.ui.NodeDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWGalleryDialog = function VeUiMWGalleryDialog() {\n\t// Parent constructor\n\tve.ui.MWGalleryDialog.super.apply( this, arguments );\n\n\tthis.$element.addClass( 've-ui-mwGalleryDialog' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWGalleryDialog, ve.ui.NodeDialog );\n\n/* Static properties */\n\nve.ui.MWGalleryDialog.static.name = 'gallery';\n\nve.ui.MWGalleryDialog.static.size = 'large';\n\nve.ui.MWGalleryDialog.static.title =\n\tOO.ui.deferMsg( 'visualeditor-mwgallerydialog-title' );\n\nve.ui.MWGalleryDialog.static.modelClasses = [ ve.dm.MWGalleryNode ];\n\nve.ui.MWGalleryDialog.static.includeCommands = null;\n\nve.ui.MWGalleryDialog.static.excludeCommands = [\n\t// No formatting\n\t'paragraph',\n\t'heading1',\n\t'heading2',\n\t'heading3',\n\t'heading4',\n\t'heading5',\n\t'heading6',\n\t'preformatted',\n\t'blockquote',\n\t// No block-level markup is allowed inside gallery caption (or gallery image captions)\n\t// No tables\n\t'insertTable',\n\t'deleteTable',\n\t'mergeCells',\n\t'tableCaption',\n\t'tableCellHeader',\n\t'tableCellData',\n\t// No structure\n\t'bullet',\n\t'bulletWrapOnce',\n\t'number',\n\t'numberWrapOnce',\n\t'indent',\n\t'outdent',\n\t// Nested galleries don't work either\n\t'gallery'\n];\n\n/**\n * Get the import rules for the surface widget in the dialog\n *\n * @see ve.dm.ElementLinearData#sanitize\n * @return {Object} Import rules\n */\nve.ui.MWGalleryDialog.static.getImportRules = function () {\n\tconst rules = ve.copy( ve.init.target.constructor.static.importRules );\n\treturn ve.extendObject(\n\t\trules,\n\t\t{\n\t\t\tall: {\n\t\t\t\tblacklist: ve.extendObject(\n\t\t\t\t\t{\n\t\t\t\t\t\t// No block-level markup is allowed inside gallery caption (or gallery image captions).\n\t\t\t\t\t\t// No lists, no tables.\n\t\t\t\t\t\tlist: true,\n\t\t\t\t\t\tlistItem: true,\n\t\t\t\t\t\tdefinitionList: true,\n\t\t\t\t\t\tdefinitionListItem: true,\n\t\t\t\t\t\ttable: true,\n\t\t\t\t\t\ttableCaption: true,\n\t\t\t\t\t\ttableSection: true,\n\t\t\t\t\t\ttableRow: true,\n\t\t\t\t\t\ttableCell: true,\n\t\t\t\t\t\tmwTable: true,\n\t\t\t\t\t\tmwTransclusionTableCell: true,\n\t\t\t\t\t\t// Nested galleries don't work either\n\t\t\t\t\t\tmwGallery: true\n\t\t\t\t\t},\n\t\t\t\t\tve.getProp( rules, 'all', 'blacklist' )\n\t\t\t\t),\n\t\t\t\t// Headings are also possible, but discouraged\n\t\t\t\tconversions: ve.extendObject(\n\t\t\t\t\t{\n\t\t\t\t\t\tmwHeading: 'paragraph'\n\t\t\t\t\t},\n\t\t\t\t\tve.getProp( rules, 'all', 'conversions' )\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t);\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.MWGalleryDialog.super.prototype.initialize.call( this );\n\n\t// States\n\tthis.highlightedItem = null;\n\tthis.searchPanelVisible = false;\n\tthis.selectedFilenames = {};\n\tthis.initialImageData = [];\n\tthis.originalMwDataNormalized = null;\n\tthis.originalGalleryGroupItems = [];\n\tthis.imageData = {};\n\tthis.isMobile = OO.ui.isMobile();\n\n\t// Default settings\n\tthis.defaults = mw.config.get( 'wgVisualEditorConfig' ).galleryOptions;\n\n\t// Images and options tab panels\n\tthis.indexLayout = new OO.ui.IndexLayout();\n\tconst imagesTabPanel = new OO.ui.TabPanelLayout( 'images', {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-card-images' ),\n\t\t// Contains a menu layout which handles its own scrolling\n\t\tscrollable: false,\n\t\tpadded: true\n\t} );\n\tconst optionsTabPanel = new OO.ui.TabPanelLayout( 'options', {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-card-options' ),\n\t\tpadded: true\n\t} );\n\n\t// Images tab panel\n\n\t// General layout\n\tconst imageListContentPanel = new OO.ui.PanelLayout( {\n\t\tpadded: true,\n\t\texpanded: true,\n\t\tscrollable: true\n\t} );\n\tconst imageListMenuPanel = new OO.ui.PanelLayout( {\n\t\tpadded: true,\n\t\texpanded: true\n\t} );\n\tthis.imageListMenuLayout = new OO.ui.MenuLayout( {\n\t\tmenuPosition: this.isMobile ? 'after' : 'bottom',\n\t\tclasses: [\n\t\t\t've-ui-mwGalleryDialog-imageListMenuLayout',\n\t\t\tthis.isMobile ?\n\t\t\t\t've-ui-mwGalleryDialog-imageListMenuLayout-mobile' :\n\t\t\t\t've-ui-mwGalleryDialog-imageListMenuLayout-desktop'\n\t\t],\n\t\tcontentPanel: imageListContentPanel,\n\t\tmenuPanel: imageListMenuPanel\n\t} );\n\tthis.editPanel = new OO.ui.PanelLayout( {\n\t\tpadded: true,\n\t\texpanded: true,\n\t\tscrollable: true\n\t} );\n\tthis.searchPanel = new OO.ui.PanelLayout( {\n\t\tpadded: true,\n\t\texpanded: true,\n\t\tscrollable: true\n\t} );\n\tthis.editSearchStack = new OO.ui.StackLayout( {\n\t\titems: [ this.editPanel, this.searchPanel ]\n\t} );\n\tthis.imageTabMenuLayout = new OO.ui.MenuLayout( {\n\t\tmenuPosition: this.isMobile ? 'top' : 'before',\n\t\tclasses: [\n\t\t\t've-ui-mwGalleryDialog-menuLayout',\n\t\t\tthis.isMobile ?\n\t\t\t\t've-ui-mwGalleryDialog-menuLayout-mobile' :\n\t\t\t\t've-ui-mwGalleryDialog-menuLayout-desktop'\n\t\t],\n\t\tmenuPanel: this.imageListMenuLayout,\n\t\tcontentPanel: this.editSearchStack\n\t} );\n\n\t// Menu\n\tthis.$emptyGalleryMessage = $( '<div>' )\n\t\t.addClass( 'oo-ui-element-hidden' )\n\t\t.text( ve.msg( 'visualeditor-mwgallerydialog-empty-gallery-message' ) );\n\tthis.galleryGroup = new ve.ui.MWGalleryGroupWidget( {\n\t\torientation: this.isMobile ? 'horizontal' : 'vertical'\n\t} );\n\tthis.showSearchPanelButton = new OO.ui.ButtonWidget( {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-search-button-label' ),\n\t\tinvisibleLabel: !!this.isMobile,\n\t\ticon: 'add',\n\t\tframed: false,\n\t\tflags: [ 'progressive' ],\n\t\tclasses: [ 've-ui-mwGalleryDialog-show-search-panel-button' ]\n\t} );\n\n\t// Edit panel\n\tthis.filenameFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-content-filename' ),\n\t\ticon: 'image'\n\t} );\n\tthis.$highlightedImage = $( '<div>' )\n\t\t.addClass( 've-ui-mwGalleryDialog-highlighted-image mw-no-invert' );\n\tthis.filenameFieldset.$element.append( this.$highlightedImage );\n\tthis.highlightedCaptionTarget = ve.init.target.createTargetWidget( {\n\t\tincludeCommands: this.constructor.static.includeCommands,\n\t\texcludeCommands: this.constructor.static.excludeCommands,\n\t\timportRules: this.constructor.static.getImportRules(),\n\t\tmultiline: false\n\t} );\n\tthis.highlightedAltTextInput = new OO.ui.TextInputWidget( {\n\t\tplaceholder: ve.msg( 'visualeditor-dialog-media-alttext-section' )\n\t} );\n\tthis.altTextSameAsCaption = new OO.ui.CheckboxInputWidget();\n\tthis.removeButton = new OO.ui.ButtonWidget( {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-remove-button-label' ),\n\t\ticon: 'trash',\n\t\tflags: [ 'destructive' ],\n\t\tclasses: [ 've-ui-mwGalleryDialog-remove-button' ]\n\t} );\n\n\tconst highlightedCaptionField = new OO.ui.FieldLayout( this.highlightedCaptionTarget, {\n\t\talign: 'top'\n\t} );\n\tconst highlightedCaptionFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-content-section' )\n\t} );\n\thighlightedCaptionFieldset.addItems( [ highlightedCaptionField ] );\n\n\tconst highlightedAltTextField = new OO.ui.FieldLayout( this.highlightedAltTextInput, {\n\t\talign: 'top'\n\t} );\n\tconst altTextSameAsCaptionField = new OO.ui.FieldLayout( this.altTextSameAsCaption, {\n\t\talign: 'inline',\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-alttext-checkbox' )\n\t} );\n\tconst highlightedAltTextFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-alttext-section' )\n\t} );\n\thighlightedAltTextFieldset.addItems( [\n\t\thighlightedAltTextField,\n\t\taltTextSameAsCaptionField\n\t] );\n\n\t// Search panel\n\tthis.searchWidget = new mw.widgets.MediaSearchWidget( {\n\t\trowHeight: this.isMobile ? 100 : 150\n\t} );\n\n\t// Options tab panel\n\n\t// Input widgets\n\tthis.modeDropdown = new OO.ui.DropdownWidget( { menu: { items: [\n\t\t'traditional',\n\t\t'nolines',\n\t\t'packed',\n\t\t'packed-overlay',\n\t\t'packed-hover',\n\t\t'slideshow'\n\t].map( ( data ) => new OO.ui.MenuOptionWidget( {\n\t\tdata: data,\n\t\t// Messages used here:\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-traditional\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-nolines\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-packed\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-packed-overlay\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-packed-hover\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-slideshow\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-mode-dropdown-label-' + data )\n\t} ) ) } } );\n\tthis.captionTarget = ve.init.target.createTargetWidget( {\n\t\tincludeCommands: this.constructor.static.includeCommands,\n\t\texcludeCommands: this.constructor.static.excludeCommands,\n\t\timportRules: this.constructor.static.getImportRules(),\n\t\tmultiline: false\n\t} );\n\tthis.widthsInput = new OO.ui.NumberInputWidget( {\n\t\tmin: 0,\n\t\tshowButtons: false,\n\t\tinput: {\n\t\t\tplaceholder: ve.msg( 'visualeditor-mwgallerydialog-widths-input-placeholder', this.defaults.imageWidth )\n\t\t}\n\t} );\n\tthis.heightsInput = new OO.ui.NumberInputWidget( {\n\t\tmin: 0,\n\t\tshowButtons: false,\n\t\tinput: {\n\t\t\tplaceholder: ve.msg( 'visualeditor-mwgallerydialog-heights-input-placeholder', this.defaults.imageHeight )\n\t\t}\n\t} );\n\tthis.perRowInput = new OO.ui.NumberInputWidget( {\n\t\tmin: 0,\n\t\tshowButtons: false\n\t} );\n\tthis.showFilenameCheckbox = new OO.ui.CheckboxInputWidget( {\n\t\tvalue: 'yes'\n\t} );\n\tthis.classesInput = new OO.ui.TextInputWidget( {\n\t\tplaceholder: ve.msg( 'visualeditor-mwgallerydialog-classes-input-placeholder' )\n\t} );\n\tthis.stylesInput = new OO.ui.TextInputWidget( {\n\t\tplaceholder: ve.msg( 'visualeditor-mwgallerydialog-styles-input-placeholder' )\n\t} );\n\n\t// Field layouts\n\tconst modeField = new OO.ui.FieldLayout( this.modeDropdown, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-mode-field-label' )\n\t} );\n\tconst captionField = new OO.ui.FieldLayout( this.captionTarget, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-caption-field-label' ),\n\t\talign: this.isMobile ? 'top' : 'left'\n\t} );\n\tconst widthsField = new OO.ui.FieldLayout( this.widthsInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-widths-field-label' )\n\t} );\n\tconst heightsField = new OO.ui.FieldLayout( this.heightsInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-heights-field-label' )\n\t} );\n\tconst perRowField = new OO.ui.FieldLayout( this.perRowInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-perrow-field-label' )\n\t} );\n\tconst showFilenameField = new OO.ui.FieldLayout( this.showFilenameCheckbox, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-show-filename-field-label' )\n\t} );\n\tconst classesField = new OO.ui.FieldLayout( this.classesInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-classes-field-label' )\n\t} );\n\tconst stylesField = new OO.ui.FieldLayout( this.stylesInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-styles-field-label' )\n\t} );\n\n\t// Append everything\n\timageListMenuPanel.$element.append(\n\t\tthis.showSearchPanelButton.$element\n\t);\n\timageListContentPanel.$element.append(\n\t\tthis.$emptyGalleryMessage,\n\t\tthis.galleryGroup.$element\n\t);\n\tthis.editPanel.$element.append(\n\t\tthis.filenameFieldset.$element,\n\t\thighlightedCaptionFieldset.$element,\n\t\thighlightedAltTextFieldset.$element,\n\t\tthis.removeButton.$element\n\t);\n\tthis.searchPanel.$element.append(\n\t\tthis.searchWidget.$element\n\t);\n\timagesTabPanel.$element.append(\n\t\tthis.imageTabMenuLayout.$element\n\t);\n\toptionsTabPanel.$element.append(\n\t\tmodeField.$element,\n\t\tcaptionField.$element,\n\t\twidthsField.$element,\n\t\theightsField.$element,\n\t\tperRowField.$element,\n\t\tshowFilenameField.$element,\n\t\tclassesField.$element,\n\t\tstylesField.$element\n\t);\n\tthis.indexLayout.addTabPanels( [\n\t\timagesTabPanel,\n\t\toptionsTabPanel\n\t] );\n\tthis.$body.append( this.indexLayout.$element );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWGalleryDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tconst namespaceIds = mw.config.get( 'wgNamespaceIds' ),\n\t\t\t\tmwData = this.selectedNode && this.selectedNode.getAttribute( 'mw' ),\n\t\t\t\tattributes = mwData && mwData.attrs,\n\t\t\t\tcaptionNode = this.selectedNode && this.selectedNode.getCaptionNode(),\n\t\t\t\timageNodes = this.selectedNode && this.selectedNode.getImageNodes(),\n\t\t\t\tisReadOnly = this.isReadOnly();\n\n\t\t\tthis.anyItemModified = false;\n\n\t\t\t// Images tab panel\n\t\t\t// If editing an existing gallery, populate with the images...\n\t\t\tif ( this.selectedNode ) {\n\t\t\t\tconst imageTitles = [];\n\n\t\t\t\tfor ( let i = 0, ilen = imageNodes.length; i < ilen; i++ ) {\n\t\t\t\t\tconst image = imageNodes[ i ];\n\t\t\t\t\tconst resourceTitle = mw.Title.newFromText( mw.libs.ve.normalizeParsoidResourceName( image.getAttribute( 'resource' ) ), namespaceIds.file );\n\t\t\t\t\tif ( !resourceTitle ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst resource = resourceTitle.getPrefixedText();\n\t\t\t\t\tconst imageCaptionNode = image.getCaptionNode();\n\t\t\t\t\timageTitles.push( resource );\n\t\t\t\t\tthis.initialImageData.push( {\n\t\t\t\t\t\tresource: resource,\n\t\t\t\t\t\taltText: image.getAttribute( 'altText' ),\n\t\t\t\t\t\taltTextSame: image.getAttribute( 'altTextSame' ),\n\t\t\t\t\t\thref: image.getAttribute( 'href' ),\n\t\t\t\t\t\tsrc: image.getAttribute( 'src' ),\n\t\t\t\t\t\theight: image.getAttribute( 'height' ),\n\t\t\t\t\t\twidth: image.getAttribute( 'width' ),\n\t\t\t\t\t\tcaptionDocument: this.createCaptionDocument( imageCaptionNode ),\n\t\t\t\t\t\ttagName: image.getAttribute( 'tagName' ),\n\t\t\t\t\t\tisError: image.getAttribute( 'isError' ),\n\t\t\t\t\t\terrorText: image.getAttribute( 'errorText' ),\n\t\t\t\t\t\timageClassAttr: image.getAttribute( 'imageClassAttr' ),\n\t\t\t\t\t\timgWrapperClassAttr: image.getAttribute( 'imgWrapperClassAttr' ),\n\t\t\t\t\t\tmw: image.getAttribute( 'mw' ),\n\t\t\t\t\t\tmediaClass: image.getAttribute( 'mediaClass' ),\n\t\t\t\t\t\tmediaTag: image.getAttribute( 'mediaTag' )\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// Populate menu and edit panels\n\t\t\t\tthis.imagesPromise = this.requestImages( {\n\t\t\t\t\ttitles: imageTitles\n\t\t\t\t} ).then( () => {\n\t\t\t\t\tthis.onHighlightItem();\n\t\t\t\t} );\n\n\t\t\t// ...Otherwise show the search panel\n\t\t\t} else {\n\t\t\t\tthis.toggleEmptyGalleryMessage( true );\n\t\t\t\tthis.toggleSearchPanel( true );\n\t\t\t}\n\n\t\t\t// Options tab panel\n\n\t\t\t// Set options\n\t\t\tconst mode = attributes && attributes.mode || this.defaults.mode;\n\t\t\tconst widths = attributes && parseInt( attributes.widths ) || '';\n\t\t\tconst heights = attributes && parseInt( attributes.heights ) || '';\n\t\t\tconst perRow = attributes && attributes.perrow || '';\n\t\t\tconst showFilename = attributes && attributes.showfilename === 'yes';\n\t\t\tconst classes = attributes && attributes.class || '';\n\t\t\tconst styles = attributes && attributes.style || '';\n\t\t\t// Caption\n\t\t\tthis.captionDocument = this.createCaptionDocument( captionNode );\n\n\t\t\t// Populate options panel\n\t\t\tthis.modeDropdown.getMenu().selectItemByData( mode );\n\t\t\tthis.widthsInput.setValue( widths );\n\t\t\tthis.heightsInput.setValue( heights );\n\t\t\tthis.perRowInput.setValue( perRow );\n\t\t\tthis.showFilenameCheckbox.setSelected( showFilename );\n\t\t\tthis.classesInput.setValue( classes );\n\t\t\tthis.stylesInput.setValue( styles );\n\t\t\t// Caption\n\t\t\tthis.captionTarget.setDocument( this.captionDocument );\n\t\t\tthis.captionTarget.setReadOnly( isReadOnly );\n\n\t\t\tif ( mwData ) {\n\t\t\t\tthis.originalMwDataNormalized = ve.copy( mwData );\n\t\t\t\tthis.updateMwData( this.originalMwDataNormalized );\n\t\t\t}\n\n\t\t\tthis.highlightedAltTextInput.setReadOnly( isReadOnly || this.altTextSameAsCaption.isSelected() );\n\t\t\tthis.altTextSameAsCaption.setDisabled( isReadOnly );\n\t\t\tthis.modeDropdown.setDisabled( isReadOnly );\n\t\t\tthis.widthsInput.setReadOnly( isReadOnly );\n\t\t\tthis.heightsInput.setReadOnly( isReadOnly );\n\t\t\tthis.perRowInput.setReadOnly( isReadOnly );\n\t\t\tthis.showFilenameCheckbox.setDisabled( isReadOnly );\n\t\t\tthis.classesInput.setReadOnly( isReadOnly );\n\t\t\tthis.stylesInput.setReadOnly( isReadOnly );\n\n\t\t\tthis.showSearchPanelButton.setDisabled( isReadOnly );\n\t\t\tthis.removeButton.setDisabled( isReadOnly );\n\n\t\t\tthis.galleryGroup.toggleDraggable( !isReadOnly );\n\n\t\t\t// Disable fields depending on mode\n\t\t\tthis.onModeDropdownChange();\n\n\t\t\t// Add event handlers\n\t\t\tthis.indexLayout.connect( this, { set: 'updateDialogSize' } );\n\t\t\tthis.searchWidget.getResults().connect( this, { choose: 'onSearchResultsChoose' } );\n\t\t\tthis.showSearchPanelButton.connect( this, { click: 'onShowSearchPanelButtonClick' } );\n\t\t\tthis.galleryGroup.connect( this, { editItem: 'onHighlightItem' } );\n\t\t\tthis.galleryGroup.connect( this, { change: 'updateActions' } );\n\t\t\tthis.removeButton.connect( this, { click: 'onRemoveItem' } );\n\t\t\tthis.modeDropdown.getMenu().connect( this, { choose: 'onModeDropdownChange' } );\n\t\t\tthis.widthsInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.heightsInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.perRowInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.showFilenameCheckbox.connect( this, { change: 'updateActions' } );\n\t\t\tthis.classesInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.stylesInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.captionTarget.connect( this, { change: 'updateActions' } );\n\t\t\tthis.highlightedAltTextInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.altTextSameAsCaption.connect( this, { change: 'onAltTextSameAsCaptionChange' } );\n\t\t\tthis.highlightedCaptionTarget.connect( this, { change: 'onHighlightedCaptionTargetChange' } );\n\n\t\t\treturn this.imagesPromise;\n\t\t} );\n};\n\n/**\n * Get a new caption document for the gallery caption or an image caption.\n *\n * @private\n * @param {ve.dm.MWGalleryCaptionNode|ve.dm.MWGalleryImageCaptionNode|null} captionNode\n * @return {ve.dm.Document}\n */\nve.ui.MWGalleryDialog.prototype.createCaptionDocument = function ( captionNode ) {\n\tif ( captionNode && captionNode.getLength() > 0 ) {\n\t\treturn this.selectedNode.getDocument().cloneFromRange( captionNode.getRange() );\n\t} else {\n\t\treturn this.getFragment().getDocument().cloneWithData( [\n\t\t\t{ type: 'paragraph', internal: { generated: 'wrapper' } },\n\t\t\t{ type: '/paragraph' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t] );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWGalleryDialog.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.searchWidget.getQuery().focus().select();\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.getTeardownProcess = function ( data ) {\n\treturn ve.ui.MWGalleryDialog.super.prototype.getTeardownProcess.call( this, data )\n\t\t.first( () => {\n\t\t\t// Layouts\n\t\t\tthis.indexLayout.setTabPanel( 'images' );\n\t\t\tthis.indexLayout.resetScroll();\n\t\t\tthis.imageTabMenuLayout.resetScroll();\n\n\t\t\t// Widgets\n\t\t\tthis.galleryGroup.clearItems();\n\t\t\tthis.searchWidget.getQuery().setValue( '' );\n\t\t\tthis.searchWidget.teardown();\n\n\t\t\t// States\n\t\t\tthis.highlightedItem = null;\n\t\t\tthis.searchPanelVisible = false;\n\t\t\tthis.selectedFilenames = {};\n\t\t\tthis.initialImageData = [];\n\t\t\tthis.originalMwDataNormalized = null;\n\t\t\tthis.originalGalleryGroupItems = [];\n\n\t\t\t// Disconnect events\n\t\t\tthis.indexLayout.disconnect( this );\n\t\t\tthis.searchWidget.getResults().disconnect( this );\n\t\t\tthis.showSearchPanelButton.disconnect( this );\n\t\t\tthis.galleryGroup.disconnect( this );\n\t\t\tthis.removeButton.disconnect( this );\n\t\t\tthis.modeDropdown.disconnect( this );\n\t\t\tthis.widthsInput.disconnect( this );\n\t\t\tthis.heightsInput.disconnect( this );\n\t\t\tthis.perRowInput.disconnect( this );\n\t\t\tthis.showFilenameCheckbox.disconnect( this );\n\t\t\tthis.classesInput.disconnect( this );\n\t\t\tthis.stylesInput.disconnect( this );\n\t\t\tthis.highlightedAltTextInput.disconnect( this );\n\t\t\tthis.altTextSameAsCaption.disconnect( this );\n\t\t\tthis.captionTarget.disconnect( this );\n\t\t\tthis.highlightedCaptionTarget.disconnect( this );\n\n\t\t} );\n};\n\nve.ui.MWGalleryDialog.prototype.getActionProcess = function ( action ) {\n\treturn ve.ui.MWGalleryDialog.super.prototype.getActionProcess.call( this, action )\n\t\t.next( () => {\n\t\t\tif ( action === 'done' ) {\n\t\t\t\t// Save the input values for the highlighted item\n\t\t\t\tthis.updateHighlightedItem();\n\n\t\t\t\tthis.insertOrUpdateNode();\n\t\t\t\tthis.close( { action: 'done' } );\n\t\t\t}\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.getBodyHeight = function () {\n\treturn 600;\n};\n\n/**\n * Request the images for the images tab panel menu\n *\n * @param {Object} options Options for the request\n * @return {jQuery.Promise} Promise which resolves when image data has been fetched\n */\nve.ui.MWGalleryDialog.prototype.requestImages = function ( options ) {\n\tconst promises = options.titles.map( ( title ) => ve.init.platform.galleryImageInfoCache.get( title ) );\n\n\treturn ve.promiseAll( promises )\n\t\t.then( ( ...args ) => {\n\t\t\tconst resp = {};\n\t\t\toptions.titles.forEach( ( title, i ) => {\n\t\t\t\tresp[ title ] = args[ i ];\n\t\t\t} );\n\t\t\tthis.onRequestImagesSuccess( resp );\n\t\t} );\n};\n\n/**\n * Create items for the returned images and add them to the gallery group\n *\n * @param {Object} response jQuery response object\n */\nve.ui.MWGalleryDialog.prototype.onRequestImagesSuccess = function ( response ) {\n\tconst thumbUrls = {},\n\t\titems = [],\n\t\tconfig = { isMobile: this.isMobile, draggable: !this.isReadOnly() };\n\n\tlet title;\n\tfor ( title in response ) {\n\t\tthumbUrls[ title ] = {\n\t\t\tthumbUrl: response[ title ].thumburl,\n\t\t\twidth: response[ title ].thumbwidth,\n\t\t\theight: response[ title ].thumbheight\n\t\t};\n\t}\n\n\tif ( this.initialImageData.length > 0 ) {\n\t\tthis.initialImageData.forEach( ( image ) => {\n\t\t\timage.thumbUrl = thumbUrls[ image.resource ].thumbUrl;\n\t\t\titems.push( new ve.ui.MWGalleryItemWidget( image, config ) );\n\t\t} );\n\t\tthis.initialImageData = [];\n\t\tthis.originalGalleryGroupItems = ve.copy( items );\n\t} else {\n\t\tfor ( title in this.selectedFilenames ) {\n\t\t\tif ( Object.prototype.hasOwnProperty.call( thumbUrls, title ) ) {\n\t\t\t\titems.push( new ve.ui.MWGalleryItemWidget( {\n\t\t\t\t\tresource: title,\n\t\t\t\t\taltText: null,\n\t\t\t\t\taltTextSame: true,\n\t\t\t\t\t// TODO: support changing the link in the UI somewhere;\n\t\t\t\t\t// for now, always link to the resource. Do it here when\n\t\t\t\t\t// generating new results, so existing links from source\n\t\t\t\t\t// will be preserved.\n\t\t\t\t\thref: title,\n\t\t\t\t\tsrc: '',\n\t\t\t\t\theight: thumbUrls[ title ].height,\n\t\t\t\t\twidth: thumbUrls[ title ].width,\n\t\t\t\t\tthumbUrl: thumbUrls[ title ].thumbUrl,\n\t\t\t\t\tcaptionDocument: this.createCaptionDocument( null ),\n\t\t\t\t\tisError: false,\n\t\t\t\t\terrorText: null,\n\t\t\t\t\timageClassAttr: 'mw-file-element',\n\t\t\t\t\tmw: {},\n\t\t\t\t\tmediaClass: 'File',\n\t\t\t\t\tmediaTag: 'img'\n\t\t\t\t}, config ) );\n\t\t\t\tdelete this.selectedFilenames[ title ];\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.galleryGroup.addItems( items );\n\n\t// Gallery is no longer empty\n\tthis.updateActions();\n\tthis.toggleEmptyGalleryMessage( false );\n};\n\n/**\n * Request a new image and highlight it\n *\n * @param {string} title Normalized title of the new image\n */\nve.ui.MWGalleryDialog.prototype.addNewImage = function ( title ) {\n\t// Make list of unique pending images, for onRequestImagesSuccess\n\tthis.selectedFilenames[ title ] = true;\n\n\t// Request image\n\tthis.requestImages( {\n\t\ttitles: [ title ]\n\t} ).then( () => {\n\t\t// populate edit panel with the new image\n\t\tconst items = this.galleryGroup.items;\n\t\tthis.onHighlightItem( items[ items.length - 1 ] );\n\t\tthis.highlightedCaptionTarget.focus();\n\t} );\n};\n\n/**\n * Update the image currently being edited (ve.ui.MWGalleryItemWidget) with the values from inputs\n * in this dialog (currently only the image caption).\n */\nve.ui.MWGalleryDialog.prototype.updateHighlightedItem = function () {\n\tthis.anyItemModified = this.anyItemModified || this.isHighlightedItemModified();\n\n\t// TODO: Support link, page and lang\n\tif ( this.highlightedItem ) {\n\t\t// No need to call setCaptionDocument(), the document object is updated on every change\n\t\tthis.highlightedItem.setAltText( this.highlightedAltTextInput.getValue() );\n\t\tthis.highlightedItem.setAltTextSame( this.altTextSameAsCaption.isSelected() );\n\t}\n};\n\n/**\n * Handle search results choose event.\n *\n * @param {mw.widgets.MediaResultWidget} item Chosen item\n */\nve.ui.MWGalleryDialog.prototype.onSearchResultsChoose = function ( item ) {\n\tconst title = mw.Title.newFromText( item.getData().title ).getPrefixedText();\n\n\t// Check title against pending insertions\n\t// TODO: Prevent two 'choose' events firing from the UI\n\tif ( !Object.prototype.hasOwnProperty.call( this.selectedFilenames, title ) ) {\n\t\tthis.addNewImage( title );\n\t}\n\n\tthis.updateActions();\n};\n\n/**\n * Handle click event for the remove button\n */\nve.ui.MWGalleryDialog.prototype.onRemoveItem = function () {\n\tconst removedItemIndex = this.galleryGroup.items.indexOf( this.highlightedItem );\n\t// Remove the highlighted item\n\tthis.galleryGroup.removeItems( [ this.highlightedItem ] );\n\n\t// Highlight another item, or show the search panel if the gallery is now empty\n\tthis.onHighlightItem( undefined, removedItemIndex !== -1 ? removedItemIndex : undefined );\n};\n\n/**\n * Handle clicking on an image in the menu\n *\n * @param {ve.ui.MWGalleryItemWidget} [item] The item that was clicked on\n * @param {number} [removedItemIndex] Index of just-removed item\n */\nve.ui.MWGalleryDialog.prototype.onHighlightItem = function ( item, removedItemIndex ) {\n\t// Unhighlight previous item\n\tif ( this.highlightedItem ) {\n\t\tthis.highlightedItem.toggleHighlighted( false );\n\t}\n\n\t// Show edit panel\n\t// (This also calls updateHighlightedItem() to save the input values.)\n\tthis.toggleSearchPanel( false );\n\n\t// Highlight new item.\n\tif ( removedItemIndex !== undefined ) {\n\t\t// The removed item might have been the last item in the list, in which\n\t\t// case highlight the new last item.\n\t\tconst index = Math.min( removedItemIndex, this.galleryGroup.items.length - 1 );\n\t\titem = this.galleryGroup.items[ index ];\n\t} else if ( !item ) {\n\t\t// If no item was given, highlight the first item in the gallery.\n\t\titem = this.galleryGroup.items[ 0 ];\n\t}\n\n\tif ( !item ) {\n\t\t// Show the search panel if the gallery is empty\n\t\tthis.toggleEmptyGalleryMessage( true );\n\t\tthis.toggleSearchPanel( true );\n\t\treturn;\n\t}\n\n\titem.toggleHighlighted( true );\n\tthis.highlightedItem = item;\n\n\t// Scroll item into view in menu\n\tOO.ui.Element.static.scrollIntoView( item.$element[ 0 ] );\n\n\t// Populate edit panel\n\tconst title = mw.Title.newFromText( mw.libs.ve.normalizeParsoidResourceName( item.resource ) );\n\tconst $link = $( '<a>' )\n\t\t.addClass( 've-ui-mwMediaDialog-description-link' )\n\t\t.attr( 'target', '_blank' )\n\t\t.attr( 'rel', 'noopener' )\n\t\t.text( ve.msg( 'visualeditor-dialog-media-content-description-link' ) );\n\n\t// T322704\n\tve.setAttributeSafe( $link[ 0 ], 'href', title.getUrl(), '#' );\n\n\tthis.filenameFieldset.setLabel(\n\t\t$( '<span>' ).append(\n\t\t\t$( document.createTextNode( title.getMainText() + ' ' ) ),\n\t\t\t$link\n\t\t)\n\t);\n\tthis.$highlightedImage\n\t\t.css( 'background-image', 'url(' + item.thumbUrl + ')' );\n\tthis.highlightedCaptionTarget.setDocument( item.captionDocument );\n\tthis.highlightedCaptionTarget.setReadOnly( this.isReadOnly() );\n\tthis.highlightedAltTextInput.setValue( item.altText );\n\tthis.highlightedAltTextInput.setReadOnly( this.isReadOnly() || item.altTextSame );\n\tthis.altTextSameAsCaption.setSelected( item.altTextSame );\n};\n\n/**\n * Handle change event for this.modeDropdown\n */\nve.ui.MWGalleryDialog.prototype.onModeDropdownChange = function () {\n\tconst mode = this.modeDropdown.getMenu().findSelectedItem().getData(),\n\t\tdisabled = (\n\t\t\tmode === 'packed' ||\n\t\t\tmode === 'packed-overlay' ||\n\t\t\tmode === 'packed-hover' ||\n\t\t\tmode === 'slideshow'\n\t\t);\n\n\tthis.widthsInput.setDisabled( disabled );\n\tthis.perRowInput.setDisabled( disabled );\n\n\t// heights is only ignored in slideshow mode\n\tthis.heightsInput.setDisabled( mode === 'slideshow' );\n\n\tthis.updateActions();\n};\n\n/**\n * Handle change event for this.highlightedCaptionTarget\n */\nve.ui.MWGalleryDialog.prototype.onHighlightedCaptionTargetChange = function () {\n\tif ( this.altTextSameAsCaption.isSelected() ) {\n\t\tconst surfaceModel = this.highlightedCaptionTarget.getSurface().getModel();\n\t\tconst caption = surfaceModel.getLinearFragment(\n\t\t\tsurfaceModel.getDocument().getDocumentRange()\n\t\t).getText();\n\t\tthis.highlightedAltTextInput.setValue( caption );\n\t}\n\tthis.updateActions();\n};\n\n/**\n * Handle change event for this.altTextSameAsCaption\n */\nve.ui.MWGalleryDialog.prototype.onAltTextSameAsCaptionChange = function () {\n\tthis.highlightedAltTextInput.setReadOnly( this.isReadOnly() || this.altTextSameAsCaption.isSelected() );\n\tthis.onHighlightedCaptionTargetChange();\n};\n\n/**\n * Handle click event for showSearchPanelButton\n */\nve.ui.MWGalleryDialog.prototype.onShowSearchPanelButtonClick = function () {\n\tthis.toggleSearchPanel( true );\n};\n\n/**\n * Toggle the search panel (and the edit panel, the opposite way)\n *\n * @param {boolean} [visible] The search panel is visible\n */\nve.ui.MWGalleryDialog.prototype.toggleSearchPanel = function ( visible ) {\n\tvisible = visible !== undefined ? visible : !this.searchPanelVisible;\n\n\t// If currently visible panel is an edit panel, save the input values for the highlighted item\n\tif ( !this.searchPanelVisible ) {\n\t\tthis.updateHighlightedItem();\n\t}\n\n\t// Record the state of the search panel\n\tthis.searchPanelVisible = visible;\n\n\t// Toggle the search panel, and do the opposite for the edit panel\n\tthis.editSearchStack.setItem( visible ? this.searchPanel : this.editPanel );\n\n\tthis.imageListMenuLayout.toggleMenu( !visible );\n\tif ( this.highlightedItem && visible ) {\n\t\tthis.highlightedItem.toggleHighlighted( false );\n\t\tthis.highlightedItem = null;\n\t}\n\n\t// If the edit panel is visible, focus the caption target\n\tif ( !visible ) {\n\t\tthis.highlightedCaptionTarget.focus();\n\t} else {\n\t\t// Try to populate with user uploads\n\t\tthis.searchWidget.queryMediaQueue();\n\t\tthis.searchWidget.getQuery().focus().select();\n\t}\n\tthis.updateDialogSize();\n};\n\n/**\n * Resize the dialog according to which panel is focused\n */\nve.ui.MWGalleryDialog.prototype.updateDialogSize = function () {\n\tif ( this.searchPanelVisible && this.indexLayout.currentTabPanelName === 'images' ) {\n\t\tthis.setSize( 'larger' );\n\t} else {\n\t\tthis.setSize( 'large' );\n\t}\n};\n\n/**\n * Toggle the empty gallery message\n *\n * @param {boolean} empty The gallery is empty\n */\nve.ui.MWGalleryDialog.prototype.toggleEmptyGalleryMessage = function ( empty ) {\n\tthis.$emptyGalleryMessage.toggleClass( 'oo-ui-element-hidden', !empty );\n};\n\n/**\n * Disable the \"Done\" button if the gallery is empty, otherwise enable it\n *\n * TODO Disable the button until the user makes any changes\n */\nve.ui.MWGalleryDialog.prototype.updateActions = function () {\n\tthis.actions.setAbilities( { done: this.isSaveable() } );\n};\n\n/**\n * Check if gallery attributes or contents would be modified if changes were applied.\n *\n * @return {boolean}\n */\nve.ui.MWGalleryDialog.prototype.isSaveable = function () {\n\t// Check attributes\n\tif ( this.originalMwDataNormalized ) {\n\t\tconst mwDataCopy = ve.copy( this.selectedNode.getAttribute( 'mw' ) );\n\t\tthis.updateMwData( mwDataCopy );\n\t\tif ( !ve.compare( mwDataCopy, this.originalMwDataNormalized ) ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\tif ( this.captionTarget.hasBeenModified() ) {\n\t\treturn true;\n\t}\n\n\t// Check contents: each image's attributes and contents (caption)\n\tif ( this.anyItemModified || this.isHighlightedItemModified() ) {\n\t\treturn true;\n\t}\n\n\t// Check contents: added/removed/reordered images\n\tif ( this.originalGalleryGroupItems ) {\n\t\tif ( this.galleryGroup.items.length !== this.originalGalleryGroupItems.length ) {\n\t\t\treturn true;\n\t\t}\n\t\tfor ( let i = 0; i < this.galleryGroup.items.length; i++ ) {\n\t\t\tif ( this.galleryGroup.items[ i ] !== this.originalGalleryGroupItems[ i ] ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n};\n\n/**\n * Check if currently highlighted item's attributes or contents would be modified if changes were\n * applied.\n *\n * @return {boolean}\n */\nve.ui.MWGalleryDialog.prototype.isHighlightedItemModified = function () {\n\tif ( this.highlightedItem ) {\n\t\tif ( this.highlightedAltTextInput.getValue() !== this.highlightedItem.altText ) {\n\t\t\treturn true;\n\t\t}\n\t\tif ( this.altTextSameAsCaption.isSelected() !== this.highlightedItem.altTextSame ) {\n\t\t\treturn true;\n\t\t}\n\t\tif ( this.highlightedCaptionTarget.hasBeenModified() ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/**\n * Insert or update the node in the document model from the new values\n */\nve.ui.MWGalleryDialog.prototype.insertOrUpdateNode = function () {\n\tconst surfaceModel = this.getFragment().getSurface(),\n\t\tsurfaceModelDocument = surfaceModel.getDocument(),\n\t\titems = this.galleryGroup.items,\n\t\tdata = [];\n\n\tlet mwData;\n\n\tfunction scaleImage( height, width, maxHeight, maxWidth ) {\n\t\tconst heightScaleFactor = maxHeight / height;\n\t\tconst widthScaleFactor = maxWidth / width;\n\n\t\tconst scaleFactor = width * heightScaleFactor > maxWidth ? widthScaleFactor : heightScaleFactor;\n\n\t\treturn {\n\t\t\theight: Math.round( height * scaleFactor ),\n\t\t\twidth: Math.round( width * scaleFactor )\n\t\t};\n\t}\n\n\t/**\n\t * Get linear data from a gallery item\n\t *\n\t * @param {ve.ui.MWGalleryItemWidget} galleryItem Gallery item\n\t * @return {Array} Linear data\n\t */\n\tfunction getImageLinearData( galleryItem ) {\n\t\tconst size = scaleImage(\n\t\t\tparseInt( galleryItem.height ),\n\t\t\tparseInt( galleryItem.width ),\n\t\t\tparseInt( mwData.attrs.heights || this.defaults.imageHeight ),\n\t\t\tparseInt( mwData.attrs.widths || this.defaults.imageWidth )\n\t\t);\n\t\tconst imageAttributes = {\n\t\t\tresource: './' + galleryItem.resource,\n\t\t\taltText: ( !galleryItem.altText && !galleryItem.originalAltText ) ?\n\t\t\t\t// Use original null/empty value\n\t\t\t\tgalleryItem.originalAltText :\n\t\t\t\tgalleryItem.altText,\n\t\t\taltTextSame: galleryItem.altTextSame,\n\t\t\thref: galleryItem.href,\n\t\t\t// For existing images use `src` to avoid triggering a diff if the\n\t\t\t// thumbnail size changes. For new images we have to use `thumbUrl` (T310623).\n\t\t\tsrc: galleryItem.src || galleryItem.thumbUrl,\n\t\t\theight: size.height,\n\t\t\twidth: size.width,\n\t\t\ttagName: galleryItem.tagName,\n\t\t\tisError: galleryItem.isError,\n\t\t\terrorText: galleryItem.errorText,\n\t\t\timageClassAttr: galleryItem.imageClassAttr,\n\t\t\timgWrapperClassAttr: galleryItem.imgWrapperClassAttr,\n\t\t\tmw: galleryItem.mw,\n\t\t\tmediaClass: galleryItem.mediaClass,\n\t\t\tmediaTag: galleryItem.mediaTag\n\t\t};\n\n\t\treturn [\n\t\t\t{ type: 'mwGalleryImage', attributes: imageAttributes },\n\t\t\t{ type: 'mwGalleryImageCaption' },\n\t\t\t// Actual caption contents are inserted later\n\t\t\t{ type: '/mwGalleryImageCaption' },\n\t\t\t{ type: '/mwGalleryImage' }\n\t\t];\n\t}\n\n\tlet innerRange;\n\tif ( this.selectedNode ) {\n\t\t// Update mwData\n\t\tmwData = ve.copy( this.selectedNode.getAttribute( 'mw' ) );\n\t\tthis.updateMwData( mwData );\n\t\tsurfaceModel.change(\n\t\t\tve.dm.TransactionBuilder.static.newFromAttributeChanges(\n\t\t\t\tsurfaceModelDocument,\n\t\t\t\tthis.selectedNode.getOuterRange().start,\n\t\t\t\t{ mw: mwData }\n\t\t\t)\n\t\t);\n\n\t\tinnerRange = this.selectedNode.getRange();\n\t} else {\n\t\t// Make gallery node and mwData\n\t\tconst element = {\n\t\t\ttype: 'mwGallery',\n\t\t\tattributes: {\n\t\t\t\tmw: {\n\t\t\t\t\tname: 'gallery',\n\t\t\t\t\tattrs: {},\n\t\t\t\t\tbody: {}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tmwData = element.attributes.mw;\n\t\tthis.updateMwData( mwData );\n\t\t// Collapse returns a new fragment, so update this.fragment\n\t\tthis.fragment = this.getFragment().collapseToEnd();\n\t\tthis.getFragment().insertContent( [\n\t\t\telement,\n\t\t\t{ type: '/mwGallery' }\n\t\t] );\n\n\t\tinnerRange = new ve.Range( this.fragment.getSelection().getRange().from + 1 );\n\t}\n\n\t// Update all child elements' data, but without the contents of the captions\n\tif ( this.captionDocument.data.hasContent() ) {\n\t\tdata.push(\n\t\t\t{ type: 'mwGalleryCaption' },\n\t\t\t{ type: '/mwGalleryCaption' }\n\t\t);\n\t}\n\t// Build node for each image\n\tfor ( let i = 0, ilen = items.length; i < ilen; i++ ) {\n\t\tve.batchPush( data, getImageLinearData.call( this, items[ i ] ) );\n\t}\n\t// Replace whole contents of this node with the new ones\n\tsurfaceModel.change(\n\t\tve.dm.TransactionBuilder.static.newFromReplacement(\n\t\t\tsurfaceModelDocument,\n\t\t\tinnerRange,\n\t\t\tdata\n\t\t)\n\t);\n\n\t// Minus 2 to skip past </mwGalleryImageCaption></mwGalleryImage>\n\tlet captionInsertionOffset = innerRange.from + data.length - 2;\n\t// Update image captions. In reverse order to avoid having to adjust offsets for each insertion.\n\tfor ( let i = items.length - 1; i >= 0; i-- ) {\n\t\tsurfaceModel.change(\n\t\t\tve.dm.TransactionBuilder.static.newFromDocumentInsertion(\n\t\t\t\tsurfaceModel.getDocument(),\n\t\t\t\tcaptionInsertionOffset,\n\t\t\t\titems[ i ].captionDocument\n\t\t\t)\n\t\t);\n\t\t// Skip past </mwGalleryImageCaption></mwGalleryImage><mwGalleryImage><mwGalleryImageCaption>\n\t\tcaptionInsertionOffset -= 4;\n\t}\n\n\t// Update gallery caption\n\tif ( this.captionDocument.data.hasContent() ) {\n\t\tsurfaceModel.change(\n\t\t\tve.dm.TransactionBuilder.static.newFromDocumentInsertion(\n\t\t\t\tsurfaceModel.getDocument(),\n\t\t\t\t// Plus 1 to skip past <mwGalleryCaption>\n\t\t\t\tinnerRange.from + 1,\n\t\t\t\tthis.captionDocument\n\t\t\t)\n\t\t);\n\t}\n};\n\n/**\n * Update the 'mw' attribute with data from inputs in the dialog.\n *\n * @param {Object} mwData Value of the 'mw' attribute, updated in-place\n * @private\n */\nve.ui.MWGalleryDialog.prototype.updateMwData = function ( mwData ) {\n\t// Need to do this, otherwise mwData.body.extsrc will override all attribute changes\n\tmwData.body = {};\n\t// Need to do this, otherwise it will override the caption from the gallery caption node\n\tdelete mwData.attrs.caption;\n\t// Update attributes\n\tlet mode;\n\tif ( this.modeDropdown.getMenu().findSelectedItem() ) {\n\t\tmode = this.modeDropdown.getMenu().findSelectedItem().getData();\n\t}\n\t// Unset mode attribute if it is the same as the default\n\tmwData.attrs.mode = mode === this.defaults.mode ? undefined : mode;\n\tmwData.attrs.widths = this.widthsInput.getValue() || undefined;\n\tmwData.attrs.heights = this.heightsInput.getValue() || undefined;\n\tmwData.attrs.perrow = this.perRowInput.getValue() || undefined;\n\tmwData.attrs.showfilename = this.showFilenameCheckbox.isSelected() ? 'yes' : undefined;\n\tmwData.attrs.class = this.classesInput.getValue() || undefined;\n\tmwData.attrs.style = this.stylesInput.getValue() || undefined;\n};\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWGalleryDialog );\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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWMediaDialog.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":747,"column":1,"nodeType":"Block","endLine":747,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWMediaDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Dialog for inserting and editing MediaWiki media.\n *\n * @class\n * @extends ve.ui.NodeDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWMediaDialog = function VeUiMWMediaDialog( config ) {\n\t// Parent constructor\n\tve.ui.MWMediaDialog.super.call( this, config );\n\n\t// Properties\n\tthis.imageModel = null;\n\tthis.isSettingUpModel = false;\n\tthis.isInsertion = false;\n\tthis.selectedImageInfo = null;\n\tthis.searchCache = {};\n\n\tthis.$element.addClass( 've-ui-mwMediaDialog' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWMediaDialog, ve.ui.NodeDialog );\n\n/* Static Properties */\n\nve.ui.MWMediaDialog.static.name = 'media';\n\nve.ui.MWMediaDialog.static.title =\n\tOO.ui.deferMsg( 'visualeditor-dialog-media-title' );\n\nve.ui.MWMediaDialog.static.size = 'medium';\n\nve.ui.MWMediaDialog.static.actions = [\n\t{\n\t\taction: 'done',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-action-apply' ),\n\t\tflags: [ 'progressive', 'primary' ],\n\t\tmodes: 'edit'\n\t},\n\t{\n\t\taction: 'insert',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-action-insert' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: 'insert'\n\t},\n\t{\n\t\taction: 'change',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-change-image' ),\n\t\tmodes: [ 'edit', 'insert' ]\n\t},\n\t{\n\t\taction: 'choose',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-choose-image' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: [ 'info' ]\n\t},\n\t{\n\t\taction: 'upload',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-upload' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: [ 'upload-upload' ]\n\t},\n\t{\n\t\taction: 'save',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-save' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: [ 'upload-info' ]\n\t},\n\t{\n\t\taction: 'cancelchoose',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-goback' ),\n\t\tflags: [ 'safe', 'back' ],\n\t\tmodes: [ 'info' ]\n\t},\n\t{\n\t\taction: 'cancelupload',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-goback' ),\n\t\tflags: [ 'safe', 'back' ],\n\t\tmodes: [ 'upload-info' ]\n\t},\n\t{\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-action-cancel' ),\n\t\tflags: [ 'safe', 'close' ],\n\t\tmodes: [ 'readonly', 'edit', 'insert', 'select', 'search', 'upload-upload' ]\n\t},\n\t{\n\t\taction: 'back',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-goback' ),\n\t\tflags: [ 'safe', 'back' ],\n\t\tmodes: [ 'change' ]\n\t}\n];\n\nve.ui.MWMediaDialog.static.modelClasses = [ ve.dm.MWBlockImageNode, ve.dm.MWInlineImageNode ];\n\nve.ui.MWMediaDialog.static.includeCommands = null;\n\nve.ui.MWMediaDialog.static.excludeCommands = [\n\t// No formatting\n\t'paragraph',\n\t'heading1',\n\t'heading2',\n\t'heading3',\n\t'heading4',\n\t'heading5',\n\t'heading6',\n\t'preformatted',\n\t'blockquote',\n\t// TODO: Decide if tables tools should be allowed\n\t'tableCellHeader',\n\t'tableCellData',\n\t// No structure\n\t'bullet',\n\t'bulletWrapOnce',\n\t'number',\n\t'numberWrapOnce',\n\t'indent',\n\t'outdent'\n];\n\n/**\n * Get the import rules for the surface widget in the dialog\n *\n * @see ve.dm.ElementLinearData#sanitize\n * @return {Object} Import rules\n */\nve.ui.MWMediaDialog.static.getImportRules = function () {\n\tconst rules = ve.copy( ve.init.target.constructor.static.importRules );\n\treturn ve.extendObject(\n\t\trules,\n\t\t{\n\t\t\tall: {\n\t\t\t\tblacklist: ve.extendObject(\n\t\t\t\t\t{\n\t\t\t\t\t\t// Tables (but not lists) are possible in wikitext with a leading\n\t\t\t\t\t\t// line break but we prevent creating these with the UI\n\t\t\t\t\t\tlist: true,\n\t\t\t\t\t\tlistItem: true,\n\t\t\t\t\t\tdefinitionList: true,\n\t\t\t\t\t\tdefinitionListItem: true,\n\t\t\t\t\t\ttable: true,\n\t\t\t\t\t\ttableCaption: true,\n\t\t\t\t\t\ttableSection: true,\n\t\t\t\t\t\ttableRow: true,\n\t\t\t\t\t\ttableCell: true,\n\t\t\t\t\t\tmwTable: true,\n\t\t\t\t\t\tmwTransclusionTableCell: true\n\t\t\t\t\t},\n\t\t\t\t\tve.getProp( rules, 'all', 'blacklist' )\n\t\t\t\t),\n\t\t\t\t// Headings are also possible, but discouraged\n\t\t\t\tconversions: ve.extendObject(\n\t\t\t\t\t{\n\t\t\t\t\t\tmwHeading: 'paragraph'\n\t\t\t\t\t},\n\t\t\t\t\tve.getProp( rules, 'all', 'conversions' )\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t);\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getEscapeAction = function () {\n\tconst backOrClose = this.actions.get( { flags: [ 'back', 'close' ], visible: true } );\n\tif ( backOrClose.length ) {\n\t\treturn backOrClose[ 0 ].getAction();\n\t}\n\treturn null;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getBodyHeight = function () {\n\t// FIXME: This should vary on panel.\n\treturn 600;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.MWMediaDialog.super.prototype.initialize.call( this );\n\n\t// Main layout\n\tthis.panels = new OO.ui.StackLayout();\n\n\t// Settings panels\n\tthis.mediaSettingsLayout = new OO.ui.IndexLayout( {\n\t\tclasses: [ 've-ui-mwMediaDialog-panel-settings' ]\n\t} );\n\tthis.generalSettingsPanel = new OO.ui.TabPanelLayout( 'general', {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-page-general' )\n\t} );\n\tthis.advancedSettingsPanel = new OO.ui.TabPanelLayout( 'advanced', {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-page-advanced' )\n\t} );\n\n\t// General settings panel\n\n\t// Filename\n\tthis.filenameFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-content-filename' ),\n\t\ticon: 'image'\n\t} );\n\n\t// Caption\n\tthis.captionTarget = ve.init.target.createTargetWidget( {\n\t\tincludeCommands: this.constructor.static.includeCommands,\n\t\texcludeCommands: this.constructor.static.excludeCommands,\n\t\timportRules: this.constructor.static.getImportRules(),\n\t\tinDialog: this.constructor.static.name,\n\t\tmultiline: false\n\t} );\n\tconst captionField = new OO.ui.FieldLayout( this.captionTarget, {\n\t\talign: 'top'\n\t} );\n\tthis.captionFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-content-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-content-section-help' ),\n\t\tclasses: [ 've-ui-mwMediaDialog-caption-fieldset' ]\n\t} );\n\tthis.captionFieldset.addItems( [ captionField ] );\n\n\t// Alt text\n\tthis.altTextInput = new OO.ui.MultilineTextInputWidget( {\n\t\tspellcheck: true,\n\t\tclasses: [ 've-ui-mwMediaDialog-altText' ],\n\t\tautosize: true,\n\t\trows: 1,\n\t\tallowLinebreaks: false\n\t} );\n\tconst altTextField = new OO.ui.FieldLayout( this.altTextInput, {\n\t\talign: 'top'\n\t} );\n\tconst altTextFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-alttext-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-alttext-section-help' )\n\t} );\n\taltTextFieldset.addItems( [ altTextField ] );\n\n\t// Advanced settings\n\n\t// Position\n\tthis.positionSelect = new ve.ui.AlignWidget( {\n\t\tdir: this.getDir()\n\t} );\n\tconst positionSelectField = new OO.ui.FieldLayout( this.positionSelect );\n\tthis.positionCheckbox = new OO.ui.CheckboxInputWidget();\n\tconst positionCheckboxField = new OO.ui.FieldLayout( this.positionCheckbox, {\n\t\t$overlay: this.$overlay,\n\t\talign: 'inline',\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-position-checkbox' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-position-checkbox-help' )\n\t} );\n\tconst positionFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-position-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-position-section-help' )\n\t} );\n\tpositionFieldset.addItems( [\n\t\tpositionCheckboxField,\n\t\tpositionSelectField\n\t] );\n\n\t// Type\n\tthis.typeSelectDropdown = new OO.ui.DropdownWidget( { $overlay: this.$overlay } );\n\tthis.typeSelect = this.typeSelectDropdown.getMenu();\n\tthis.typeSelect.addItems( [\n\t\t// TODO: Inline images require a bit of further work, will be coming soon\n\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\tdata: 'thumb',\n\t\t\ticon: 'imageLayoutThumbnail',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-thumb' )\n\t\t} ),\n\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\tdata: 'frameless',\n\t\t\ticon: 'imageLayoutFrameless',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-frameless' )\n\t\t} ),\n\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\tdata: 'frame',\n\t\t\ticon: 'imageLayoutFrame',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-frame' )\n\t\t} ),\n\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\tdata: 'none',\n\t\t\ticon: 'imageLayoutBasic',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-none' )\n\t\t} )\n\t] );\n\tconst typeSelectField = new OO.ui.FieldLayout( this.typeSelectDropdown, {\n\t\talign: 'top'\n\t} );\n\tthis.borderCheckbox = new OO.ui.CheckboxInputWidget();\n\tconst borderField = new OO.ui.FieldLayout( this.borderCheckbox, {\n\t\talign: 'inline',\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-border' )\n\t} );\n\tthis.typeFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-type-section-help' )\n\t} );\n\tthis.typeFieldset.addItems( [\n\t\ttypeSelectField,\n\t\tborderField\n\t] );\n\n\t// Size\n\tthis.sizeWidget = new ve.ui.MediaSizeWidget( undefined, {\n\t\tdimensionsAlign: 'top'\n\t} );\n\tconst sizeWidgetField = new OO.ui.FieldLayout( this.sizeWidget );\n\tthis.sizeFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-size-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-size-section-help' )\n\t} );\n\tthis.sizeFieldset.addItems( [\n\t\tsizeWidgetField\n\t] );\n\n\t// Search, upload and info layouts\n\tthis.mediaSearchPanel = new OO.ui.TabPanelLayout( {\n\t\tclasses: [ 've-ui-mwMediaDialog-panel-search' ],\n\t\tscrollable: true\n\t} );\n\tif ( mw.ForeignStructuredUpload && mw.ForeignStructuredUpload.BookletLayout ) {\n\t\tthis.mediaUploadBooklet = new mw.ForeignStructuredUpload.BookletLayout( {\n\t\t\t$overlay: this.$overlay\n\t\t} );\n\t}\n\tthis.mediaImageInfoPanel = new OO.ui.TabPanelLayout( {\n\t\tclasses: [ 've-ui-mwMediaDialog-panel-imageinfo' ],\n\t\tscrollable: false\n\t} );\n\tthis.$infoPanelWrapper = $( '<div>' ).addClass( 've-ui-mwMediaDialog-panel-imageinfo-wrapper' );\n\n\t// Search and upload panels\n\tthis.searchTabs = new OO.ui.IndexLayout();\n\tconst searchPanel = new OO.ui.TabPanelLayout( 'search', {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-search-tab-search' )\n\t} );\n\tlet uploadPanel;\n\tif ( this.mediaUploadBooklet ) {\n\t\tuploadPanel = new OO.ui.TabPanelLayout( 'upload', {\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-search-tab-upload' ),\n\t\t\tcontent: [ this.mediaUploadBooklet ]\n\t\t} );\n\t}\n\n\t// Search widget\n\tthis.search = new mw.widgets.MediaSearchWidget( {\n\t\trowHeight: OO.ui.isMobile() ? 120 : 200\n\t} );\n\n\t// Events\n\tthis.positionCheckbox.connect( this, { change: 'onPositionCheckboxChange' } );\n\tthis.borderCheckbox.connect( this, { change: 'onBorderCheckboxChange' } );\n\tthis.positionSelect.connect( this, { choose: 'onPositionSelectChoose' } );\n\tthis.typeSelect.connect( this, { choose: 'onTypeSelectChoose' } );\n\tthis.search.getQuery().connect( this, { change: 'onSearchQueryChange' } );\n\tthis.search.getQuery().$indicator.on( 'mousedown', this.onSearchQueryClear.bind( this ) );\n\tthis.search.getResults().connect( this, { choose: 'onSearchResultsChoose' } );\n\tthis.captionTarget.connect( this, { change: 'checkChanged' } );\n\tthis.altTextInput.connect( this, { change: 'onAlternateTextChange' } );\n\tthis.searchTabs.connect( this, { set: 'onSearchTabsSet' } );\n\tif ( this.mediaUploadBooklet ) {\n\t\tthis.mediaUploadBooklet.connect( this, {\n\t\t\tset: 'onMediaUploadBookletSet',\n\t\t\tuploadValid: 'onUploadValid',\n\t\t\tinfoValid: 'onInfoValid'\n\t\t} );\n\t}\n\n\t// Append panels\n\tsearchPanel.$element.append( this.search.$element );\n\tthis.searchTabs.addTabPanels( [ searchPanel ] );\n\tif ( this.mediaUploadBooklet ) {\n\t\tthis.searchTabs.addTabPanels( [ uploadPanel ] );\n\t}\n\tthis.mediaSearchPanel.$element.append(\n\t\tthis.searchTabs.$element\n\t);\n\tthis.generalSettingsPanel.$element.append(\n\t\tthis.filenameFieldset.$element,\n\t\tthis.captionFieldset.$element,\n\t\taltTextFieldset.$element\n\t);\n\tthis.advancedSettingsPanel.$element.append(\n\t\tpositionFieldset.$element,\n\t\tthis.typeFieldset.$element,\n\t\tthis.sizeFieldset.$element\n\t);\n\tthis.mediaSettingsLayout.addTabPanels( [\n\t\tthis.generalSettingsPanel,\n\t\tthis.advancedSettingsPanel\n\t] );\n\tthis.panels.addItems( [\n\t\tthis.mediaSearchPanel,\n\t\tthis.mediaImageInfoPanel,\n\t\tthis.mediaSettingsLayout\n\t] );\n\tthis.$body.append( this.panels.$element );\n};\n\n/**\n * Handle set events from the search tabs\n *\n * @param {OO.ui.TabPanelLayout} tabPanel Current tabPanel\n */\nve.ui.MWMediaDialog.prototype.onSearchTabsSet = function ( tabPanel ) {\n\tconst name = tabPanel.getName();\n\n\tthis.actions.setMode( name );\n\n\tswitch ( name ) {\n\t\tcase 'search':\n\t\t\tthis.setSize( 'larger' );\n\t\t\tbreak;\n\n\t\tcase 'upload':\n\t\t\t// Initialize and reset the upload booklet if it hasn't\n\t\t\t// been initiailized since setup.\n\t\t\tif ( !this.mediaUploadBookletInit ) {\n\t\t\t\tthis.mediaUploadBookletInit = true;\n\t\t\t\tthis.mediaUploadBooklet.initialize();\n\t\t\t}\n\t\t\tthis.setSize( 'medium' );\n\t\t\tthis.uploadPageNameSet( 'upload' );\n\t\t\tbreak;\n\t}\n};\n\n/**\n * Handle panelNameSet events from the upload stack\n *\n * @param {OO.ui.PageLayout} page Current page\n */\nve.ui.MWMediaDialog.prototype.onMediaUploadBookletSet = function ( page ) {\n\tthis.uploadPageNameSet( page.getName() );\n};\n\n/**\n * The upload booklet's page name has changed\n *\n * @param {string} pageName Page name\n */\nve.ui.MWMediaDialog.prototype.uploadPageNameSet = function ( pageName ) {\n\tif ( pageName === 'insert' ) {\n\t\tconst imageInfo = this.mediaUploadBooklet.upload.getImageInfo();\n\t\tthis.chooseImageInfo( imageInfo );\n\t} else {\n\t\t// Hide the tabs after the first page\n\t\tthis.searchTabs.toggleMenu( pageName === 'upload' );\n\n\t\tthis.actions.setMode( 'upload-' + pageName );\n\t}\n};\n\n/**\n * Handle uploadValid events\n *\n * @param {boolean} isValid The panel is complete and valid\n */\nve.ui.MWMediaDialog.prototype.onUploadValid = function ( isValid ) {\n\tthis.actions.setAbilities( { upload: isValid } );\n};\n\n/**\n * Handle infoValid events\n *\n * @param {boolean} isValid The panel is complete and valid\n */\nve.ui.MWMediaDialog.prototype.onInfoValid = function ( isValid ) {\n\tthis.actions.setAbilities( { save: isValid } );\n};\n\n/**\n * Build the image info panel from the information in the API.\n * Use the metadata info if it exists.\n * Note: Some information in the metadata object needs to be safely\n * stripped from its html wrappers.\n *\n * @param {Object} imageinfo Image info\n */\nve.ui.MWMediaDialog.prototype.buildMediaInfoPanel = function ( imageinfo ) {\n\tconst contentDirection = this.getFragment().getDocument().getDir(),\n\t\timageTitleText = imageinfo.title || imageinfo.canonicaltitle,\n\t\timageTitle = new OO.ui.LabelWidget( {\n\t\t\tlabel: mw.Title.newFromText( imageTitleText ).getNameText()\n\t\t} ),\n\t\tmetadata = imageinfo.extmetadata,\n\t\t// Field configuration (in order)\n\t\tapiDataKeysConfig = [\n\t\t\t{\n\t\t\t\tname: 'ImageDescription',\n\t\t\t\tvalue: ve.getProp( metadata, 'ImageDescription', 'value' ),\n\t\t\t\tformat: 'html',\n\t\t\t\tview: {\n\t\t\t\t\ttype: 'description',\n\t\t\t\t\tprimary: true,\n\t\t\t\t\tdescriptionHeight: '5em'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: '$fileDetails',\n\t\t\t\t// Real value is set later\n\t\t\t\tvalue: '',\n\t\t\t\tformat: 'html',\n\t\t\t\tview: { icon: 'image' }\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'LicenseShortName',\n\t\t\t\tvalue: ve.getProp( metadata, 'LicenseShortName', 'value' ),\n\t\t\t\tformat: 'html-remove-formatting',\n\t\t\t\tview: {\n\t\t\t\t\thref: ve.getProp( metadata, 'LicenseUrl', 'value' ),\n\t\t\t\t\ticon: this.getLicenseIcon( ve.getProp( metadata, 'LicenseShortName', 'value' ) )\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Artist',\n\t\t\t\tvalue: ve.getProp( metadata, 'Artist', 'value' ),\n\t\t\t\tformat: 'html-remove-formatting',\n\t\t\t\tview: {\n\t\t\t\t\t// \"Artist\" label\n\t\t\t\t\tlabelMsg: 'visualeditor-dialog-media-info-meta-artist',\n\t\t\t\t\ticon: 'userAvatar'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Credit',\n\t\t\t\tvalue: ve.getProp( metadata, 'Credit', 'value' ),\n\t\t\t\tformat: 'html-remove-formatting',\n\t\t\t\tview: { icon: 'userAvatar' }\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'user',\n\t\t\t\tvalue: imageinfo.user,\n\t\t\t\tformat: 'plaintext',\n\t\t\t\tview: {\n\t\t\t\t\ticon: 'userAvatar',\n\t\t\t\t\t// This is 'uploaded by'\n\t\t\t\t\tlabelMsg: 'visualeditor-dialog-media-info-artist'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'timestamp',\n\t\t\t\tvalue: imageinfo.timestamp,\n\t\t\t\tformat: 'plaintext',\n\t\t\t\tview: {\n\t\t\t\t\ticon: 'clock',\n\t\t\t\t\tlabelMsg: 'visualeditor-dialog-media-info-uploaded',\n\t\t\t\t\tisDate: true\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'DateTimeOriginal',\n\t\t\t\tvalue: ve.getProp( metadata, 'DateTimeOriginal', 'value' ),\n\t\t\t\tformat: 'html-remove-formatting',\n\t\t\t\tview: {\n\t\t\t\t\ticon: 'clock',\n\t\t\t\t\tlabelMsg: 'visualeditor-dialog-media-info-created'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'moreinfo',\n\t\t\t\tvalue: ve.msg( 'visualeditor-dialog-media-info-moreinfo' ),\n\t\t\t\tformat: 'plaintext',\n\t\t\t\tview: {\n\t\t\t\t\ticon: 'info',\n\t\t\t\t\thref: imageinfo.descriptionurl\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\tfields = {},\n\t\t// Store clean API data\n\t\tapiData = {},\n\t\tfileType = this.getFileType( imageinfo.url ),\n\t\t$thumbContainer = $( '<div>' )\n\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-thumb' ),\n\t\t$main = $( '<div>' )\n\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-main' ),\n\t\t$details = $( '<div>' )\n\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-details' ),\n\t\t$image = $( '<img>' );\n\n\t// Main section - title\n\t$main.append(\n\t\timageTitle.$element\n\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-title' )\n\t);\n\n\t// Clean data from the API responses\n\tfor ( let i = 0; i < apiDataKeysConfig.length; i++ ) {\n\t\tconst field = apiDataKeysConfig[ i ].name;\n\t\tif ( apiDataKeysConfig[ i ].format === 'html' ) {\n\t\t\tapiData[ field ] = new OO.ui.HtmlSnippet( apiDataKeysConfig[ i ].value );\n\n\t\t} else if ( apiDataKeysConfig[ i ].format === 'html-remove-formatting' ) {\n\t\t\tapiData[ field ] = this.cleanAPIresponse( apiDataKeysConfig[ i ].value );\n\n\t\t} else if ( apiDataKeysConfig[ i ].format === 'plaintext' ) {\n\t\t\tapiData[ field ] = apiDataKeysConfig[ i ].value;\n\n\t\t} else {\n\t\t\tthrow new Error( 'Unexpected metadata field format' );\n\t\t}\n\t}\n\n\t// Add sizing info for non-audio images\n\tif ( imageinfo.mediatype === 'AUDIO' ) {\n\t\t// Label this file as an audio\n\t\tapiData.$fileDetails = $( '<span>' )\n\t\t\t.text( ve.msg( 'visualeditor-dialog-media-info-audiofile' ) );\n\t} else {\n\t\t// Build the display for image size and type\n\t\tapiData.$fileDetails = $( '<div>' )\n\t\t\t.append(\n\t\t\t\t$( '<span>' ).text(\n\t\t\t\t\timageinfo.width +\n\t\t\t\t\t'\\u00a0' +\n\t\t\t\t\tve.msg( 'visualeditor-dimensionswidget-times' ) +\n\t\t\t\t\t'\\u00a0' +\n\t\t\t\t\timageinfo.height +\n\t\t\t\t\tve.msg( 'visualeditor-dimensionswidget-px' )\n\t\t\t\t),\n\t\t\t\t$( '<span>' )\n\t\t\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-separator' )\n\t\t\t\t\t.text( ve.msg( 'visualeditor-dialog-media-info-separator' ) ),\n\t\t\t\t$( '<span>' ).text( fileType )\n\t\t\t);\n\t}\n\n\t// Attach all fields in order\n\tfor ( let i = 0; i < apiDataKeysConfig.length; i++ ) {\n\t\tconst field = apiDataKeysConfig[ i ].name;\n\t\tif ( apiData[ field ] ) {\n\t\t\tconst $section = apiDataKeysConfig[ i ].view.primary ? $main : $details;\n\n\t\t\tfields[ field ] = new ve.ui.MWMediaInfoFieldWidget( apiData[ field ], apiDataKeysConfig[ i ].view );\n\t\t\t$section.append( fields[ field ].$element );\n\t\t}\n\t}\n\n\t// Build the info panel\n\tconst $info = $( '<div>' )\n\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-info' )\n\t\t.append(\n\t\t\t$main.prop( 'dir', contentDirection ),\n\t\t\t$details\n\t\t);\n\tve.targetLinksToNewWindow( $info[ 0 ] );\n\n\t// Initialize thumb container\n\t$thumbContainer\n\t\t.append( $image.prop( 'src', imageinfo.thumburl ) );\n\n\tthis.$infoPanelWrapper.empty().append(\n\t\t$thumbContainer,\n\t\t$info\n\t);\n\n\t// Force a scrollbar to the screen before we measure it\n\tthis.mediaImageInfoPanel.$element.css( 'overflow-y', 'scroll' );\n\tconst windowWidth = this.mediaImageInfoPanel.$element.width();\n\n\t// Define thumbnail size\n\tlet newDimensions;\n\tif ( imageinfo.mediatype === 'AUDIO' ) {\n\t\t// HACK: We are getting the wrong information from the\n\t\t// API about audio files. Set their thumbnail to square\n\t\tnewDimensions = {\n\t\t\twidth: imageinfo.thumbwidth,\n\t\t\theight: imageinfo.thumbwidth\n\t\t};\n\t} else {\n\t\t// For regular images, calculate a bigger image dimensions\n\t\tnewDimensions = ve.dm.MWImageNode.static.resizeToBoundingBox(\n\t\t\t// Original image dimensions\n\t\t\t{\n\t\t\t\twidth: imageinfo.width,\n\t\t\t\theight: imageinfo.height\n\t\t\t},\n\t\t\t// Bounding box -- the size of the dialog, minus padding\n\t\t\t{\n\t\t\t\twidth: windowWidth,\n\t\t\t\theight: this.getBodyHeight() - 120\n\t\t\t}\n\t\t);\n\t}\n\t// Resize the image\n\t$image.css( {\n\t\twidth: newDimensions.width,\n\t\theight: newDimensions.height\n\t} );\n\n\t// Call for a bigger image\n\tthis.fetchThumbnail( imageTitleText, newDimensions )\n\t\t.then( ( thumburl ) => {\n\t\t\tif ( thumburl ) {\n\t\t\t\t$image.prop( 'src', thumburl );\n\t\t\t}\n\t\t} );\n\n\tconst isPortrait = newDimensions.width < ( windowWidth * 3 / 5 );\n\tthis.mediaImageInfoPanel.$element.toggleClass( 've-ui-mwMediaDialog-panel-imageinfo-portrait', isPortrait );\n\tthis.mediaImageInfoPanel.$element.append( this.$infoPanelWrapper );\n\tif ( isPortrait ) {\n\t\t$info.outerWidth( Math.floor( windowWidth - $thumbContainer.outerWidth( true ) - 15 ) );\n\t}\n\n\t// Initialize fields\n\tfor ( const field in fields ) {\n\t\tfields[ field ].initialize();\n\t}\n\t// Let the scrollbar appear naturally if it should\n\tthis.mediaImageInfoPanel.$element.css( 'overflow', '' );\n};\n\n/**\n * Fetch a bigger image thumbnail from the API.\n *\n * @param {string} imageName Image source\n * @param {Object} dimensions Image dimensions\n * @return {jQuery.Promise} Thumbnail promise that resolves with new thumb url\n */\nve.ui.MWMediaDialog.prototype.fetchThumbnail = function ( imageName, dimensions ) {\n\t// Check cache first\n\tif ( this.searchCache[ imageName ] ) {\n\t\treturn ve.createDeferred().resolve( this.searchCache[ imageName ] );\n\t}\n\n\tconst params = {\n\t\taction: 'query',\n\t\tprop: 'imageinfo',\n\t\tiiprop: 'url',\n\t\ttitles: imageName\n\t};\n\n\tif ( dimensions.width ) {\n\t\tparams.iiurlwidth = dimensions.width;\n\t}\n\tif ( dimensions.height ) {\n\t\tparams.iiurlheight = dimensions.height;\n\t}\n\treturn ve.init.target.getContentApi( this.getFragment().getDocument() ).get( params )\n\t\t.then( ( response ) => {\n\t\t\tconst thumburl = ve.getProp( response.query.pages[ 0 ], 'imageinfo', 0, 'thumburl' );\n\t\t\t// Cache\n\t\t\tthis.searchCache[ imageName ] = thumburl;\n\t\t\treturn thumburl;\n\t\t} );\n};\n\n/**\n * Clean the API responses and return it in plaintext. If needed, truncate.\n *\n * @param {string} html Raw response from the API\n * @return {string} Plaintext clean response\n */\nve.ui.MWMediaDialog.prototype.cleanAPIresponse = function ( html ) {\n\tlet text = $( $.parseHTML( html ) ).text();\n\n\t// Check if the string should be truncated\n\tconst charLimit = 50;\n\tif ( text.length > charLimit ) {\n\t\tconst ellipsis = ve.msg( 'visualeditor-dialog-media-info-ellipsis' );\n\t\ttext = text.slice( 0, charLimit ) + ellipsis;\n\t}\n\n\treturn text;\n};\n\n/**\n * Get the file type from the suffix of the url\n *\n * @param {string} url Full file url\n * @return {string} File type\n */\nve.ui.MWMediaDialog.prototype.getFileType = function ( url ) {\n\t// TODO: Validate these types, and work with icons\n\t// SVG, PNG, JPEG, GIF, TIFF, XCF;\n\t// OGA, OGG, MIDI, WAV;\n\t// WEBM, OGV, OGX;\n\t// APNG;\n\t// PDF, DJVU\n\treturn url.split( '.' ).pop().toUpperCase();\n};\n\n/**\n * Get the proper icon for the license if it is recognized\n * or general info icon if it is not recognized.\n *\n * @param {string} license License short name\n * @return {string} Icon name\n */\nve.ui.MWMediaDialog.prototype.getLicenseIcon = function ( license ) {\n\tif ( !license ) {\n\t\treturn 'info';\n\t}\n\n\tconst normalized = license.toLowerCase().replace( /[-_]/g, ' ' );\n\n\t// FIXME: Structured data from Commons will make this properly\n\t// multilingual. For now, this is the limit of what is sensible.\n\tif ( /^((cc )?pd|public domain)/.test( normalized ) ) {\n\t\treturn 'public-domain';\n\t} else if ( /^cc (by|sa)?/.test( normalized ) ) {\n\t\treturn 'logoCC';\n\t} else {\n\t\treturn 'info';\n\t}\n};\n\n/**\n * Handle search results choose event.\n *\n * @param {mw.widgets.MediaResultWidget} item Chosen item\n */\nve.ui.MWMediaDialog.prototype.onSearchResultsChoose = function ( item ) {\n\tthis.chooseImageInfo( item.getData() );\n\n\tve.track( 'activity.' + this.constructor.static.name, {\n\t\taction: 'search-choose-image'\n\t} );\n};\n\n/**\n * Handle query change events from the search input widget\n *\n * @param {string} query\n */\nve.ui.MWMediaDialog.prototype.onSearchQueryChange = function ( query ) {\n\tif ( query === '' ) {\n\t\treturn;\n\t}\n\n\tve.track( 'activity.' + this.constructor.static.name, {\n\t\taction: 'search-change-query'\n\t} );\n};\n\n/**\n * Handle clearing of search query by user clicking on indicator\n */\nve.ui.MWMediaDialog.prototype.onSearchQueryClear = function () {\n\tve.track( 'activity.' + this.constructor.static.name, {\n\t\taction: 'search-clear-query'\n\t} );\n};\n\n/**\n * Choose image info for editing\n *\n * @param {Object} info Image info\n */\nve.ui.MWMediaDialog.prototype.chooseImageInfo = function ( info ) {\n\t// Switch panels\n\tthis.selectedImageInfo = info;\n\tthis.switchPanels( 'imageInfo' );\n\t// Build info panel\n\tthis.buildMediaInfoPanel( info );\n};\n\n/**\n * Handle new image being chosen.\n *\n * @param {mw.widgets.MediaResultWidget|null} item Selected item\n */\nve.ui.MWMediaDialog.prototype.confirmSelectedImage = function () {\n\tconst obj = {},\n\t\tinfo = this.selectedImageInfo;\n\n\tif ( info ) {\n\t\tconst imageTitleText = info.title || info.canonicaltitle;\n\t\t// Run title through mw.Title so the File: prefix is localised\n\t\tconst title = mw.Title.newFromText( imageTitleText ).getPrefixedText();\n\t\tif ( !this.imageModel ) {\n\t\t\t// Create a new image model based on default attributes\n\t\t\tthis.imageModel = ve.dm.MWImageModel.static.newFromImageAttributes(\n\t\t\t\t{\n\t\t\t\t\t// Per https://www.mediawiki.org/w/?diff=931265&oldid=prev\n\t\t\t\t\thref: './' + title,\n\t\t\t\t\tsrc: info.url,\n\t\t\t\t\tresource: './' + title,\n\t\t\t\t\twidth: info.thumbwidth,\n\t\t\t\t\theight: info.thumbheight,\n\t\t\t\t\tmediaType: info.mediatype,\n\t\t\t\t\ttype: 'thumb',\n\t\t\t\t\talign: 'default',\n\t\t\t\t\tdefaultSize: true,\n\t\t\t\t\timageClassAttr: 'mw-file-element'\n\t\t\t\t},\n\t\t\t\tthis.getFragment().getDocument()\n\t\t\t);\n\t\t\tthis.attachImageModel();\n\t\t\tthis.resetCaption();\n\t\t} else {\n\t\t\t// Update the current image model with the new image source\n\t\t\tthis.imageModel.changeImageSource(\n\t\t\t\t{\n\t\t\t\t\tmediaType: info.mediatype,\n\t\t\t\t\thref: './' + title,\n\t\t\t\t\tsrc: info.url,\n\t\t\t\t\tresource: './' + title\n\t\t\t\t},\n\t\t\t\tinfo\n\t\t\t);\n\t\t\tthis.updateFilenameFieldset();\n\t\t}\n\n\t\t// Cache\n\t\t// We're trimming the stored data down to be consistent with what\n\t\t// ImageInfoCache.getRequestPromise fetches.\n\t\tobj[ imageTitleText ] = {\n\t\t\tsize: info.size,\n\t\t\twidth: info.width,\n\t\t\theight: info.height,\n\t\t\tmediatype: info.mediatype\n\t\t};\n\t\tve.init.platform.imageInfoCache.set( obj );\n\n\t\tthis.checkChanged();\n\t\tthis.switchPanels( 'edit' );\n\n\t\tve.track( 'activity.' + this.constructor.static.name, {\n\t\t\taction: 'search-confirm-image'\n\t\t} );\n\t}\n};\n\n/**\n * Update the filename fieldset (link to media page)\n */\nve.ui.MWMediaDialog.prototype.updateFilenameFieldset = function () {\n\tconst title = mw.Title.newFromText( mw.libs.ve.normalizeParsoidResourceName( this.imageModel.getResourceName() ) );\n\tconst $link = $( '<a>' )\n\t\t.addClass( 've-ui-mwMediaDialog-description-link' )\n\t\t.attr( 'target', '_blank' )\n\t\t.attr( 'rel', 'noopener' )\n\t\t.text( ve.msg( 'visualeditor-dialog-media-content-description-link' ) );\n\tve.setAttributeSafe( $link[ 0 ], 'href', title.getUrl() );\n\tthis.filenameFieldset.setLabel(\n\t\t$( '<span>' ).append(\n\t\t\t$( document.createTextNode( this.imageModel.getFilename() + ' ' ) ),\n\t\t\t$link\n\t\t)\n\t);\n};\n\n/**\n * Handle image model alignment change\n *\n * @param {string} alignment Image alignment\n */\nve.ui.MWMediaDialog.prototype.onImageModelAlignmentChange = function ( alignment ) {\n\talignment = alignment || 'none';\n\n\t// Select the item without triggering the 'choose' event\n\tthis.positionSelect.selectItemByData( alignment !== 'none' ? alignment : undefined );\n\n\tthis.positionCheckbox.setSelected( alignment !== 'none' );\n\tthis.checkChanged();\n};\n\n/**\n * Handle image model type change\n *\n * @param {string} type Image type\n */\nve.ui.MWMediaDialog.prototype.onImageModelTypeChange = function ( type ) {\n\tthis.typeSelect.selectItemByData( type );\n\n\tthis.borderCheckbox.setDisabled(\n\t\t!this.imageModel.isBorderable()\n\t);\n\n\tthis.borderCheckbox.setSelected(\n\t\tthis.imageModel.isBorderable() && this.imageModel.hasBorder()\n\t);\n\tthis.checkChanged();\n};\n\n/**\n * Handle change event on the positionCheckbox element.\n *\n * @param {boolean} isSelected Checkbox status\n */\nve.ui.MWMediaDialog.prototype.onPositionCheckboxChange = function ( isSelected ) {\n\tconst currentModelAlignment = this.imageModel.getAlignment();\n\n\tthis.positionSelect.setDisabled( !isSelected );\n\tthis.checkChanged();\n\t// Only update the model if the current value is different than that\n\t// of the image model\n\tif (\n\t\t( currentModelAlignment === 'none' && isSelected ) ||\n\t\t( currentModelAlignment !== 'none' && !isSelected )\n\t) {\n\t\tif ( isSelected ) {\n\t\t\t// Picking a floating alignment value will create a block image\n\t\t\t// no matter what the type is, so in here we want to calculate\n\t\t\t// the default alignment of a block to set as our initial alignment\n\t\t\t// in case the checkbox is clicked but there was no alignment set\n\t\t\t// previously.\n\t\t\tconst newPositionValue = this.imageModel.getDefaultDir( 'mwBlockImage' );\n\t\t\tthis.imageModel.setAlignment( newPositionValue );\n\t\t} else {\n\t\t\t// If we're unchecking the box, always set alignment to none and unselect the position widget\n\t\t\tthis.imageModel.setAlignment( 'none' );\n\t\t}\n\t}\n};\n\n/**\n * Handle change event on the positionCheckbox element.\n *\n * @param {boolean} isSelected Checkbox status\n */\nve.ui.MWMediaDialog.prototype.onBorderCheckboxChange = function ( isSelected ) {\n\t// Only update if the value is different than the model\n\tif ( this.imageModel.hasBorder() !== isSelected ) {\n\t\t// Update the image model\n\t\tthis.imageModel.toggleBorder( isSelected );\n\t\tthis.checkChanged();\n\t}\n};\n\n/**\n * Handle change event on the positionSelect element.\n *\n * @param {OO.ui.ButtonOptionWidget} item Selected item\n */\nve.ui.MWMediaDialog.prototype.onPositionSelectChoose = function ( item ) {\n\tconst position = item.getData();\n\n\t// Only update if the value is different than the model\n\tif ( this.imageModel.getAlignment() !== position ) {\n\t\tthis.imageModel.setAlignment( position );\n\t\tthis.checkChanged();\n\t}\n};\n\n/**\n * Handle change event on the typeSelect element.\n *\n * @param {OO.ui.MenuOptionWidget} item Selected item\n */\nve.ui.MWMediaDialog.prototype.onTypeSelectChoose = function ( item ) {\n\tconst type = item.getData();\n\n\t// Only update if the value is different than the model\n\tif ( this.imageModel.getType() !== type ) {\n\t\tthis.imageModel.setType( type );\n\t\tthis.checkChanged();\n\t}\n\n\t// If type is 'frame', custom size is ignored\n\tif ( type === 'frame' ) {\n\t\tthis.sizeWidget.setSizeType( 'default' );\n\t}\n};\n\n/**\n * Handle changeSizeType events from the MediaSizeWidget\n *\n * @param {string} sizeType Size type\n */\nve.ui.MWMediaDialog.prototype.onChangeSizeType = function ( sizeType ) {\n\t// type=frame is not resizeable, so change it to type=thumb\n\tif ( sizeType === 'custom' && this.imageModel.getType() === 'frame' ) {\n\t\tthis.imageModel.setType( 'thumb' );\n\t}\n\n\tthis.checkChanged();\n};\n\n/**\n * Respond to change in alternate text\n *\n * @param {string} text New alternate text\n */\nve.ui.MWMediaDialog.prototype.onAlternateTextChange = function ( text ) {\n\tthis.imageModel.setAltText( text );\n\tthis.checkChanged();\n};\n\n/**\n * When changes occur, enable the apply button.\n */\nve.ui.MWMediaDialog.prototype.checkChanged = function () {\n\tlet captionChanged = false;\n\n\t// Only check 'changed' status after the model has finished\n\t// building itself\n\tif ( !this.isSettingUpModel ) {\n\t\tcaptionChanged = !!this.captionTarget && this.captionTarget.hasBeenModified();\n\n\t\tif (\n\t\t\tthis.imageModel &&\n\t\t\t// Activate or deactivate the apply/insert buttons\n\t\t\t// Make sure sizes are valid first\n\t\t\tthis.sizeWidget.isValid() &&\n\t\t\t(\n\t\t\t\t// Check that the model or caption changed\n\t\t\t\tthis.isInsertion ||\n\t\t\t\tcaptionChanged ||\n\t\t\t\tthis.imageModel.hasBeenModified()\n\t\t\t)\n\t\t) {\n\t\t\tthis.actions.setAbilities( { insert: true, done: true } );\n\t\t} else {\n\t\t\tthis.actions.setAbilities( { insert: false, done: false } );\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWMediaDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tconst isReadOnly = this.isReadOnly();\n\n\t\t\t// Set language for search results\n\t\t\tthis.search.setLang( this.getFragment().getDocument().getLang() );\n\n\t\t\tif ( this.selectedNode ) {\n\t\t\t\tthis.isInsertion = false;\n\t\t\t\t// Create image model\n\t\t\t\tthis.imageModel = ve.dm.MWImageModel.static.newFromImageNode( this.selectedNode );\n\t\t\t\tthis.attachImageModel();\n\n\t\t\t\tif ( !this.imageModel.isDefaultSize() ) {\n\t\t\t\t\t// To avoid dirty diff in case where only the image changes,\n\t\t\t\t\t// we will store the initial bounding box, in case the image\n\t\t\t\t\t// is not defaultSize\n\t\t\t\t\tthis.imageModel.setBoundingBox( this.imageModel.getCurrentDimensions() );\n\t\t\t\t}\n\t\t\t\t// Store initial hash to compare against\n\t\t\t\tthis.imageModel.storeInitialHash( this.imageModel.getHashObject() );\n\t\t\t} else {\n\t\t\t\tthis.isInsertion = true;\n\t\t\t}\n\n\t\t\tthis.search.setup();\n\t\t\t// Try to populate with user uploads\n\t\t\tthis.search.queryMediaQueue();\n\t\t\tthis.resetCaption();\n\n\t\t\tthis.altTextInput.setReadOnly( isReadOnly );\n\t\t\tthis.positionCheckbox.setDisabled( isReadOnly );\n\t\t\t// TODO: This widget is not readable when disabled\n\t\t\tthis.positionSelect.setDisabled( isReadOnly );\n\t\t\tthis.typeSelectDropdown.setDisabled( isReadOnly );\n\t\t\tthis.borderCheckbox.setDisabled( isReadOnly );\n\t\t\tthis.sizeWidget.setDisabled( isReadOnly );\n\n\t\t\t// Pass `true` to avoid focussing. If we focus the image caption widget during dialog\n\t\t\t// opening, and it wants to display a context menu, it will be mispositioned.\n\t\t\tthis.switchPanels( this.selectedNode ? 'edit' : 'search', true );\n\n\t\t\tthis.actions.setAbilities( { upload: false, save: false, insert: false, done: false } );\n\n\t\t\tthis.mediaUploadBookletInit = false;\n\t\t\tif ( data.file && this.mediaUploadBooklet ) {\n\t\t\t\tthis.searchTabs.setTabPanel( 'upload' );\n\t\t\t\tthis.mediaUploadBooklet.setFile( data.file );\n\t\t\t}\n\t\t} );\n};\n\n/**\n * Switch between the edit and insert/search panels\n *\n * @param {string} panel Panel name\n * @param {boolean} [noFocus=false] Do not put focus into the default field of the panel\n */\nve.ui.MWMediaDialog.prototype.switchPanels = function ( panel, noFocus ) {\n\tswitch ( panel ) {\n\t\tcase 'edit':\n\t\t\tthis.setSize( this.constructor.static.size );\n\t\t\t// Set the edit panel\n\t\t\tthis.panels.setItem( this.mediaSettingsLayout );\n\t\t\t// Focus the general settings page\n\t\t\tthis.mediaSettingsLayout.setTabPanel( 'general' );\n\t\t\t// Parent functionality (edit/insert/readonly)\n\t\t\tthis.actions.setMode( this.getMode() );\n\t\t\tif ( !noFocus ) {\n\t\t\t\t// Focus the caption surface\n\t\t\t\tthis.captionTarget.focus();\n\t\t\t}\n\t\t\t// Auto-sized alt text field is populated while hidden,\n\t\t\t// so force a manual resize now.\n\t\t\tthis.altTextInput.adjustSize( true );\n\t\t\tbreak;\n\t\tcase 'search':\n\t\t\tthis.setSize( 'larger' );\n\t\t\tthis.selectedImageInfo = null;\n\t\t\t// Set the edit panel\n\t\t\tthis.panels.setItem( this.mediaSearchPanel );\n\t\t\tthis.searchTabs.setTabPanel( 'search' );\n\t\t\tthis.searchTabs.toggleMenu( true );\n\t\t\tthis.actions.setMode( this.imageModel ? 'change' : 'select' );\n\t\t\tif ( !noFocus ) {\n\t\t\t\tthis.search.getQuery().focus().select();\n\t\t\t}\n\t\t\t// Layout pending items\n\t\t\tthis.search.runLayoutQueue();\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase 'imageInfo':\n\t\t\tthis.setSize( 'larger' );\n\t\t\t// Hide/show buttons\n\t\t\tthis.actions.setMode( 'info' );\n\t\t\t// Hide/show the panels\n\t\t\tthis.panels.setItem( this.mediaImageInfoPanel );\n\t\t\tbreak;\n\t}\n\tthis.currentPanel = panel || 'imageinfo';\n};\n\n/**\n * Attach the image model to the dialog\n */\nve.ui.MWMediaDialog.prototype.attachImageModel = function () {\n\tif ( this.imageModel ) {\n\t\tthis.imageModel.disconnect( this );\n\t\tthis.sizeWidget.disconnect( this );\n\t}\n\n\t// Events\n\tthis.imageModel.connect( this, {\n\t\talignmentChange: 'onImageModelAlignmentChange',\n\t\ttypeChange: 'onImageModelTypeChange',\n\t\tsizeDefaultChange: 'checkChanged'\n\t} );\n\n\t// Set up\n\t// Ignore the following changes in validation while we are\n\t// setting up the initial tools according to the model state\n\tthis.isSettingUpModel = true;\n\n\t// Filename\n\tthis.updateFilenameFieldset();\n\n\t// Size widget\n\tthis.sizeWidget.setScalable( this.imageModel.getScalable() );\n\tthis.sizeWidget.connect( this, {\n\t\tchangeSizeType: 'onChangeSizeType',\n\t\tchange: 'checkChanged',\n\t\tvalid: 'checkChanged'\n\t} );\n\n\t// Initialize size\n\tthis.sizeWidget.setSizeType( this.imageModel.isDefaultSize() ? 'default' : 'custom' );\n\n\t// Update default dimensions\n\tthis.sizeWidget.updateDefaultDimensions();\n\n\t// Set initial alt text\n\tthis.altTextInput.setValue( this.imageModel.getAltText() );\n\n\t// Set initial alignment\n\tthis.positionSelect.setDisabled( !this.imageModel.isAligned() );\n\tthis.positionSelect.selectItemByData( this.imageModel.isAligned() && this.imageModel.getAlignment() );\n\tthis.positionCheckbox.setSelected( this.imageModel.isAligned() );\n\n\t// Border flag\n\tthis.borderCheckbox.setDisabled( !this.imageModel.isBorderable() );\n\tthis.borderCheckbox.setSelected( this.imageModel.isBorderable() && this.imageModel.hasBorder() );\n\n\t// Type select\n\tthis.typeSelect.selectItemByData( this.imageModel.getType() || 'none' );\n\n\tthis.isSettingUpModel = false;\n};\n\n/**\n * Reset the caption surface\n */\nve.ui.MWMediaDialog.prototype.resetCaption = function () {\n\tconst doc = this.getFragment().getDocument();\n\n\t// Get existing caption. We only do this in setup, because the caption\n\t// should not reset to original if the image is replaced or edited.\n\t//\n\t// If the selected node is a block image and the caption already exists,\n\t// store the initial caption and set it as the caption document\n\tif (\n\t\tthis.imageModel &&\n\t\tthis.selectedNode &&\n\t\tthis.selectedNode.getDocument() &&\n\t\tthis.selectedNode instanceof ve.dm.MWBlockImageNode\n\t) {\n\t\tconst captionNode = this.selectedNode.getCaptionNode();\n\t\tif ( captionNode && captionNode.getLength() > 0 ) {\n\t\t\tthis.imageModel.setCaptionDocument(\n\t\t\t\tthis.selectedNode.getDocument().cloneFromRange( captionNode.getRange() )\n\t\t\t);\n\t\t}\n\t}\n\n\tlet captionDocument;\n\tif ( this.imageModel ) {\n\t\tcaptionDocument = this.imageModel.getCaptionDocument();\n\t} else {\n\t\tcaptionDocument = doc.cloneWithData( [\n\t\t\t{ type: 'paragraph', internal: { generated: 'wrapper' } },\n\t\t\t{ type: '/paragraph' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t] );\n\t}\n\n\t// Set document\n\tthis.captionTarget.setDocument( captionDocument );\n\tthis.captionTarget.setReadOnly( this.isReadOnly() );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWMediaDialog.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tif ( !data.file ) {\n\t\t\t\tthis.switchPanels( this.selectedNode ? 'edit' : 'search' );\n\t\t\t}\n\t\t\t// Revalidate size\n\t\t\tthis.sizeWidget.validateDimensions();\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getTeardownProcess = function ( data ) {\n\treturn ve.ui.MWMediaDialog.super.prototype.getTeardownProcess.call( this, data )\n\t\t.first( () => {\n\t\t\tthis.mediaSettingsLayout.resetScroll();\n\t\t\t// Cleanup\n\t\t\tthis.search.getQuery().setValue( '' );\n\t\t\tthis.search.teardown();\n\t\t\tif ( this.imageModel ) {\n\t\t\t\tthis.imageModel.disconnect( this );\n\t\t\t\tthis.sizeWidget.disconnect( this );\n\t\t\t}\n\t\t\tthis.captionTarget.clear();\n\t\t\tthis.imageModel = null;\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getActionProcess = function ( action ) {\n\tlet handler;\n\n\tswitch ( action ) {\n\t\tcase 'change':\n\t\t\thandler = function () {\n\t\t\t\tthis.switchPanels( 'search' );\n\t\t\t};\n\n\t\t\tve.track( 'activity.' + this.constructor.static.name, {\n\t\t\t\taction: 'search-change-image'\n\t\t\t} );\n\t\t\tbreak;\n\t\tcase 'back':\n\t\t\thandler = function () {\n\t\t\t\tthis.switchPanels( 'edit' );\n\t\t\t};\n\t\t\tbreak;\n\t\tcase 'choose':\n\t\t\thandler = function () {\n\t\t\t\tthis.confirmSelectedImage();\n\t\t\t\tthis.switchPanels( 'edit' );\n\t\t\t};\n\t\t\tbreak;\n\t\tcase 'cancelchoose':\n\t\t\thandler = function () {\n\t\t\t\tthis.switchPanels( 'search' );\n\t\t\t};\n\t\t\tve.track( 'activity.' + this.constructor.static.name, {\n\t\t\t\taction: 'search-change-image'\n\t\t\t} );\n\t\t\tbreak;\n\t\tcase 'cancelupload':\n\t\t\thandler = function () {\n\t\t\t\tthis.searchTabs.setTabPanel( 'upload' );\n\t\t\t\tthis.searchTabs.toggleMenu( true );\n\t\t\t\treturn this.mediaUploadBooklet.initialize();\n\t\t\t};\n\t\t\tbreak;\n\t\tcase 'upload':\n\t\t\tve.track( 'activity.' + this.constructor.static.name, {\n\t\t\t\taction: 'search-upload-image'\n\t\t\t} );\n\t\t\treturn new OO.ui.Process( this.mediaUploadBooklet.uploadFile() );\n\t\tcase 'save':\n\t\t\treturn new OO.ui.Process( this.mediaUploadBooklet.saveFile() );\n\t\tcase 'done':\n\t\tcase 'insert':\n\t\t\thandler = function () {\n\t\t\t\tconst surfaceModel = this.getFragment().getSurface();\n\n\t\t\t\t// Update from the form\n\t\t\t\tthis.imageModel.setAltText( this.altTextInput.getValue() );\n\t\t\t\tthis.imageModel.setCaptionDocument(\n\t\t\t\t\tthis.captionTarget.getSurface().getModel().getDocument()\n\t\t\t\t);\n\n\t\t\t\tif (\n\t\t\t\t\t// There was an initial node\n\t\t\t\t\tthis.selectedNode &&\n\t\t\t\t\t// And we didn't change the image type block/inline or vice versa\n\t\t\t\t\tthis.selectedNode.type === this.imageModel.getImageNodeType() &&\n\t\t\t\t\t// And we didn't change the image itself\n\t\t\t\t\tthis.selectedNode.getAttribute( 'src' ) ===\n\t\t\t\t\t\tthis.imageModel.getImageSource()\n\t\t\t\t) {\n\t\t\t\t\t// We only need to update the attributes of the current node\n\t\t\t\t\tthis.imageModel.updateImageNode( this.selectedNode, surfaceModel );\n\t\t\t\t} else {\n\t\t\t\t\t// Replacing an image or inserting a brand new one\n\t\t\t\t\tthis.fragment = this.imageModel.insertImageNode( this.getFragment() );\n\t\t\t\t}\n\n\t\t\t\tthis.close( { action: action } );\n\t\t\t};\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn ve.ui.MWMediaDialog.super.prototype.getActionProcess.call( this, action );\n\t}\n\n\treturn new OO.ui.Process( handler, this );\n};\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWMediaDialog );\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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWMetaDialog.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-each-util","severity":2,"message":"Prefer Array#forEach to $.each","line":96,"column":2,"nodeType":"CallExpression","endLine":109,"endColumn":5,"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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWMobileSaveDialog.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":48,"column":4,"nodeType":"CallExpression","endLine":48,"endColumn":36,"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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWPreDialog.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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWRequiredParamBlankConfirmDialog.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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWSaveDialog.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":95,"column":1,"nodeType":"Block","endLine":95,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":134,"column":1,"nodeType":"Block","endLine":134,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":135,"column":1,"nodeType":"Block","endLine":135,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":418,"column":1,"nodeType":"Block","endLine":418,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":173,"column":4,"nodeType":"CallExpression","endLine":173,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":209,"column":4,"nodeType":"CallExpression","endLine":209,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":219,"column":3,"nodeType":"CallExpression","endLine":219,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":221,"column":3,"nodeType":"CallExpression","endLine":234,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":226,"column":4,"nodeType":"CallExpression","endLine":232,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":374,"column":7,"nodeType":"CallExpression","endLine":374,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-slide","severity":2,"message":"Prefer CSS transitions to .slideDown","line":432,"column":19,"nodeType":"CallExpression","endLine":435,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-slide","severity":2,"message":"Prefer CSS transitions to .slideUp","line":457,"column":3,"nodeType":"CallExpression","endLine":460,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":546,"column":27,"nodeType":"CallExpression","endLine":547,"endColumn":58,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":674,"column":19,"nodeType":"CallExpression","endLine":675,"endColumn":76,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":808,"column":4,"nodeType":"CallExpression","endLine":808,"endColumn":47,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWSaveDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Dialog for saving MediaWiki pages.\n *\n * Note that most methods are not safe to call before the dialog has initialized, except where\n * noted otherwise.\n *\n * @class\n * @extends OO.ui.ProcessDialog\n *\n * @constructor\n * @param {Object} [config] Config options\n */\nve.ui.MWSaveDialog = function VeUiMwSaveDialog( config ) {\n\t// Parent constructor\n\tve.ui.MWSaveDialog.super.call( this, config );\n\n\t// Properties\n\tthis.editSummaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' );\n\tthis.restoring = false;\n\tthis.messages = {};\n\tthis.setupDeferred = ve.createDeferred();\n\tthis.checkboxesByName = null;\n\tthis.changedEditSummary = false;\n\tthis.canReview = false;\n\tthis.canPreview = false;\n\tthis.hasDiff = false;\n\tthis.diffElement = null;\n\tthis.diffElementPromise = null;\n\tthis.getDiffElementPromise = null;\n\n\t// Initialization\n\tthis.$element.addClass( 've-ui-mwSaveDialog' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWSaveDialog, OO.ui.ProcessDialog );\n\n/* Static Properties */\n\nve.ui.MWSaveDialog.static.name = 'mwSave';\n\nve.ui.MWSaveDialog.static.title =\n\tOO.ui.deferMsg( 'visualeditor-savedialog-title-save' );\n\nve.ui.MWSaveDialog.static.actions = [\n\t{\n\t\taction: 'save',\n\t\t// label will be set by config.saveButtonLabel\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: [ 'save', 'review', 'preview' ]\n\t},\n\t{\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-savedialog-label-resume-editing' ),\n\t\tflags: [ 'safe', OO.ui.isMobile() ? 'back' : 'close' ],\n\t\tmodes: [ 'save', 'conflict' ]\n\t},\n\t{\n\t\taction: 'review',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-savedialog-label-review' ),\n\t\tmodes: [ 'save', 'preview' ]\n\t},\n\t{\n\t\taction: 'preview',\n\t\tlabel: OO.ui.deferMsg( 'showpreview' ),\n\t\tmodes: [ 'save', 'review' ]\n\t},\n\t{\n\t\taction: 'approve',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-savedialog-label-review-good' ),\n\t\tflags: [ 'safe', 'back' ],\n\t\tmodes: [ 'review', 'preview' ]\n\t},\n\t{\n\t\taction: 'resolve',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-savedialog-label-resolve-conflict' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: 'conflict'\n\t}\n];\n\n/* Events */\n\n/**\n * Emitted when the user clicks the save button\n *\n * @event ve.ui.MWSaveDialog#save\n * @param {jQuery.Deferred} saveDeferred Deferred object to resolve/reject when the save\n *  succeeds/fails.\n */\n\n/**\n * Emitted when the user clicks the review changes button\n *\n * @event ve.ui.MWSaveDialog#review\n */\n\n/**\n * Emitted when the user clicks the show preview button\n *\n * @event ve.ui.MWSaveDialog#preview\n */\n\n/**\n * Emitted when the user clicks the resolve conflict button\n *\n * @event ve.ui.MWSaveDialog#resolve\n */\n\n/**\n * Emitted when the user clicks the retry/continue save button after an error.\n *\n * @event ve.ui.MWSaveDialog#retry\n */\n\n/**\n * Emitted when the save dialog changes panel, and when it opens\n *\n * @event ve.ui.MWSaveDialog#changePanel\n */\n\n/* Methods */\n\n/**\n * Set review content and show review panel.\n *\n * @param {jQuery.Promise} wikitextDiffPromise Wikitext diff HTML promise\n * @param {jQuery.Promise} visualDiffGeneratorPromise Visual diff promise\n * @param {HTMLDocument} [baseDoc] Base document against which to normalise links when rendering visualDiff\n */\nve.ui.MWSaveDialog.prototype.setDiffAndReview = function ( wikitextDiffPromise, visualDiffGeneratorPromise, baseDoc ) {\n\tthis.clearDiff();\n\n\tfunction createDiffElement( visualDiff ) {\n\t\tconst diffElement = new ve.ui.DiffElement( visualDiff );\n\t\t// The following classes are used here:\n\t\t// * mw-content-ltr\n\t\t// * mw-content-rtl\n\t\tdiffElement.$document.addClass( [\n\t\t\t'mw-body-content',\n\t\t\t'mw-parser-output',\n\t\t\t'mw-content-' + visualDiff.newDoc.getDir()\n\t\t] );\n\t\tve.targetLinksToNewWindow( diffElement.$document[ 0 ] );\n\t\t// Run styles so links render with their appropriate classes\n\t\tve.init.platform.linkCache.styleParsoidElements( diffElement.$document, baseDoc );\n\t\tmw.libs.ve.fixFragmentLinks( diffElement.$document[ 0 ], mw.Title.newFromText( ve.init.target.getPageName() ), 'mw-save-visualdiff-' );\n\t\treturn diffElement;\n\t}\n\n\t// Visual diff\n\tthis.$reviewVisualDiff.append( new OO.ui.ProgressBarWidget().$element );\n\t// Don't generate the DiffElement until the tab is switched to\n\tthis.getDiffElementPromise = function () {\n\t\treturn visualDiffGeneratorPromise.then( ( visualDiffGenerator ) => createDiffElement( visualDiffGenerator() ) );\n\t};\n\n\tthis.baseDoc = baseDoc;\n\n\t// Wikitext diff\n\tthis.$reviewWikitextDiff.append( new OO.ui.ProgressBarWidget().$element );\n\twikitextDiffPromise.then( ( wikitextDiff ) => {\n\t\tif ( wikitextDiff ) {\n\t\t\t// wikitextDiff is an HTML string we trust from the API\n\t\t\t// eslint-disable-next-line no-jquery/no-append-html\n\t\t\tthis.$reviewWikitextDiff.empty().append( wikitextDiff );\n\t\t\t// Remove the HTML diff-mode ButtonGroupWidget because this.reviewModeButtonSelect replaces it.\n\t\t\t// This matches what's done for action=diff in modules/ve-mw/preinit/ve.init.mw.DiffPage.init.js\n\t\t\tthis.$reviewWikitextDiff.find( '.ve-init-mw-diffPage-diffMode' ).empty();\n\t\t} else {\n\t\t\tthis.$reviewWikitextDiff.empty().append(\n\t\t\t\t$( '<div>' ).addClass( 've-ui-mwSaveDialog-no-changes' ).text( ve.msg( 'visualeditor-diff-no-changes' ) )\n\t\t\t);\n\t\t}\n\t}, ( code, errorObject ) => {\n\t\tconst $errorMessage = ve.init.target.extractErrorMessages( errorObject );\n\n\t\tthis.$reviewWikitextDiff.empty().append(\n\t\t\tnew OO.ui.MessageWidget( {\n\t\t\t\ttype: 'error',\n\t\t\t\tlabel: $errorMessage\n\t\t\t} ).$element\n\t\t);\n\t} ).always( () => {\n\t\tthis.updateSize();\n\t} );\n\n\tthis.hasDiff = true;\n\tthis.popPending();\n\tthis.swapPanel( 'review' );\n};\n\n/**\n * Set preview content and show preview panel.\n *\n * @param {Object|jQuery} response action=parse API response, or error message\n */\nve.ui.MWSaveDialog.prototype.showPreview = function ( response ) {\n\tif ( response instanceof $ ) {\n\t\tthis.$previewViewer.empty().append(\n\t\t\t// eslint-disable-next-line no-jquery/no-append-html\n\t\t\t$( '<em>' ).append( response )\n\t\t);\n\t} else {\n\t\tconst data = response.parse,\n\t\t\tconfig = mw.config.get( 'wgVisualEditor' );\n\n\t\tmw.config.set( data.jsconfigvars );\n\t\tmw.loader.using( ( data.modules || [] ).concat( data.modulestyles || [] ) );\n\n\t\t// eslint-disable-next-line no-jquery/no-html\n\t\tthis.$previewHeading.html( data.displaytitle );\n\t\t// eslint-disable-next-line no-jquery/no-append-html\n\t\tthis.$previewViewer.empty().append(\n\t\t\t// The following classes are used here:\n\t\t\t// * mw-content-ltr\n\t\t\t// * mw-content-rtl\n\t\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t\t$( '<div>' )\n\t\t\t\t.addClass( 'mw-content-' + config.pageLanguageDir )\n\t\t\t\t.attr( {\n\t\t\t\t\tlang: config.pageLanguageCode,\n\t\t\t\t\tdir: config.pageLanguageDir\n\t\t\t\t} )\n\t\t\t\t.html( data.text ),\n\t\t\tdata.categorieshtml\n\t\t);\n\n\t\tve.targetLinksToNewWindow( this.$previewViewer[ 0 ] );\n\t\tmw.libs.ve.fixFragmentLinks( this.$previewViewer[ 0 ], mw.Title.newFromText( ve.init.target.getPageName() ), 'mw-save-preview-' );\n\n\t\t// Run hooks so other things can alter the document\n\t\tmw.hook( 'wikipage.content' ).fire( this.$previewViewer );\n\t}\n\n\tthis.popPending();\n\tthis.swapPanel( 'preview' );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.pushPending = function () {\n\tthis.getActions().setAbilities( { review: false, preview: false } );\n\treturn ve.ui.MWSaveDialog.super.prototype.pushPending.call( this );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.popPending = function () {\n\tconst ret = ve.ui.MWSaveDialog.super.prototype.popPending.call( this );\n\tif ( !this.isPending() ) {\n\t\tthis.getActions().setAbilities( { review: true, preview: true } );\n\t}\n\treturn ret;\n};\n\n/**\n * Clear the diff displayed in the review panel, if any.\n */\nve.ui.MWSaveDialog.prototype.clearDiff = function () {\n\tthis.$reviewWikitextDiff.empty();\n\tthis.$reviewVisualDiff.empty();\n\tthis.$previewViewer.empty();\n\tthis.hasDiff = false;\n\tthis.diffElement = null;\n\tthis.diffElementPromise = null;\n\tthis.getDiffElementPromise = null;\n};\n\n/**\n * Swap state in the save dialog.\n *\n * @param {string} panel One of 'save', 'review' or 'conflict'\n * @param {boolean} [noFocus=false] Don't attempt to focus anything (e.g. while setting up)\n * @throws {Error} Unknown saveDialog panel\n */\nve.ui.MWSaveDialog.prototype.swapPanel = function ( panel, noFocus ) {\n\tif ( ![ 'save', 'review', 'preview', 'conflict' ].includes( panel ) ) {\n\t\tthrow new Error( 'Unknown saveDialog panel: ' + panel );\n\t}\n\n\tconst mode = panel,\n\t\tpanelObj = this[ panel + 'Panel' ];\n\n\t// Update the window title\n\t// The following messages are used here:\n\t// * visualeditor-savedialog-title-conflict\n\t// * visualeditor-savedialog-title-preview\n\t// * visualeditor-savedialog-title-review\n\t// * visualeditor-savedialog-title-save\n\tthis.title.setLabel( ve.msg( 'visualeditor-savedialog-title-' + panel ) );\n\n\t// Reset save button if we disabled it for e.g. unrecoverable spam error\n\tthis.actions.setAbilities( { save: true } );\n\n\tif ( !noFocus ) {\n\t\t// On panels without inputs, ensure the dialog is focused so events\n\t\t// are captured, e.g. 'Esc' to close\n\t\tthis.$content[ 0 ].focus();\n\t}\n\n\tlet size = 'medium';\n\tswitch ( panel ) {\n\t\tcase 'save':\n\t\t\tif ( !noFocus && this.panels.getCurrentItem() !== this.savePanel ) {\n\t\t\t\t// HACK: FF needs *another* defer\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tthis.editSummaryInput.moveCursorToEnd();\n\t\t\t\t} );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'conflict':\n\t\t\tthis.actions.setAbilities( { save: false } );\n\t\t\tbreak;\n\t\tcase 'preview':\n\t\t\tsize = 'full';\n\t\t\tthis.previewPanel.$element[ 0 ].focus();\n\t\t\tthis.previewPanel.$element.prepend( this.$previewEditSummaryContainer );\n\t\t\tbreak;\n\t\tcase 'review':\n\t\t\tsize = 'larger';\n\t\t\tthis.reviewModeButtonSelect.$element.after( this.$previewEditSummaryContainer );\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.updateReviewMode();\n\n\t\t\t\tve.track(\n\t\t\t\t\t'activity.' + this.constructor.static.name,\n\t\t\t\t\t{ action: 'review-initial-' + this.reviewModeButtonSelect.findSelectedItem().getData() }\n\t\t\t\t);\n\t\t\t} );\n\t\t\tbreak;\n\t}\n\tif ( panel === 'preview' || panel === 'review' ) {\n\t\tconst currentEditSummaryWikitext = this.editSummaryInput.getValue();\n\t\tif ( this.lastEditSummaryWikitext === undefined || this.lastEditSummaryWikitext !== currentEditSummaryWikitext ) {\n\t\t\tif ( this.editSummaryXhr ) {\n\t\t\t\tthis.editSummaryXhr.abort();\n\t\t\t}\n\t\t\tthis.lastEditSummaryWikitext = currentEditSummaryWikitext;\n\t\t\tthis.$previewEditSummary.empty();\n\n\t\t\tif ( !currentEditSummaryWikitext || currentEditSummaryWikitext.trim() === '' ) {\n\t\t\t\t// Don't bother with an API request for an empty summary\n\t\t\t\tthis.$previewEditSummary.text( ve.msg( 'visualeditor-savedialog-review-nosummary' ) );\n\t\t\t} else {\n\t\t\t\tthis.$previewEditSummary.parent().removeClass( 'oo-ui-element-hidden' );\n\t\t\t\tconst $spinner = $.createSpinner();\n\t\t\t\tthis.$previewEditSummary.append( $spinner );\n\t\t\t\tthis.editSummaryXhr = ve.init.target.getContentApi().post( {\n\t\t\t\t\taction: 'parse',\n\t\t\t\t\ttitle: ve.init.target.getPageName(),\n\t\t\t\t\tprop: '',\n\t\t\t\t\tsummary: currentEditSummaryWikitext\n\t\t\t\t} );\n\t\t\t\tthis.editSummaryXhr.then( ( result ) => {\n\t\t\t\t\tif ( result.parse.parsedsummary === '' ) {\n\t\t\t\t\t\tthis.$previewEditSummary.parent().addClass( 'oo-ui-element-hidden' );\n\t\t\t\t\t\tthis.$previewEditSummary.empty();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Escape message before inserting parameter to prevent i18n XSS\n\t\t\t\t\t\tconst wrappedSummary = ve.escapeHtml( ve.msg( 'parentheses' ) )\n\t\t\t\t\t\t\t.replace( '$1', () => result.parse.parsedsummary );\n\t\t\t\t\t\t// Intentionally treated as HTML\n\t\t\t\t\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t\t\t\t\tthis.$previewEditSummary.html( wrappedSummary );\n\t\t\t\t\t\tve.targetLinksToNewWindow( this.$previewEditSummary[ 0 ] );\n\t\t\t\t\t}\n\t\t\t\t}, () => {\n\t\t\t\t\tthis.$previewEditSummary.parent().addClass( 'oo-ui-element-hidden' );\n\t\t\t\t\tthis.$previewEditSummary.empty();\n\t\t\t\t} ).always( () => {\n\t\t\t\t\tthis.updateSize();\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Show the target panel\n\tthis.panels.setItem( panelObj );\n\tthis.setSize( size );\n\n\t// Set mode after setting size so that the footer is measured correctly\n\tthis.actions.setMode( mode );\n\n\t// Only show preview in source mode\n\tthis.actions.forEach( { actions: 'preview' }, ( action ) => {\n\t\taction.toggle( this.canPreview && panel !== 'preview' );\n\t} );\n\n\t// Diff API doesn't support section=new\n\tthis.actions.forEach( { actions: 'review' }, ( action ) => {\n\t\taction.toggle( this.canReview && panel !== 'review' );\n\t} );\n\n\t// Support: iOS\n\t// HACK: iOS Safari sometimes makes the entire panel completely disappear (T221289).\n\t// Rebuilding it makes it reappear.\n\tOO.ui.Element.static.reconsiderScrollbars( panelObj.$element[ 0 ] );\n\n\tmw.hook( 've.saveDialog.stateChanged' ).fire();\n};\n\n/**\n * Show a message in the save dialog.\n *\n * @param {string} name Message's unique name\n * @param {jQuery|string|Function|OO.ui.HtmlSnippet} label Message content. See OO.ui.mixin.LabelElement.\n * @param {string} config MessageWidget config. Defaults to an inline warning.\n * @return {jQuery.Promise} Promise which resolves when the message has been shown, rejects if no new message shown.\n */\nve.ui.MWSaveDialog.prototype.showMessage = function ( name, label, config ) {\n\tif ( !this.messages[ name ] ) {\n\t\tconst messageWidget = new OO.ui.MessageWidget( ve.extendObject( {\n\t\t\tclasses: [ 've-ui-mwSaveDialog-message' ],\n\t\t\tlabel: label,\n\t\t\tinline: true,\n\t\t\ttype: 'warning'\n\t\t}, config ) );\n\t\tthis.$saveMessages.append( messageWidget.$element.css( 'display', 'none' ) );\n\n\t\t// FIXME: Use CSS transitions\n\t\t// eslint-disable-next-line no-jquery/no-slide\n\t\tconst promise = messageWidget.$element.slideDown( {\n\t\t\tduration: 250,\n\t\t\tprogress: this.updateSize.bind( this )\n\t\t} ).promise();\n\n\t\tthis.swapPanel( 'save' );\n\n\t\t// Can be hidden later by #clearMessage\n\t\tthis.messages[ name ] = messageWidget.$element;\n\n\t\treturn promise;\n\t}\n\treturn ve.createDeferred().reject().promise();\n};\n\n/**\n * Remove a message from the save dialog.\n *\n * @param {string} name Message's unique name\n */\nve.ui.MWSaveDialog.prototype.clearMessage = function ( name ) {\n\tconst $message = this.messages[ name ];\n\tif ( $message ) {\n\t\t// FIXME: Use CSS transitions\n\t\t// eslint-disable-next-line no-jquery/no-slide\n\t\t$message.slideUp( {\n\t\t\tduration: 250,\n\t\t\tprogress: this.updateSize.bind( this )\n\t\t} ).promise().then( () => {\n\t\t\t$message.remove();\n\t\t\tthis.updateSize();\n\t\t} );\n\t\tdelete this.messages[ name ];\n\t}\n};\n\n/**\n * Remove all messages from the save dialog.\n */\nve.ui.MWSaveDialog.prototype.clearAllMessages = function () {\n\tthis.$saveMessages.empty();\n\tthis.messages = {};\n};\n\n/**\n * Reset the fields of the save dialog.\n */\nve.ui.MWSaveDialog.prototype.reset = function () {\n\t// Reset summary input\n\tthis.editSummaryInput.setValue( '' );\n\t// Uncheck minoredit\n\tif ( this.checkboxesByName.wpMinoredit ) {\n\t\tthis.checkboxesByName.wpMinoredit.setSelected( false );\n\t}\n\tthis.clearDiff();\n};\n\n/**\n * Initialize MediaWiki page specific checkboxes.\n *\n * This method is safe to call even when the dialog hasn't been initialized yet.\n *\n * @param {OO.ui.FieldLayout[]} checkboxFields Checkbox fields\n */\nve.ui.MWSaveDialog.prototype.setupCheckboxes = function ( checkboxFields ) {\n\tthis.setupDeferred.then( () => {\n\t\tcheckboxFields.forEach( ( field ) => {\n\t\t\tthis.$saveCheckboxes.append( field.$element );\n\t\t} );\n\t\tthis.updateOptionsBar();\n\t} );\n};\n\n/**\n * Change the edit summary prefilled in the save dialog.\n *\n * This method is safe to call even when the dialog hasn't been initialized yet.\n *\n * @param {string} summary Edit summary to prefill\n */\nve.ui.MWSaveDialog.prototype.setEditSummary = function ( summary ) {\n\tthis.setupDeferred.then( () => {\n\t\tthis.editSummaryInput.setValue( summary );\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.initialize = function () {\n\tconst mwString = require( 'mediawiki.String' );\n\n\t// Parent method\n\tve.ui.MWSaveDialog.super.prototype.initialize.call( this );\n\n\t// Properties\n\tthis.panels = new OO.ui.StackLayout( { scrollable: false } );\n\tthis.panels.connect( this, { set: [ 'emit', 'changePanel' ] } );\n\n\tthis.savePanel = new OO.ui.PanelLayout( {\n\t\texpanded: false,\n\t\tpadded: true,\n\t\tclasses: [ 've-ui-mwSaveDialog-savePanel' ]\n\t} );\n\n\t// Character counter in edit summary\n\tthis.editSummaryCountLabel = new OO.ui.LabelWidget( {\n\t\tclasses: [ 've-ui-mwSaveDialog-editSummary-count' ],\n\t\tlabel: '',\n\t\ttitle: ve.msg( 'visualeditor-editsummary-characters-remaining' )\n\t} );\n\n\t// Save panel\n\t// eslint-disable-next-line no-jquery/no-html\n\tthis.$editSummaryLabel = $( '<div>' ).addClass( 've-ui-mwSaveDialog-summaryLabel' )\n\t\t.html( ve.init.platform.getParsedMessage( 'summary' ) );\n\tve.targetLinksToNewWindow( this.$editSummaryLabel[ 0 ] );\n\tthis.editSummaryInput = new ve.ui.MWEditSummaryWidget( {\n\t\t$overlay: this.$overlay,\n\t\tplaceholder: ve.msg( 'visualeditor-editsummary' ),\n\t\tclasses: [ 've-ui-mwSaveDialog-summary' ]\n\t} );\n\t// Show a warning if the user presses Enter\n\tthis.editSummaryInput.on( 'enter', () => {\n\t\tthis.showMessage(\n\t\t\t'keyboard-shortcut-submit',\n\t\t\tve.msg(\n\t\t\t\t'visualeditor-savedialog-keyboard-shortcut-submit',\n\t\t\t\tnew ve.ui.Trigger( ve.ui.commandHelpRegistry.lookup( 'dialogConfirm' ).shortcuts[ 0 ] ).getMessage()\n\t\t\t)\n\t\t).then( () => {\n\t\t\t// Restore focus after potential window resize\n\t\t\tthis.editSummaryInput.focus();\n\t\t} );\n\t} );\n\t// Limit length, and display the remaining characters\n\tthis.editSummaryInput.$input.codePointLimit( this.editSummaryCodePointLimit );\n\tthis.editSummaryInput.on( 'change', () => {\n\t\tconst remaining = this.editSummaryCodePointLimit - mwString.codePointLength( this.editSummaryInput.getValue() );\n\t\t// TODO: This looks a bit weird, there is no unit in the UI, just numbers.\n\t\tthis.changedEditSummary = true;\n\t\tif ( remaining > 99 ) {\n\t\t\tthis.editSummaryCountLabel.setLabel( '' );\n\t\t} else {\n\t\t\tthis.editSummaryCountLabel.setLabel( mw.language.convertNumber( remaining ) );\n\t\t}\n\n\t\tthis.updateOptionsBar();\n\t} );\n\tthis.editSummaryInput.on( 'resize', () => {\n\t\tif ( this.overflowTimeout !== undefined ) {\n\t\t\tclearTimeout( this.overflowTimeout );\n\t\t}\n\t\tthis.panels.$element.css( 'overflow', 'hidden' );\n\t\tthis.updateSize();\n\t\tthis.overflowTimeout = setTimeout( () => {\n\t\t\tthis.panels.$element.css( 'overflow', '' );\n\t\t}, 250 );\n\t} );\n\n\tthis.$saveCheckboxes = $( '<div>' ).addClass( 've-ui-mwSaveDialog-checkboxes' );\n\tthis.$saveOptions = $( '<div>' ).addClass( 've-ui-mwSaveDialog-options' ).append(\n\t\tthis.$saveCheckboxes,\n\t\tthis.editSummaryCountLabel.$element\n\t);\n\tthis.$license = $( '<p>' ).addClass( 've-ui-mwSaveDialog-license' );\n\tthis.$saveMessages = $( '<div>' ).addClass( 've-ui-mwSaveDialog-messages' );\n\tthis.$saveFoot = $( '<div>' ).addClass( 've-ui-mwSaveDialog-foot' ).append( this.$license );\n\tve.targetLinksToNewWindow( this.$saveFoot[ 0 ] );\n\tthis.savePanel.$element.append(\n\t\tthis.$editSummaryLabel,\n\t\tthis.editSummaryInput.$element,\n\t\tthis.$saveOptions,\n\t\tthis.$saveMessages,\n\t\tthis.$saveFoot\n\t);\n\n\tthis.updateOptionsBar();\n\n\t// Review panel\n\tthis.reviewPanel = new OO.ui.PanelLayout( {\n\t\texpanded: false,\n\t\tpadded: true\n\t} );\n\n\tthis.$reviewVisualDiff = $( '<div>' ).addClass( 've-ui-mwSaveDialog-viewer' );\n\tthis.$reviewWikitextDiff = $( '<div>' ).addClass( 've-ui-mwSaveDialog-viewer' );\n\n\tthis.reviewModeButtonSelect = new OO.ui.ButtonSelectWidget( {\n\t\titems: [\n\t\t\tnew OO.ui.ButtonOptionWidget( { data: 'visual', icon: 'eye', label: ve.msg( 'visualeditor-savedialog-review-visual' ) } ),\n\t\t\tnew OO.ui.ButtonOptionWidget( { data: 'source', icon: 'wikiText', label: ve.msg( 'visualeditor-savedialog-review-wikitext' ) } )\n\t\t],\n\t\tclasses: [ 've-ui-mwSaveDialog-reviewMode' ]\n\t} );\n\tthis.reviewModeButtonSelect.connect( this, {\n\t\tchoose: 'onReviewChoose',\n\t\tselect: 'updateReviewMode'\n\t} );\n\n\tthis.$previewEditSummary = $( '<span>' ).addClass( 've-ui-mwSaveDialog-summaryPreview' ).addClass( 'comment' );\n\tthis.$previewEditSummaryContainer = $( '<div>' )\n\t\t.addClass( 'mw-summary-preview' )\n\t\t.text( ve.msg( 'summary-preview' ) )\n\t\t.append( $( '<br>' ), this.$previewEditSummary );\n\tthis.$reviewActions = $( '<div>' ).addClass( 've-ui-mwSaveDialog-actions' );\n\tthis.reviewPanel.$element.append(\n\t\tthis.reviewModeButtonSelect.$element,\n\t\tthis.$reviewVisualDiff,\n\t\tthis.$reviewWikitextDiff,\n\t\tthis.$reviewActions\n\t);\n\n\t// Preview panel\n\tthis.previewPanel = new OO.ui.PanelLayout( {\n\t\tclasses: [ 've-ui-mwSaveDialog-preview' ],\n\t\texpanded: false,\n\t\tpadded: true\n\t} );\n\tthis.$previewHeading = $( '<h1>' ).addClass( 'firstHeading' );\n\tthis.$previewViewer = $( '<div>' ).addClass( [\n\t\t'mw-body-content',\n\t\t'mw-parser-output'\n\t] );\n\tthis.previewPanel.$element\n\t\t// Make focusable for keyboard accessible scrolling\n\t\t.prop( 'tabIndex', 0 )\n\t\t.append(\n\t\t\t$( '<div>' ).addClass( 'mw-content-container' ).append(\n\t\t\t\t$( '<div>' ).addClass( 'mw-body' ).append(\n\t\t\t\t\tthis.$previewHeading,\n\t\t\t\t\tthis.$previewViewer\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\n\t// Conflict panel\n\tthis.conflictPanel = new OO.ui.PanelLayout( {\n\t\texpanded: false,\n\t\tpadded: true\n\t} );\n\t// eslint-disable-next-line no-jquery/no-html\n\tthis.$conflict = $( '<div>' ).addClass( 've-ui-mwSaveDialog-conflict' )\n\t\t.html( ve.init.platform.getParsedMessage( 'visualeditor-editconflict' ) );\n\tve.targetLinksToNewWindow( this.$conflict[ 0 ] );\n\tthis.conflictPanel.$element.append( this.$conflict );\n\n\t// Panel stack\n\tthis.panels.addItems( [\n\t\tthis.savePanel,\n\t\tthis.reviewPanel,\n\t\tthis.previewPanel,\n\t\tthis.conflictPanel\n\t] );\n\n\t// Initialization\n\tthis.$body.append( this.panels.$element );\n\n\tthis.setupDeferred.resolve();\n};\n\nve.ui.MWSaveDialog.prototype.updateOptionsBar = function () {\n\tconst showOptions = !!this.editSummaryCountLabel.getLabel() || !this.$saveCheckboxes.is( ':empty' );\n\tif ( showOptions !== this.showOptions ) {\n\t\tthis.savePanel.$element.toggleClass( 've-ui-mwSaveDialog-withOptions', showOptions );\n\t\tthis.showOptions = showOptions;\n\t\tthis.updateSize();\n\t}\n};\n\n/**\n * Update the current review mode\n *\n * @param  {OO.ui.ButtonOptionWidget} [button] The button clicked, or false if this is the initial setup\n */\nve.ui.MWSaveDialog.prototype.updateReviewMode = function () {\n\tif ( !this.hasDiff ) {\n\t\treturn;\n\t}\n\n\tconst diffMode = this.reviewModeButtonSelect.findSelectedItem().getData(),\n\t\tsurfaceMode = ve.init.target.getSurface().getMode(),\n\t\tisVisual = diffMode === 'visual';\n\n\t// Config values used here:\n\t// * visualeditor-diffmode-visual\n\t// * visualeditor-diffmode-source\n\tve.userConfig( 'visualeditor-diffmode-' + surfaceMode, diffMode );\n\n\tthis.$reviewVisualDiff.toggleClass( 'oo-ui-element-hidden', !isVisual );\n\tthis.$reviewWikitextDiff.toggleClass( 'oo-ui-element-hidden', isVisual );\n\tif ( isVisual ) {\n\t\tif ( !this.diffElement ) {\n\t\t\tif ( !this.diffElementPromise ) {\n\t\t\t\tthis.diffElementPromise = this.getDiffElementPromise().then( ( diffElement ) => {\n\t\t\t\t\tthis.diffElement = diffElement;\n\t\t\t\t\tthis.$reviewVisualDiff.empty().append( diffElement.$element );\n\t\t\t\t\tthis.positionDiffElement();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis.positionDiffElement();\n\t}\n\n\t// Support: iOS\n\t// HACK: iOS Safari sometimes makes the entire panel completely disappear (T219680).\n\t// Rebuilding it makes it reappear.\n\tOO.ui.Element.static.reconsiderScrollbars( this.reviewPanel.$element[ 0 ] );\n\n\tthis.updateSize();\n};\n\n/**\n * Update the current review mode\n *\n * @param {OO.ui.OptionWidget} item Item chosen\n */\nve.ui.MWSaveDialog.prototype.onReviewChoose = function ( item ) {\n\tve.track( 'activity.' + this.constructor.static.name, { action: 'review-switch-' + item.getData() } );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.setDimensions = function () {\n\t// Parent method\n\tve.ui.MWSaveDialog.super.prototype.setDimensions.apply( this, arguments );\n\n\tif ( !this.positioning ) {\n\t\tthis.positionDiffElement();\n\t}\n};\n\n/**\n * Re-position elements within the diff element\n *\n * Should be called whenever the diff element's container has changed width.\n */\nve.ui.MWSaveDialog.prototype.positionDiffElement = function () {\n\tif ( this.panels.getCurrentItem() === this.reviewPanel ) {\n\t\tsetTimeout( () => {\n\t\t\tthis.withoutSizeTransitions( () => {\n\t\t\t\t// This is delayed, so check the visual diff is still visible\n\t\t\t\tif ( this.diffElement && this.isVisible() && this.reviewModeButtonSelect.findSelectedItem().getData() === 'visual' ) {\n\t\t\t\t\tthis.diffElement.positionDescriptions();\n\t\t\t\t\tthis.positioning = true;\n\t\t\t\t\tthis.updateSize();\n\t\t\t\t\tthis.positioning = false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}, OO.ui.theme.getDialogTransitionDuration() );\n\t}\n};\n\n/**\n * @inheritdoc\n * @param {Object} [data]\n * @param {boolean} [data.canReview=false] User can review changes\n * @param {boolean} [data.canPreview=false] User can preview changes\n * @param {string} [data.copyrightWarning] HTML to display as the copyright message\n * @param {OO.ui.FieldLayout[]} [data.checkboxFields=[]] Checkbox fields\n * @param {Object} [data.checkboxesByName={}] Checkbox widgets, indexed by name\n * @param {string} [data.sectionTitle] Section title, if in new section mode\n * @param {string} [data.editSummary] Edit summary\n * @param {string} [data.initialPanel='save'] Initial panel to show\n * @param {jQuery|string|OO.ui.HtmlSnippet|Function|null} [data.saveButtonLabel] Label for the save button\n */\nve.ui.MWSaveDialog.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWSaveDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tconst surfaceMode = ve.init.target.getSurface().getMode();\n\n\t\t\tthis.canReview = !!data.canReview;\n\t\t\tthis.canPreview = !!data.canPreview;\n\t\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t\tthis.$license.html( data.copyrightWarning );\n\t\t\tthis.setupCheckboxes( data.checkboxFields || [] );\n\t\t\tthis.checkboxesByName = data.checkboxesByName || {};\n\t\t\t// HACK: Change layout when wpWatchlistExpiry is present to force wpWatchthis\n\t\t\t// onto a new line, hopefully with the expiry dropdown\n\t\t\tthis.$saveCheckboxes.toggleClass( 've-ui-mwSaveDialog-checkboxes-withExpiry', !!this.checkboxesByName.wpWatchlistExpiry );\n\t\t\t// Toggle the watchlist-expiry dropdown's disabled state according to the\n\t\t\t// selected state of the watchthis checkbox.\n\t\t\tif ( this.checkboxesByName.wpWatchthis && this.checkboxesByName.wpWatchlistExpiry ) {\n\t\t\t\t// Set initial state to match the watchthis checkbox.\n\t\t\t\tthis.checkboxesByName.wpWatchlistExpiry.setDisabled( !this.checkboxesByName.wpWatchthis.isSelected() );\n\t\t\t\t// Change state on every change of the watchthis checkbox.\n\t\t\t\tthis.checkboxesByName.wpWatchthis.on( 'change', ( enabled ) => {\n\t\t\t\t\tthis.checkboxesByName.wpWatchlistExpiry.setDisabled( !enabled );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tfunction trackCheckbox( n ) {\n\t\t\t\tve.track( 'activity.mwSave', { action: 'checkbox-' + n } );\n\t\t\t}\n\t\t\tfor ( const name in this.checkboxesByName ) {\n\t\t\t\tthis.checkboxesByName[ name ].$element.off( '.mwSave' ).on( 'click.mwSave', trackCheckbox.bind( this, name ) );\n\t\t\t}\n\n\t\t\tif ( data.sectionTitle ) {\n\t\t\t\tthis.setEditSummary( ve.msg( 'newsectionsummary', data.sectionTitle ) );\n\t\t\t\tthis.editSummaryInput.setDisabled( true );\n\t\t\t} else {\n\t\t\t\tthis.editSummaryInput.setDisabled( false );\n\t\t\t\tif ( !this.changedEditSummary ) {\n\t\t\t\t\tthis.setEditSummary( data.editSummary );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Config values used here:\n\t\t\t// * visualeditor-diffmode-visual\n\t\t\t// * visualeditor-diffmode-source\n\t\t\tthis.reviewModeButtonSelect.selectItemByData(\n\t\t\t\tve.userConfig( 'visualeditor-diffmode-' + surfaceMode ) || surfaceMode\n\t\t\t);\n\n\t\t\t// Old messages should not persist\n\t\t\tthis.clearAllMessages();\n\t\t\t// Don't focus during setup to prevent scroll jumping (T153010)\n\t\t\tthis.swapPanel( data.initialPanel || 'save', true );\n\t\t\t// Update save button label\n\t\t\tthis.actions.forEach( { actions: 'save' }, ( action ) => {\n\t\t\t\taction.setLabel( data.saveButtonLabel );\n\t\t\t} );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWSaveDialog.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\t// HACK: iOS Safari sometimes makes the entire panel completely disappear (T221289).\n\t\t\t// Rebuilding it makes it reappear.\n\t\t\tOO.ui.Element.static.reconsiderScrollbars( this.panels.getCurrentItem().$element[ 0 ] );\n\n\t\t\t// Support: Firefox\n\t\t\t// In Firefox, trying to focus a hidden input will throw an\n\t\t\t// exception. This would happen when opening the preview via\n\t\t\t// keyboard shortcut.\n\t\t\tif ( this.panels.getCurrentItem() === this.savePanel ) {\n\t\t\t\t// This includes a #focus call\n\t\t\t\tthis.editSummaryInput.moveCursorToEnd();\n\t\t\t}\n\t\t\tthis.emit( 'changePanel' );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getTeardownProcess = function ( data ) {\n\treturn ve.ui.MWSaveDialog.super.prototype.getTeardownProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.emit( 'close' );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getEscapeAction = function () {\n\tconst backOrClose = this.actions.get( { flags: [ 'back', 'close' ], visible: true } );\n\tif ( backOrClose.length ) {\n\t\treturn backOrClose[ 0 ].getAction();\n\t}\n\treturn null;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getActionProcess = function ( action ) {\n\tve.track( 'activity.' + this.constructor.static.name, { action: 'dialog-' + ( action || 'abort' ) } );\n\n\tif ( action === 'save' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tif ( this.panels.getCurrentItem() !== this.savePanel ) {\n\t\t\t\tthis.swapPanel( 'save' );\n\t\t\t} else {\n\t\t\t\tconst saveDeferred = ve.createDeferred();\n\t\t\t\tthis.clearMessage( 'keyboard-shortcut-submit' );\n\t\t\t\tthis.emit( 'save', saveDeferred );\n\t\t\t\treturn saveDeferred.promise();\n\t\t\t}\n\t\t} );\n\t}\n\tif ( action === 'review' || action === 'preview' || action === 'resolve' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tthis.emit( action );\n\t\t} );\n\t}\n\tif ( action === 'approve' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tthis.swapPanel( 'save' );\n\t\t} );\n\t}\n\n\treturn ve.ui.MWSaveDialog.super.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getBodyHeight = function () {\n\t// Don't vary the height when the foot is made visible or not\n\treturn this.panels.getCurrentItem().$element.outerHeight( true );\n};\n\n/**\n * Handle retry button click events.\n *\n * Hides errors and then tries again.\n */\nve.ui.MWSaveDialog.prototype.onRetryButtonClick = function () {\n\tthis.emit( 'retry' );\n\tve.ui.MWSaveDialog.super.prototype.onRetryButtonClick.apply( this, arguments );\n};\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWSaveDialog );\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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWTableDialog.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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWTemplateDialog.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":12,"column":1,"nodeType":"Block","endLine":12,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":12,"column":1,"nodeType":"Block","endLine":12,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":52,"column":1,"nodeType":"Block","endLine":52,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":312,"column":1,"nodeType":"Block","endLine":312,"endColumn":1}],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'template_names' is not in camel case.","line":381,"column":6,"nodeType":"Identifier","messageId":"notCamelCase","endLine":381,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_edit_count_bucket' is not in camel case.","line":386,"column":20,"nodeType":"Identifier","messageId":"notCamelCase","endLine":386,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'template_names' is not in camel case.","line":461,"column":6,"nodeType":"Identifier","messageId":"notCamelCase","endLine":461,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_edit_count_bucket' is not in camel case.","line":466,"column":20,"nodeType":"Identifier","messageId":"notCamelCase","endLine":466,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWTemplateDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Abstract base class for dialogs that allow to insert and edit MediaWiki transclusions, i.e. a\n * sequence of one or more template invocations that strictly belong to each other (e.g. because\n * they are unbalanced), possibly mixed with raw wikitext snippets. Currently used for:\n * - {@see ve.ui.MWTransclusionDialog} for arbitrary transclusions. Registered via the name\n *   \"transclusion\".\n * - {@see ve.ui.MWCitationDialog} in the Cite extension for the predefined citation types from\n *   [[MediaWiki:visualeditor-cite-tool-definition.json]]. These are strictly limited to a single\n *   template invocation. Registered via the name \"cite\".\n *\n * @class\n * @abstract\n * @extends ve.ui.NodeDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @property {ve.dm.MWTransclusionModel|null} transclusionModel\n * @property {ve.ui.MWTransclusionOutlineWidget} sidebar\n * @property {boolean} [canGoBack=false]\n */\nve.ui.MWTemplateDialog = function VeUiMWTemplateDialog( config ) {\n\t// Parent constructor\n\tve.ui.MWTemplateDialog.super.call( this, config );\n\n\t// Properties\n\tthis.transclusionModel = null;\n\tthis.loaded = false;\n\tthis.altered = false;\n\tthis.canGoBack = false;\n\tthis.preventReselection = false;\n\n\tthis.confirmDialogs = new ve.ui.WindowManager( { factory: ve.ui.windowFactory, isolate: true } );\n\t$( OO.ui.getTeleportTarget() ).append( this.confirmDialogs.$element );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWTemplateDialog, ve.ui.NodeDialog );\n\n/* Static Properties */\n\nve.ui.MWTemplateDialog.static.modelClasses = [ ve.dm.MWTransclusionNode ];\n\n/**\n * Configuration for the {@see ve.ui.MWTwoPaneTransclusionDialogLayout} used in this dialog.\n *\n * @static\n * @property {Object}\n * @inheritable\n */\nve.ui.MWTemplateDialog.static.bookletLayoutConfig = {};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWTemplateDialog.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tif ( this.transclusionModel.isEmpty() ) {\n\t\t\t\t// Focus the template placeholder input field.\n\t\t\t\tthis.bookletLayout.focus();\n\t\t\t}\n\n\t\t\tthis.bookletLayout.getPagesOrdered().forEach( ( page ) => {\n\t\t\t\tif ( page instanceof ve.ui.MWParameterPage ) {\n\t\t\t\t\tpage.updateSize();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n};\n\n/**\n * Update dialog actions whenever the content changes.\n *\n * @private\n */\nve.ui.MWTemplateDialog.prototype.touch = function () {\n\tif ( this.loaded ) {\n\t\tthis.altered = true;\n\t\tthis.setApplicableStatus();\n\t}\n};\n\n/**\n * Handle parts being replaced.\n *\n * @protected\n * @param {ve.dm.MWTransclusionPartModel|null} removed Removed part\n * @param {ve.dm.MWTransclusionPartModel|null} added Added part\n */\nve.ui.MWTemplateDialog.prototype.onReplacePart = function ( removed, added ) {\n\tconst removePages = [];\n\n\tif ( removed ) {\n\t\t// Remove parameter pages of removed templates\n\t\tif ( removed instanceof ve.dm.MWTemplateModel ) {\n\t\t\tconst params = removed.getParameters();\n\t\t\tfor ( const name in params ) {\n\t\t\t\tremovePages.push( params[ name ].getId() );\n\t\t\t}\n\t\t\tremoved.disconnect( this );\n\t\t}\n\t\tremovePages.push( removed.getId() );\n\t\tthis.bookletLayout.removePages( removePages );\n\t}\n\n\tif ( added ) {\n\t\tconst page = this.getPageFromPart( added );\n\t\tif ( page ) {\n\t\t\tlet reselect;\n\n\t\t\tthis.bookletLayout.addPages( [ page ], this.transclusionModel.getIndex( added ) );\n\t\t\tif ( removed ) {\n\t\t\t\t// When we're replacing a part, it can only be a template placeholder\n\t\t\t\t// becoming an actual template.  Focus this new template.\n\t\t\t\treselect = added.getId();\n\t\t\t}\n\n\t\t\tif ( added instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\t// Prevent selection changes while parameters are added\n\t\t\t\tthis.preventReselection = true;\n\n\t\t\t\t// Add existing params to templates (the template might be being moved)\n\t\t\t\tconst names = added.getOrderedParameterNames();\n\t\t\t\tfor ( let i = 0; i < names.length; i++ ) {\n\t\t\t\t\tthis.onAddParameter( added.getParameter( names[ i ] ) );\n\t\t\t\t}\n\t\t\t\tadded.connect( this, { add: 'onAddParameter', remove: 'onRemoveParameter' } );\n\n\t\t\t\tthis.preventReselection = false;\n\n\t\t\t\tif ( this.loaded ) {\n\t\t\t\t\tif ( reselect ) {\n\t\t\t\t\t\tthis.bookletLayout.focusPart( reselect );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst documentedParameters = added.getSpec().getDocumentedParameterOrder(),\n\t\t\t\t\tundocumentedParameters = added.getSpec().getUndocumentedParameterNames();\n\n\t\t\t\tif ( !documentedParameters.length || undocumentedParameters.length ) {\n\t\t\t\t\tpage.addPlaceholderParameter();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( added || removed ) {\n\t\tthis.touch();\n\t}\n\tthis.updateTitle();\n};\n\n/**\n * Handle add param events.\n *\n * @private\n * @param {ve.dm.MWParameterModel} param Added param\n */\nve.ui.MWTemplateDialog.prototype.onAddParameter = function ( param ) {\n\tlet page;\n\n\tif ( param.getName() ) {\n\t\tpage = new ve.ui.MWParameterPage( param, {\n\t\t\t$overlay: this.$overlay, readOnly: this.isReadOnly()\n\t\t} )\n\t\t\t.connect( this, {\n\t\t\t\thasValueChange: 'onHasValueChange'\n\t\t\t} );\n\t} else {\n\t\t// Create parameter placeholder.\n\t\tpage = new ve.ui.MWAddParameterPage( param, param.getId(), {\n\t\t\t$overlay: this.$overlay\n\t\t} )\n\t\t\t.connect( this, {\n\t\t\t\ttemplateParameterAdded: this.bookletLayout.focusPart.bind( this.bookletLayout )\n\t\t\t} );\n\t}\n\tthis.bookletLayout.addPages( [ page ], this.transclusionModel.getIndex( param ) );\n\tif ( this.loaded ) {\n\t\tthis.touch();\n\n\t\tif ( page instanceof ve.ui.MWParameterPage ) {\n\t\t\tpage.updateSize();\n\t\t}\n\t}\n};\n\n/**\n * Handle remove param events.\n *\n * @private\n * @param {ve.dm.MWParameterModel} param Removed param\n */\nve.ui.MWTemplateDialog.prototype.onRemoveParameter = function ( param ) {\n\tthis.bookletLayout.removePages( [ param.getId() ] );\n\n\tthis.touch();\n};\n\n/**\n * Sets transclusion applicable status\n *\n * If the transclusion is empty or only contains a placeholder it will not be insertable.\n * If the transclusion only contains a placeholder it will not be editable.\n *\n * @private\n */\nve.ui.MWTemplateDialog.prototype.setApplicableStatus = function () {\n\tconst canSave = !this.transclusionModel.isEmpty();\n\tthis.actions.setAbilities( { done: canSave && this.altered } );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getBodyHeight = function () {\n\treturn 400;\n};\n\n/**\n * Get a page for a transclusion part.\n *\n * @protected\n * @param {ve.dm.MWTransclusionModel} part Part to get page for\n * @return {OO.ui.PageLayout|null} Page for part, null if no matching page could be found\n */\nve.ui.MWTemplateDialog.prototype.getPageFromPart = function ( part ) {\n\tif ( part instanceof ve.dm.MWTemplateModel ) {\n\t\treturn new ve.ui.MWTemplatePage( part, part.getId(), { $overlay: this.$overlay, isReadOnly: this.isReadOnly() } );\n\t} else if ( part instanceof ve.dm.MWTemplatePlaceholderModel ) {\n\t\treturn new ve.ui.MWTemplatePlaceholderPage(\n\t\t\tpart,\n\t\t\tpart.getId(),\n\t\t\t{ $overlay: this.$overlay }\n\t\t);\n\t}\n\treturn null;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getSelectedNode = function ( data = {} ) {\n\tconst selectedNode = ve.ui.MWTemplateDialog.super.prototype.getSelectedNode.call( this );\n\n\t// Require template to match if specified\n\tif ( selectedNode && data.template && !selectedNode.isSingleTemplate( data.template ) ) {\n\t\treturn null;\n\t}\n\n\treturn selectedNode;\n};\n\n/**\n * Update the dialog title.\n *\n * @protected\n */\nve.ui.MWTemplateDialog.prototype.updateTitle = function () {\n\tlet title = ve.msg( 'visualeditor-dialog-transclusion-loading' );\n\n\tif ( this.transclusionModel.isSingleTemplate() ) {\n\t\tconst part = this.transclusionModel.getParts()[ 0 ];\n\t\tif ( part instanceof ve.dm.MWTemplateModel ) {\n\t\t\ttitle = ve.msg(\n\t\t\t\tthis.getMode() === 'insert' ?\n\t\t\t\t\t'visualeditor-dialog-transclusion-title-insert-known-template' :\n\t\t\t\t\t'visualeditor-dialog-transclusion-title-edit-known-template',\n\t\t\t\tpart.getSpec().getLabel()\n\t\t\t);\n\t\t} else {\n\t\t\ttitle = ve.msg( 'visualeditor-dialog-transclusion-title-insert-template' );\n\t\t}\n\t}\n\tthis.title.setLabel( title );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.MWTemplateDialog.super.prototype.initialize.call( this );\n\n\t// Properties\n\tthis.bookletLayout = new ve.ui.MWTwoPaneTransclusionDialogLayout( this.constructor.static.bookletLayoutConfig );\n\t// TODO: Remove once all references are gone.\n\tthis.sidebar = this.bookletLayout.sidebar;\n\n\t// Initialization\n\tthis.$content.addClass( 've-ui-mwTemplateDialog' );\n\t// bookletLayout is appended after the form has been built in getSetupProcess for performance\n};\n\n/**\n * If the user has left blank required parameters, confirm that they actually want to do this.\n * If no required parameters were left blank, or if they were but the user decided to go ahead\n *  anyway, the returned deferred will be resolved.\n * Otherwise, the returned deferred will be rejected.\n *\n * @private\n * @return {jQuery.Deferred}\n */\nve.ui.MWTemplateDialog.prototype.checkRequiredParameters = function () {\n\tconst blankRequired = [],\n\t\tdeferred = ve.createDeferred();\n\n\tthis.bookletLayout.stackLayout.getItems().forEach( ( page ) => {\n\t\tif ( !( page instanceof ve.ui.MWParameterPage ) ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( page.parameter.isRequired() && !page.valueInput.getValue() ) {\n\t\t\tblankRequired.push( mw.msg(\n\t\t\t\t'quotation-marks',\n\t\t\t\tpage.parameter.template.getSpec().getParameterLabel( page.parameter.getName() )\n\t\t\t) );\n\t\t}\n\t} );\n\tif ( blankRequired.length ) {\n\t\tthis.confirmDialogs.openWindow( 'requiredparamblankconfirm', {\n\t\t\tmessage: mw.msg(\n\t\t\t\t'visualeditor-dialog-transclusion-required-parameter-is-blank',\n\t\t\t\tmw.language.listToText( blankRequired ),\n\t\t\t\tblankRequired.length\n\t\t\t),\n\t\t\ttitle: mw.msg(\n\t\t\t\t'visualeditor-dialog-transclusion-required-parameter-dialog-title',\n\t\t\t\tblankRequired.length\n\t\t\t)\n\t\t} ).closed.then( ( data ) => {\n\t\t\tif ( data && data.action === 'ok' ) {\n\t\t\t\tdeferred.resolve();\n\t\t\t} else {\n\t\t\t\tdeferred.reject();\n\t\t\t}\n\t\t} );\n\t} else {\n\t\tdeferred.resolve();\n\t}\n\treturn deferred.promise();\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getActionProcess = function ( action ) {\n\tif ( action === 'done' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tconst deferred = ve.createDeferred();\n\t\t\tthis.checkRequiredParameters().then( () => {\n\t\t\t\tconst surfaceModel = this.getFragment().getSurface(),\n\t\t\t\t\tobj = this.transclusionModel.getPlainObject();\n\n\t\t\t\tthis.pushPending();\n\n\t\t\t\tlet modelPromise = ve.createDeferred().resolve().promise();\n\t\t\t\tif ( this.selectedNode instanceof ve.dm.MWTransclusionNode ) {\n\t\t\t\t\tthis.transclusionModel.updateTransclusionNode( surfaceModel, this.selectedNode );\n\t\t\t\t\t// TODO: updating the node could result in the inline/block state change\n\t\t\t\t} else if ( obj !== null ) {\n\t\t\t\t\t// Collapse returns a new fragment, so update this.fragment\n\t\t\t\t\tthis.fragment = this.getFragment().collapseToEnd();\n\t\t\t\t\tmodelPromise = this.transclusionModel.insertTransclusionNode( this.getFragment() );\n\t\t\t\t}\n\n\t\t\t\t// TODO tracking will only be implemented temporarily to answer questions on\n\t\t\t\t// template usage for the Technical Wishes topic area see T258917\n\t\t\t\tconst templateEvent = {\n\t\t\t\t\taction: 'save',\n\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\ttemplate_names: []\n\t\t\t\t};\n\t\t\t\tconst editCountBucket = mw.config.get( 'wgUserEditCountBucket' );\n\t\t\t\tif ( editCountBucket !== null ) {\n\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\ttemplateEvent.user_edit_count_bucket = editCountBucket;\n\t\t\t\t}\n\t\t\t\tconst parts = this.transclusionModel.getParts();\n\t\t\t\tfor ( let i = 0; i < parts.length; i++ ) {\n\t\t\t\t\t// Only {@see ve.dm.MWTemplateModel} have a title\n\t\t\t\t\tconst title = parts[ i ].getTitle && parts[ i ].getTitle();\n\t\t\t\t\tif ( title ) {\n\t\t\t\t\t\ttemplateEvent.template_names.push( title );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmw.track( 'event.VisualEditorTemplateDialogUse', templateEvent );\n\n\t\t\t\treturn modelPromise.then( () => {\n\t\t\t\t\tthis.close( { action: action } ).closed.always( this.popPending.bind( this ) );\n\t\t\t\t} );\n\t\t\t} ).always( deferred.resolve );\n\n\t\t\treturn deferred;\n\t\t} );\n\t}\n\n\treturn ve.ui.MWTemplateDialog.super.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getSetupProcess = function ( data = {} ) {\n\treturn ve.ui.MWTemplateDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tlet promise;\n\n\t\t\t// Properties\n\t\t\tthis.loaded = false;\n\t\t\tthis.altered = false;\n\t\t\tthis.transclusionModel = new ve.dm.MWTransclusionModel( this.getFragment().getDocument() );\n\n\t\t\t// Events\n\t\t\tthis.transclusionModel.connect( this, {\n\t\t\t\treplace: 'onReplacePart',\n\t\t\t\tchange: 'touch'\n\t\t\t} );\n\n\t\t\t// Detach the form while building for performance\n\t\t\tthis.bookletLayout.$element.detach();\n\n\t\t\tthis.transclusionModel.connect( this.bookletLayout, { replace: 'onReplacePart' } );\n\n\t\t\t// Initialization\n\t\t\tif ( !this.selectedNode ) {\n\t\t\t\tif ( data.template ) {\n\t\t\t\t\t// The template name is from MediaWiki:Visualeditor-cite-tool-definition.json,\n\t\t\t\t\t// passed via a ve.ui.Command, which triggers a ve.ui.MWCitationAction, which\n\t\t\t\t\t// executes ve.ui.WindowAction.open(), which opens this dialog.\n\t\t\t\t\tconst template = ve.dm.MWTemplateModel.newFromName(\n\t\t\t\t\t\tthis.transclusionModel, data.template\n\t\t\t\t\t);\n\t\t\t\t\tpromise = this.transclusionModel.addPart( template );\n\t\t\t\t} else {\n\t\t\t\t\t// Open the dialog to add a new template, always starting with a placeholder\n\t\t\t\t\tconst placeholderPage = new ve.dm.MWTemplatePlaceholderModel( this.transclusionModel );\n\t\t\t\t\tpromise = this.transclusionModel.addPart( placeholderPage );\n\t\t\t\t\tpromise.then( () => {\n\t\t\t\t\t\tthis.bookletLayout.setPage( placeholderPage.getId() );\n\t\t\t\t\t} );\n\t\t\t\t\tthis.canGoBack = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Open the dialog to edit an existing template\n\n\t\t\t\t// TODO tracking will only be implemented temporarily to answer questions on\n\t\t\t\t// template usage for the Technical Wishes topic area see T258917\n\t\t\t\tconst templateEvent = {\n\t\t\t\t\taction: 'edit',\n\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\ttemplate_names: []\n\t\t\t\t};\n\t\t\t\tconst editCountBucket = mw.config.get( 'wgUserEditCountBucket' );\n\t\t\t\tif ( editCountBucket !== null ) {\n\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\ttemplateEvent.user_edit_count_bucket = editCountBucket;\n\t\t\t\t}\n\t\t\t\tfor ( let i = 0; i < this.selectedNode.partsList.length; i++ ) {\n\t\t\t\t\tif ( this.selectedNode.partsList[ i ].templatePage ) {\n\t\t\t\t\t\ttemplateEvent.template_names.push( this.selectedNode.partsList[ i ].templatePage );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmw.track( 'event.VisualEditorTemplateDialogUse', templateEvent );\n\n\t\t\t\tpromise = this.transclusionModel\n\t\t\t\t\t.load( ve.copy( this.selectedNode.getAttribute( 'mw' ) ) )\n\t\t\t\t\t.then( this.initializeTemplateParameters.bind( this ) );\n\t\t\t}\n\t\t\tthis.actions.setAbilities( { done: false } );\n\n\t\t\treturn promise.then( () => {\n\t\t\t\t// Add missing required and suggested parameters to each transclusion.\n\t\t\t\tthis.transclusionModel.addPromptedParameters();\n\n\t\t\t\tthis.$body.append( this.bookletLayout.$element );\n\t\t\t\tthis.$element.addClass( 've-ui-mwTemplateDialog-ready' );\n\t\t\t\tthis.loaded = true;\n\t\t\t} );\n\t\t} );\n};\n\n/**\n * Intentionally empty. This is provided for Wikia extensibility.\n */\nve.ui.MWTemplateDialog.prototype.initializeTemplateParameters = function () {};\n\n/**\n * @private\n * @param {string} pageName\n * @param {boolean} hasValue\n */\nve.ui.MWTemplateDialog.prototype.onHasValueChange = function ( pageName, hasValue ) {\n\tthis.sidebar.toggleHasValueByPageName( pageName, hasValue );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getTeardownProcess = function ( data ) {\n\treturn ve.ui.MWTemplateDialog.super.prototype.getTeardownProcess.call( this, data )\n\t\t.first( () => {\n\t\t\t// Cleanup\n\t\t\tthis.$element.removeClass( 've-ui-mwTemplateDialog-ready' );\n\t\t\tthis.transclusionModel.disconnect( this );\n\t\t\tthis.transclusionModel.abortAllApiRequests();\n\t\t\tthis.transclusionModel = null;\n\t\t\tthis.bookletLayout.clearPages();\n\t\t\tthis.content = null;\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":"implicit-arrow-linebreak","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-mw/ui/dialogs/ve.ui.MWTransclusionDialog.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":13,"column":1,"nodeType":"Block","endLine":13,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":151,"column":1,"nodeType":"Block","endLine":151,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":266,"column":1,"nodeType":"Block","endLine":266,"endColumn":1},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":302,"column":3,"nodeType":"MemberExpression","messageId":"forbidden","endLine":302,"endColumn":32},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":437,"column":1,"nodeType":"Block","endLine":437,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":312,"column":3,"nodeType":"CallExpression","endLine":312,"endColumn":70,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWTransclusionDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Dialog for inserting and editing MediaWiki transclusions, i.e. a sequence of one or more template\n * invocations that strictly belong to each other (e.g. because they are unbalanced), possibly\n * mixed with raw wikitext snippets.\n *\n * Note the base class {@see ve.ui.MWTemplateDialog} alone does not allow to manage more than a\n * single template invocation. Most of the code for this feature set is exclusive to this subclass.\n *\n * @class\n * @extends ve.ui.MWTemplateDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWTransclusionDialog = function VeUiMWTransclusionDialog( config ) {\n\t// Parent constructor\n\tve.ui.MWTransclusionDialog.super.call( this, config );\n\n\t// Properties\n\tthis.isSidebarExpanded = null;\n\n\tthis.hotkeyTriggers = {};\n\tthis.$element.on( 'keydown', this.onKeyDown.bind( this ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWTransclusionDialog, ve.ui.MWTemplateDialog );\n\n/* Static Properties */\n\nve.ui.MWTransclusionDialog.static.name = 'transclusion';\n\nve.ui.MWTransclusionDialog.static.size = 'larger';\n\nve.ui.MWTransclusionDialog.static.actions = [\n\t...ve.ui.MWTemplateDialog.static.actions,\n\t{\n\t\taction: 'mode',\n\t\t// label is set by updateModeActionState\n\t\tmodes: [ 'edit', 'insert' ]\n\t},\n\t{\n\t\taction: 'back',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-action-goback' ),\n\t\tmodes: [ 'edit', 'insert' ],\n\t\tflags: [ 'safe', 'back' ]\n\t}\n];\n\nve.ui.MWTransclusionDialog.static.smallScreenMaxWidth = 540;\n\n/* Static Methods */\n\n/**\n * @return {boolean}\n */\nve.ui.MWTransclusionDialog.static.isSmallScreen = function () {\n\treturn $( window ).width() <= ve.ui.MWTransclusionDialog.static.smallScreenMaxWidth;\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getEscapeAction = function () {\n\tconst backOrClose = this.actions.get( { flags: [ 'back', 'close' ], visible: true } );\n\tif ( backOrClose.length ) {\n\t\treturn backOrClose[ 0 ].getAction();\n\t}\n\treturn null;\n};\n\n/**\n * Handle outline controls move events.\n *\n * @private\n * @param {number} places Number of places to move the selected item\n */\nve.ui.MWTransclusionDialog.prototype.onOutlineControlsMove = function ( places ) {\n\tconst part = this.transclusionModel.getPartFromId( this.bookletLayout.getSelectedTopLevelPartId() );\n\tif ( !part ) {\n\t\treturn;\n\t}\n\n\tconst newPlace = this.transclusionModel.getParts().indexOf( part ) + places;\n\tif ( newPlace < 0 || newPlace >= this.transclusionModel.getParts().length ) {\n\t\treturn;\n\t}\n\n\t// Move part to new location, and if dialog is loaded switch to new part page\n\tconst promise = this.transclusionModel.addPart( part, newPlace );\n\tif ( this.loaded && !this.preventReselection ) {\n\t\t// FIXME: Should be handled internally {@see ve.ui.MWTwoPaneTransclusionDialogLayout}\n\t\tpromise.then( this.bookletLayout.focusPart.bind( this.bookletLayout, part.getId() ) );\n\t}\n};\n\n/**\n * Handle outline controls remove events.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.onOutlineControlsRemove = function () {\n\tconst controls = this.bookletLayout.getOutlineControls();\n\t// T301914: Safe-guard for when a keyboard shortcut triggers this, instead of the actual button\n\tif ( !controls.isVisible() ||\n\t\t!controls.removeButton.isVisible() ||\n\t\tcontrols.removeButton.isDisabled()\n\t) {\n\t\treturn;\n\t}\n\n\tconst partId = this.bookletLayout.getSelectedTopLevelPartId(),\n\t\tpart = this.transclusionModel.getPartFromId( partId );\n\tif ( part ) {\n\t\tthis.transclusionModel.removePart( part );\n\t}\n};\n\n/**\n * Create a new template part at the end of the transclusion.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.addTemplatePlaceholder = function () {\n\tthis.addPart( new ve.dm.MWTemplatePlaceholderModel( this.transclusionModel ) );\n};\n\n/**\n * Handle add wikitext button click or hotkey events.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.addWikitext = function () {\n\tthis.addPart( new ve.dm.MWTransclusionContentModel( this.transclusionModel ) );\n};\n\n/**\n * Handle add parameter hotkey events.\n *\n * @private\n * @param {jQuery.Event} e Key down event\n */\nve.ui.MWTransclusionDialog.prototype.addParameter = function ( e ) {\n\t// Check if the focus was in e.g. a parameter list or filter input when the hotkey was pressed\n\tlet partId = this.bookletLayout.sidebar.findPartIdContainingElement( e.target ),\n\t\tpart = this.transclusionModel.getPartFromId( partId );\n\n\tif ( !( part instanceof ve.dm.MWTemplateModel ) ) {\n\t\t// Otherwise add to the template that's currently selected via its title or parameter\n\t\tpartId = this.bookletLayout.getTopLevelPartIdForSelection();\n\t\tpart = this.transclusionModel.getPartFromId( partId );\n\t}\n\n\tif ( this.transclusionModel.isSingleTemplate() ) {\n\t\tpart = this.transclusionModel.getParts()[ 0 ];\n\t}\n\n\tif ( !( part instanceof ve.dm.MWTemplateModel ) ) {\n\t\treturn;\n\t}\n\n\t// TODO: Use a distinct class for placeholder model rather than\n\t// these magical \"empty\" constants.\n\tconst placeholderParameter = new ve.dm.MWParameterModel( part );\n\tpart.addParameter( placeholderParameter );\n\tthis.bookletLayout.focusPart( placeholderParameter.getId() );\n\n\tthis.autoExpandSidebar();\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.onReplacePart = function ( removed, added ) {\n\tve.ui.MWTransclusionDialog.super.prototype.onReplacePart.call( this, removed, added );\n\tconst parts = this.transclusionModel.getParts();\n\n\tif ( parts.length === 0 ) {\n\t\tthis.addPart( new ve.dm.MWTemplatePlaceholderModel( this.transclusionModel ) );\n\t} else if ( parts.length > 1 ) {\n\t\tthis.$element.removeClass( 've-ui-mwTransclusionDialog-single-transclusion' );\n\t}\n\n\t// multipart message\n\tthis.bookletLayout.stackLayout.$element.prepend( this.multipartMessage.$element );\n\tthis.multipartMessage.toggle( parts.length > 1 );\n\n\tthis.autoExpandSidebar();\n\tthis.updateModeActionState();\n\tthis.updateActionSet();\n};\n\n/**\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.setupHotkeyTriggers = function () {\n\t// Lower-case modifier and key names as specified in {@see ve.ui.Trigger}\n\tconst isMac = ve.getSystemPlatform() === 'mac',\n\t\tmeta = isMac ? 'meta+' : 'ctrl+';\n\tconst hotkeys = {\n\t\taddTemplate: meta + 'd',\n\t\taddWikitext: meta + 'shift+y',\n\t\taddParameter: meta + 'shift+d',\n\t\tmoveUp: meta + 'shift+up',\n\t\tmoveDown: meta + 'shift+down',\n\t\tremove: meta + 'delete',\n\t\tremoveBackspace: meta + 'backspace'\n\t};\n\n\tconst notInTextFields = /^(?!INPUT|TEXTAREA)/i;\n\tthis.connectHotKeyBinding( hotkeys.addTemplate, this.addTemplatePlaceholder.bind( this ) );\n\tthis.connectHotKeyBinding( hotkeys.addWikitext, this.addWikitext.bind( this ) );\n\tthis.connectHotKeyBinding( hotkeys.addParameter, this.addParameter.bind( this ) );\n\tthis.connectHotKeyBinding( hotkeys.moveUp, this.onOutlineControlsMove.bind( this, -1 ), notInTextFields );\n\tthis.connectHotKeyBinding( hotkeys.moveDown, this.onOutlineControlsMove.bind( this, 1 ), notInTextFields );\n\tthis.connectHotKeyBinding( hotkeys.remove, this.onOutlineControlsRemove.bind( this ), notInTextFields );\n\tif ( isMac ) {\n\t\tthis.connectHotKeyBinding( hotkeys.removeBackspace, this.onOutlineControlsRemove.bind( this ), notInTextFields );\n\t}\n\n\tconst controls = this.bookletLayout.getOutlineControls();\n\tthis.addHotkeyToTitle( controls.addTemplateButton, hotkeys.addTemplate );\n\tthis.addHotkeyToTitle( controls.addWikitextButton, hotkeys.addWikitext );\n\tthis.addHotkeyToTitle( controls.upButton, hotkeys.moveUp );\n\tthis.addHotkeyToTitle( controls.downButton, hotkeys.moveDown );\n\tthis.addHotkeyToTitle( controls.removeButton, hotkeys.remove );\n};\n\n/**\n * @private\n * @param {string} hotkey\n * @param {Function} handler\n * @param {RegExp} [validTypes]\n */\nve.ui.MWTransclusionDialog.prototype.connectHotKeyBinding = function ( hotkey, handler, validTypes ) {\n\tthis.hotkeyTriggers[ hotkey ] = {\n\t\thandler: handler,\n\t\tvalidTypes: validTypes\n\t};\n};\n\n/**\n * @private\n * @param {OO.ui.mixin.TitledElement} element\n * @param {string} hotkey\n */\nve.ui.MWTransclusionDialog.prototype.addHotkeyToTitle = function ( element, hotkey ) {\n\t// Separated with a space as in {@see OO.ui.Tool.updateTitle}\n\telement.setTitle( element.getTitle() + ' ' + new ve.ui.Trigger( hotkey ).getMessage() );\n};\n\n/**\n * Handles key down events.\n *\n * @protected\n * @param {jQuery.Event} e Key down event\n */\nve.ui.MWTransclusionDialog.prototype.onKeyDown = function ( e ) {\n\tconst hotkey = new ve.ui.Trigger( e ).toString(),\n\t\ttrigger = this.hotkeyTriggers[ hotkey ];\n\n\tif ( trigger && ( !trigger.validTypes || trigger.validTypes.test( e.target.nodeName ) ) ) {\n\t\ttrigger.handler( e );\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getPageFromPart = function ( part ) {\n\tconst page = ve.ui.MWTransclusionDialog.super.prototype.getPageFromPart.call( this, part );\n\tif ( !page && part instanceof ve.dm.MWTransclusionContentModel ) {\n\t\treturn new ve.ui.MWTransclusionContentPage( part, part.getId(), { $overlay: this.$overlay, isReadOnly: this.isReadOnly() } );\n\t}\n\treturn page;\n};\n\n/**\n * Automatically expand or collapse the sidebar according to default logic.\n *\n * @protected\n */\nve.ui.MWTransclusionDialog.prototype.autoExpandSidebar = function () {\n\tlet expandSidebar;\n\n\tconst isSmallScreen = this.constructor.static.isSmallScreen();\n\n\tconst showOtherActions = isSmallScreen ||\n\t\t// Check for unknown actions, show the toolbar if any are available.\n\t\tthis.actions.getOthers().some( ( action ) => action.action !== 'mode' );\n\tthis.actions.forEach( { actions: [ 'mode' ] }, ( action ) => {\n\t\taction.toggle( isSmallScreen );\n\t} );\n\tthis.$otherActions.toggleClass( 'oo-ui-element-hidden', !showOtherActions );\n\n\tif ( isSmallScreen && this.transclusionModel.isEmpty() ) {\n\t\texpandSidebar = false;\n\t} else if ( isSmallScreen &&\n\t\t// eslint-disable-next-line no-jquery/no-class-state\n\t\tthis.$content.hasClass( 've-ui-mwTransclusionDialog-small-screen' )\n\t) {\n\t\t// We did this already. If the sidebar is visible or not is now the user's decision.\n\t\treturn;\n\t} else {\n\t\texpandSidebar = !isSmallScreen;\n\t}\n\n\tthis.$content.toggleClass( 've-ui-mwTransclusionDialog-small-screen', isSmallScreen );\n\n\tthis.toggleSidebar( expandSidebar );\n};\n\n/**\n * Set if the sidebar is visible (which means the dialog is expanded), or collapsed.\n *\n * @param {boolean} expandSidebar\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.toggleSidebar = function ( expandSidebar ) {\n\tif ( this.isSidebarExpanded === expandSidebar ) {\n\t\treturn;\n\t}\n\n\tthis.isSidebarExpanded = expandSidebar;\n\tthis.$content\n\t\t.toggleClass( 've-ui-mwTransclusionDialog-collapsed', !expandSidebar )\n\t\t.toggleClass( 've-ui-mwTransclusionDialog-expanded', expandSidebar );\n\n\tthis.bookletLayout.toggleOutline( expandSidebar );\n\tthis.updateTitle();\n\tthis.updateModeActionState();\n\n\t// HACK blur any active input so that its dropdown will be hidden and won't end\n\t// up being mispositioned\n\tthis.$content.find( 'input:focus' ).trigger( 'blur' );\n\n\tif ( this.loaded && this.constructor.static.isSmallScreen() ) {\n\t\t// Updates the page sizes when the menu is toggled using the button. This needs\n\t\t// to happen after the animation when the panel is visible.\n\t\tsetTimeout( () => {\n\t\t\tthis.bookletLayout.stackLayout.getItems().forEach( ( page ) => {\n\t\t\t\tif ( page instanceof ve.ui.MWParameterPage ) {\n\t\t\t\t\tpage.updateSize();\n\t\t\t\t}\n\t\t\t} );\n\t\t}, OO.ui.theme.getDialogTransitionDuration() );\n\n\t\t// Reapply selection and scrolling when switching between panes.\n\t\tconst selectedPage = this.bookletLayout.getCurrentPage();\n\t\tif ( selectedPage ) {\n\t\t\tconst name = selectedPage.getName();\n\t\t\t// Align whichever panel is becoming visible, after animation completes.\n\t\t\t// TODO: Should hook onto an animation promise—but is this possible when pure CSS?\n\t\t\tsetTimeout( () => {\n\t\t\t\tif ( expandSidebar ) {\n\t\t\t\t\tthis.sidebar.setSelectionByPageName( name );\n\t\t\t\t} else {\n\t\t\t\t\tselectedPage.scrollElementIntoView( { alignToTop: true, padding: { top: 20 } } );\n\t\t\t\t\tif ( !OO.ui.isMobile() ) {\n\t\t\t\t\t\tselectedPage.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, OO.ui.theme.getDialogTransitionDuration() );\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.updateTitle = function () {\n\tif ( !this.transclusionModel.isSingleTemplate() ) {\n\t\tthis.title.setLabel( ve.msg( 'visualeditor-dialog-transclusion-title-edit-transclusion' ) );\n\t} else {\n\t\t// Parent method\n\t\tve.ui.MWTransclusionDialog.super.prototype.updateTitle.call( this );\n\t}\n};\n\n/**\n * Update the state of the 'mode' action\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.updateModeActionState = function () {\n\tconst isExpanded = this.isSidebarExpanded,\n\t\tlabel = ve.msg( isExpanded ?\n\t\t\t'visualeditor-dialog-transclusion-collapse-options' :\n\t\t\t'visualeditor-dialog-transclusion-expand-options' );\n\n\tthis.actions.forEach( { actions: [ 'mode' ] }, ( action ) => {\n\t\taction.setLabel( label );\n\t\taction.$button.attr( 'aria-expanded', isExpanded ? 1 : 0 );\n\t} );\n\n\t// The button is only visible on very narrow screens, {@see autoExpandSidebar}.\n\t// It's always needed, except in the initial placeholder state.\n\tconst isInitialState = !isExpanded && this.transclusionModel.isEmpty(),\n\t\tcanCollapse = !isInitialState;\n\tthis.actions.setAbilities( { mode: canCollapse } );\n};\n\n/**\n * Add a part to the transclusion.\n *\n * @param {ve.dm.MWTransclusionPartModel} part Part to add\n */\nve.ui.MWTransclusionDialog.prototype.addPart = function ( part ) {\n\tconst parts = this.transclusionModel.getParts(),\n\t\tpartId = this.bookletLayout.getTopLevelPartIdForSelection(),\n\t\tselectedPart = this.transclusionModel.getPartFromId( partId );\n\t// Insert after selected part, or at the end if nothing is selected\n\tconst index = selectedPart ? parts.indexOf( selectedPart ) + 1 : parts.length;\n\t// Add the part, and if dialog is loaded switch to part page\n\tconst promise = this.transclusionModel.addPart( part, index );\n\tif ( this.loaded && !this.preventReselection ) {\n\t\tpromise.then( this.bookletLayout.focusPart.bind( this.bookletLayout, part.getId() ) );\n\t}\n};\n\n/**\n * Show a confirm prompt before closing the dialog\n *\n * @param {string} prompt Prompt\n * @return {jQuery.Promise} Close promise\n */\nve.ui.MWTransclusionDialog.prototype.closeConfirm = function ( prompt ) {\n\treturn OO.ui.confirm( prompt, {\n\t\tactions: [\n\t\t\t{\n\t\t\t\taction: 'reject',\n\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-transclusion-confirmation-reject' ),\n\t\t\t\tflags: 'safe'\n\t\t\t},\n\t\t\t{\n\t\t\t\taction: 'accept',\n\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-transclusion-confirmation-discard' ),\n\t\t\t\t// TODO: Destructive actions don't get focus by default, but maybe should here?\n\t\t\t\tflags: 'destructive'\n\t\t\t}\n\t\t]\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getActionProcess = function ( action ) {\n\tconst willLoseProgress = this.getMode() === 'insert' ?\n\t\t// A new template with no parameters is not considered valuable.\n\t\tthis.transclusionModel.containsValuableData() :\n\t\t// The user has changed a parameter, and is not on the template search page.\n\t\t( this.altered && !this.transclusionModel.isEmpty() );\n\n\tswitch ( action ) {\n\t\tcase 'back':\n\t\t\treturn new OO.ui.Process( () => {\n\t\t\t\tif ( willLoseProgress ) {\n\t\t\t\t\tthis.closeConfirm( ve.msg( 'visualeditor-dialog-transclusion-back-confirmation-prompt' ) ).then( ( confirmed ) => {\n\t\t\t\t\t\tif ( confirmed ) {\n\t\t\t\t\t\t\tthis.resetDialog();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tthis.resetDialog();\n\t\t\t\t}\n\t\t\t} );\n\t\tcase 'mode':\n\t\t\treturn new OO.ui.Process( () => {\n\t\t\t\tthis.toggleSidebar( !this.isSidebarExpanded );\n\t\t\t} );\n\t\tcase '':\n\t\t\t// close action\n\t\t\tif ( willLoseProgress ) {\n\t\t\t\treturn new OO.ui.Process( () => {\n\t\t\t\t\tthis.closeConfirm( ve.msg( 'visualeditor-dialog-transclusion-close-confirmation-prompt' ) ).then( ( confirmed ) => {\n\t\t\t\t\t\tif ( confirmed ) {\n\t\t\t\t\t\t\tthis.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t}\n\treturn ve.ui.MWTransclusionDialog.super.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * Update the widgets in the dialog's action bar.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.updateActionSet = function () {\n\tconst backButton = this.actions.get( { flags: [ 'back' ] } ).pop(),\n\t\tsaveButton = this.actions.get( { actions: [ 'done' ] } ).pop();\n\n\tif ( saveButton && this.getMode() === 'edit' ) {\n\t\tsaveButton.setLabel( ve.msg( 'visualeditor-dialog-transclusion-action-save' ) );\n\t}\n\n\tconst closeButton = this.actions.get( { flags: [ 'close' ] } ).pop(),\n\t\tcanGoBack = this.getMode() === 'insert' && this.canGoBack && !this.transclusionModel.isEmpty();\n\n\tcloseButton.toggle( !canGoBack );\n\tbackButton.toggle( canGoBack );\n};\n\n/**\n * Revert the dialog back to its initial state.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.resetDialog = function () {\n\tthis.transclusionModel.reset();\n\tthis.bookletLayout.clearPages();\n\tconst placeholderPage = new ve.dm.MWTemplatePlaceholderModel( this.transclusionModel );\n\tthis.transclusionModel.addPart( placeholderPage )\n\t\t.then( () => {\n\t\t\tthis.bookletLayout.focusPart( placeholderPage.getId() );\n\t\t\tthis.autoExpandSidebar();\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.MWTransclusionDialog.super.prototype.initialize.call( this );\n\n\tthis.setupHotkeyTriggers();\n\n\t// multipart message gets attached in onReplacePart()\n\tthis.multipartMessage = new OO.ui.MessageWidget( {\n\t\tlabel: mw.message( 'visualeditor-dialog-transclusion-multipart-message' ).parseDom(),\n\t\tclasses: [ 've-ui-mwTransclusionDialog-multipart-message' ]\n\t} );\n\tve.targetLinksToNewWindow( this.multipartMessage.$element[ 0 ] );\n\n\tconst helpPopup = new ve.ui.MWFloatingHelpElement( {\n\t\tlabel: mw.message( 'visualeditor-dialog-transclusion-help-title' ).text(),\n\t\ttitle: mw.message( 'visualeditor-dialog-transclusion-help-title' ).text(),\n\t\t$message: new OO.ui.FieldsetLayout( {\n\t\t\titems: [\n\t\t\t\tnew OO.ui.LabelWidget( {\n\t\t\t\t\tlabel: mw.message( 'visualeditor-dialog-transclusion-help-message' ).text()\n\t\t\t\t} ),\n\t\t\t\tthis.getMessageButton( 'visualeditor-dialog-transclusion-help-page-help', 'helpNotice' ),\n\t\t\t\tthis.getMessageButton( 'visualeditor-dialog-transclusion-help-page-shortcuts', 'keyboard' )\n\t\t\t],\n\t\t\tclasses: [ 've-ui-mwTransclusionDialog-floatingHelpElement-fieldsetLayout' ]\n\t\t} ).$element\n\t} );\n\thelpPopup.$element.addClass( 've-ui-mwTransclusionDialog-floatingHelpElement' );\n\thelpPopup.$element.appendTo( this.$body );\n\n\t// Events\n\tthis.getManager().connect( this, { resize: ve.debounce( this.onWindowResize.bind( this ) ) } );\n\tthis.bookletLayout.getOutlineControls().connect( this, {\n\t\taddTemplate: 'addTemplatePlaceholder',\n\t\taddWikitext: 'addWikitext',\n\t\tmove: 'onOutlineControlsMove',\n\t\tremove: 'onOutlineControlsRemove'\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWTransclusionDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.bookletLayout.getOutlineControls().toggle( !this.transclusionModel.isSingleTemplate() );\n\t\t\tthis.$element.toggleClass(\n\t\t\t\t've-ui-mwTransclusionDialog-single-transclusion',\n\t\t\t\tthis.transclusionModel.isSingleTemplate()\n\t\t\t);\n\n\t\t\tthis.updateModeActionState();\n\t\t\tthis.autoExpandSidebar();\n\n\t\t\tif ( !this.transclusionModel.isSingleTemplate() ) {\n\t\t\t\tthis.sidebar.hideAllUnusedParameters();\n\t\t\t}\n\t\t\t// We can do this only after the widget is visible on screen\n\t\t\tthis.sidebar.initializeAllStickyHeaderHeights();\n\t\t} );\n};\n\n/**\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.onWindowResize = function () {\n\tif ( this.transclusionModel ) {\n\t\tthis.autoExpandSidebar();\n\n\t\tthis.bookletLayout.getPagesOrdered().forEach( ( page ) => {\n\t\t\tif ( page instanceof ve.ui.MWParameterPage ) {\n\t\t\t\tpage.updateSize();\n\t\t\t}\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getSizeProperties = function () {\n\treturn ve.extendObject(\n\t\t{ height: '90%' },\n\t\tve.ui.MWTransclusionDialog.super.prototype.getSizeProperties.call( this )\n\t);\n};\n\n/**\n * Converts a message link into an OO.ui.ButtonWidget with an icon.\n *\n * @private\n * @param {string} message i18n message key\n * @param {string} icon icon name\n * @return {OO.ui.ButtonWidget}\n */\nve.ui.MWTemplateDialog.prototype.getMessageButton = function ( message, icon ) {\n\t// Messages that can be used here:\n\t// * visualeditor-dialog-transclusion-help-page-help\n\t// * visualeditor-dialog-transclusion-help-page-shortcuts\n\tconst $link = mw.message( message ).parseDom(),\n\t\tbutton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: $link.text(),\n\t\t\thref: $link.attr( 'href' ),\n\t\t\ttarget: '_blank',\n\t\t\tflags: 'progressive',\n\t\t\ticon: icon,\n\t\t\tframed: false\n\t\t} );\n\tbutton.$button.attr( 'role', 'link' );\n\treturn button;\n};\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWTransclusionDialog );\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":"implicit-arrow-linebreak","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-mw/ui/elements/ve.ui.MWExpandableContentElement.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":"implicit-arrow-linebreak","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-mw/ui/elements/ve.ui.MWExpandableErrorElement.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":33,"column":16,"nodeType":"NewExpression","messageId":"noLabel","endLine":37,"endColumn":5}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWExpandableErrorElement class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki expandable error element.\n *\n * @class\n * @extends OO.ui.Element\n * @mixes OO.EventEmitter\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWExpandableErrorElement = function VeUiMWExpandableErrorElement( config ) {\n\t// Parent constructor\n\tve.ui.MWExpandableErrorElement.super.call( this, config );\n\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Interaction\n\tthis.expanded = false;\n\tthis.expandable = false;\n\n\tthis.toggle( false );\n\tthis.label = new OO.ui.LabelWidget( {\n\t\tclasses: [ 've-ui-mwExpandableErrorElement-label' ]\n\t} );\n\tthis.button = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\tclasses: [ 've-ui-mwExpandableErrorElement-button' ],\n\t\ticon: 'expand'\n\t} ).toggle( false );\n\n\tthis.$element.append(\n\t\tthis.button.$element,\n\t\tthis.label.$element\n\t).addClass( 've-ui-mwExpandableErrorElement' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWExpandableErrorElement, OO.ui.Element );\n\nOO.mixinClass( ve.ui.MWExpandableErrorElement, OO.EventEmitter );\n\n/* Events */\n\n/**\n * @event ve.ui.MWExpandableErrorElement#update\n */\n\n/* Methods */\n\n/**\n * Set the expandability of the error.\n *\n * @param {boolean} [expandable] Value to set the expandability to,\n * determine based on label size if omitted\n */\nve.ui.MWExpandableErrorElement.prototype.setExpandable = function ( expandable ) {\n\tif ( expandable !== undefined ) {\n\t\tthis.expandable = expandable;\n\t} else {\n\t\t// Check if error fits when in not-expandable mode\n\t\tthis.label.$element\n\t\t\t.addClass( 've-ui-mwExpandableErrorElement-label-not-expandable' );\n\t\tthis.expandable = this.label.$element.prop( 'scrollWidth' ) >\n\t\t\tthis.label.$element.innerWidth();\n\t}\n\tthis.label.$element\n\t\t.toggleClass( 've-ui-mwExpandableErrorElement-label-not-expandable', !this.expandable );\n};\n\n/**\n * Show the error and set the label to contain the error text.\n *\n * @param {jQuery} [$element] Element containing the error\n */\nve.ui.MWExpandableErrorElement.prototype.show = function ( $element ) {\n\tthis.label.setLabel( $element || null );\n\tthis.toggle( true );\n\n\tthis.setExpandable();\n\n\tif ( this.expandable ) {\n\t\tthis.label.$element.addClass( 've-ui-mwExpandableErrorElement-label-collapsed' );\n\t\tthis.button.toggle( true );\n\t\tthis.button.connect( this, { click: 'toggleLabel' } );\n\t}\n\n\tthis.emit( 'update' );\n};\n\n/**\n * Hide and collapse the error element, remove the label, and set expandable\n * to false.\n */\nve.ui.MWExpandableErrorElement.prototype.clear = function () {\n\tthis.label.setLabel( null );\n\tthis.toggle( false );\n\n\tthis.button.toggle( false );\n\tthis.button.disconnect( this );\n\tthis.toggleLabel( false );\n\n\tthis.emit( 'update' );\n};\n\n/**\n * Toggles the label between collapsed and expanded.\n *\n * @param {boolean} [expand] Expand if true, collapse if false, toggle if\n * omitted\n */\nve.ui.MWExpandableErrorElement.prototype.toggleLabel = function ( expand ) {\n\t// Set this.expanded to the new state\n\tthis.expanded = expand === undefined ? !this.expanded : expand;\n\n\t// Update DOM based on the new state of this.expanded\n\tthis.button.setIcon( this.expanded ? 'collapse' : 'expand' );\n\tthis.label.$element\n\t\t.toggleClass( 've-ui-mwExpandableErrorElement-label-expanded', this.expanded )\n\t\t.toggleClass( 've-ui-mwExpandableErrorElement-label-collapsed', !this.expanded );\n\n\tthis.emit( 'update' );\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":"implicit-arrow-linebreak","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-mw/ui/elements/ve.ui.MWFloatingHelpElement.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":"implicit-arrow-linebreak","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-mw/ui/elements/ve.ui.MWPreviewElement.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":"implicit-arrow-linebreak","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-mw/ui/inspectors/ve.ui.MWAlienExtensionInspector.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":"implicit-arrow-linebreak","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-mw/ui/inspectors/ve.ui.MWCommentInspector.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":"implicit-arrow-linebreak","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-mw/ui/inspectors/ve.ui.MWExtensionInspector.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":"implicit-arrow-linebreak","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-mw/ui/inspectors/ve.ui.MWLanguageVariantInspector.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":"implicit-arrow-linebreak","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-mw/ui/inspectors/ve.ui.MWLinkAnnotationInspector.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":208,"column":1,"nodeType":"Block","endLine":208,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface LinkAnnotationInspector class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Inspector for applying and editing labeled MediaWiki internal and external links.\n *\n * @class\n * @extends ve.ui.LinkAnnotationInspector\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWLinkAnnotationInspector = function VeUiMWLinkAnnotationInspector( config ) {\n\t// Parent constructor\n\tve.ui.MWLinkAnnotationInspector.super.call( this, ve.extendObject( { padded: false }, config ) );\n\n\tthis.$element.addClass( 've-ui-mwLinkAnnotationInspector' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWLinkAnnotationInspector, ve.ui.LinkAnnotationInspector );\n\n/* Static properties */\n\nve.ui.MWLinkAnnotationInspector.static.name = 'link';\n\nve.ui.MWLinkAnnotationInspector.static.modelClasses = [\n\tve.dm.MWExternalLinkAnnotation,\n\tve.dm.MWInternalLinkAnnotation\n];\n\nve.ui.MWLinkAnnotationInspector.static.actions = [\n\t...ve.ui.MWLinkAnnotationInspector.static.actions,\n\t{\n\t\taction: 'convert',\n\t\tlabel: null, // see #updateActions\n\t\tmodes: [ 'edit', 'insert' ]\n\t}\n];\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.initialize = function () {\n\t// Properties\n\tthis.allowProtocolInInternal = false;\n\tthis.internalAnnotationInput = this.createInternalAnnotationInput();\n\tthis.externalAnnotationInput = this.createExternalAnnotationInput();\n\n\tthis.linkTypeIndex = new OO.ui.IndexLayout( {\n\t\texpanded: false,\n\t\tframed: false\n\t} );\n\n\tthis.linkTypeIndex.addTabPanels( [\n\t\tnew OO.ui.TabPanelLayout( 'internal', {\n\t\t\tlabel: mw.config.get( 'wgSiteName' ),\n\t\t\texpanded: false,\n\t\t\tscrollable: false,\n\t\t\tpadded: true\n\t\t} ),\n\t\tnew OO.ui.TabPanelLayout( 'external', {\n\t\t\tlabel: ve.msg( 'visualeditor-linkinspector-button-link-external' ),\n\t\t\texpanded: false,\n\t\t\tscrollable: false,\n\t\t\tpadded: true\n\t\t} )\n\t] );\n\n\t// Parent method\n\t// Parent requires createAnnotationInput to be callable, but tries to move\n\t// inputs in the DOM, so call this before we restructure the DOM.\n\tve.ui.MWLinkAnnotationInspector.super.prototype.initialize.call( this );\n\n\tthis.internalAnnotationField = this.annotationField;\n\tthis.externalAnnotationField = new OO.ui.FieldLayout(\n\t\tthis.externalAnnotationInput,\n\t\t{\n\t\t\talign: 'top',\n\t\t\tlabel: ve.msg( 'visualeditor-linkinspector-title' )\n\t\t}\n\t);\n\n\tthis.onExternalLinkInputChangeDebounced = ve.debounce( this.onExternalLinkInputChange, 750 );\n\n\t// Events\n\tthis.linkTypeIndex.connect( this, { set: 'onLinkTypeIndexSet' } );\n\tthis.labelInput.connect( this, { change: 'onLabelInputChange' } );\n\tthis.internalAnnotationInput.connect( this, { change: 'onInternalLinkChange' } );\n\tthis.externalAnnotationInput.connect( this, { change: 'onExternalLinkChange' } );\n\tthis.internalAnnotationInput.input.getResults().connect( this, { choose: 'onFormSubmit' } );\n\t// Form submit only auto triggers on enter when there is one input\n\tthis.internalAnnotationInput.getTextInputWidget().connect( this, {\n\t\tchange: 'onInternalLinkInputChange',\n\t\tenter: 'onLinkInputEnter'\n\t} );\n\tthis.externalAnnotationInput.getTextInputWidget().connect( this, {\n\t\tchange: 'onExternalLinkInputChangeDebounced',\n\t\tenter: 'onLinkInputEnter'\n\t} );\n\t// this.internalAnnotationInput is already bound by parent class\n\tthis.externalAnnotationInput.connect( this, { change: 'onAnnotationInputChange' } );\n\n\tthis.internalAnnotationInput.input.results.connect( this, {\n\t\tadd: 'onInternalLinkChangeResultsChange',\n\t\t// Listening to remove causes a flicker, and is not required\n\t\t// as 'add' is always trigger on a change too\n\t\tchoose: 'onInternalLinkSearchResultsChoose'\n\t} );\n\n\t// Initialization\n\t// HACK: IndexLayout is absolutely positioned, so place actions inside it\n\tthis.linkTypeIndex.$content.append( this.$otherActions );\n\tthis.linkTypeIndex.getTabPanel( 'internal' ).$element.append( this.internalAnnotationField.$element );\n\tthis.linkTypeIndex.getTabPanel( 'external' ).$element.append( this.externalAnnotationField.$element );\n\t// labelField gets moved between tabs when activated\n\tif ( OO.ui.isMobile() ) {\n\t\tthis.linkTypeIndex.getTabPanel( 'internal' ).$element.prepend( this.labelField.$element );\n\t}\n\tthis.form.$element.empty().append( this.linkTypeIndex.$element );\n\tif ( !OO.ui.isMobile() ) {\n\t\tthis.externalAnnotationField.setLabel( null );\n\t}\n};\n\n/**\n * @return {ve.ui.MWInternalLinkAnnotationWidget}\n */\nve.ui.MWLinkAnnotationInspector.prototype.createInternalAnnotationInput = function () {\n\treturn new ve.ui.MWInternalLinkAnnotationWidget();\n};\n\n/**\n * @return {ve.ui.MWExternalLinkAnnotationWidget}\n */\nve.ui.MWLinkAnnotationInspector.prototype.createExternalAnnotationInput = function () {\n\treturn new ve.ui.MWExternalLinkAnnotationWidget();\n};\n\n/**\n * Check if the current input mode is for external links\n *\n * @return {boolean} Input mode is for external links\n */\nve.ui.MWLinkAnnotationInspector.prototype.isExternal = function () {\n\treturn this.linkTypeIndex.getCurrentTabPanelName() === 'external';\n};\n\n/**\n * Handle change events on the label input\n *\n * @param {string} value\n */\nve.ui.MWLinkAnnotationInspector.prototype.onLabelInputChange = function () {\n\tif ( this.isActive && !this.trackedLabelInputChange ) {\n\t\tve.track( 'activity.' + this.constructor.static.name, { action: 'label-input' } );\n\t\tthis.trackedLabelInputChange = true;\n\t}\n};\n\n/**\n * Handle change events on the internal link widget\n *\n * @param {ve.dm.MWInternalLinkAnnotation} annotation\n */\nve.ui.MWLinkAnnotationInspector.prototype.onInternalLinkChange = function () {\n\tthis.updateActions();\n};\n\n/**\n * Handle list change events ('add') from the interal link's result widget\n *\n * @param {OO.ui.OptionWidget[]} items Added items\n * @param {number} index Index of insertion point\n */\nve.ui.MWLinkAnnotationInspector.prototype.onInternalLinkChangeResultsChange = function () {\n\tthis.updateSize();\n};\n\n/**\n * Handle choose events from the result widget\n *\n * @param {OO.ui.OptionWidget} item Chosen item\n */\nve.ui.MWLinkAnnotationInspector.prototype.onInternalLinkSearchResultsChoose = function () {\n\tve.track( 'activity.' + this.constructor.static.name, { action: 'search-pages-choose' } );\n};\n\n/**\n * Handle change events on the external link widget\n *\n * @param {ve.dm.MWExternalLinkAnnotation} annotation\n */\nve.ui.MWLinkAnnotationInspector.prototype.onExternalLinkChange = function () {\n\tthis.updateActions();\n};\n\n/**\n * Handle enter events on the external/internal link inputs\n *\n * @param {jQuery.Event} e Key press event\n */\nve.ui.MWLinkAnnotationInspector.prototype.onLinkInputEnter = function () {\n\tif ( this.annotationInput.getTextInputWidget().getValue().trim() === '' ) {\n\t\tthis.executeAction( 'done' );\n\t}\n\tthis.annotationInput.getTextInputWidget().getValidity()\n\t\t.then( () => {\n\t\t\tthis.executeAction( 'done' );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.updateActions = function () {\n\tlet msg = null;\n\n\tve.ui.MWLinkAnnotationInspector.super.prototype.updateActions.call( this );\n\n\t// show/hide convert action\n\tconst content = this.fragment ? this.fragment.getText() : '';\n\tconst annotation = this.annotationInput.getAnnotation();\n\tconst href = annotation && annotation.getHref();\n\tif ( href && ve.dm.MWMagicLinkNode.static.validateHref( content, href ) ) {\n\t\tconst type = ve.dm.MWMagicLinkType.static.fromContent( content ).type;\n\t\tmsg = 'visualeditor-linkinspector-convert-link-' + type.toLowerCase();\n\t}\n\n\t// Once we toggle the visibility of the ActionWidget, we can't filter\n\t// it with `get` any more.  So we have to use `forEach`:\n\tthis.actions.forEach( null, ( action ) => {\n\t\tif ( action.getAction() === 'convert' ) {\n\t\t\tif ( msg ) {\n\t\t\t\t// The following messages are used here:\n\t\t\t\t// * visualeditor-linkinspector-convert-link-isbn\n\t\t\t\t// * visualeditor-linkinspector-convert-link-pmid\n\t\t\t\t// * visualeditor-linkinspector-convert-link-rfc\n\t\t\t\taction.setLabel( OO.ui.deferMsg( msg ) );\n\t\t\t\taction.toggle( true );\n\t\t\t} else {\n\t\t\t\taction.toggle( false );\n\t\t\t}\n\t\t}\n\t} );\n};\n\n/**\n * Handle change events on the internal link widget's input\n *\n * @param {string} value Current value of input widget\n */\nve.ui.MWLinkAnnotationInspector.prototype.onInternalLinkInputChange = function ( value ) {\n\t// If this looks like an external link, switch to the correct tabPanel.\n\t// Note: We don't care here if it's a *valid* link, so we just\n\t// check whether it looks like a URI -- i.e. whether it starts with\n\t// something that appears to be a schema per RFC1630. Later the external\n\t// link inspector will use getExternalLinkUrlProtocolsRegExp for validity\n\t// checking.\n\t// Note 2: RFC1630 might be too broad in practice. You don't really see\n\t// schemas that use the full set of allowed characters, and we might get\n\t// more false positives by checking for them.\n\t// Note 3: We allow protocol-relative URIs here.\n\tif ( this.internalAnnotationInput.getTextInputWidget().getValue() !== value ) {\n\t\treturn;\n\t}\n\tif ( this.isActive && !this.trackedInternalLinkInputChange && !this.switchingLinkTypes ) {\n\t\tve.track( 'activity.' + this.constructor.static.name, { action: 'search-pages-input' } );\n\t\tthis.trackedInternalLinkInputChange = true;\n\t}\n\tif (\n\t\t!this.allowProtocolInInternal &&\n\t\t( /^(?:[a-z][a-z0-9$\\-_@.&!*\"'(),]*:)?\\/\\//i ).test( value.trim() )\n\t) {\n\t\tthis.linkTypeIndex.setTabPanel( 'external' );\n\t\t// Changing tabPanel focuses and selects the input, so collapse the cursor back to the end.\n\t\tthis.externalAnnotationInput.getTextInputWidget().moveCursorToEnd();\n\t}\n\n\tthis.internalAnnotationInput.getTextInputWidget().getValidity()\n\t\t.then(\n\t\t\t() => {\n\t\t\t\tthis.internalAnnotationField.setErrors( [] );\n\t\t\t\tthis.updateSize();\n\t\t\t}, () => {\n\t\t\t\tthis.internalAnnotationField.setErrors( [ ve.msg( 'visualeditor-linkinspector-illegal-title' ) ] );\n\t\t\t\tthis.updateSize();\n\t\t\t}\n\t\t);\n\n};\n\n/**\n * Handle change events on the external link widget's input\n *\n * @param {string} value Current value of input widget\n */\nve.ui.MWLinkAnnotationInspector.prototype.onExternalLinkInputChange = function () {\n\tthis.externalAnnotationInput.getValidity().then(\n\t\t() => {\n\t\t\t// clear any invalid-protocol errors\n\t\t\tthis.externalAnnotationField.setErrors( [] );\n\t\t}, ( errortype ) => {\n\t\t\t// Messages that can be used here:\n\t\t\t// * visualeditor-linkinspector-invalid-blocked\n\t\t\t// * visualeditor-linkinspector-invalid-external\n\t\t\tthis.externalAnnotationField.setErrors( [ ve.msg( 'visualeditor-linkinspector-' + errortype ) ] );\n\t\t\tif ( errortype === 'invalid-blocked' ) {\n\t\t\t\t// This has been quite async, so:\n\t\t\t\tthis.actions.forEach( { actions: [ 'done', 'insert' ] }, ( action ) => {\n\t\t\t\t\taction.setDisabled( true );\n\t\t\t\t} );\n\t\t\t\tve.track( 'activity.editCheckReliability', { action: 'link-blocked' } );\n\t\t\t}\n\t\t}\n\t).always( () => {\n\t\tthis.updateSize();\n\t} );\n\n\tif ( this.isActive && !this.trackedExternalLinkInputChange && !this.switchingLinkTypes ) {\n\t\tve.track( 'activity.' + this.constructor.static.name, { action: 'external-link-input' } );\n\t\tthis.trackedExternalLinkInputChange = true;\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.createAnnotationInput = function () {\n\treturn this.isExternal() ? this.externalAnnotationInput : this.internalAnnotationInput;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWLinkAnnotationInspector.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.isReady = false;\n\n\t\t\tconst isReadOnly = this.isReadOnly();\n\t\t\tthis.linkTypeIndex.setTabPanel(\n\t\t\t\tthis.initialAnnotation instanceof ve.dm.MWExternalLinkAnnotation ? 'external' : 'internal'\n\t\t\t);\n\t\t\tthis.annotationInput.setAnnotation( this.initialAnnotation );\n\t\t\tthis.internalAnnotationInput.setReadOnly( isReadOnly );\n\t\t\tthis.externalAnnotationInput.setReadOnly( isReadOnly );\n\n\t\t\tthis.trackedInternalLinkInputChange = false;\n\t\t\tthis.trackedExternalLinkInputChange = false;\n\t\t\tthis.isActive = true;\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWLinkAnnotationInspector.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.isReady = true;\n\t\t\t// Focus is skipped during setup. (T321026)\n\t\t\tthis.annotationInput.getTextInputWidget().focus();\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getActionProcess = function ( action ) {\n\tif ( action === 'convert' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tthis.close( { action: 'done', convert: true } );\n\t\t} );\n\t}\n\treturn ve.ui.MWLinkAnnotationInspector.super.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getTeardownProcess = function ( data ) {\n\tlet fragment;\n\treturn ve.ui.MWLinkAnnotationInspector.super.prototype.getTeardownProcess.call( this, data )\n\t\t.first( () => {\n\t\t\t// Save the original fragment for later.\n\t\t\tfragment = this.getFragment();\n\n\t\t\tthis.isActive = false;\n\t\t} )\n\t\t.next( () => {\n\t\t\tconst selection = fragment && fragment.getSelection();\n\n\t\t\t// Handle conversion to magic link.\n\t\t\tif ( data && data.convert && selection instanceof ve.dm.LinearSelection ) {\n\t\t\t\tconst annotations = fragment.getDocument().data\n\t\t\t\t\t.getAnnotationsFromRange( selection.getRange() )\n\t\t\t\t\t// Remove link annotations\n\t\t\t\t\t.filter( ( annotation ) => !/^link/.test( annotation.name ) );\n\t\t\t\tconst linearData = new ve.dm.ElementLinearData( annotations.store, [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'link/mwMagic',\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tcontent: fragment.getText()\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: '/link/mwMagic'\n\t\t\t\t\t}\n\t\t\t\t] );\n\t\t\t\tlinearData.setAnnotationsAtOffset( 0, annotations );\n\t\t\t\tfragment.insertContent( linearData.getData(), true );\n\t\t\t}\n\n\t\t\t// Clear dialog state.\n\t\t\tthis.allowProtocolInInternal = false;\n\t\t\t// Make sure both inputs are cleared\n\t\t\tthis.internalAnnotationInput.setAnnotation( null );\n\t\t\tthis.externalAnnotationInput.setAnnotation( null );\n\t\t} );\n};\n\n/**\n * Handle set events from the linkTypeIndex layout\n *\n * @param {OO.ui.TabPanelLayout} tabPanel Current tabPanel\n */\nve.ui.MWLinkAnnotationInspector.prototype.onLinkTypeIndexSet = function ( tabPanel ) {\n\tconst text = this.annotationInput.getTextInputWidget().getValue(),\n\t\tend = text.length,\n\t\tisExternal = this.isExternal(),\n\t\tinputHasProtocol = ve.init.platform.getExternalLinkUrlProtocolsRegExp().test( text );\n\n\tthis.switchingLinkTypes = true;\n\n\tthis.annotationInput = isExternal ? this.externalAnnotationInput : this.internalAnnotationInput;\n\n\tif ( OO.ui.isMobile() ) {\n\t\ttabPanel.$element.prepend( this.labelField.$element );\n\t}\n\n\tthis.updateSize();\n\n\t// If the user manually switches to internal links with an external link in the input, remember this\n\tif ( !isExternal && inputHasProtocol ) {\n\t\tthis.allowProtocolInInternal = true;\n\t}\n\n\tthis.annotationInput.getTextInputWidget().setValue( text );\n\tif ( this.isReady ) {\n\t\t// Focussing an element that isn't visible yet triggers a\n\t\t// bug in jQuery that prevents future focusses. (T321026)\n\t\tthis.annotationInput.getTextInputWidget().focus();\n\t}\n\t// Select entire link when switching, for ease of replacing entire contents.\n\t// Most common case:\n\t// 1. Inspector opened, internal-link shown with the selected-word prefilled\n\t// 2. User clicks external link tab (unnecessary, because we'd auto-switch, but the user doesn't know that)\n\t// 3. User pastes a link, intending to replace the existing prefilled link\n\tthis.annotationInput.getTextInputWidget().$input[ 0 ].setSelectionRange( 0, end );\n\t// Focusing a TextInputWidget normally unsets validity. However, because\n\t// we're kind of pretending this is the same input, just in a different\n\t// mode, it doesn't make sense to the user that the focus behavior occurs.\n\tthis.annotationInput.getTextInputWidget().setValidityFlag();\n\n\tthis.onAnnotationInputChange();\n\n\tif ( this.isActive ) {\n\t\tve.track( 'activity.' + this.constructor.static.name, { action: 'panel-switch' } );\n\t}\n\n\tthis.switchingLinkTypes = false;\n};\n\n/**\n * Gets an annotation object from a fragment.\n *\n * The type of link is automatically detected based on some crude heuristics.\n *\n * @param {ve.dm.SurfaceFragment} fragment Current selection\n * @return {ve.dm.MWInternalLinkAnnotation|ve.dm.MWExternalLinkAnnotation|null}\n */\nve.ui.MWLinkAnnotationInspector.prototype.getAnnotationFromFragment = function ( fragment ) {\n\tconst target = fragment.getText(),\n\t\ttitle = mw.Title.newFromText( target );\n\n\t// Figure out if this is an internal or external link\n\tif ( ve.init.platform.getExternalLinkUrlProtocolsRegExp().test( target ) ) {\n\t\t// External link\n\t\treturn this.newExternalLinkAnnotation( {\n\t\t\ttype: 'link/mwExternal',\n\t\t\tattributes: {\n\t\t\t\thref: target\n\t\t\t}\n\t\t} );\n\t} else if ( title ) {\n\t\t// Internal link\n\t\treturn this.newInternalLinkAnnotationFromTitle( title );\n\t} else {\n\t\t// Doesn't look like an external link and mw.Title considered it an illegal value,\n\t\t// for an internal link.\n\t\treturn null;\n\t}\n};\n\n/**\n * @param {mw.Title} title The title to link to.\n * @return {ve.dm.MWInternalLinkAnnotation} The annotation.\n */\nve.ui.MWLinkAnnotationInspector.prototype.newInternalLinkAnnotationFromTitle = function ( title ) {\n\treturn ve.dm.MWInternalLinkAnnotation.static.newFromTitle( title );\n};\n\n/**\n * @param {Object} element\n * @return {ve.dm.MWExternalLinkAnnotation} The annotation.\n */\nve.ui.MWLinkAnnotationInspector.prototype.newExternalLinkAnnotation = function ( element ) {\n\treturn new ve.dm.MWExternalLinkAnnotation( element );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getInsertionText = function () {\n\t// Prefer user input, not normalized annotation, to preserve case\n\tconst label = this.labelInput.getValue().trim();\n\tif ( label ) {\n\t\treturn label;\n\t} else if ( this.isNew && this.isExternal() ) {\n\t\treturn '';\n\t} else {\n\t\treturn this.annotationInput.getTextInputWidget().getValue();\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getInsertionData = function () {\n\t// If this is a new external link with no label, insert an autonumbered link instead of a link annotation\n\t// (applying the annotation on this later does nothing because of disallowedAnnotationTypes).\n\t// Otherwise call parent method to figure out the text to insert and annotate.\n\tif ( this.isNew && this.isExternal() && !this.labelInput.getValue().trim() ) {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttype: 'link/mwNumberedExternal',\n\t\t\t\tattributes: {\n\t\t\t\t\thref: this.annotationInput.getHref()\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ type: '/link/mwNumberedExternal' }\n\t\t];\n\t} else {\n\t\treturn this.getInsertionText().split( '' );\n\t}\n};\n\n// #getInsertionText call annotationInput#getHref, which returns the link title,\n// so no custmisation is needed.\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWLinkAnnotationInspector );\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":"implicit-arrow-linebreak","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-mw/ui/inspectors/ve.ui.MWLinkNodeInspector.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":"implicit-arrow-linebreak","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-mw/ui/inspectors/ve.ui.MWLiveExtensionInspector.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":"implicit-arrow-linebreak","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-mw/ui/inspectors/ve.ui.MWMagicLinkNodeInspector.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":"implicit-arrow-linebreak","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-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.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":"implicit-arrow-linebreak","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-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":2,"column":1,"nodeType":"Block","endLine":2,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":102,"column":1,"nodeType":"Block","endLine":102,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Specialized layout forked from and similar to {@see OO.ui.BookletLayout}, but to synchronize the\n * sidebar and content pane of the transclusion dialog.\n *\n * Also owns the outline controls.\n *\n * This class has domain knowledge about its contents, for example different\n * behaviors for template vs template parameter elements.\n *\n * @class\n * @extends OO.ui.MenuLayout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @property {Object.<string,OO.ui.PageLayout>} pages\n * @property {string} currentPageName Name of the currently selected transclusion item (top-level\n *  part or template parameter). Typically represented as a blue bar in the sidebar. Special cases\n *  you should be aware of:\n *  - An unchecked parameter exists as an item in the sidebar, but not as a page in the content\n *    pane.\n *  - A parameter placeholder (to add an undocumented parameter) exists as a page in the content\n *    pane, but has no corresponding item in the sidebar.\n */\nve.ui.MWTwoPaneTransclusionDialogLayout = function VeUiMWTwoPaneTransclusionDialogLayout( config ) {\n\t// Parent constructor\n\tve.ui.MWTwoPaneTransclusionDialogLayout.super.call( this, config );\n\n\t// Properties\n\tthis.pages = {};\n\tthis.currentPageName = null;\n\tthis.stackLayout = new ve.ui.MWVerticalLayout();\n\tthis.setContentPanel( this.stackLayout );\n\tthis.sidebar = new ve.ui.MWTransclusionOutlineWidget();\n\tthis.outlinePanel = new OO.ui.PanelLayout( { expanded: this.expanded, scrollable: true } );\n\tthis.setMenuPanel( this.outlinePanel );\n\tthis.outlineControlsWidget = new ve.ui.MWTransclusionOutlineControlsWidget();\n\n\t// Events\n\tthis.sidebar.connect( this, {\n\t\tfilterPagesByName: 'onFilterPagesByName',\n\t\tsidebarItemSelected: 'onSidebarItemSelected'\n\t} );\n\t// Event 'focus' does not bubble, but 'focusin' does\n\tthis.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );\n\n\t// Initialization\n\tthis.$element.addClass( 've-ui-mwTwoPaneTransclusionDialogLayout' );\n\tthis.stackLayout.$element.addClass( 've-ui-mwTwoPaneTransclusionDialogLayout-stackLayout' );\n\tthis.outlinePanel.$element\n\t\t.addClass( 've-ui-mwTwoPaneTransclusionDialogLayout-outlinePanel' )\n\t\t.append(\n\t\t\t$( '<div>' ).addClass( 've-ui-mwTwoPaneTransclusionDialogLayout-sidebar-container' )\n\t\t\t\t.append( this.sidebar.$element ),\n\t\t\tthis.outlineControlsWidget.$element\n\t\t);\n};\n\n/* Setup */\n\nOO.inheritClass( ve.ui.MWTwoPaneTransclusionDialogLayout, OO.ui.MenuLayout );\n\n/* Methods */\n\n/**\n * @private\n * @param {Object.<string,boolean>} visibility\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.onFilterPagesByName = function ( visibility ) {\n\tthis.currentPageName = null;\n\tfor ( const pageName in visibility ) {\n\t\tconst page = this.getPage( pageName );\n\t\tif ( page ) {\n\t\t\tpage.toggle( visibility[ pageName ] );\n\t\t}\n\t}\n};\n\n/**\n * @param {ve.dm.MWTransclusionPartModel|null} removed Removed part\n * @param {ve.dm.MWTransclusionPartModel|null} added Added part\n * @param {number} [newPosition]\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.onReplacePart = function ( removed, added, newPosition ) {\n\tthis.sidebar.onReplacePart( removed, added, newPosition );\n\n\tconst keys = Object.keys( this.pages ),\n\t\tisMultiPart = keys.length > 1,\n\t\tisLastPlaceholder = keys.length === 1 &&\n\t\t\tthis.pages[ keys[ 0 ] ] instanceof ve.ui.MWTemplatePlaceholderPage;\n\n\t// TODO: In other cases this is disabled rather than hidden. See T311303\n\tthis.outlineControlsWidget.removeButton.toggle( !isLastPlaceholder );\n\n\tif ( isMultiPart ) {\n\t\t// Warning, this is intentionally never turned off again\n\t\tthis.outlineControlsWidget.toggle( true );\n\t}\n};\n\n/**\n * @private\n * @param {jQuery.Event} e Focusin event\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.onStackLayoutFocus = function ( e ) {\n\t// Find the page that an element was focused within\n\tconst $target = $( e.target ).closest( '.oo-ui-pageLayout' );\n\tfor ( const name in this.pages ) {\n\t\tif ( this.pages[ name ].$element[ 0 ] === $target[ 0 ] ) {\n\t\t\tthis.setPage( name );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Focus the input field for the current page.\n *\n * If the focus is already in an element on the current page, nothing will happen.\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.focus = function () {\n\tconst page = this.pages[ this.currentPageName ];\n\tif ( !page ) {\n\t\treturn;\n\t}\n\n\t// Only change the focus if it's visible and is not already the current page\n\tif ( page.$element[ 0 ].offsetParent !== null &&\n\t\t!OO.ui.contains( page.$element[ 0 ], this.getElementDocument().activeElement, true )\n\t) {\n\t\tpage.focus();\n\t}\n};\n\n/**\n * @param {string} pageName\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.focusPart = function ( pageName ) {\n\tthis.setPage( pageName );\n\tthis.focus();\n};\n\n/**\n * Parts and parameters can be soft-selected, or selected and focused.\n *\n * @param {string|null} pageName Full, unique name of part or parameter, or null to deselect\n * @param {boolean} [soft] If true, suppress content pane focus.\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.onSidebarItemSelected = function ( pageName, soft ) {\n\tthis.setPage( pageName );\n\n\tconst page = this.pages[ pageName ];\n\tif ( page ) {\n\t\t// Warning, scrolling must be done before focussing. The browser will trigger a conflicting\n\t\t// scroll when the focussed element is out of view.\n\t\tpage.scrollElementIntoView( { alignToTop: true, padding: { top: 20 } } );\n\t}\n\n\t// We assume \"mobile\" means \"touch device with on-screen keyboard\". That should only open when\n\t// tapping the input field, not when navigating in the sidebar.\n\tif ( !soft && !OO.ui.isMobile() ) {\n\t\tthis.focus();\n\t}\n};\n\n/**\n * @param {boolean} show If the sidebar should be shown or not.\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.toggleOutline = function ( show ) {\n\tthis.toggleMenu( show );\n\tif ( show ) {\n\t\t// HACK: Kill dumb scrollbars when the sidebar stops animating, see T161798.\n\t\t// Only necessary when outline controls are present, delay matches transition on\n\t\t// `.oo-ui-menuLayout-menu`.\n\t\tsetTimeout( () => {\n\t\t\tOO.ui.Element.static.reconsiderScrollbars( this.outlinePanel.$element[ 0 ] );\n\t\t}, OO.ui.theme.getDialogTransitionDuration() );\n\t}\n};\n\n/**\n * @return {ve.ui.MWTransclusionOutlineControlsWidget}\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.getOutlineControls = function () {\n\treturn this.outlineControlsWidget;\n};\n\n/**\n * Get the list of pages on the stack ordered by appearance.\n *\n * @return {OO.ui.PageLayout[]}\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.getPagesOrdered = function () {\n\treturn this.stackLayout.getItems();\n};\n\n/**\n * @param {string} name Symbolic name of page\n * @return {OO.ui.PageLayout|undefined} Page, if found\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.getPage = function ( name ) {\n\treturn this.pages[ name ];\n};\n\n/**\n * @return {OO.ui.PageLayout|undefined} Current page, if found\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.getCurrentPage = function () {\n\treturn this.pages[ this.currentPageName ];\n};\n\n/**\n * @return {string|null} A top-level part id like \"part_0\" if that part is selected. When a\n *  parameter is selected null is returned.\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.getSelectedTopLevelPartId = function () {\n\tconst page = this.getCurrentPage(),\n\t\tisParameter = page instanceof ve.ui.MWParameterPage || page instanceof ve.ui.MWAddParameterPage;\n\treturn page && !isParameter ? page.getName() : null;\n};\n\n/**\n * @return {string|null} A top-level part id like \"part_0\" that corresponds to the current\n *  selection, whatever is selected. When a parameter is selected the id of the template the\n *  parameter belongs to is returned.\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.getTopLevelPartIdForSelection = function () {\n\treturn this.currentPageName ? this.currentPageName.split( '/', 1 )[ 0 ] : null;\n};\n\n/**\n * When pages are added with the same names as existing pages, the existing pages will be\n * automatically removed before the new pages are added.\n *\n * @param {OO.ui.PageLayout[]} pages Pages to add\n * @param {number} index Index of the insertion point\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.addPages = function ( pages, index ) {\n\tconst stackLayoutPages = this.stackLayout.getItems();\n\n\t// Remove pages with same names\n\tconst remove = [];\n\tfor ( let i = 0; i < pages.length; i++ ) {\n\t\tconst page = pages[ i ];\n\t\tconst name = page.getName();\n\n\t\tif ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {\n\t\t\t// Correct the insertion index\n\t\t\tconst currentIndex = stackLayoutPages.indexOf( this.pages[ name ] );\n\t\t\tif ( currentIndex !== -1 && currentIndex + 1 < index ) {\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\tremove.push( name );\n\t\t}\n\t}\n\tif ( remove.length ) {\n\t\tthis.removePages( remove );\n\t}\n\n\t// Add new pages\n\tfor ( let i = 0; i < pages.length; i++ ) {\n\t\tconst page = pages[ i ];\n\t\tconst name = page.getName();\n\t\tthis.pages[ name ] = page;\n\t}\n\n\tthis.stackLayout.addItems( pages, index );\n};\n\n/**\n * @param {string[]} pagesNamesToRemove\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.removePages = function ( pagesNamesToRemove ) {\n\tconst pagesToRemove = [],\n\t\tisCurrentParameter = this.pages[ this.currentPageName ] instanceof ve.ui.MWParameterPage;\n\tlet isCurrentPageRemoved = false,\n\t\tprevSelectionCandidate, nextSelectionCandidate;\n\n\tthis.stackLayout.getItems().forEach( ( page ) => {\n\t\tconst pageName = page.getName();\n\n\t\tif ( pagesNamesToRemove.includes( pageName ) ) {\n\t\t\tpagesToRemove.push( page );\n\t\t\tdelete this.pages[ pageName ];\n\t\t\tif ( this.currentPageName === pageName ) {\n\t\t\t\tthis.currentPageName = null;\n\t\t\t\tisCurrentPageRemoved = true;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the selection from a removed top-level part to another, but not to a parameter\n\t\tif ( !pageName.includes( '/' ) ) {\n\t\t\tif ( !isCurrentPageRemoved ) {\n\t\t\t\t// The last part before the removed one\n\t\t\t\tprevSelectionCandidate = pageName;\n\t\t\t} else if ( !nextSelectionCandidate ) {\n\t\t\t\t// The first part after the removed one\n\t\t\t\tnextSelectionCandidate = pageName;\n\t\t\t}\n\t\t}\n\t} );\n\n\tthis.stackLayout.removeItems( pagesToRemove );\n\tif ( isCurrentPageRemoved && !isCurrentParameter ) {\n\t\tthis.setPage( nextSelectionCandidate || prevSelectionCandidate );\n\t}\n};\n\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.clearPages = function () {\n\tthis.pages = {};\n\tthis.currentPageName = null;\n\tthis.sidebar.clear();\n\tthis.stackLayout.clearItems();\n};\n\n/**\n * Set the current page and sidebar selection, by symbolic name. Doesn't focus the input.\n *\n * @param {string} [name] Symbolic name of page. Omit to remove current selection.\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.setPage = function ( name ) {\n\tconst page = this.pages[ name ];\n\n\tif ( page && name === this.currentPageName ) {\n\t\treturn;\n\t}\n\n\tconst previousPage = this.currentPageName ? this.pages[ this.currentPageName ] : null;\n\tthis.currentPageName = name;\n\n\tif ( previousPage ) {\n\t\t// Blur anything focused if the next page doesn't have anything focusable.\n\t\t// This is not needed if the next page has something focusable (because once it is\n\t\t// focused this blur happens automatically).\n\t\tif ( !OO.ui.isMobile() &&\n\t\t\t( !page || OO.ui.findFocusable( page.$element ).length !== 0 )\n\t\t) {\n\t\t\tconst $focused = previousPage.$element.find( ':focus' );\n\t\t\tif ( $focused.length ) {\n\t\t\t\t$focused[ 0 ].blur();\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.sidebar.setSelectionByPageName( name );\n\tthis.refreshControls();\n};\n\n/**\n * @private\n */\nve.ui.MWTwoPaneTransclusionDialogLayout.prototype.refreshControls = function () {\n\tconst partId = this.getSelectedTopLevelPartId(),\n\t\tcanBeDeleted = !!partId;\n\n\tlet canMoveUp, canMoveDown = false;\n\tif ( partId ) {\n\t\tconst pages = this.stackLayout.getItems(),\n\t\t\tpage = this.getPage( partId ),\n\t\t\tindex = pages.indexOf( page );\n\t\tcanMoveUp = index > 0;\n\t\t// Check if there is at least one more top-level part below the current one\n\t\tfor ( let i = index + 1; i < pages.length; i++ ) {\n\t\t\tif ( !( pages[ i ] instanceof ve.ui.MWParameterPage || pages[ i ] instanceof ve.ui.MWAddParameterPage ) ) {\n\t\t\t\tcanMoveDown = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.outlineControlsWidget.setButtonsEnabled( {\n\t\tcanMoveUp: canMoveUp,\n\t\tcanMoveDown: canMoveDown,\n\t\tcanBeDeleted: canBeDeleted\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":"implicit-arrow-linebreak","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-mw/ui/layouts/ve.ui.MWVerticalLayout.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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWAddParameterPage.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":171,"column":1,"nodeType":"Block","endLine":171,"endColumn":1}],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":203,"column":10,"nodeType":"CallExpression","endLine":203,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Placeholder page for a currently unnamed parameter. Represented as an unnamed\n * {@see ve.dm.MWParameterModel} in the corresponding {@see ve.dm.MWTemplateModel}.\n *\n * @class\n * @extends OO.ui.PageLayout\n *\n * @constructor\n * @param {ve.dm.MWParameterModel} parameter Reference to a placeholder parameter with an empty\n *  name, as well as to the template the parameter belongs to\n * @param {string} name Unique symbolic name of page\n * @param {Object} [config] Configuration options\n * @param {jQuery} [config.$overlay] Overlay to render dropdowns in\n */\nve.ui.MWAddParameterPage = function VeUiMWAddParameterPage( parameter, name, config ) {\n\t// Parent constructor\n\tve.ui.MWAddParameterPage.super.call( this, name, ve.extendObject( {\n\t\tscrollable: false\n\t}, config ) );\n\n\tthis.template = parameter.getTemplate();\n\tthis.isExpanded = false;\n\n\t// Header button to expand\n\tthis.addParameterInputHeader = new OO.ui.ButtonWidget( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-transclusion-add-undocumented-param' ),\n\t\ticon: 'add',\n\t\tframed: false,\n\t\tinline: true,\n\t\tclasses: [ 've-ui-mwTransclusionDialog-addParameterFieldset-header' ]\n\t} )\n\t\t.connect( this, { click: 'togglePlaceholder' } );\n\n\tthis.addParameterFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: this.addParameterInputHeader.$element,\n\t\tclasses: [ 've-ui-mwTransclusionDialog-addParameterFieldset' ]\n\t} );\n\n\t// Init visibility\n\tthis.togglePlaceholder( false );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 've-ui-mwAddParameterPage' )\n\t\t.append( this.addParameterFieldset.$element );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWAddParameterPage, OO.ui.PageLayout );\n\n/* Events */\n\n/**\n * @event ve.ui.MWAddParameterPage#templateParameterAdded\n * @param {string} id Page ID\n */\n\n/* Methods */\n\n/**\n * @private\n */\nve.ui.MWAddParameterPage.prototype.initialize = function () {\n\tthis.template\n\t\t.connect( this, {\n\t\t\t// There is a \"change\" event, but it triggers way to often even for content changes\n\t\t\tadd: 'onTemplateParametersChanged',\n\t\t\tremove: 'onTemplateParametersChanged'\n\t\t} );\n\n\tthis.paramInputField = new OO.ui.TextInputWidget( {\n\t\tplaceholder: ve.msg( 'visualeditor-dialog-transclusion-add-param-placeholder' )\n\t} )\n\t\t.connect( this, {\n\t\t\tchange: 'updateParameterNameValidation',\n\t\t\tenter: 'onParameterNameSubmitted'\n\t\t} );\n\tthis.saveButton = new OO.ui.ButtonWidget( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-transclusion-add-param-save' ),\n\t\tflags: [ 'progressive' ],\n\t\tdisabled: true\n\t} )\n\t\t.connect( this, { click: 'onParameterNameSubmitted' } );\n\n\tthis.actionFieldLayout = new OO.ui.ActionFieldLayout(\n\t\tthis.paramInputField,\n\t\tthis.saveButton,\n\t\t{\n\t\t\tclasses: [ 've-ui-mwTransclusionDialog-addParameterFieldset-input' ],\n\t\t\talign: 'top'\n\t\t}\n\t);\n\n\tconst link = this.template.getTitle() || this.template.getTarget().wt;\n\tconst $helpText = mw.message(\n\t\t'visualeditor-dialog-transclusion-add-param-help',\n\t\tlink\n\t).parseDom();\n\tve.init.platform.linkCache.styleElement( link, $helpText.filter( 'a:not(.external)' ) );\n\n\t// Copied from {@see OO.ui.FieldsetLayout} because there is no method to do this later\n\tconst helpWidget = new OO.ui.LabelWidget( {\n\t\tlabel: $helpText,\n\t\tclasses: [ 'oo-ui-inline-help' ]\n\t} );\n\n\tve.targetLinksToNewWindow( helpWidget.$element[ 0 ] );\n\n\tthis.addParameterFieldset.$element.append(\n\t\thelpWidget.$element,\n\t\tthis.addParameterFieldset.$group,\n\t\tthis.actionFieldLayout.$element\n\t);\n};\n\n/**\n * @inheritDoc OO.ui.PanelLayout\n */\nve.ui.MWAddParameterPage.prototype.focus = function () {\n\tthis.togglePlaceholder( true );\n};\n\n/**\n * @private\n */\nve.ui.MWAddParameterPage.prototype.onTemplateParametersChanged = function () {\n\tthis.updateParameterNameValidation( this.paramInputField.getValue() );\n};\n\n/**\n * @private\n * @param {string} value\n */\nve.ui.MWAddParameterPage.prototype.updateParameterNameValidation = function ( value ) {\n\tconst paramName = value.trim(),\n\t\terrors = this.getValidationErrors( paramName );\n\n\tthis.actionFieldLayout.setErrors( errors );\n\tthis.saveButton.setDisabled( !paramName || errors.length );\n};\n\n/**\n * @private\n * @fires ve.ui.MWAddParameterPage#templateParameterAdded\n */\nve.ui.MWAddParameterPage.prototype.onParameterNameSubmitted = function () {\n\tconst name = this.paramInputField.getValue().trim();\n\tif ( !name || this.saveButton.isDisabled() ) {\n\t\treturn;\n\t}\n\n\tthis.paramInputField.setValue( '' );\n\n\tif ( this.template.hasParameter( name ) ) {\n\t\treturn;\n\t}\n\n\tconst param = new ve.dm.MWParameterModel( this.template, name );\n\tthis.template.addParameter( param );\n\tthis.emit( 'templateParameterAdded', param.getId() );\n\n\tve.track( 'activity.transclusion', {\n\t\taction: 'add-unknown-parameter'\n\t} );\n};\n\n/**\n * @private\n * @param {string} name Parameter name or alias\n * @return {jQuery[]} An array as accepted by {@see OO.ui.FieldLayout.setErrors}\n */\nve.ui.MWAddParameterPage.prototype.getValidationErrors = function ( name ) {\n\tif ( !name ) {\n\t\treturn [];\n\t}\n\n\tconst forbiddenCharacter = name.match( /[={|}]/ );\n\tif ( forbiddenCharacter ) {\n\t\treturn [ mw.message( 'visualeditor-dialog-transclusion-add-param-error-forbidden-char',\n\t\t\tforbiddenCharacter[ 0 ] ).parseDom() ];\n\t}\n\n\tconst spec = this.template.getSpec();\n\n\tlet key;\n\tif ( spec.getParameterAliases( name ).includes( name ) ) {\n\t\tkey = 'visualeditor-dialog-transclusion-add-param-error-alias';\n\t} else if ( this.template.hasParameter( name ) ) {\n\t\tkey = 'visualeditor-dialog-transclusion-add-param-error-exists-selected';\n\t} else if ( spec.isParameterDeprecated( name ) ) {\n\t\tkey = 'visualeditor-dialog-transclusion-add-param-error-deprecated';\n\t} else if ( spec.isKnownParameterOrAlias( name ) ) {\n\t\tkey = 'visualeditor-dialog-transclusion-add-param-error-exists-unselected';\n\t}\n\n\tif ( !key ) {\n\t\treturn [];\n\t}\n\n\tconst label = spec.getParameterLabel( this.template.getOriginalParameterName( name ) ),\n\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\t$msg = mw.message( key, name, label ).parseDom();\n\tve.targetLinksToNewWindow( $( '<div>' ).append( $msg )[ 0 ] );\n\treturn [ $msg ];\n};\n\n/**\n * @private\n * @param {boolean} [expand]\n */\nve.ui.MWAddParameterPage.prototype.togglePlaceholder = function ( expand ) {\n\tthis.isExpanded = expand === undefined ? !this.isExpanded : !!expand;\n\n\tthis.addParameterInputHeader.setIcon( this.isExpanded ? 'subtract' : 'add' );\n\tthis.addParameterFieldset.$element.toggleClass(\n\t\t've-ui-mwTransclusionDialog-addParameterFieldset-collapsed',\n\t\t!this.isExpanded\n\t);\n\tif ( this.isExpanded ) {\n\t\tif ( !this.paramInputField ) {\n\t\t\tthis.initialize();\n\t\t}\n\t\tthis.paramInputField.focus();\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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWAdvancedSettingsPage.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":194,"column":1,"nodeType":"Block","endLine":194,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":84,"column":79,"nodeType":"CallExpression","endLine":84,"endColumn":94,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWAdvancedSettingsPage class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki meta dialog advanced settings page.\n *\n * @class\n * @extends OO.ui.PageLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of page\n * @param {Object} [config] Configuration options\n * @param {jQuery} [config.$overlay] Overlay to render dropdowns in\n */\nve.ui.MWAdvancedSettingsPage = function VeUiMWAdvancedSettingsPage( name, config ) {\n\t// Parent constructor\n\tve.ui.MWAdvancedSettingsPage.super.apply( this, arguments );\n\n\t// Properties\n\tthis.fragment = null;\n\tthis.indexingOptionTouched = false;\n\tthis.newSectionEditLinkOptionTouched = false;\n\n\tthis.advancedSettingsFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-meta-advancedsettings-label' ),\n\t\ticon: 'settings'\n\t} );\n\n\t// Initialization\n\n\t// Indexing items\n\tthis.indexing = new OO.ui.FieldLayout(\n\t\tnew OO.ui.ButtonSelectWidget()\n\t\t\t.addItems( [\n\t\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\t\tdata: 'mw:PageProp/index',\n\t\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-index-force' )\n\t\t\t\t} ),\n\t\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\t\tdata: 'default',\n\t\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-index-default' )\n\t\t\t\t} ),\n\t\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\t\tdata: 'mw:PageProp/noindex',\n\t\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-index-disable' )\n\t\t\t\t} )\n\t\t\t] )\n\t\t\t.connect( this, { select: 'onIndexingOptionChange' } ),\n\t\t{\n\t\t\t$overlay: config.$overlay,\n\t\t\talign: 'top',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-index-label' ),\n\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-index-help' )\n\t\t}\n\t);\n\n\t// New edit section link items\n\tthis.newEditSectionLink = new OO.ui.FieldLayout(\n\t\tnew OO.ui.ButtonSelectWidget()\n\t\t\t.addItems( [\n\t\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\t\tdata: 'mw:PageProp/newsectionlink',\n\t\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-newsectioneditlink-force' )\n\t\t\t\t} ),\n\t\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\t\tdata: 'default',\n\t\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-newsectioneditlink-default' )\n\t\t\t\t} ),\n\t\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\t\tdata: 'mw:PageProp/nonewsectionlink',\n\t\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-newsectioneditlink-disable' )\n\t\t\t\t} )\n\t\t\t] )\n\t\t\t.connect( this, { select: 'onNewSectionEditLinkOptionChange' } ),\n\t\t{\n\t\t\t$overlay: config.$overlay,\n\t\t\talign: 'top',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-newsectioneditlink-label' ),\n\t\t\t// eslint-disable-next-line no-jquery/no-global-selector\n\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-newsectioneditlink-help', $( '#ca-edit' ).text() )\n\t\t}\n\t);\n\n\tthis.displayTitleTouched = false;\n\tthis.displayTitleInput = new OO.ui.TextInputWidget();\n\tthis.displayTitleInput.connect( this, { change: 'onDisplayTitleInputChange' } );\n\tthis.displayTitleField = new OO.ui.FieldLayout(\n\t\tthis.displayTitleInput,\n\t\t{\n\t\t\t$overlay: config.$overlay,\n\t\t\talign: 'top',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-displaytitle' ),\n\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-displaytitle-help' )\n\t\t}\n\t);\n\n\tthis.advancedSettingsFieldset.addItems( [ this.indexing, this.newEditSectionLink, this.displayTitleField ] );\n\n\tthis.metaItemCheckboxes = [];\n\tif ( mw.config.get( 'wgVariantArticlePath' ) ) {\n\t\tthis.metaItemCheckboxes.push(\n\t\t\t{\n\t\t\t\tmetaName: 'mwNoContentConvert',\n\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-nocontentconvert-label' ),\n\t\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-nocontentconvert-help' )\n\t\t\t},\n\t\t\t{\n\t\t\t\tmetaName: 'mwNoTitleConvert',\n\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-notitleconvert-label' ),\n\t\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-notitleconvert-help' )\n\t\t\t}\n\t\t);\n\t}\n\n\tthis.metaItemCheckboxes.forEach( ( metaItemCheckbox ) => {\n\t\tmetaItemCheckbox.fieldLayout = new OO.ui.FieldLayout(\n\t\t\tnew OO.ui.CheckboxInputWidget(),\n\t\t\t{\n\t\t\t\t$overlay: config.$overlay,\n\t\t\t\talign: 'inline',\n\t\t\t\tlabel: metaItemCheckbox.label,\n\t\t\t\thelp: metaItemCheckbox.help\n\t\t\t}\n\t\t);\n\t\tthis.advancedSettingsFieldset.addItems( [ metaItemCheckbox.fieldLayout ] );\n\t} );\n\n\tthis.$element.append( this.advancedSettingsFieldset.$element );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWAdvancedSettingsPage, OO.ui.PageLayout );\n\n/* Methods */\n\n/**\n * Handle display title input change events.\n *\n * @param {string} value Current value of input widget\n */\nve.ui.MWAdvancedSettingsPage.prototype.onDisplayTitleInputChange = function () {\n\tthis.displayTitleTouched = true;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWAdvancedSettingsPage.prototype.setupOutlineItem = function () {\n\tthis.outlineItem\n\t\t.setIcon( 'settings' )\n\t\t.setLabel( ve.msg( 'visualeditor-dialog-meta-advancedsettings-section' ) );\n};\n\n/* Indexing option methods */\n\n/**\n * Handle indexing option state change events.\n */\nve.ui.MWAdvancedSettingsPage.prototype.onIndexingOptionChange = function () {\n\tthis.indexingOptionTouched = true;\n};\n\n/**\n * Get the first meta item of a given name\n *\n * @param {string} name Name of the meta item\n * @return {Object|null} Meta item, if any\n */\nve.ui.MWAdvancedSettingsPage.prototype.getMetaItem = function ( name ) {\n\treturn this.fragment.getDocument().getMetaList().getItemsInGroup( name )[ 0 ] || null;\n};\n\n/* New edit section link option methods */\n\n/**\n * Handle new edit section link change events.\n */\nve.ui.MWAdvancedSettingsPage.prototype.onNewSectionEditLinkOptionChange = function () {\n\tthis.newSectionEditLinkOptionTouched = true;\n};\n\n/**\n * Setup settings page.\n *\n * @param {ve.dm.SurfaceFragment} fragment Surface fragment\n * @param {Object} config\n * @param {Object} [config.data] Dialog setup data\n * @param {boolean} [config.isReadOnly=false] Dialog is in read-only mode\n * @return {jQuery.Promise}\n */\nve.ui.MWAdvancedSettingsPage.prototype.setup = function ( fragment, config ) {\n\tthis.fragment = fragment;\n\n\t// Indexing items\n\tconst indexingField = this.indexing.getField();\n\tconst indexingOption = this.getMetaItem( 'mwIndex' );\n\tconst indexingType = indexingOption && indexingOption.getAttribute( 'property' ) || 'default';\n\tindexingField\n\t\t.selectItemByData( indexingType )\n\t\t.setDisabled( config.isReadOnly );\n\tthis.indexingOptionTouched = false;\n\n\t// New section edit link items\n\tconst newSectionEditField = this.newEditSectionLink.getField();\n\tconst newSectionEditLinkOption = this.getMetaItem( 'mwNewSectionEdit' );\n\tconst newSectionEditLinkType = newSectionEditLinkOption && newSectionEditLinkOption.getAttribute( 'property' ) || 'default';\n\tnewSectionEditField\n\t\t.selectItemByData( newSectionEditLinkType )\n\t\t.setDisabled( config.isReadOnly );\n\tthis.newSectionEditLinkOptionTouched = false;\n\n\t// Display title items\n\tconst displayTitleItem = this.getMetaItem( 'mwDisplayTitle' );\n\tlet displayTitle = displayTitleItem && displayTitleItem.getAttribute( 'content' ) || '';\n\tif ( !displayTitle ) {\n\t\tdisplayTitle = mw.Title.newFromText( ve.init.target.getPageName() ).getPrefixedText();\n\t}\n\tthis.displayTitleInput\n\t\t.setValue( displayTitle )\n\t\t.setReadOnly( config.isReadOnly );\n\tthis.displayTitleTouched = false;\n\n\t// Simple checkbox items\n\tthis.metaItemCheckboxes.forEach( ( metaItemCheckbox ) => {\n\t\tconst isSelected = !!this.getMetaItem( metaItemCheckbox.metaName );\n\t\tmetaItemCheckbox.fieldLayout.getField()\n\t\t\t.setSelected( isSelected )\n\t\t\t.setDisabled( config.isReadOnly );\n\t} );\n\n\treturn ve.createDeferred().resolve().promise();\n};\n\n/**\n * Tear down settings page.\n *\n * @param {Object} [data] Dialog tear down data\n */\nve.ui.MWAdvancedSettingsPage.prototype.teardown = function ( data = {} ) {\n\tif ( data.action !== 'done' ) {\n\t\treturn;\n\t}\n\n\t// Indexing items\n\tconst currentIndexingItem = this.getMetaItem( 'mwIndex' );\n\tconst newIndexingData = this.indexing.getField().findSelectedItem();\n\n\t// Alter the indexing option flag iff it's been touched & is actually different\n\tif ( this.indexingOptionTouched ) {\n\t\tif ( newIndexingData.data === 'default' ) {\n\t\t\tif ( currentIndexingItem ) {\n\t\t\t\tthis.fragment.removeMeta( currentIndexingItem );\n\t\t\t}\n\t\t} else {\n\t\t\tconst newIndexingItem = { type: 'mwIndex', attributes: { property: newIndexingData.data } };\n\n\t\t\tif ( !currentIndexingItem ) {\n\t\t\t\tthis.fragment.insertMeta( newIndexingItem );\n\t\t\t} else if ( currentIndexingItem.getAttribute( 'property' ) !== newIndexingData.data ) {\n\t\t\t\tthis.fragment.replaceMeta(\n\t\t\t\t\tcurrentIndexingItem,\n\t\t\t\t\tve.extendObject( true, {}, currentIndexingItem.getElement(), newIndexingItem )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// New section edit link items\n\tconst currentNewSectionEditLinkItem = this.getMetaItem( 'mwNewSectionEdit' );\n\tconst newNewSectionEditLinkData = this.newEditSectionLink.getField().findSelectedItem();\n\n\t// Alter the new section edit option flag iff it's been touched & is actually different\n\tif ( this.newSectionEditLinkOptionTouched ) {\n\t\tif ( newNewSectionEditLinkData.data === 'default' ) {\n\t\t\tif ( currentNewSectionEditLinkItem ) {\n\t\t\t\tthis.fragment.removeMeta( currentNewSectionEditLinkItem );\n\t\t\t}\n\t\t} else {\n\t\t\tconst newNewSectionEditLinkItem = { type: 'mwNewSectionEdit', attributes: { property: newNewSectionEditLinkData.data } };\n\n\t\t\tif ( !currentNewSectionEditLinkItem ) {\n\t\t\t\tthis.fragment.insertMeta( newNewSectionEditLinkItem );\n\t\t\t} else if ( currentNewSectionEditLinkItem.getAttribute( 'property' ) !== newNewSectionEditLinkData.data ) {\n\t\t\t\tthis.fragment.replaceMeta(\n\t\t\t\t\tcurrentNewSectionEditLinkItem,\n\t\t\t\t\tve.extendObject( true, {}, currentNewSectionEditLinkItem.getElement(), newNewSectionEditLinkItem )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Display title items\n\tconst currentDisplayTitleItem = this.getMetaItem( 'mwDisplayTitle' );\n\tlet newDisplayTitle = this.displayTitleInput.getValue();\n\tif ( newDisplayTitle === mw.Title.newFromText( ve.init.target.getPageName() ).getPrefixedText() ) {\n\t\tnewDisplayTitle = '';\n\t}\n\tconst newDisplayTitleItem = { type: 'mwDisplayTitle', attributes: { content: newDisplayTitle } };\n\n\t// Alter the display title flag iff it's been touched & is actually different\n\tif ( this.displayTitleTouched ) {\n\t\tif ( currentDisplayTitleItem ) {\n\t\t\tif ( newDisplayTitle ) {\n\t\t\t\tif ( currentDisplayTitleItem.getAttribute( 'content' ) !== newDisplayTitle ) {\n\t\t\t\t\t// There was a display title and is a new one, but they differ, so replace\n\t\t\t\t\tthis.fragment.replaceMeta(\n\t\t\t\t\t\tcurrentDisplayTitleItem,\n\t\t\t\t\t\tve.extendObject( true, {},\n\t\t\t\t\t\t\tcurrentDisplayTitleItem.getElement(),\n\t\t\t\t\t\t\tnewDisplayTitleItem\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// There was a display title and is no new one, so remove\n\t\t\t\tthis.fragment.removeMeta( currentDisplayTitleItem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( newDisplayTitle ) {\n\t\t\t\t// There's no existing display title but there is a new one, so create\n\t\t\t\t// HACK: Putting this at position 0 so that it works – T63862\n\t\t\t\tthis.fragment.insertMeta( newDisplayTitleItem, 0 );\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.metaItemCheckboxes.forEach( ( metaItemCheckbox ) => {\n\t\tconst currentItem = this.getMetaItem( metaItemCheckbox.metaName ),\n\t\t\tisSelected = metaItemCheckbox.fieldLayout.getField().isSelected();\n\n\t\tif ( currentItem && !isSelected ) {\n\t\t\tthis.fragment.removeMeta( currentItem );\n\t\t} else if ( !currentItem && isSelected ) {\n\t\t\tthis.fragment.insertMeta( { type: metaItemCheckbox.metaName } );\n\t\t}\n\t} );\n\n\tthis.fragment = null;\n};\n\nve.ui.MWAdvancedSettingsPage.prototype.getFieldsets = function () {\n\treturn [\n\t\tthis.advancedSettingsFieldset\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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWCategoriesPage.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":227,"column":1,"nodeType":"Block","endLine":227,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWCategoriesPage class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki meta dialog categories page.\n *\n * @class\n * @extends OO.ui.PageLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of page\n * @param {Object} [config] Configuration options\n * @param {jQuery} [config.$overlay] Overlay to render dropdowns in\n */\nve.ui.MWCategoriesPage = function VeUiMWCategoriesPage( name, config = {} ) {\n\t// Parent constructor\n\tve.ui.MWCategoriesPage.super.apply( this, arguments );\n\n\t// Properties\n\tthis.fragment = null;\n\tthis.defaultSortKeyTouched = false;\n\tthis.fallbackDefaultSortKey = mw.Title.newFromText( ve.init.target.getPageName() ).getMainText();\n\tthis.categoriesFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-meta-categories-data-label' ),\n\t\ticon: 'tag'\n\t} );\n\n\tthis.categoryOptionsFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-meta-categories-options' ),\n\t\ticon: 'settings'\n\t} );\n\n\tthis.categoryWidget = new ve.ui.MWCategoryWidget( {\n\t\t$overlay: config.$overlay\n\t} );\n\n\tthis.addCategory = new OO.ui.FieldLayout(\n\t\tthis.categoryWidget,\n\t\t{\n\t\t\t$overlay: config.$overlay,\n\t\t\talign: 'top',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-categories-addcategory-label' )\n\t\t}\n\t);\n\n\tthis.defaultSortInput = new OO.ui.TextInputWidget( {\n\t\tplaceholder: this.fallbackDefaultSortKey\n\t} );\n\n\tthis.defaultSortInput.$element.addClass( 've-ui-mwCategoriesPage-defaultsort' );\n\n\tthis.defaultSort = new OO.ui.FieldLayout(\n\t\tthis.defaultSortInput,\n\t\t{\n\t\t\t$overlay: config.$overlay,\n\t\t\talign: 'top',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-categories-defaultsort-label' ),\n\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-categories-defaultsort-help' )\n\t\t}\n\t);\n\n\t// Events\n\tthis.categoryWidget.connect( this, {\n\t\tnewCategory: 'onNewCategory',\n\t\tupdateSortkey: 'onUpdateSortKey'\n\t} );\n\tthis.defaultSortInput.connect( this, {\n\t\tchange: 'onDefaultSortChange'\n\t} );\n\n\t// Initialization\n\tthis.categoriesFieldset.addItems( [ this.addCategory ] );\n\tthis.categoryOptionsFieldset.addItems( [ this.defaultSort ] );\n\tthis.$element.append( this.categoriesFieldset.$element, this.categoryOptionsFieldset.$element );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWCategoriesPage, OO.ui.PageLayout );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWCategoriesPage.prototype.setupOutlineItem = function () {\n\tthis.outlineItem\n\t\t.setIcon( 'tag' )\n\t\t.setLabel( ve.msg( 'visualeditor-dialog-meta-categories-section' ) );\n};\n\n/**\n * Handle category default sort change events.\n *\n * @param {string} value Default sort value\n */\nve.ui.MWCategoriesPage.prototype.onDefaultSortChange = function ( value ) {\n\tthis.categoryWidget.setDefaultSortKey( value === '' ? this.fallbackDefaultSortKey : value );\n\tthis.defaultSortKeyTouched = true;\n};\n\n/**\n * Inserts new category into meta list\n *\n * @param {Object} item\n * @param {ve.dm.MWCategoryMetaItem} [beforeMetaItem] Meta item to insert before,\n *  or undefined to go at the end\n */\nve.ui.MWCategoriesPage.prototype.onNewCategory = function ( item, beforeMetaItem ) {\n\tthis.fragment.insertMeta(\n\t\tthis.getCategoryItemForInsertion( item ),\n\t\tbeforeMetaItem ? beforeMetaItem.getOffset() : undefined\n\t);\n};\n\n/**\n * Removes and re-inserts updated category widget item\n *\n * @param {Object} item\n */\nve.ui.MWCategoriesPage.prototype.onUpdateSortKey = function ( item ) {\n\t// Replace meta item with updated one\n\tthis.fragment.replaceMeta( item.metaItem, this.getCategoryItemForInsertion( item, item.metaItem.getElement() ) );\n};\n\n/**\n * Bound to MetaList insert event for adding meta dialog components.\n *\n * @param {ve.dm.MetaItem} metaItem\n */\nve.ui.MWCategoriesPage.prototype.onMetaListInsert = function ( metaItem ) {\n\t// Responsible for adding UI components\n\tif ( metaItem.element.type === 'mwCategory' ) {\n\t\tconst index = this.fragment.getDocument().getMetaList().getItemsInGroup( 'mwCategory' ).indexOf( metaItem );\n\t\tthis.categoryWidget.addItems(\n\t\t\t[ this.getCategoryItemFromMetaListItem( metaItem ) ],\n\t\t\tindex\n\t\t);\n\t}\n};\n\n/**\n * Bound to MetaList insert event for removing meta dialog components.\n *\n * @param {ve.dm.MetaItem} metaItem\n */\nve.ui.MWCategoriesPage.prototype.onMetaListRemove = function ( metaItem ) {\n\tif ( metaItem.element.type === 'mwCategory' ) {\n\t\tconst item = this.categoryWidget.categories[ this.getCategoryItemFromMetaListItem( metaItem ).value ];\n\t\tthis.categoryWidget.removeItems( [ item ] );\n\t}\n};\n\n/**\n * Get default sort key item.\n *\n * @return {Object} Default sort key item\n */\nve.ui.MWCategoriesPage.prototype.getDefaultSortKeyItem = function () {\n\treturn this.fragment.getDocument().getMetaList().getItemsInGroup( 'mwDefaultSort' )[ 0 ] || null;\n};\n\n/**\n * Get array of category items from meta list\n *\n * @return {Object[]} items\n */\nve.ui.MWCategoriesPage.prototype.getCategoryItems = function () {\n\tconst items = [],\n\t\tcategories = this.fragment.getDocument().getMetaList().getItemsInGroup( 'mwCategory' );\n\n\t// Loop through MwCategories and build out items\n\tfor ( let i = 0; i < categories.length; i++ ) {\n\t\titems.push( this.getCategoryItemFromMetaListItem( categories[ i ] ) );\n\t}\n\treturn items;\n};\n\n/**\n * Gets category item from meta list item\n *\n * @param {ve.dm.MWCategoryMetaItem} metaItem\n * @return {Object} item\n */\nve.ui.MWCategoriesPage.prototype.getCategoryItemFromMetaListItem = function ( metaItem ) {\n\tconst title = mw.Title.newFromText( metaItem.element.attributes.category ),\n\t\tvalue = title ? title.getMainText() : '';\n\n\treturn {\n\t\tname: metaItem.element.attributes.category,\n\t\tvalue: value,\n\t\t// TODO: sortkey is lcase, make consistent throughout CategoryWidget\n\t\tsortKey: metaItem.element.attributes.sortkey,\n\t\tmetaItem: metaItem\n\t};\n};\n\n/**\n * Get metaList like object to insert from item\n *\n * @param {Object} item category widget item\n * @param {Object} [oldData] Metadata object that was previously associated with this item, if any\n * @return {Object} metaBase\n */\nve.ui.MWCategoriesPage.prototype.getCategoryItemForInsertion = function ( item, oldData ) {\n\tconst newData = {\n\t\tattributes: { category: item.name, sortkey: item.sortKey || '' },\n\t\ttype: 'mwCategory'\n\t};\n\tif ( oldData ) {\n\t\treturn ve.extendObject( {}, oldData, newData );\n\t}\n\treturn newData;\n};\n\n/**\n * Setup categories page.\n *\n * @param {ve.dm.SurfaceFragment} fragment Surface fragment\n * @param {Object} [config]\n * @param {Object} [config.data] Dialog setup data\n * @param {boolean} [config.isReadOnly=false] Dialog is in read-only mode\n * @return {jQuery.Promise}\n */\nve.ui.MWCategoriesPage.prototype.setup = function ( fragment, config = {} ) {\n\tthis.fragment = fragment;\n\tthis.fragment.getDocument().getMetaList().connect( this, {\n\t\tinsert: 'onMetaListInsert',\n\t\tremove: 'onMetaListRemove'\n\t} );\n\n\tconst defaultSortKeyItem = this.getDefaultSortKeyItem();\n\n\tthis.categoryWidget.setFragment( fragment );\n\tconst promise = this.categoryWidget.addItems( this.getCategoryItems() ).then( () => {\n\t\tthis.categoryWidget.setDisabled( config.isReadOnly );\n\t} );\n\n\tthis.defaultSortInput.setValue(\n\t\tdefaultSortKeyItem ? defaultSortKeyItem.getAttribute( 'sortkey' ) : this.fallbackDefaultSortKey\n\t).setReadOnly( config.isReadOnly );\n\tthis.defaultSortKeyTouched = false;\n\n\t// Update input position after transition\n\tsetTimeout( () => {\n\t\tthis.categoryWidget.fitInput();\n\t}, OO.ui.theme.getDialogTransitionDuration() );\n\n\treturn promise;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWCategoriesPage.prototype.focus = function () {\n\tthis.categoryWidget.focus();\n};\n\n/**\n * Tear down the page. This is called when the MWMetaDialog is torn down.\n *\n * @param {Object} [data] Dialog tear down data\n */\nve.ui.MWCategoriesPage.prototype.teardown = function ( data ) {\n\tconst currentDefaultSortKeyItem = this.getDefaultSortKeyItem(),\n\t\tnewDefaultSortKey = this.defaultSortInput.getValue();\n\n\tif ( data && data.action === 'done' ) {\n\t\t// Alter the default sort key iff it's been touched & is actually different\n\t\tif ( this.defaultSortKeyTouched ) {\n\t\t\tif ( newDefaultSortKey === '' || newDefaultSortKey === this.fallbackDefaultSortKey ) {\n\t\t\t\tif ( currentDefaultSortKeyItem ) {\n\t\t\t\t\tthis.fragment.removeMeta( currentDefaultSortKeyItem );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst newDefaultSortKeyData = {\n\t\t\t\t\ttype: 'mwDefaultSort',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tsortkey: newDefaultSortKey\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif ( !currentDefaultSortKeyItem ) {\n\t\t\t\t\tconst firstCategory = this.fragment.getDocument().getMetaList().getItemsInGroup( 'mwCategory' )[ 0 ],\n\t\t\t\t\t\toffset = firstCategory && firstCategory.getOffset();\n\t\t\t\t\tthis.fragment.insertMeta( newDefaultSortKeyData, offset );\n\t\t\t\t} else if ( currentDefaultSortKeyItem.getAttribute( 'sortkey' ) !== newDefaultSortKey ) {\n\t\t\t\t\tthis.fragment.replaceMeta(\n\t\t\t\t\t\tcurrentDefaultSortKeyItem,\n\t\t\t\t\t\tve.extendObject( true, {},\n\t\t\t\t\t\t\tcurrentDefaultSortKeyItem.getElement(),\n\t\t\t\t\t\t\tnewDefaultSortKeyData\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.categoryWidget.clearItems();\n\tthis.categoryWidget.setFragment( null );\n\tthis.fragment.getDocument().getMetaList().disconnect( this );\n\tthis.fragment = null;\n};\n\nve.ui.MWCategoriesPage.prototype.getFieldsets = function () {\n\treturn [\n\t\tthis.categoriesFieldset,\n\t\tthis.categoryOptionsFieldset\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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWLanguagesPage.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":124,"column":1,"nodeType":"Block","endLine":124,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWLanguagesPage class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki meta dialog Languages page.\n *\n * @class\n * @extends OO.ui.PageLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of page\n * @param {Object} [config] Configuration options\n * @param {jQuery} [config.$overlay] Overlay to render dropdowns in\n */\nve.ui.MWLanguagesPage = function VeUiMWLanguagesPage() {\n\t// Parent constructor\n\tve.ui.MWLanguagesPage.super.apply( this, arguments );\n\n\t// Properties\n\tthis.languagesFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-meta-languages-label' ),\n\t\ticon: 'textLanguage'\n\t} );\n\n\t// Initialization\n\tthis.languagesFieldset.$element.append(\n\t\t$( '<span>' )\n\t\t\t.text( ve.msg( 'visualeditor-dialog-meta-languages-readonlynote' ) )\n\t);\n\tthis.$element.append( this.languagesFieldset.$element );\n\n\tthis.getAllLanguageItems().then( this.onLoadLanguageData.bind( this ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWLanguagesPage, OO.ui.PageLayout );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWLanguagesPage.prototype.setupOutlineItem = function () {\n\tthis.outlineItem\n\t\t.setIcon( 'textLanguage' )\n\t\t.setLabel( ve.msg( 'visualeditor-dialog-meta-languages-section' ) );\n};\n\nve.ui.MWLanguagesPage.prototype.onLoadLanguageData = function ( languages ) {\n\tconst $languagesTable = $( '<table>' ),\n\t\tlanguageslength = languages.length;\n\n\t$languagesTable\n\t\t.addClass( 've-ui-mwLanguagesPage-languages-table' )\n\t\t.append( $( '<tr>' )\n\t\t\t.append(\n\t\t\t\t$( '<th>' )\n\t\t\t\t\t.text( ve.msg( 'visualeditor-dialog-meta-languages-code-label' ) )\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$( '<th>' )\n\t\t\t\t\t.text( ve.msg( 'visualeditor-dialog-meta-languages-name-label' ) )\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$( '<th>' )\n\t\t\t\t\t.text( ve.msg( 'visualeditor-dialog-meta-languages-link-label' ) )\n\t\t\t)\n\t\t);\n\n\tfor ( let i = 0; i < languageslength; i++ ) {\n\t\tlanguages[ i ].safelang = languages[ i ].lang;\n\t\tlanguages[ i ].dir = 'auto';\n\t\tif ( $.uls ) {\n\t\t\t// site codes don't always represent official language codes\n\t\t\t// using real language code instead of a dummy ('redirect' in ULS' terminology)\n\t\t\tlanguages[ i ].safelang = $.uls.data.isRedirect( languages[ i ].lang ) || languages[ i ].lang;\n\t\t\tlanguages[ i ].dir = ve.init.platform.getLanguageDirection( languages[ i ].safelang );\n\t\t}\n\t\t$languagesTable.append(\n\t\t\t$( '<tr>' ).append(\n\t\t\t\t$( '<td>' ).text( languages[ i ].lang ),\n\t\t\t\t$( '<td>' ).text( languages[ i ].langname ).add( $( '<td>' ).text( languages[ i ].title ) )\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\tlang: languages[ i ].safelang,\n\t\t\t\t\t\tdir: languages[ i ].dir\n\t\t\t\t\t} )\n\t\t\t)\n\t\t);\n\t}\n\n\tthis.languagesFieldset.$element.append( $languagesTable );\n};\n\n/**\n * Handle language items being loaded.\n *\n * @param {Object} response API response\n * @return {Array}\n */\nve.ui.MWLanguagesPage.prototype.onAllLanguageItemsSuccess = function ( response ) {\n\tconst languages = [],\n\t\tlanglinks = OO.getProp( response, 'query', 'pages', 0, 'langlinks' );\n\tif ( langlinks ) {\n\t\tfor ( let i = 0, iLen = langlinks.length; i < iLen; i++ ) {\n\t\t\tlanguages.push( {\n\t\t\t\tlang: langlinks[ i ].lang,\n\t\t\t\tlangname: langlinks[ i ].autonym,\n\t\t\t\ttitle: langlinks[ i ].title,\n\t\t\t\tmetaItem: null\n\t\t\t} );\n\t\t}\n\t}\n\treturn languages;\n};\n\n/**\n * Get array of language items from meta list\n *\n * @return {jQuery.Promise}\n */\nve.ui.MWLanguagesPage.prototype.getAllLanguageItems = function () {\n\t// TODO: Detect paging token if results exceed limit\n\treturn ve.init.target.getContentApi().get( {\n\t\taction: 'query',\n\t\tprop: 'langlinks',\n\t\tllprop: 'autonym',\n\t\tlllimit: 500,\n\t\ttitles: ve.init.target.getPageName()\n\t} ).then(\n\t\tthis.onAllLanguageItemsSuccess.bind( this ),\n\t\tthis.onAllLanguageItemsError.bind( this )\n\t);\n};\n\n/**\n * Handle language items failing to be loaded.\n *\n * TODO: This error function should probably not be empty.\n */\nve.ui.MWLanguagesPage.prototype.onAllLanguageItemsError = function () {};\n\nve.ui.MWLanguagesPage.prototype.getFieldsets = function () {\n\treturn [\n\t\tthis.languagesFieldset\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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWParameterPage.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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWSettingsPage.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":282,"column":1,"nodeType":"Block","endLine":282,"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":140,"column":4,"nodeType":"ObjectExpression","endLine":146,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWSettingsPage class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki meta dialog settings page.\n *\n * @class\n * @extends OO.ui.PageLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of page\n * @param {Object} [config] Configuration options\n * @param {jQuery} [config.$overlay] Overlay to render dropdowns in\n */\nve.ui.MWSettingsPage = function VeUiMWSettingsPage( name, config ) {\n\t// Parent constructor\n\tve.ui.MWSettingsPage.super.apply( this, arguments );\n\n\t// Properties\n\tthis.fragment = null;\n\tthis.tocOptionTouched = false;\n\tthis.redirectOptionsTouched = false;\n\tthis.tableOfContentsTouched = false;\n\tthis.label = ve.msg( 'visualeditor-dialog-meta-settings-section' );\n\n\tthis.settingsFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-label' ),\n\t\ticon: 'pageSettings'\n\t} );\n\n\t// Initialization\n\n\t// Table of Contents items\n\tthis.tableOfContents = new OO.ui.FieldLayout(\n\t\tnew OO.ui.ButtonSelectWidget( {\n\t\t\tclasses: [ 've-test-page-settings-table-of-contents' ]\n\t\t} )\n\t\t\t.addItems( [\n\t\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\t\tdata: 'mw:PageProp/forcetoc',\n\t\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-toc-force' )\n\t\t\t\t} ),\n\t\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\t\tdata: 'default',\n\t\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-toc-default' )\n\t\t\t\t} ),\n\t\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\t\tdata: 'mw:PageProp/notoc',\n\t\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-toc-disable' )\n\t\t\t\t} )\n\t\t\t] )\n\t\t\t.connect( this, { select: 'onTableOfContentsFieldChange' } ),\n\t\t{\n\t\t\t$overlay: config.$overlay,\n\t\t\talign: 'top',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-toc-label' ),\n\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-toc-help' )\n\t\t}\n\t);\n\n\t// Redirect items\n\tthis.enableRedirectInput = new OO.ui.CheckboxInputWidget();\n\tthis.enableRedirectField = new OO.ui.FieldLayout(\n\t\tthis.enableRedirectInput,\n\t\t{\n\t\t\t$overlay: config.$overlay,\n\t\t\tclasses: [ 've-test-page-settings-enable-redirect' ],\n\t\t\talign: 'inline',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-redirect-label' ),\n\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-redirect-help' )\n\t\t}\n\t);\n\tthis.redirectTargetInput = new mw.widgets.TitleInputWidget( {\n\t\tplaceholder: ve.msg( 'visualeditor-dialog-meta-settings-redirect-placeholder' ),\n\t\t$overlay: config.$overlay,\n\t\tapi: ve.init.target.getContentApi()\n\t} );\n\tthis.redirectTargetInput.$input.attr( 'aria-label', ve.msg( 'visualeditor-dialog-meta-settings-redirect-placeholder' ) );\n\n\tthis.redirectTargetField = new OO.ui.FieldLayout(\n\t\tthis.redirectTargetInput,\n\t\t{ align: 'top' }\n\t);\n\tthis.enableStaticRedirectInput = new OO.ui.CheckboxInputWidget();\n\tthis.enableStaticRedirectField = new OO.ui.FieldLayout(\n\t\tthis.enableStaticRedirectInput,\n\t\t{\n\t\t\t$overlay: config.$overlay,\n\t\t\tclasses: [ 've-test-page-settings-prevent-redirect' ],\n\t\t\talign: 'inline',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-redirect-staticlabel' ),\n\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-redirect-statichelp' )\n\t\t}\n\t);\n\tthis.enableRedirectInput.connect( this, { change: 'onEnableRedirectChange' } );\n\tthis.redirectTargetInput.connect( this, { change: 'onRedirectTargetChange' } );\n\tthis.enableStaticRedirectInput.connect( this, { change: 'onEnableStaticRedirectChange' } );\n\n\tthis.metaItemCheckboxes = [\n\t\t{\n\t\t\tmetaName: 'mwNoEditSection',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-noeditsection-label' ),\n\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-noeditsection-help' ),\n\t\t\tclasses: [ 've-test-page-settings-noeditsection' ]\n\t\t},\n\t\t...ve.ui.MWSettingsPage.static.extraMetaCheckboxes\n\t];\n\n\tif ( mw.config.get( 'wgNamespaceNumber' ) === mw.config.get( 'wgNamespaceIds' ).category ) {\n\t\tthis.metaItemCheckboxes.push(\n\t\t\t{\n\t\t\t\tmetaName: 'mwHiddenCategory',\n\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-hiddencat-label' ),\n\t\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-hiddencat-help' )\n\t\t\t},\n\t\t\t{\n\t\t\t\tmetaName: 'mwNoGallery',\n\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-meta-settings-nogallery-label' ),\n\t\t\t\thelp: ve.msg( 'visualeditor-dialog-meta-settings-nogallery-help' )\n\t\t\t}\n\t\t);\n\t}\n\n\tthis.settingsFieldset.addItems( [\n\t\tthis.enableRedirectField,\n\t\tthis.redirectTargetField,\n\t\tthis.enableStaticRedirectField,\n\t\tthis.tableOfContents\n\t] );\n\n\tthis.metaItemCheckboxes.forEach( ( metaItemCheckbox ) => {\n\t\tmetaItemCheckbox.fieldLayout = new OO.ui.FieldLayout(\n\t\t\tnew OO.ui.CheckboxInputWidget(),\n\t\t\t// See above for classes\n\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\t{\n\t\t\t\t$overlay: config.$overlay,\n\t\t\t\tclasses: metaItemCheckbox.classes,\n\t\t\t\talign: 'inline',\n\t\t\t\tlabel: metaItemCheckbox.label,\n\t\t\t\thelp: metaItemCheckbox.help || ''\n\t\t\t}\n\t\t);\n\t\tthis.settingsFieldset.addItems( [ metaItemCheckbox.fieldLayout ] );\n\t} );\n\n\tthis.$element.append( this.settingsFieldset.$element );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWSettingsPage, OO.ui.PageLayout );\n\n/* Allow extra meta item checkboxes to be added by extensions etc. */\nve.ui.MWSettingsPage.static.extraMetaCheckboxes = [];\n\n/**\n * Add a checkbox to the list of changeable page settings\n *\n * @param {string} metaName The name of the DM meta item\n * @param {string} label The label to show next to the checkbox\n */\nve.ui.MWSettingsPage.static.addMetaCheckbox = function ( metaName, label ) {\n\tthis.extraMetaCheckboxes.push( { metaName: metaName, label: label } );\n};\n\n/* Methods */\n\n/* Table of Contents methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWSettingsPage.prototype.setupOutlineItem = function () {\n\tthis.outlineItem\n\t\t.setIcon( 'pageSettings' )\n\t\t.setLabel( ve.msg( 'visualeditor-dialog-meta-settings-section' ) );\n};\n\n/**\n * Handle Table Of Contents display change events.\n */\nve.ui.MWSettingsPage.prototype.onTableOfContentsFieldChange = function () {\n\tthis.tableOfContentsTouched = true;\n};\n\n/* Redirect methods */\n\n/**\n * Handle redirect state change events.\n *\n * @param {boolean} value Whether a redirect is to be set for this page\n */\nve.ui.MWSettingsPage.prototype.onEnableRedirectChange = function ( value ) {\n\tthis.redirectTargetInput.setDisabled( !value );\n\tthis.enableStaticRedirectInput.setDisabled( !value );\n\tif ( value ) {\n\t\t/*\n\t\t * HACK: When editing a page which has a redirect, the meta dialog\n\t\t * automatically opens with the settings page's redirect field focused.\n\t\t * When this happens, we don't want the lookup dropdown to appear until\n\t\t * the user actually does something.\n\t\t * Using setTimeout because we need to defer this until after the\n\t\t * dialog has opened - otherwise its internal lookupDisabled logic will\n\t\t * fail to have any effect during the actual focusing and calling of\n\t\t * OO.ui.LookupElement#onLookupInputFocus/OO.ui.LookupElement#populateLookupMenu.\n\t\t * https://phabricator.wikimedia.org/T137309\n\t\t */\n\t\tsetTimeout( () => {\n\t\t\tthis.redirectTargetInput.focus();\n\t\t} );\n\t} else {\n\t\tthis.redirectTargetInput.setValue( '' );\n\t\tthis.enableStaticRedirectInput.setSelected( false );\n\t}\n\tthis.redirectOptionsTouched = true;\n};\n\n/**\n * @return {boolean} Whether redirect link is valid.\n */\nve.ui.MWSettingsPage.prototype.checkValidRedirect = function () {\n\tif ( this.enableRedirectInput.isSelected() ) {\n\t\tconst title = this.redirectTargetInput.getValue();\n\n\t\tif ( !mw.Title.newFromText( title ) ) {\n\t\t\t/*\n\t\t\t * TODO more precise error message. Modify the Title.newFromText method in Title.js\n\t\t\t * my idea is to in the parse method instead of a boolean return a string with an error message (not an error code since the error string can have parameters),\n\t\t\t * then in Title.newFromText instead of returning null, return the error string. Use that string there in setErrors.\n\t\t\t * Problem: some methods might depend on it returning null.\n\t\t\t * Solution: either make it a new method (Title.newFromTextThrow), or add a an optional parameter to return the error message.\n\t\t\t */\n\t\t\tthis.redirectTargetField.setErrors( [ mw.msg( 'visualeditor-title-error' ) ] );\n\t\t\treturn false;\n\n\t\t} else {\n\t\t\tthis.redirectTargetField.setErrors( [] );\n\t\t}\n\t} else {\n\t\tthis.redirectTargetField.setErrors( [] );\n\t}\n\n\treturn true;\n};\n\n/**\n * Handle redirect target change events.\n */\nve.ui.MWSettingsPage.prototype.onRedirectTargetChange = function () {\n\tthis.redirectOptionsTouched = true;\n};\n\n/**\n * Handle static redirect state change events.\n */\nve.ui.MWSettingsPage.prototype.onEnableStaticRedirectChange = function () {\n\tthis.redirectOptionsTouched = true;\n};\n\n/**\n * Get the first meta item of a given name\n *\n * @param {string} name Name of the meta item\n * @return {Object|null} Meta item, if any\n */\nve.ui.MWSettingsPage.prototype.getMetaItem = function ( name ) {\n\treturn this.fragment.getDocument().getMetaList().getItemsInGroup( name )[ 0 ] || null;\n};\n\n/**\n * Setup settings page.\n *\n * @param {ve.dm.SurfaceFragment} fragment Surface fragment\n * @param {Object} config\n * @param {Object} [config.data] Dialog setup data\n * @param {boolean} [config.isReadOnly=false] Dialog is in read-only mode\n * @return {jQuery.Promise}\n */\nve.ui.MWSettingsPage.prototype.setup = function ( fragment, config ) {\n\tthis.fragment = fragment;\n\n\t// Table of Contents items\n\tconst tableOfContentsField = this.tableOfContents.getField();\n\tconst tableOfContentsMetaItem = this.getMetaItem( 'mwTOC' );\n\tconst tableOfContentsMode = tableOfContentsMetaItem && tableOfContentsMetaItem.getAttribute( 'property' ) || 'default';\n\ttableOfContentsField\n\t\t.selectItemByData( tableOfContentsMode )\n\t\t.setDisabled( config.isReadOnly );\n\tthis.tableOfContentsTouched = false;\n\n\t// Redirect items (disabled states set by change event)\n\tconst redirectTargetItem = this.getMetaItem( 'mwRedirect' );\n\tconst redirectTarget = redirectTargetItem && redirectTargetItem.getAttribute( 'title' ) || '';\n\tconst redirectStatic = this.getMetaItem( 'mwStaticRedirect' );\n\tthis.enableRedirectInput\n\t\t.setSelected( !!redirectTargetItem )\n\t\t.setDisabled( config.isReadOnly );\n\tthis.redirectTargetInput\n\t\t.setValue( redirectTarget )\n\t\t.setDisabled( !redirectTargetItem )\n\t\t.setReadOnly( config.isReadOnly );\n\tthis.enableStaticRedirectInput\n\t\t.setSelected( !!redirectStatic )\n\t\t.setDisabled( !redirectTargetItem || config.isReadOnly );\n\tthis.redirectOptionsTouched = false;\n\n\t// Simple checkbox items\n\tthis.metaItemCheckboxes.forEach( ( metaItemCheckbox ) => {\n\t\tconst isSelected = !!this.getMetaItem( metaItemCheckbox.metaName );\n\t\tmetaItemCheckbox.fieldLayout.getField()\n\t\t\t.setSelected( isSelected )\n\t\t\t.setDisabled( config.isReadOnly );\n\t} );\n\n\treturn ve.createDeferred().resolve().promise();\n};\n\n/**\n * Tear down settings page.\n *\n * @param {Object} [data] Dialog tear down data\n */\nve.ui.MWSettingsPage.prototype.teardown = function ( data = {} ) {\n\tif ( data.action !== 'done' ) {\n\t\treturn;\n\t}\n\n\t// Table of Contents items\n\tconst currentTableOfContents = this.getMetaItem( 'mwTOC' );\n\tconst newTableOfContentsData = this.tableOfContents.getField().findSelectedItem();\n\n\t// Redirect items\n\tconst currentRedirectTargetItem = this.getMetaItem( 'mwRedirect' );\n\tconst newRedirectData = this.redirectTargetInput.getValue();\n\tconst newRedirectItemData = { type: 'mwRedirect', attributes: { title: newRedirectData } };\n\n\tconst currentStaticRedirectItem = this.getMetaItem( 'mwStaticRedirect' );\n\tconst newStaticRedirectState = this.enableStaticRedirectInput.isSelected();\n\n\t// Alter the TOC option flag iff it's been touched & is actually different\n\tif ( this.tableOfContentsTouched ) {\n\t\tif ( newTableOfContentsData.data === 'default' ) {\n\t\t\tif ( currentTableOfContents ) {\n\t\t\t\tthis.fragment.removeMeta( currentTableOfContents );\n\t\t\t}\n\t\t} else {\n\t\t\tconst newTableOfContentsItem = { type: 'mwTOC', attributes: { property: newTableOfContentsData.data } };\n\n\t\t\tif ( !currentTableOfContents ) {\n\t\t\t\tthis.fragment.insertMeta( newTableOfContentsItem );\n\t\t\t} else if ( currentTableOfContents.getAttribute( 'property' ) !== newTableOfContentsData.data ) {\n\t\t\t\tthis.fragment.replaceMeta(\n\t\t\t\t\tcurrentTableOfContents,\n\t\t\t\t\tve.extendObject( true, {}, currentTableOfContents.getElement(), newTableOfContentsItem )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Alter the redirect options iff they've been touched & are different\n\tif ( this.redirectOptionsTouched ) {\n\t\tif ( currentRedirectTargetItem ) {\n\t\t\tif ( newRedirectData ) {\n\t\t\t\tif ( currentRedirectTargetItem.getAttribute( 'title' ) !== newRedirectData ) {\n\t\t\t\t\t// There was a redirect and is a new one, but they differ, so replace\n\t\t\t\t\tthis.fragment.replaceMeta(\n\t\t\t\t\t\tcurrentRedirectTargetItem,\n\t\t\t\t\t\tve.extendObject( true, {},\n\t\t\t\t\t\t\tcurrentRedirectTargetItem.getElement(),\n\t\t\t\t\t\t\tnewRedirectItemData\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// There was a redirect and is no new one, so remove\n\t\t\t\tthis.fragment.removeMeta( currentRedirectTargetItem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( newRedirectData ) {\n\t\t\t\t// There's no existing redirect but there is a new one, so create\n\t\t\t\t// HACK: Putting this at position 0 so that it works – T63862\n\t\t\t\tthis.fragment.insertMeta( newRedirectItemData, 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( currentStaticRedirectItem && ( !newStaticRedirectState || !newRedirectData ) ) {\n\t\t\tthis.fragment.removeMeta( currentStaticRedirectItem );\n\t\t}\n\t\tif ( !currentStaticRedirectItem && newStaticRedirectState && newRedirectData ) {\n\t\t\tthis.fragment.insertMeta( { type: 'mwStaticRedirect' } );\n\t\t}\n\t}\n\n\tthis.metaItemCheckboxes.forEach( ( metaItemCheckbox ) => {\n\t\tconst currentItem = this.getMetaItem( metaItemCheckbox.metaName ),\n\t\t\tisSelected = metaItemCheckbox.fieldLayout.getField().isSelected();\n\n\t\tif ( currentItem && !isSelected ) {\n\t\t\tthis.fragment.removeMeta( currentItem );\n\t\t} else if ( !currentItem && isSelected ) {\n\t\t\tthis.fragment.insertMeta( { type: metaItemCheckbox.metaName } );\n\t\t}\n\t} );\n\n\tthis.fragment = null;\n};\n\nve.ui.MWSettingsPage.prototype.getFieldsets = function () {\n\treturn [\n\t\tthis.settingsFieldset\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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWTemplatePage.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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWTemplatePlaceholderPage.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'template_names' is not in camel case.","line":142,"column":3,"nodeType":"Identifier","messageId":"notCamelCase","endLine":142,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_edit_count_bucket' is not in camel case.","line":147,"column":9,"nodeType":"Identifier","messageId":"notCamelCase","endLine":147,"endColumn":31,"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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWTemplatesUsedPage.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":50,"column":3,"nodeType":"CallExpression","endLine":50,"endColumn":60,"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":"implicit-arrow-linebreak","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-mw/ui/pages/ve.ui.MWTransclusionContentPage.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":"implicit-arrow-linebreak","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-mw/ui/styles/apex/ve.ui.Icons.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":"implicit-arrow-linebreak","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/ve-mw/ui/styles/apex/ve.ui.Indicators.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":"implicit-arrow-linebreak","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/ve-mw/ui/styles/wikimediaui/ve.ui.Icons.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":"implicit-arrow-linebreak","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/ve-mw/ui/styles/wikimediaui/ve.ui.Indicators.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":"implicit-arrow-linebreak","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/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js","messages":[],"suppressedMessages":[{"ruleId":"local/no-unsanitized-href","severity":2,"message":"Don't set 'href' without sanitizing; use ve.setAttributeSafe.","line":73,"column":15,"nodeType":"CallExpression","messageId":"noHref","endLine":77,"endColumn":46,"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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWBackTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWEditModeTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWFormatTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWGalleryDialogTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWLinkInspectorTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWMediaDialogTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWMetaDialogTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWMobileLinkInspectorTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWPopupTool.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":58,"column":1,"nodeType":"Block","endLine":58,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":127,"column":20,"nodeType":"CallExpression","endLine":129,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki UserInterface popup tool classes.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki UserInterface popup tool.\n *\n * @class\n * @abstract\n * @extends OO.ui.PopupTool\n * @constructor\n * @param {string} title\n * @param {OO.ui.ToolGroup} toolGroup\n * @param {Object} [config]\n * @param {number} [config.width] Popup width. Upstream default is 320.\n */\nve.ui.MWPopupTool = function VeUiMWPopupTool( title, toolGroup, config ) {\n\t// Configuration initialization\n\tconfig = ve.extendObject( { popup: { head: true, label: title, width: config && config.width } }, config );\n\n\t// Parent constructor\n\tve.ui.MWPopupTool.super.call( this, toolGroup, config );\n\n\tthis.popup.connect( this, {\n\t\tready: 'onPopupOpened',\n\t\tclosing: 'onPopupClosing'\n\t} );\n\n\tthis.$element.addClass( 've-ui-mwPopupTool' );\n\n\tthis.$link.on( 'click', this.onToolLinkClick.bind( this ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWPopupTool, OO.ui.PopupTool );\n\n/**\n * Handle to call when popup is opened.\n */\nve.ui.MWPopupTool.prototype.onPopupOpened = function () {\n\tthis.popup.closeButton.focus();\n};\n\n/**\n * Handle to call when popup is closing\n */\nve.ui.MWPopupTool.prototype.onPopupClosing = function () {\n\tthis.$link.trigger( 'focus' );\n};\n\n/**\n * Handle clicks on the main tool button.\n *\n * @param {jQuery.Event} e Click event\n */\nve.ui.MWPopupTool.prototype.onToolLinkClick = function () {\n\tif ( this.popup.isVisible() ) {\n\t\t// Popup will be visible if this just opened, thanks to sequencing.\n\t\t// Can't just track this with toggle, because the notices popup is auto-opened and we\n\t\t// want to know about deliberate interactions.\n\t\tve.track( 'activity.' + this.constructor.static.name + 'Popup', { action: 'show' } );\n\t}\n};\n\n/**\n * MediaWiki UserInterface notices popup tool.\n *\n * @class\n * @extends ve.ui.MWPopupTool\n * @constructor\n * @param {OO.ui.ToolGroup} toolGroup\n * @param {Object} [config]\n */\nve.ui.MWNoticesPopupTool = function VeUiMWNoticesPopupTool( toolGroup, config ) {\n\t// Parent constructor\n\tve.ui.MWNoticesPopupTool.super.call(\n\t\tthis,\n\t\tve.msg( 'visualeditor-editnotices-tooltip' ),\n\t\ttoolGroup,\n\t\tve.extendObject( config, { width: 380 } )\n\t);\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWNoticesPopupTool, ve.ui.MWPopupTool );\n\n/* Static Properties */\n\nve.ui.MWNoticesPopupTool.static.name = 'notices';\nve.ui.MWNoticesPopupTool.static.group = 'notices';\nve.ui.MWNoticesPopupTool.static.icon = 'alert';\nve.ui.MWNoticesPopupTool.static.title = OO.ui.deferMsg( 'visualeditor-editnotices-tooltip' );\nve.ui.MWNoticesPopupTool.static.autoAddToCatchall = false;\n\n/* Methods */\n\n/**\n * Set notices to display\n *\n * @param {string[]} notices A (non-empty) list of notices\n */\nve.ui.MWNoticesPopupTool.prototype.setNotices = function ( notices ) {\n\tconst count = notices.length;\n\n\tconst noticeMsg = ve.msg(\n\t\t'visualeditor-editnotices-tool',\n\t\tmw.language.convertNumber( count )\n\t);\n\n\tthis.popup.setLabel( noticeMsg );\n\tthis.setTitle( noticeMsg );\n\n\tif ( this.$items ) {\n\t\tthis.$items.remove();\n\t}\n\n\tthis.$items = $( '<div>' ).addClass( 've-ui-mwNoticesPopupTool-items' );\n\tthis.noticeItems = [];\n\n\tnotices.forEach( ( item ) => {\n\t\t// eslint-disable-next-line no-jquery/no-html\n\t\tconst $element = $( '<div>' )\n\t\t\t.addClass( 've-ui-mwNoticesPopupTool-item' )\n\t\t\t.html( typeof item === 'string' ? item : item.message );\n\t\tve.targetLinksToNewWindow( $element[ 0 ] );\n\n\t\tthis.noticeItems.push( {\n\t\t\t$element: $element,\n\t\t\ttype: item.type\n\t\t} );\n\n\t\tthis.$items.append( $element );\n\t} );\n\n\tthis.popup.$body.append( this.$items );\n\t// Fire content hook\n\tmw.hook( 'wikipage.content' ).fire( this.popup.$body );\n\n\tve.track( 'activity.notices', { action: 'show' } );\n};\n\n/* Registration */\n\nve.ui.toolFactory.register( ve.ui.MWNoticesPopupTool );\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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWSaveTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWSignatureTool.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":"implicit-arrow-linebreak","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-mw/ui/tools/ve.ui.MWTransclusionDialogTool.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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWAriaDescribe.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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWCommandRegistry.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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWExtensionWindow.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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWSequenceRegistry.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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWSurface.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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWWikitextCommandRegistry.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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWWikitextDataTransferHandlerFactory.js","messages":[{"ruleId":"es-x/no-iterator-prototype-every","severity":2,"message":"ES2025 'Iterator.prototype.every' method is forbidden.","line":56,"column":73,"nodeType":"MemberExpression","messageId":"forbidden","endLine":56,"endColumn":88}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MWWikitextDataTransferHandlerFactory class.\n *\n * @copyright See AUTHORS.txt\n */\n\n/**\n * Drop handler Factory.\n *\n * @class\n * @extends ve.ui.DataTransferHandlerFactory\n * @constructor\n */\nve.ui.MWWikitextDataTransferHandlerFactory = function VeUiMwWikitextDataTransferHandlerFactory() {\n\t// Parent constructor\n\tve.ui.MWWikitextDataTransferHandlerFactory.super.apply( this, arguments );\n\n\tfor ( const name in ve.ui.dataTransferHandlerFactory.registry ) {\n\t\tthis.register( ve.ui.dataTransferHandlerFactory.registry[ name ] );\n\t}\n\n\tve.ui.dataTransferHandlerFactory.on( 'register', ( n, data ) => {\n\t\tthis.register( data );\n\t} );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWWikitextDataTransferHandlerFactory, ve.ui.DataTransferHandlerFactory );\n\n/* Methods */\n\n/**\n * Create an object based on a name.\n *\n * Name is used to look up the constructor to use, while all additional arguments are passed to the\n * constructor directly, so leaving one out will pass an undefined to the constructor.\n *\n * See https://doc.wikimedia.org/oojs/master/OO.Factory.html\n *\n * @param {string} name Object name\n * @param {...any} [args] Arguments to pass to the constructor\n * @return {Object} The new object\n * @throws {Error} Unknown object name\n */\nve.ui.MWWikitextDataTransferHandlerFactory.prototype.create = function () {\n\t// Parent method\n\tconst handler = ve.ui.MWWikitextDataTransferHandlerFactory.super.prototype.create.apply( this, arguments ),\n\t\tresolve = handler.resolve.bind( handler );\n\n\tfunction isPlain( data ) {\n\t\treturn typeof data === 'string' || ve.dm.LinearData.static.getType( data ) === 'paragraph';\n\t}\n\n\thandler.resolve = function ( dataOrDoc ) {\n\t\tif ( typeof dataOrDoc === 'string' || ( Array.isArray( dataOrDoc ) && dataOrDoc.every( isPlain ) ) ) {\n\t\t\tresolve( dataOrDoc );\n\t\t} else {\n\t\t\tconst doc = dataOrDoc instanceof ve.dm.Document ?\n\t\t\t\tdataOrDoc :\n\t\t\t\t// The handler may have also written items to the store\n\t\t\t\tnew ve.dm.Document( new ve.dm.ElementLinearData( handler.surface.getModel().getDocument().getStore(), dataOrDoc ) );\n\n\t\t\t// Optimization: we can skip a server hit if this is a plain link,\n\t\t\t// with no title, whose href is equal to the contained text. This\n\t\t\t// avoids a stutter in the common case of pasting a link into the\n\t\t\t// document.\n\t\t\tconst annotations = doc.data.getAnnotationsFromRange( new ve.Range( 0, doc.data.getLength() ) );\n\t\t\tif ( annotations.getLength() === 1 ) {\n\t\t\t\tconst text = doc.data.getText();\n\t\t\t\tif ( annotations.get( 0 ).getAttribute( 'href' ) === text ) {\n\t\t\t\t\treturn resolve( text );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tve.init.target.getWikitextFragment( doc, false )\n\t\t\t\t.then( resolve, () => {\n\t\t\t\t\thandler.abort();\n\t\t\t\t} );\n\t\t}\n\t};\n\n\treturn handler;\n};\n\n/* Initialization */\n\nve.ui.wikitextDataTransferHandlerFactory = new ve.ui.MWWikitextDataTransferHandlerFactory();\n\nve.ui.wikitextDataTransferHandlerFactory.unregister( ve.ui.MWWikitextStringTransferHandler );\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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWWikitextSequenceRegistry.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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWWikitextSurface.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":32,"column":18,"nodeType":"CallExpression","endLine":32,"endColumn":36,"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":"implicit-arrow-linebreak","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-mw/ui/ve.ui.MWWikitextTransferRegistry.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWAceEditorWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWCategoryInputWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWCategoryItemWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWCategoryPopupWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":31,"column":22,"nodeType":"NewExpression","messageId":"noLabel","endLine":35,"endColumn":5},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":101,"column":1,"nodeType":"Block","endLine":101,"endColumn":1}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWCategoryPopupWidget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Creates an ve.ui.MWCategoryPopupWidget object.\n *\n * @class\n * @extends OO.ui.PopupWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWCategoryPopupWidget = function VeUiMWCategoryPopupWidget( config ) {\n\t// Configuration initialization\n\tconfig = ve.extendObject( { autoClose: true }, config );\n\n\t// Parent constructor\n\tve.ui.MWCategoryPopupWidget.super.call( this, config );\n\n\t// Properties\n\tthis.category = null;\n\tthis.origSortkey = null;\n\tthis.removed = false;\n\tthis.$title = $( '<label>' );\n\tthis.$menu = $( '<div>' );\n\tthis.fallbackSortKey = ve.init.target.getPageName();\n\tthis.removeButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'trash',\n\t\ttitle: ve.msg( 'visualeditor-inspector-remove-tooltip' )\n\t} );\n\tthis.sortKeyInput = new OO.ui.TextInputWidget();\n\tthis.sortKeyField = new OO.ui.FieldLayout( this.sortKeyInput, {\n\t\talign: 'top',\n\t\tlabel: ve.msg( 'visualeditor-dialog-meta-categories-sortkey-label' )\n\t} );\n\tthis.$sortKeyForm = $( '<form>' ).addClass( 've-ui-mwCategoryPopupWidget-sortKeyForm' )\n\t\t.append( this.sortKeyField.$element );\n\n\t// Events\n\tthis.connect( this, { toggle: 'onToggle' } );\n\tthis.removeButton.connect( this, { click: 'onRemoveCategory' } );\n\tthis.$sortKeyForm.on( 'submit', this.onSortKeySubmit.bind( this ) );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 've-ui-mwCategoryPopupWidget' );\n\tthis.toggle( false );\n\tthis.$title\n\t\t.addClass( 've-ui-mwCategoryPopupWidget-title oo-ui-icon-tag' )\n\t\t.text( ve.msg( 'visualeditor-dialog-meta-categories-category' ) );\n\tthis.$hiddenStatus = $( '<div>' );\n\tthis.$menu\n\t\t.addClass( 've-ui-mwCategoryPopupWidget-content' )\n\t\t.append(\n\t\t\tthis.$title,\n\t\t\tthis.$hiddenStatus,\n\t\t\tthis.removeButton.$element.addClass( 've-ui-mwCategoryPopupWidget-removeButton' ),\n\t\t\tthis.$sortKeyForm\n\t\t);\n\tthis.$body.append( this.$menu );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWCategoryPopupWidget, OO.ui.PopupWidget );\n\n/* Events */\n\n/**\n * @event ve.ui.MWCategoryPopupWidget#removeCategory\n * @param {string} category Category name\n */\n\n/**\n * @event ve.ui.MWCategoryPopupWidget#updateSortkey\n * @param {string} category Category name\n * @param {string} sortkey New sortkey\n */\n\n/* Methods */\n\n/**\n * Handle category remove events.\n *\n * @fires ve.ui.MWCategoryPopupWidget#removeCategory\n */\nve.ui.MWCategoryPopupWidget.prototype.onRemoveCategory = function () {\n\tthis.removed = true;\n\tthis.emit( 'removeCategory', this.category );\n\tthis.closePopup();\n};\n\n/**\n * Handle sort key form submit events.\n *\n * @param {jQuery.Event} e Form submit event\n * @return {boolean}\n * @fires ve.ui.MWCategoryPopupWidget#updateSortkey\n */\nve.ui.MWCategoryPopupWidget.prototype.onSortKeySubmit = function () {\n\tthis.closePopup();\n\treturn false;\n};\n\n/**\n * Open a category item popup.\n *\n * @param {ve.ui.MWCategoryItemWidget} item Category item\n */\nve.ui.MWCategoryPopupWidget.prototype.openPopup = function ( item ) {\n\tthis.toggle( true );\n\tthis.popupOpen = true;\n\tthis.category = item.value;\n\tthis.loadCategoryIntoPopup( item );\n\tthis.setPopup( item );\n};\n\n/**\n * Handle popup toggle events.\n *\n * @param {boolean} show Widget is being made visible\n * @fires ve.ui.MWCategoryPopupWidget#updateSortkey\n */\nve.ui.MWCategoryPopupWidget.prototype.onToggle = function ( show ) {\n\tif ( show ) {\n\t\treturn;\n\t}\n\tconst newSortkey = this.sortKeyInput.$input.val();\n\tif ( !this.removed && newSortkey !== ( this.origSortkey || '' ) ) {\n\t\tif ( newSortkey === this.fallbackSortKey ) {\n\t\t\tthis.emit( 'updateSortkey', this.category, '' );\n\t\t} else {\n\t\t\tthis.emit( 'updateSortkey', this.category, this.sortKeyInput.$input.val() );\n\t\t}\n\t}\n};\n\n/**\n * Load item information into the popup.\n *\n * @param {ve.ui.MWCategoryItemWidget} item Category item\n */\nve.ui.MWCategoryPopupWidget.prototype.loadCategoryIntoPopup = function ( item ) {\n\tthis.origSortkey = item.sortKey || this.fallbackSortKey;\n\tif ( item.isHidden ) {\n\t\tthis.$hiddenStatus.text( ve.msg( 'visualeditor-dialog-meta-categories-hidden' ) );\n\t} else if ( item.isMissing ) {\n\t\tthis.$hiddenStatus.text( ve.msg( 'visualeditor-dialog-meta-categories-missing' ) );\n\t} else {\n\t\tthis.$hiddenStatus.empty();\n\t}\n\tthis.sortKeyInput.$input.val( this.origSortkey );\n};\n\n/**\n * Close the popup.\n */\nve.ui.MWCategoryPopupWidget.prototype.closePopup = function () {\n\tthis.toggle( false );\n\tthis.popupOpen = false;\n\tthis.category = null;\n\tthis.origSortkey = null;\n\tthis.removed = false;\n};\n\n/**\n * Set the default sort key.\n *\n * @param {string} value Default sort key value\n */\nve.ui.MWCategoryPopupWidget.prototype.setDefaultSortKey = function ( value ) {\n\tthis.fallbackSortKey = value;\n};\n\n/**\n * Display the popup next to an item.\n *\n * @param {ve.ui.MWCategoryItemWidget} item Category item\n */\nve.ui.MWCategoryPopupWidget.prototype.setPopup = function ( item ) {\n\tthis.setFloatableContainer( item.$element );\n\tthis.updateDimensions();\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWCategoryWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":295,"column":1,"nodeType":"Block","endLine":295,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":367,"column":1,"nodeType":"Block","endLine":367,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-map-util","severity":2,"message":"Prefer Array#map to $.map","line":372,"column":19,"nodeType":"CallExpression","endLine":372,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-sizzle","severity":2,"message":"Selector extensions are not allowed","line":457,"column":30,"nodeType":"CallExpression","endLine":457,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWCategoryWidget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Creates an ve.ui.MWCategoryWidget object.\n *\n * @class\n * @abstract\n * @extends OO.ui.Widget\n * @mixes OO.ui.mixin.GroupElement\n * @mixes OO.ui.mixin.DraggableGroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @param {jQuery} [config.$overlay] Overlay to render dropdowns in\n */\nve.ui.MWCategoryWidget = function VeUiMWCategoryWidget( config ) {\n\t// Parent constructor\n\tve.ui.MWCategoryWidget.super.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, config );\n\tOO.ui.mixin.DraggableGroupElement.call( this, ve.extendObject( {}, config, { orientation: 'horizontal' } ) );\n\n\tconst categoryNamespace = mw.config.get( 'wgNamespaceIds' ).category;\n\t// Properties\n\tthis.fragment = null;\n\tthis.categories = {};\n\t// Source -> target\n\tthis.categoryRedirects = {};\n\t// Title cache - will contain entries even if title is already normalized\n\tthis.normalizedTitles = {};\n\tthis.popup = new ve.ui.MWCategoryPopupWidget();\n\tthis.input = new ve.ui.MWCategoryInputWidget( this, { $overlay: config.$overlay } );\n\tthis.forceCapitalization = !mw.config.get( 'wgCaseSensitiveNamespaces' ).includes( categoryNamespace );\n\tthis.categoryPrefix = mw.config.get( 'wgFormattedNamespaces' )[ categoryNamespace ] + ':';\n\tthis.expandedItem = null;\n\n\t// Events\n\tthis.input.connect( this, { choose: 'onInputChoose' } );\n\tthis.popup.connect( this, {\n\t\tremoveCategory: 'onRemoveCategory',\n\t\tupdateSortkey: 'onUpdateSortkey',\n\t\tready: 'onPopupOpened',\n\t\tclosing: 'onPopupClosing'\n\t} );\n\tthis.connect( this, {\n\t\tdrag: 'onDrag'\n\t} );\n\n\t// Initialization\n\tthis.$element.addClass( 've-ui-mwCategoryWidget' )\n\t\t.append(\n\t\t\tthis.$group.addClass( 've-ui-mwCategoryWidget-items' ).append(\n\t\t\t\tthis.input.$element\n\t\t\t),\n\t\t\tthis.popup.$element,\n\t\t\t$( '<div>' ).css( 'clear', 'both' )\n\t\t);\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWCategoryWidget, OO.ui.Widget );\n\nOO.mixinClass( ve.ui.MWCategoryWidget, OO.ui.mixin.GroupElement );\nOO.mixinClass( ve.ui.MWCategoryWidget, OO.ui.mixin.DraggableGroupElement );\n\n/* Events */\n\n/**\n * @event ve.ui.MWCategoryWidget#newCategory\n * @param {Object} item Category item\n * @param {string} item.name Fully prefixed category name\n * @param {string} item.value Category value (name without prefix)\n * @param {ve.dm.MWCategoryMetaItem} item.metaItem\n * @param {ve.dm.MetaItem} [beforeCategory] Insert after this category; if unset, insert at the end\n */\n\n/**\n * @event ve.ui.MWCategoryWidget#updateSortkey\n * @param {Object} item Category item\n * @param {string} item.name Fully prefixed category name\n * @param {string} item.value Category value (name without prefix)\n * @param {ve.dm.MWCategoryMetaItem} item.metaItem\n */\n\n/* Methods */\n\n/**\n * Surface fragment for modifying meta list\n *\n * @param {ve.dm.SurfaceFragment|null} fragment Surface fragment\n */\nve.ui.MWCategoryWidget.prototype.setFragment = function ( fragment ) {\n\tthis.fragment = fragment;\n};\n\n/**\n * Handle input 'choose' event.\n *\n * @param {OO.ui.MenuOptionWidget} item Selected item\n */\nve.ui.MWCategoryWidget.prototype.onInputChoose = function ( item ) {\n\tconst value = item.getData();\n\n\tif ( value && value !== '' ) {\n\t\t// Add new item\n\t\tconst categoryItem = this.getCategoryItemFromValue( value );\n\t\tthis.queryCategoryStatus( [ categoryItem.name ] ).then( () => {\n\t\t\t// Remove existing items by name\n\t\t\tconst toRemove = mw.Title.newFromText( categoryItem.name ).getMainText();\n\t\t\tif ( Object.prototype.hasOwnProperty.call( this.categories, toRemove ) ) {\n\t\t\t\tthis.fragment.removeMeta( this.categories[ toRemove ].metaItem );\n\t\t\t}\n\t\t\tcategoryItem.name = this.normalizedTitles[ categoryItem.name ];\n\t\t\tthis.emit( 'newCategory', categoryItem );\n\t\t} );\n\t}\n};\n\n/**\n * Hanle popup open event\n *\n */\nve.ui.MWCategoryWidget.prototype.onPopupOpened = function () {\n\tthis.popup.removeButton.focus();\n};\n\n/**\n * Handle popup closing dialog\n */\nve.ui.MWCategoryWidget.prototype.onPopupClosing = function () {\n\tthis.expandedItem.focus();\n};\n\n/**\n * Get a category item.\n *\n * @param {string} value Category name\n * @return {Object} Category item with name, value and metaItem properties\n */\nve.ui.MWCategoryWidget.prototype.getCategoryItemFromValue = function ( value ) {\n\t// Normalize\n\tconst title = mw.Title.newFromText( this.categoryPrefix + value );\n\tif ( title ) {\n\t\treturn {\n\t\t\tname: title.getPrefixedText(),\n\t\t\tvalue: title.getMainText(),\n\t\t\tmetaItem: {}\n\t\t};\n\t}\n\n\tif ( this.forceCapitalization ) {\n\t\tvalue = value.slice( 0, 1 ).toUpperCase() + value.slice( 1 );\n\t}\n\n\treturn {\n\t\tname: this.categoryPrefix + value,\n\t\tvalue: value,\n\t\tmetaItem: {}\n\t};\n};\n\n/**\n * Focus the widget\n */\nve.ui.MWCategoryWidget.prototype.focus = function () {\n\tthis.input.$input[ 0 ].focus();\n};\n\n/**\n * @param {ve.ui.MWCategoryItemWidget} item Item that was moved\n * @param {number} newIndex The new index of the item\n */\nve.ui.MWCategoryWidget.prototype.onDrag = function () {\n\tthis.fitInput();\n};\n\n/**\n * @inheritdoc OO.ui.mixin.DraggableGroupElement\n * @fires ve.ui.MWCategoryWidget#newCategory\n */\nve.ui.MWCategoryWidget.prototype.reorder = function ( item, newIndex ) {\n\t// Compute beforeCategory before removing, otherwise newIndex\n\t// could be off by one\n\tconst beforeCategory = this.items[ newIndex ] && this.items[ newIndex ].metaItem;\n\tif ( Object.prototype.hasOwnProperty.call( this.categories, item.value ) ) {\n\t\tthis.fragment.removeMeta( this.categories[ item.value ].metaItem );\n\t}\n\n\tthis.emit( 'newCategory', item, beforeCategory );\n};\n\n/**\n * Removes category from model.\n *\n * @param {string} name Removed category name\n */\nve.ui.MWCategoryWidget.prototype.onRemoveCategory = function ( name ) {\n\tthis.fragment.removeMeta( this.categories[ name ].metaItem );\n\tdelete this.categories[ name ];\n};\n\n/**\n * Update sortkey value, emit updateSortkey event\n *\n * @param {string} name\n * @param {string} value\n * @fires ve.ui.MWCategoryWidget#updateSortkey\n */\nve.ui.MWCategoryWidget.prototype.onUpdateSortkey = function ( name, value ) {\n\tthis.categories[ name ].sortKey = value;\n\tthis.emit( 'updateSortkey', this.categories[ name ] );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWCategoryWidget.prototype.clearItems = function () {\n\tOO.ui.mixin.GroupElement.prototype.clearItems.call( this );\n\tthis.categories = {};\n};\n\n/**\n * Toggles popup menu per category item\n *\n * @param {Object} item\n */\nve.ui.MWCategoryWidget.prototype.onTogglePopupMenu = function ( item ) {\n\t// Close open popup.\n\tif ( item.value !== this.popup.category ) {\n\t\tthis.popup.openPopup( item );\n\t\tthis.expandedItem = item;\n\t\tthis.popup\n\t\t\t.$element\n\t\t\t.attr( 'aria-label',\n\t\t\t\tve.msg( 'visualeditor-dialog-meta-categories-category' )\n\t\t\t);\n\t} else {\n\t\t// Handle toggle\n\t\tthis.popup.closePopup();\n\t}\n};\n\n/**\n * Set the default sort key.\n *\n * @param {string} value Default sort key value\n */\nve.ui.MWCategoryWidget.prototype.setDefaultSortKey = function ( value ) {\n\tthis.popup.setDefaultSortKey( value );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWCategoryWidget.prototype.setDisabled = function () {\n\t// Parent method\n\tve.ui.MWCategoryWidget.super.prototype.setDisabled.apply( this, arguments );\n\n\tconst isDisabled = this.isDisabled();\n\n\tif ( this.input ) {\n\t\tthis.input.setDisabled( isDisabled );\n\t}\n\tif ( this.items ) {\n\t\tthis.items.forEach( ( item ) => {\n\t\t\titem.setDisabled( isDisabled );\n\t\t} );\n\t}\n\tif ( this.popup ) {\n\t\tthis.popup.closePopup();\n\t}\n};\n\n/**\n * Get list of category names.\n *\n * @return {string[]} List of category names\n */\nve.ui.MWCategoryWidget.prototype.getCategories = function () {\n\treturn Object.keys( this.categories );\n};\n\n/**\n * Starts a request to update the link cache's hidden and missing status for\n *  the given titles, following normalisation responses as necessary.\n *\n * @param {string[]} categoryNames\n * @return {jQuery.Promise}\n */\nve.ui.MWCategoryWidget.prototype.queryCategoryStatus = function ( categoryNames ) {\n\t// Get rid of any we already know the hidden status of, or have an entry\n\t// if normalizedTitles (i.e. have been fetched before)\n\tconst categoryNamesToQuery = categoryNames.filter( ( name ) => {\n\t\tif ( this.normalizedTitles[ name ] ) {\n\t\t\treturn false;\n\t\t}\n\t\tconst cacheEntry = ve.init.platform.linkCache.getCached( name );\n\t\tif ( cacheEntry && cacheEntry.hidden ) {\n\t\t\t// As we aren't doing an API request for this category, mark it in the cache.\n\t\t\tthis.normalizedTitles[ name ] = name;\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t} );\n\n\tif ( !categoryNamesToQuery.length ) {\n\t\treturn ve.createDeferred().resolve( {} ).promise();\n\t}\n\n\tlet index = 0;\n\tconst batchSize = 50, promises = [];\n\t// Batch this up into groups of 50\n\twhile ( index < categoryNamesToQuery.length ) {\n\t\tpromises.push( ve.init.target.getContentApi().get( {\n\t\t\taction: 'query',\n\t\t\tprop: 'pageprops',\n\t\t\ttitles: categoryNamesToQuery.slice( index, index + batchSize ),\n\t\t\tppprop: 'hiddencat',\n\t\t\tredirects: ''\n\t\t} ).then( ( result ) => {\n\t\t\tconst linkCacheUpdate = {},\n\t\t\t\tnormalizedTitles = {};\n\t\t\tif ( result && result.query && result.query.pages ) {\n\t\t\t\tresult.query.pages.forEach( ( pageInfo ) => {\n\t\t\t\t\tlinkCacheUpdate[ pageInfo.title ] = {\n\t\t\t\t\t\tmissing: Object.prototype.hasOwnProperty.call( pageInfo, 'missing' ),\n\t\t\t\t\t\thidden: pageInfo.pageprops &&\n\t\t\t\t\t\t\tObject.prototype.hasOwnProperty.call( pageInfo.pageprops, 'hiddencat' )\n\t\t\t\t\t};\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( result && result.query && result.query.redirects ) {\n\t\t\t\tresult.query.redirects.forEach( ( redirectInfo ) => {\n\t\t\t\t\tthis.categoryRedirects[ redirectInfo.from ] = redirectInfo.to;\n\t\t\t\t} );\n\t\t\t}\n\t\t\tve.init.platform.linkCache.set( linkCacheUpdate );\n\n\t\t\tif ( result.query && result.query.normalized ) {\n\t\t\t\tresult.query.normalized.forEach( ( normalisation ) => {\n\t\t\t\t\tnormalizedTitles[ normalisation.from ] = normalisation.to;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tcategoryNames.forEach( ( name ) => {\n\t\t\t\tthis.normalizedTitles[ name ] = normalizedTitles[ name ] || name;\n\t\t\t} );\n\t\t} ) );\n\t\tindex += batchSize;\n\t}\n\n\treturn ve.promiseAll( promises );\n};\n\n/**\n * Adds category items.\n *\n * @param {Object[]} items Items to add\n * @param {number} [index] Index to insert items after\n * @return {jQuery.Promise}\n */\nve.ui.MWCategoryWidget.prototype.addItems = function ( items, index ) {\n\tconst categoryItems = [],\n\t\t// eslint-disable-next-line no-jquery/no-map-util\n\t\tcategoryNames = $.map( items, ( item ) => item.name );\n\n\treturn this.queryCategoryStatus( categoryNames ).then( () => {\n\t\tlet config;\n\t\tconst checkValueMatches = function ( existingCategoryItem ) {\n\t\t\treturn config.item.value === existingCategoryItem.value;\n\t\t};\n\n\t\titems.forEach( ( item ) => {\n\t\t\titem.name = this.normalizedTitles[ item.name ];\n\n\t\t\tconst itemTitle = new mw.Title( item.name, mw.config.get( 'wgNamespaceIds' ).category );\n\t\t\t// Create a widget using the item data\n\t\t\tconfig = {\n\t\t\t\titem: item\n\t\t\t};\n\t\t\tlet cachedData;\n\t\t\tif ( Object.prototype.hasOwnProperty.call( this.categoryRedirects, itemTitle.getPrefixedText() ) ) {\n\t\t\t\tconfig.redirectTo = new mw.Title(\n\t\t\t\t\tthis.categoryRedirects[ itemTitle.getPrefixedText() ],\n\t\t\t\t\tmw.config.get( 'wgNamespaceIds' ).category\n\t\t\t\t).getMainText();\n\t\t\t\tcachedData = ve.init.platform.linkCache.getCached( this.categoryRedirects[ itemTitle.getPrefixedText() ] );\n\t\t\t} else {\n\t\t\t\tcachedData = ve.init.platform.linkCache.getCached( item.name );\n\t\t\t}\n\t\t\tconfig.hidden = cachedData.hidden;\n\t\t\tconfig.missing = cachedData.missing;\n\t\t\tconfig.disabled = this.disabled;\n\n\t\t\tconst categoryItem = new ve.ui.MWCategoryItemWidget( config );\n\t\t\tcategoryItem.connect( this, {\n\t\t\t\ttogglePopupMenu: 'onTogglePopupMenu'\n\t\t\t} );\n\n\t\t\t// Index item\n\t\t\tthis.categories[ itemTitle.getMainText() ] = categoryItem;\n\t\t\t// Copy sortKey from old item when \"moving\"\n\t\t\tconst existingCategoryItems = this.items.filter( checkValueMatches );\n\t\t\tif ( existingCategoryItems.length ) {\n\t\t\t\t// There should only be one element in existingCategoryItems\n\t\t\t\tcategoryItem.sortKey = existingCategoryItems[ 0 ].sortKey;\n\t\t\t\tthis.removeItems( [ existingCategoryItems[ 0 ] ] );\n\t\t\t}\n\n\t\t\tcategoryItems.push( categoryItem );\n\t\t} );\n\n\t\tOO.ui.mixin.DraggableGroupElement.prototype.addItems.call( this, categoryItems, index );\n\n\t\t// Ensure the input remains the last item in the list, and preserve focus\n\t\tconst hadFocus = this.getElementDocument().activeElement === this.input.$input[ 0 ];\n\t\tthis.$group.append( this.input.$element );\n\t\tif ( hadFocus ) {\n\t\t\tthis.input.$input[ 0 ].focus();\n\t\t}\n\t\tthis.fitInput();\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWCategoryWidget.prototype.removeItems = function ( items ) {\n\tfor ( let i = 0, len = items.length; i < len; i++ ) {\n\t\tconst categoryItem = items[ i ];\n\t\tif ( categoryItem ) {\n\t\t\tcategoryItem.disconnect( this );\n\t\t\titems.push( categoryItem );\n\t\t\tdelete this.categories[ categoryItem.value ];\n\t\t}\n\t}\n\n\tOO.ui.mixin.DraggableGroupElement.prototype.removeItems.call( this, items );\n\n\tthis.fitInput();\n};\n\n/**\n * Auto-fit the input.\n */\nve.ui.MWCategoryWidget.prototype.fitInput = function () {\n\tconst $input = this.input.$element;\n\n\t// eslint-disable-next-line no-jquery/no-sizzle\n\tif ( !this.items.length || !$input.is( ':visible' ) ) {\n\t\treturn;\n\t}\n\n\t// Measure the input's natural size\n\t$input.css( 'width', '' );\n\tconst inputWidth = $input.outerWidth( true );\n\n\t// this.items hasn't been updated if this was triggered by a drag event,\n\t// so look at document order\n\tconst $lastItem = this.$group.find( '.ve-ui-mwCategoryItemWidget' ).last();\n\t// Try to fit to the right of the last item\n\tconst availableSpace = Math.floor( this.$group.width() - ( $lastItem.position().left + $lastItem.outerWidth( true ) ) );\n\tif ( availableSpace > inputWidth ) {\n\t\t$input.css( 'width', availableSpace );\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWEditSummaryWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":132,"column":1,"nodeType":"Block","endLine":132,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWEditSummaryWidget class.\n *\n * @copyright See AUTHORS.txt\n */\n\n/**\n * Multi line text input for edit summary, with auto completion based on\n * the user's previous edit summaries.\n *\n * @class\n * @extends OO.ui.MultilineTextInputWidget\n * @mixes OO.ui.mixin.LookupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @param {number} [config.limit=6] Number of suggestions to show\n */\nve.ui.MWEditSummaryWidget = function VeUiMWEditSummaryWidget( config = {} ) {\n\t// Parent method\n\tve.ui.MWEditSummaryWidget.super.call( this, ve.extendObject( {\n\t\tautosize: true,\n\t\tmaxRows: 15,\n\t\tallowLinebreaks: false\n\t}, config ) );\n\n\t// Mixin method\n\tOO.ui.mixin.LookupElement.call( this, ve.extendObject( {\n\t\tshowPendingRequest: false,\n\t\tshowSuggestionsOnFocus: false,\n\t\tallowSuggestionsWhenEmpty: false,\n\t\thighlightFirst: false\n\t}, config ) );\n\n\tthis.limit = config.limit || 6;\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWEditSummaryWidget, OO.ui.MultilineTextInputWidget );\n\nOO.mixinClass( ve.ui.MWEditSummaryWidget, OO.ui.mixin.LookupElement );\n\n/* Static properties */\n\nve.ui.MWEditSummaryWidget.static.summarySplitter = /^(\\/\\*.*?\\*\\/\\s*)?([^]*)$/;\n\n/* Static methods */\n\n/**\n * Split a summary into the section and the actual summary\n *\n * @param {string} summary\n * @return {Object} Object with section and comment string properties\n */\nve.ui.MWEditSummaryWidget.static.splitSummary = function ( summary ) {\n\tconst result = summary.match( this.summarySplitter );\n\treturn {\n\t\tsection: result[ 1 ] || '',\n\t\tcomment: result[ 2 ]\n\t};\n};\n\n/**\n * Filter a list of edit summaries to a specific query string\n *\n * @param {string[]} summaries Edit summaries\n * @param {string} query User query\n * @return {string[]} Filtered edit summaries\n */\nve.ui.MWEditSummaryWidget.static.getMatchingSummaries = function ( summaries, query ) {\n\tconst summaryPrefixMatches = [], wordPrefixMatches = [], otherMatches = [],\n\t\tlowerQuery = query.toLowerCase();\n\n\tif ( !query.trim() ) {\n\t\t// Show no results for empty query\n\t\treturn [];\n\t}\n\n\tsummaries.forEach( ( summary ) => {\n\t\tconst lowerSummary = summary.toLowerCase(),\n\t\t\tindex = lowerSummary.indexOf( lowerQuery );\n\t\tif ( index === 0 ) {\n\t\t\t// Exclude exact matches\n\t\t\tif ( lowerQuery !== summary ) {\n\t\t\t\tsummaryPrefixMatches.push( summary );\n\t\t\t}\n\t\t} else if ( index !== -1 ) {\n\t\t\tif ( /^\\s/.test( lowerSummary.charAt( index - 1 ) ) ) {\n\t\t\t\t// Character before match is whitespace\n\t\t\t\twordPrefixMatches.push( summary );\n\t\t\t} else {\n\t\t\t\totherMatches.push( summary );\n\t\t\t}\n\t\t}\n\t} );\n\treturn summaryPrefixMatches.concat( wordPrefixMatches, otherMatches );\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWEditSummaryWidget.prototype.adjustSize = function () {\n\t// To autosize, the widget will render another element beneath the input\n\t// with the same text for measuring. This extra element could cause scrollbars\n\t// to appear, changing the available width, so if scrollbars are intially\n\t// hidden, force them to stay hidden during the adjustment.\n\t// TODO: Consider upstreaming this?\n\tconst scrollContainer = this.getClosestScrollableElementContainer();\n\tconst hasScrollbar = scrollContainer.offsetWidth > scrollContainer.scrollWidth;\n\tlet overflowY;\n\tif ( !hasScrollbar ) {\n\t\toverflowY = scrollContainer.style.overflowY;\n\t\tscrollContainer.style.overflowY = 'hidden';\n\t}\n\n\t// Parent method\n\tve.ui.MWEditSummaryWidget.super.prototype.adjustSize.apply( this, arguments );\n\n\tif ( !hasScrollbar ) {\n\t\tscrollContainer.style.overflowY = overflowY;\n\t}\n\n\treturn this;\n};\n\n/**\n * Get recent edit summaries for the logged in user\n *\n * @return {jQuery.Promise} Promise which resolves with a list of summaries\n */\nve.ui.MWEditSummaryWidget.prototype.getSummaries = function () {\n\tconst splitSummary = this.constructor.static.splitSummary.bind( this.constructor.static );\n\tif ( !this.getSummariesPromise ) {\n\t\tif ( mw.user.isAnon() ) {\n\t\t\tthis.getSummariesPromise = ve.createDeferred().resolve( [] ).promise();\n\t\t} else {\n\t\t\t// Allow this for temp users as well. The isAnon() check above is just to avoid autocompleting\n\t\t\t// with someone else's summaries.\n\t\t\tthis.getSummariesPromise = ve.init.target.getLocalApi().get( {\n\t\t\t\taction: 'query',\n\t\t\t\tlist: 'usercontribs',\n\t\t\t\tucuser: mw.user.getName(),\n\t\t\t\tucprop: 'comment',\n\t\t\t\tuclimit: 500\n\t\t\t} ).then( ( response ) => {\n\t\t\t\tconst usedComments = {},\n\t\t\t\t\tchanges = ve.getProp( response, 'query', 'usercontribs' ) || [];\n\n\t\t\t\treturn changes\n\t\t\t\t\t// Filter out changes without comment (e.g. due to RevisionDelete)\n\t\t\t\t\t.filter( ( change ) => Object.prototype.hasOwnProperty.call( change, 'comment' ) )\n\t\t\t\t\t// Remove section /* headings */\n\t\t\t\t\t.map( ( change ) => splitSummary( change.comment ).comment.trim() )\n\t\t\t\t\t// Filter out duplicates and empty comments\n\t\t\t\t\t.filter( ( comment ) => {\n\t\t\t\t\t\tif ( !comment || Object.prototype.hasOwnProperty.call( usedComments, comment ) ) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tusedComments[ comment ] = true;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} )\n\t\t\t\t\t.sort();\n\t\t\t} );\n\t\t}\n\t}\n\treturn this.getSummariesPromise;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWEditSummaryWidget.prototype.getLookupRequest = function () {\n\tconst query = this.constructor.static.splitSummary( this.value ),\n\t\tlimit = this.limit;\n\n\treturn this.getSummaries().then( ( allSummaries ) => {\n\t\tconst matchingSummaries = this.constructor.static.getMatchingSummaries( allSummaries, query.comment );\n\t\tif ( matchingSummaries.length > limit ) {\n\t\t\t// Quick in-place truncate\n\t\t\tmatchingSummaries.length = limit;\n\t\t}\n\t\treturn { summaries: matchingSummaries, section: query.section };\n\t} ).promise( { abort: () => {} } ); // don't abort, the actual request will be the same anyway\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWEditSummaryWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {\n\treturn response;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWEditSummaryWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {\n\treturn data.summaries.map( ( item ) => new OO.ui.MenuOptionWidget( {\n\t\tlabel: item,\n\t\tdata: data.section + item\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWEducationPopupWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":95,"column":1,"nodeType":"Block","endLine":95,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":52,"column":3,"nodeType":"CallExpression","endLine":56,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MediaWiki EducationPopup class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * UserInterface education popup.\n *\n * Shows a pulsating blue dot which, when you click,\n * reveals a popup with useful information.\n *\n * @class\n *\n * @constructor\n * @extends OO.ui.Widget\n * @param {jQuery} $target Element to attach to\n * @param {Object} config Configuration options\n * @param {string} config.popupTitle\n * @param {string|jQuery} config.popupText\n * @param {string} [config.popupImage] Popup image class\n * @param {string} [config.trackingName]\n */\nve.ui.MWEducationPopupWidget = function VeUiMwEducationPopup( $target, config ) {\n\t// HACK: Do not display on platforms other than desktop\n\tif ( !( ve.init.mw.DesktopArticleTarget && ve.init.target instanceof ve.init.mw.DesktopArticleTarget ) ) {\n\t\treturn;\n\t}\n\n\t// Do not display if the user already acknowledged the popups\n\tif ( !mw.libs.ve.shouldShowEducationPopups() ) {\n\t\treturn;\n\t}\n\n\t// Parent method\n\tve.ui.MWEducationPopupWidget.super.call( this, config );\n\n\t// Properties\n\tthis.$target = $target;\n\tthis.popupCloseButton = new OO.ui.ButtonWidget( {\n\t\tlabel: ve.msg( 'visualeditor-educationpopup-dismiss' ),\n\t\tflags: [ 'progressive', 'primary' ],\n\t\tclasses: [ 've-ui-educationPopup-dismiss' ]\n\t} );\n\tthis.trackingName = config.trackingName;\n\tthis.$pulsatingDot = $( '<div>' ).addClass( 'mw-pulsating-dot' );\n\n\tconst $popupContent = $( '<div>' ).append(\n\t\t$( '<h3>' ).text( config.popupTitle ),\n\t\t// eslint-disable-next-line no-jquery/no-append-html\n\t\t$( '<p>' ).append(\n\t\t\tconfig.popupText instanceof $ ?\n\t\t\t\tconfig.popupText :\n\t\t\t\tdocument.createTextNode( config.popupText )\n\t\t),\n\t\tthis.popupCloseButton.$element\n\t);\n\tve.targetLinksToNewWindow( $popupContent[ 0 ] );\n\tif ( config.popupImage ) {\n\t\t$popupContent.prepend(\n\t\t\t// The following classes can be generated here:\n\t\t\t// * ve-ui-educationPopup-image-link\n\t\t\t// * others generated by extensions\n\t\t\t$( '<div>' ).addClass( 've-ui-educationPopup-image ve-ui-educationPopup-image-' + config.popupImage )\n\t\t);\n\t}\n\n\tthis.popup = new OO.ui.PopupWidget( {\n\t\t$floatableContainer: this.$target,\n\t\t$content: $popupContent,\n\t\tpadded: true,\n\t\twidth: 300\n\t} );\n\n\tthis.onTargetMouseDownHandler = this.onTargetMouseDown.bind( this );\n\n\t// Events\n\tthis.$target.on( 'mousedown', this.onTargetMouseDownHandler );\n\tthis.popupCloseButton.connect( this, { click: 'onPopupCloseButtonClick' } );\n\n\t// DOME\n\tthis.$element.addClass( 've-ui-educationPopup' ).append( this.$pulsatingDot, this.popup.$element );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWEducationPopupWidget, OO.ui.Widget );\n\n/* Methods */\n\n/**\n * Handle mouse down events on the handle\n *\n * @param {jQuery.Event} e\n * @return {boolean|undefined}\n */\nve.ui.MWEducationPopupWidget.prototype.onTargetMouseDown = function () {\n\tif ( ve.init.target.openEducationPopup ) {\n\t\tve.init.target.openEducationPopup.popup.toggle( false );\n\t\tve.init.target.openEducationPopup.$pulsatingDot.removeClass( 'oo-ui-element-hidden' );\n\t}\n\tve.init.target.openEducationPopup = this;\n\n\tthis.$pulsatingDot.addClass( 'oo-ui-element-hidden' );\n\tthis.popup.toggle( true );\n\tthis.popupCloseButton.focus();\n\n\tif ( this.trackingName ) {\n\t\tve.track( 'activity.' + this.trackingName + 'EducationPopup', { action: 'show' } );\n\t}\n\treturn false;\n};\n\n/**\n * Click handler for the popup close button\n */\nve.ui.MWEducationPopupWidget.prototype.onPopupCloseButtonClick = function () {\n\tthis.$target.off( 'mousedown', this.onTargetMouseDownHandler );\n\tthis.popup.toggle( false );\n\n\tve.init.target.openEducationPopup = null;\n\tmw.libs.ve.stopShowingEducationPopups();\n\n\tconst mouseLeft = { which: OO.ui.MouseButtons.LEFT };\n\tthis.$target\n\t\t.trigger( $.Event( 'mousedown', mouseLeft ) )\n\t\t.trigger( $.Event( 'mouseup', mouseLeft ) )\n\t\t.trigger( $.Event( 'click', mouseLeft ) );\n\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWExternalLinkAnnotationWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":81,"column":1,"nodeType":"Block","endLine":81,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWExternalLinkAnnotationWidget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Creates an ve.ui.MWExternalLinkAnnotationWidget object.\n *\n * @class\n * @extends ve.ui.LinkAnnotationWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWExternalLinkAnnotationWidget = function VeUiMWExternalLinkAnnotationWidget() {\n\t// Parent constructor\n\tve.ui.MWExternalLinkAnnotationWidget.super.apply( this, arguments );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWExternalLinkAnnotationWidget, ve.ui.LinkAnnotationWidget );\n\n/* Static Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWExternalLinkAnnotationWidget.static.getAnnotationFromText = function ( value ) {\n\tconst href = value.trim();\n\n\t// Keep annotation in sync with value\n\tif ( href === '' ) {\n\t\treturn null;\n\t} else {\n\t\treturn new ve.dm.MWExternalLinkAnnotation( {\n\t\t\ttype: 'link/mwExternal',\n\t\t\tattributes: {\n\t\t\t\thref: href\n\t\t\t}\n\t\t} );\n\t}\n};\n\n/**\n * Create an external link input widget.\n *\n * @param {Object} [config] Configuration options\n * @return {OO.ui.TextInputWidget} Text input widget\n */\nve.ui.MWExternalLinkAnnotationWidget.static.createExternalLinkInputWidget = function ( config ) {\n\tconst inputWidget = new OO.ui.TextInputWidget( ve.extendObject( {}, config, {\n\t\ticon: 'linkExternal',\n\t\ttype: 'url',\n\t\tvalidate: ( text ) => !!ve.init.platform.getExternalLinkUrlProtocolsRegExp().exec( text.trim() )\n\t} ) );\n\n\tinputWidget.$input.attr( 'aria-label', mw.msg( 'visualeditor-linkinspector-button-link-external' ) );\n\treturn inputWidget;\n};\n\n/* Methods */\n\n/**\n * Create a text input widget to be used by the annotation widget\n *\n * @param {Object} [config] Configuration options\n * @return {OO.ui.TextInputWidget} Text input widget\n */\nve.ui.MWExternalLinkAnnotationWidget.prototype.createInputWidget = function ( config ) {\n\treturn this.constructor.static.createExternalLinkInputWidget( config );\n};\n\n/**\n * Get the validity of current value\n *\n * @see OO.ui.TextInputWidget#getValidity\n *\n * @return {jQuery.Promise} A promise that resolves if the value is valid,\n *  rejects if not. If it's rejected, it'll resolve with an error code.\n */\nve.ui.MWExternalLinkAnnotationWidget.prototype.getValidity = function () {\n\tconst url = this.input.getValue().trim();\n\treturn this.input.getValidity().then(\n\t\t// input validity check covers whether it's a valid external link, now check whether it's blocked:\n\t\t() => {\n\t\t\tif ( mw.config.get( 'wgVisualEditorConfig' ).editCheckReliabilityAvailable ) {\n\t\t\t\treturn ( new mw.Api().get( {\n\t\t\t\t\taction: 'editcheckreferenceurl',\n\t\t\t\t\turl: url,\n\t\t\t\t\tformatversion: 2\n\t\t\t\t} ) ).then( ( reliablityResults ) => {\n\t\t\t\t\tif ( reliablityResults && reliablityResults.editcheckreferenceurl[ url ] === 'blocked' ) {\n\t\t\t\t\t\treturn ve.createDeferred().reject( 'invalid-blocked' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t// invalid link, so provide a reason\n\t\t() => ve.createDeferred().reject( 'invalid-external' )\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWGalleryGroupWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWGalleryItemWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":92,"column":1,"nodeType":"Block","endLine":92,"endColumn":1}],"suppressedMessages":[{"ruleId":"local/no-unsanitized-href","severity":2,"message":"Don't set 'href' without sanitizing; use ve.setAttributeSafe.","line":27,"column":2,"nodeType":"AssignmentExpression","messageId":"noHref","endLine":27,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWGalleryItemWidget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Draggable item widget for the MWGalleryGroupWidget\n *\n * @class\n * @extends OO.ui.Widget\n * @mixes OO.ui.mixin.DraggableElement\n *\n * @constructor\n * @param {Object} imageInfo Image information object\n * @param {Object} [config] Configuration options\n * @param {boolean} [config.isMobile=false]\n * @param {boolean} [config.draggable=true]\n */\nve.ui.MWGalleryItemWidget = function VeUiMWGalleryItemWidget( imageInfo, config = {} ) {\n\tthis.resource = imageInfo.resource;\n\tthis.altText = imageInfo.altText || '';\n\tthis.altTextSame = imageInfo.altTextSame;\n\t// `this` is not a DOM node\n\t// eslint-disable-next-line local/no-unsanitized-href\n\tthis.href = imageInfo.href;\n\t// Keep the original value which may be null\n\tthis.originalAltText = imageInfo.altText;\n\tthis.src = imageInfo.src;\n\tthis.height = imageInfo.height;\n\tthis.width = imageInfo.width;\n\tthis.thumbUrl = imageInfo.thumbUrl;\n\tthis.captionDocument = imageInfo.captionDocument;\n\tthis.highlighted = false;\n\tthis.tagName = imageInfo.tagName;\n\tthis.isError = imageInfo.isError;\n\tthis.imageClassAttr = imageInfo.imageClassAttr;\n\tthis.imgWrapperClassAttr = imageInfo.imgWrapperClassAttr;\n\tthis.mw = imageInfo.mw;\n\tthis.mediaClass = imageInfo.mediaClass;\n\tthis.mediaTag = imageInfo.mediaTag;\n\n\t// Parent constructor\n\tve.ui.MWGalleryItemWidget.super.call( this, config );\n\n\tthis.$element\n\t\t.addClass( 've-ui-mwGalleryDialog-image-container mw-no-invert' ) // TODO: put in new CSS file?\n\t\t.addClass( config.isMobile ?\n\t\t\t've-ui-mwGalleryDialog-image-container-mobile' :\n\t\t\t've-ui-mwGalleryDialog-image-container-desktop'\n\t\t)\n\t\t.css( 'background-image', 'url(' + this.thumbUrl + ')' );\n\n\t// Mixin constructors\n\tOO.ui.mixin.DraggableElement.call( this, ve.extendObject( { $handle: this.$element }, config ) );\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\n\tthis.$element.on( {\n\t\tclick: this.onItemClick.bind( this ),\n\t\tkeypress: this.onItemKeyPress.bind( this )\n\t} );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWGalleryItemWidget, OO.ui.Widget );\n\nOO.mixinClass( ve.ui.MWGalleryItemWidget, OO.ui.mixin.DraggableElement );\nOO.mixinClass( ve.ui.MWGalleryItemWidget, OO.ui.mixin.TabIndexedElement );\n\n/* Events */\n\n/**\n * @event ve.ui.MWGalleryItemWidget#edit\n */\n\n/* Methods */\n\n/**\n * Handle clicking on an item\n *\n * @fires ve.ui.MWGalleryItemWidget#edit\n */\nve.ui.MWGalleryItemWidget.prototype.onItemClick = function () {\n\tthis.emit( 'edit' );\n};\n\n/**\n * Handle key press events\n *\n * @param {jQuery.Event} e Key press event\n * @return {boolean|undefined}\n * @fires ve.ui.MWGalleryItemWidget#edit\n */\nve.ui.MWGalleryItemWidget.prototype.onItemKeyPress = function ( e ) {\n\tif ( e.which === OO.ui.Keys.ENTER ) {\n\t\tthis.emit( 'edit', this );\n\t\treturn false;\n\t}\n};\n\n/**\n * Set the captionDocument property\n *\n * @param {ve.dm.Document} captionDocument The caption document\n */\nve.ui.MWGalleryItemWidget.prototype.setCaptionDocument = function ( captionDocument ) {\n\tthis.captionDocument = captionDocument;\n};\n\n/**\n * Set the altText property\n *\n * @param {string} altText The altText\n */\nve.ui.MWGalleryItemWidget.prototype.setAltText = function ( altText ) {\n\tthis.altText = altText;\n};\n\n/**\n * Set the altTextSame property\n *\n * @param {boolean} same\n */\nve.ui.MWGalleryItemWidget.prototype.setAltTextSame = function ( same ) {\n\tthis.altTextSame = same;\n};\n\n/**\n * Toggle highlighted class\n *\n * @param {boolean} highlighted The item is highlighted\n */\nve.ui.MWGalleryItemWidget.prototype.toggleHighlighted = function ( highlighted ) {\n\thighlighted = highlighted !== undefined ? highlighted : !this.highlighted;\n\tthis.$element.toggleClass( 've-ui-mwGalleryDialog-image-container-highlighted', !!highlighted );\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWLazyMultilineTextInputWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWMediaInfoFieldWidget.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":49,"column":14,"nodeType":"CallExpression","endLine":49,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/variable-pattern","severity":2,"message":"jQuery collection names must match the variablePattern","line":61,"column":4,"nodeType":"AssignmentExpression","endLine":61,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":70,"column":3,"nodeType":"CallExpression","endLine":70,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":73,"column":3,"nodeType":"CallExpression","endLine":73,"endColumn":31,"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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWParameterCheckboxInputWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWPreTextInputWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTargetWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js","messages":[{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":203,"column":27,"nodeType":"MemberExpression","messageId":"forbidden","endLine":203,"endColumn":40},{"ruleId":"es-x/no-iterator-prototype-some","severity":2,"message":"ES2025 'Iterator.prototype.some' method is forbidden.","line":221,"column":56,"nodeType":"MemberExpression","messageId":"forbidden","endLine":221,"endColumn":66}],"suppressedMessages":[{"ruleId":"prefer-regex-literals","severity":2,"message":"Use a regular expression literal instead of the 'RegExp' constructor.","line":73,"column":25,"nodeType":"NewExpression","messageId":"unexpectedRegExp","endLine":73,"endColumn":61,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"es-x/no-regexp-unicode-property-escapes","severity":2,"message":"ES2018 RegExp Unicode property escape sequences are forbidden.","line":73,"column":25,"nodeType":"NewExpression","messageId":"forbidden","endLine":73,"endColumn":61,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWTemplateTitleInputWidget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Input field for entering a template title, for example when adding a template\n * in the template dialog.  Autocomplete fetches TemplateData and performs\n * searching in the background, to display information about matching templates\n * on the wiki.\n *\n * @class\n * @extends mw.widgets.TitleInputWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @param {number} [config.namespace] Namespace to prepend to queries. Defaults to template namespace.\n * @param {boolean} [config.showDescriptions] Show template descriptions from the TemplateData API\n * @param {mw.Api} [config.api]\n */\nve.ui.MWTemplateTitleInputWidget = function VeUiMWTemplateTitleInputWidget( config ) {\n\tconfig = ve.extendObject( {}, {\n\t\tnamespace: mw.config.get( 'wgNamespaceIds' ).template,\n\t\tshowMissing: false,\n\t\t// We don't need results to show up twice normalized and unnormalized\n\t\taddQueryInput: false,\n\t\ticon: 'search',\n\t\tplaceholder: ve.msg( 'visualeditor-dialog-transclusion-placeholder-input-placeholder' )\n\t}, config );\n\n\t// Parent constructor\n\tve.ui.MWTemplateTitleInputWidget.super.call( this, config );\n\t// All code below expects this, but ContentTranslation doesn't necessarily set it to 2\n\tthis.api.defaults.parameters.formatversion = 2;\n\n\tthis.showTemplateDescriptions = this.showDescriptions;\n\t// Clear the showDescriptions flag for subsequent requests as we implement\n\t// description fetch ourselves\n\tthis.showDescriptions = false;\n\n\t// Properties\n\tthis.descriptions = {};\n\n\t// Initialization\n\tthis.$element.addClass( 've-ui-mwTemplateTitleInputWidget' );\n};\n\n/* Inheritance */\n\n// FIXME: This should extend mw.widgets.TitleSearchWidget instead\nOO.inheritClass( ve.ui.MWTemplateTitleInputWidget, mw.widgets.TitleInputWidget );\n\n/* Methods */\n\n// @inheritdoc mw.widgets.TitleWidget\nve.ui.MWTemplateTitleInputWidget.prototype.getApiParams = function ( query ) {\n\tconst params = ve.ui.MWTemplateTitleInputWidget.super.prototype.getApiParams.call( this, query );\n\n\t// TODO: This should stay as a feature flag for 3rd-parties to fallback to prefixsearch\n\tif ( mw.config.get( 'wgVisualEditorConfig' ).cirrusSearchLookup ) {\n\t\tve.extendObject( params, {\n\t\t\tgenerator: 'search',\n\t\t\tgsrsearch: params.gpssearch,\n\t\t\tgsrnamespace: params.gpsnamespace,\n\t\t\tgsrlimit: params.gpslimit\n\t\t} );\n\t\t// Adding the asterisk to emulate a prefix search behavior. It does not make sense in all\n\t\t// cases though. We're limiting it to be add only of the term ends with a letter or numeric\n\t\t// character.\n\t\t// eslint-disable-next-line es-x/no-regexp-unicode-property-escapes, prefer-regex-literals\n\t\tconst endsWithAlpha = new RegExp( '[\\\\p{L}\\\\p{N}]$', 'u' );\n\t\tif ( endsWithAlpha.test( params.gsrsearch ) ) {\n\t\t\tparams.gsrsearch += '*';\n\t\t}\n\t\tif ( this.showRedirectTargets ) {\n\t\t\tparams.gsrprop = 'redirecttitle';\n\t\t}\n\t\tdelete params.gpssearch;\n\t\tdelete params.gpsnamespace;\n\t\tdelete params.gpslimit;\n\t}\n\treturn params;\n};\n\n// @inheritdoc mw.widgets.TitleInputWidget\nve.ui.MWTemplateTitleInputWidget.prototype.getLookupRequest = function () {\n\tlet promise = ve.ui.MWTemplateTitleInputWidget.super.prototype.getLookupRequest.call( this );\n\tif ( mw.config.get( 'wgVisualEditorConfig' ).cirrusSearchLookup ) {\n\t\tpromise = promise\n\t\t\t.then( this.addExactMatch.bind( this ) )\n\t\t\t.promise( { abort: () => {} } );\n\t}\n\n\tif ( !this.showTemplateDescriptions ) {\n\t\treturn promise;\n\t}\n\n\tconst templateDataMessage = mw.message( 'templatedata-doc-subpage' ),\n\t\ttemplateDataInstalled = templateDataMessage.exists(),\n\t\ttemplateDocPageFragment = '/' + templateDataMessage.text();\n\n\tlet originalResponse;\n\treturn promise\n\t\t.then( ( response ) => {\n\t\t\tconst redirects = ( response.query && response.query.redirects ) || [];\n\t\t\tlet newPages = ( response.query && response.query.pages ) || [];\n\n\t\t\tnewPages.forEach( ( page ) => {\n\t\t\t\tif ( !( 'index' in page ) ) {\n\t\t\t\t\t// Watch out for cases where the index is specified on the redirect object\n\t\t\t\t\t// rather than the page object.\n\t\t\t\t\tfor ( const j in redirects ) {\n\t\t\t\t\t\tif ( redirects[ j ].to === page.title ) {\n\t\t\t\t\t\t\tpage.index = redirects[ j ].index;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// T54448: Filter out matches which end in /doc or as configured on-wiki\n\t\t\tif ( templateDataInstalled ) {\n\t\t\t\tnewPages = newPages.filter( ( page ) => !page.title.endsWith( templateDocPageFragment ) );\n\t\t\t}\n\n\t\t\t// T390005: Filter out matches which end in /sandbox or as configured on-wiki\n\t\t\tconst sandboxPageFragment = '/' + mw.message( 'visualeditor-template-sandbox-subpage' ).text();\n\t\t\tnewPages = newPages.filter( ( page ) => !page.title.endsWith( sandboxPageFragment ) );\n\n\t\t\t// Ensure everything goes into the order defined by the page's index key\n\t\t\tnewPages.sort( ( a, b ) => {\n\t\t\t\t// T366299: Avoid unstable sort.\n\t\t\t\tif ( a.index === undefined || b.index === undefined ) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn a.index - b.index;\n\t\t\t} );\n\n\t\t\tconst titles = newPages.map( ( page ) => page.title );\n\n\t\t\tve.setProp( response, 'query', 'pages', newPages );\n\t\t\toriginalResponse = response; // lie!\n\n\t\t\t// Also get descriptions\n\t\t\t// FIXME: This should go through MWTransclusionModel rather than duplicate.\n\t\t\tif ( titles.length > 0 ) {\n\t\t\t\tconst xhr = this.getApi().get( {\n\t\t\t\t\taction: 'templatedata',\n\t\t\t\t\ttitles: titles,\n\t\t\t\t\tredirects: !!this.showRedirects,\n\t\t\t\t\tincludeMissingTitles: '1',\n\t\t\t\t\tlang: mw.config.get( 'wgUserLanguage' )\n\t\t\t\t} );\n\t\t\t\treturn xhr.promise( { abort: xhr.abort } );\n\t\t\t}\n\t\t} )\n\t\t.then( ( templateDataResponse ) => {\n\t\t\tconst pages = ( templateDataResponse && templateDataResponse.pages ) || {};\n\t\t\t// Look for descriptions and cache them\n\t\t\tfor ( const i in pages ) {\n\t\t\t\tconst page = pages[ i ];\n\n\t\t\t\tif ( page.missing ) {\n\t\t\t\t\t// Remember templates that don't exist in the link cache\n\t\t\t\t\t// { title: { missing: true|false }\n\t\t\t\t\tconst missingTitle = {};\n\t\t\t\t\tmissingTitle[ page.title ] = { missing: true };\n\t\t\t\t\tve.init.platform.linkCache.setMissing( missingTitle );\n\t\t\t\t} else if ( !page.notemplatedata ) {\n\t\t\t\t\t// Cache descriptions\n\t\t\t\t\tthis.descriptions[ page.title ] = page.description;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Return the original response\n\t\t\treturn originalResponse;\n\t\t// API request failed; most likely, we're on a wiki which doesn't have TemplateData.\n\t\t}, () => originalResponse || ve.createDeferred().reject() )\n\t\t.promise( { abort: () => {} } );\n};\n\n/**\n * @private\n * @method\n * @param {Object} response Action API response from server\n * @return {Object} Modified response\n */\nve.ui.MWTemplateTitleInputWidget.prototype.addExactMatch = function ( response ) {\n\tconst query = this.getQueryValue(),\n\t\ttitle = mw.Title.newFromText( query, this.namespace );\n\t// No point in trying anything when the title is invalid\n\tif ( !title ) {\n\t\treturn response;\n\t}\n\n\tif ( !response.query ) {\n\t\tresponse.query = { pages: [] };\n\t}\n\n\tconst lowerTitle = title.getPrefixedText().toLowerCase(),\n\t\tmetadata = response.query.redirects || [],\n\t\tfoundMatchingMetadata = metadata.some( ( redirect ) => redirect.from.toLowerCase() === lowerTitle );\n\tif ( foundMatchingMetadata ) {\n\t\t// Redirects will be carefully positioned later in TitleWidget.getOptionsFromData()\n\t\treturn response;\n\t}\n\n\t/**\n\t * @typedef {Object} PageResponse\n\t * @memberof ve.ui.MWTemplateTitleInputWidget\n\t * @param {number} pageId Page ID\n\t * @param {number} index Page ID\n\t */\n\n\t/**\n\t * @param {ve.ui.MWTemplateTitleInputWidget.PageResponse[]} pages\n\t * @param {number} pageId\n\t * @return {boolean}\n\t */\n\tconst containsPageId = ( pages, pageId ) => pageId && pages.some( ( page ) => page.pageid === pageId );\n\n\t/**\n\t * @param {ve.ui.MWTemplateTitleInputWidget.PageResponse[]} pages\n\t * @param {Object} [newPage]\n\t */\n\tconst unshiftPages = ( pages, newPage ) => {\n\t\tpages.forEach( ( page ) => {\n\t\t\tpage.index++;\n\t\t} );\n\t\tif ( newPage && newPage.title ) {\n\t\t\tnewPage.index = 1;\n\t\t\tpages.unshift( newPage );\n\t\t\tif ( pages.length > this.limit ) {\n\t\t\t\tpages.sort( ( a, b ) => a.index - b.index ).splice( this.limit );\n\t\t\t}\n\t\t}\n\t};\n\n\tconst matchingRedirects = response.query.pages.filter( ( page ) => page.redirecttitle && page.redirecttitle.toLowerCase() === lowerTitle );\n\tif ( matchingRedirects.length ) {\n\t\tfor ( let i = matchingRedirects.length; i--; ) {\n\t\t\tconst matchingRedirect = matchingRedirects[ i ];\n\t\t\t// Offer redirects as separate options when the user's input is an exact match\n\t\t\tunshiftPages( response.query.pages, {\n\t\t\t\tpageid: matchingRedirect.pageid,\n\t\t\t\tns: matchingRedirect.ns,\n\t\t\t\ttitle: matchingRedirect.redirecttitle\n\t\t\t} );\n\t\t}\n\t\treturn response;\n\t}\n\n\tconst matchingTitles = response.query.pages.filter( ( page ) => page.title.toLowerCase() === lowerTitle );\n\tif ( matchingTitles.length ) {\n\t\tfor ( let i = matchingTitles.length; i--; ) {\n\t\t\t// Make sure exact matches are at the very top\n\t\t\tunshiftPages( response.query.pages );\n\t\t\tmatchingTitles[ i ].index = 1;\n\t\t}\n\t\treturn response;\n\t}\n\n\treturn this.getApi().get( {\n\t\taction: 'query',\n\t\t// Can't use a direct lookup by title because we need this to be case-insensitive\n\t\tgenerator: 'prefixsearch',\n\t\tgpssearch: query,\n\t\tgpsnamespace: this.namespace,\n\t\t// Try to fill with prefix matches, otherwise just the top-1 prefix match\n\t\tgpslimit: this.limit\n\t} ).then( ( prefixMatches ) => {\n\t\t// action=query returns page objects in `{ query: { pages: [] } }`, not keyed by page id\n\t\tconst pages = prefixMatches.query && prefixMatches.query.pages || [];\n\t\tpages.sort( ( a, b ) => a.index - b.index );\n\t\tfor ( const i in pages ) {\n\t\t\tconst prefixMatch = pages[ i ];\n\t\t\tif ( !containsPageId( response.query.pages, prefixMatch.pageid ) ) {\n\t\t\t\t// Move prefix matches to the top, indexed from -9 to 0, relevant for e.g. {{!!}}\n\t\t\t\t// Note: Sorting happens later in mw.widgets.TitleWidget.getOptionsFromData()\n\t\t\t\tprefixMatch.index -= this.limit;\n\t\t\t\tresponse.query.pages.push( prefixMatch );\n\t\t\t}\n\t\t\t// Check only after the top-1 prefix match is guaranteed to be present\n\t\t\tif ( response.query.pages.length >= this.limit ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn response;\n\t// Proceed with the unmodified response in case the additional API request failed\n\t}, () => response )\n\t\t.promise( { abort: () => {} } );\n};\n\n// @inheritdoc mw.widgets.TitleWidget\nve.ui.MWTemplateTitleInputWidget.prototype.getOptionWidgetData = function ( title, data ) {\n\treturn ve.extendObject(\n\t\tve.ui.MWTemplateTitleInputWidget.super.prototype.getOptionWidgetData.apply( this, arguments ),\n\t\t{\n\t\t\tdescription: this.descriptions[ title ],\n\t\t\tredirecttitle: data.originalData.redirecttitle\n\t\t}\n\t);\n};\n\n// @inheritdoc mw.widgets.TitleWidget\nve.ui.MWTemplateTitleInputWidget.prototype.createOptionWidget = function ( data ) {\n\tconst widget = ve.ui.MWTemplateTitleInputWidget.super.prototype.createOptionWidget.call( this, data );\n\n\tif ( data.redirecttitle ) {\n\t\t// Same conditions as in mw.widgets.TitleWidget.getOptionWidgetData()\n\t\tconst title = new mw.Title( data.redirecttitle ),\n\t\t\ttext = this.namespace !== null && this.relative ?\n\t\t\t\ttitle.getRelativeText( this.namespace ) :\n\t\t\t\tdata.redirecttitle;\n\n\t\tlet $desc = widget.$element.find( '.mw-widget-titleOptionWidget-description' );\n\t\tif ( !$desc.length ) {\n\t\t\t$desc = $( '<span>' )\n\t\t\t\t.addClass( 'mw-widget-titleOptionWidget-description' )\n\t\t\t\t.appendTo( widget.$element );\n\t\t}\n\t\t$desc.prepend( $( '<div>' )\n\t\t\t.addClass( 've-ui-mwTemplateTitleInputWidget-redirectedfrom' )\n\t\t\t.text( mw.msg( 'redirectedfrom', text ) ) );\n\t}\n\n\treturn widget;\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTocWidget.js","messages":[],"suppressedMessages":[{"ruleId":"local/no-unsanitized-href","severity":2,"message":"Don't set 'href' without sanitizing; use ve.setAttributeSafe.","line":203,"column":17,"nodeType":"CallExpression","messageId":"noHref","endLine":203,"endColumn":58,"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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlineButtonWidget.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":63,"column":1,"nodeType":"Block","endLine":63,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":68,"column":1,"nodeType":"Block","endLine":68,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Generic button-like widget for top-level parts in the template dialog\n * sidebar. See {@see OO.ui.ButtonWidget} for inspiration.\n *\n * @class\n * @extends OO.ui.OptionWidget\n * @mixes OO.ui.mixin.ButtonElement\n * @mixes OO.ui.mixin.IconElement\n * @mixes OO.ui.mixin.TabIndexedElement\n * @mixes ve.ui.MWAriaDescribe\n *\n * @constructor\n * @param {Object} config\n * @param {string} [config.icon=''] Symbolic name of an icon, e.g. \"puzzle\" or \"wikiText\"\n * @param {string} config.label\n */\nve.ui.MWTransclusionOutlineButtonWidget = function VeUiMWTransclusionOutlineButtonWidget( config ) {\n\t// Parent constructor\n\tve.ui.MWTransclusionOutlineButtonWidget.super.call( this, ve.extendObject( config, {\n\t\tclasses: [ 've-ui-mwTransclusionOutlineButtonWidget' ]\n\t} ) );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ButtonElement.call( this, {\n\t\t// FIXME semantically this could be a <legend> and the surrounding OutlinePartWidget a <fieldset>\n\t\t$button: $( '<span>' ),\n\t\tframed: false\n\t} );\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, ve.extendObject( {\n\t\t$tabIndexed: this.$button\n\t}, config ) );\n\tve.ui.MWAriaDescribe.call( this, {\n\t\tariaLabel: config.label,\n\t\t$describedElement: this.$button\n\t} );\n\n\t// FIXME hack for screen readers to understand the selection state\n\tthis.$button.attr( {\n\t\trole: 'gridcell',\n\t\t'aria-selected': 'false'\n\t} );\n\n\tthis.$element\n\t\t.append( this.$button.append( this.$icon, this.$label ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWTransclusionOutlineButtonWidget, OO.ui.OptionWidget );\nOO.mixinClass( ve.ui.MWTransclusionOutlineButtonWidget, OO.ui.mixin.ButtonElement );\nOO.mixinClass( ve.ui.MWTransclusionOutlineButtonWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( ve.ui.MWTransclusionOutlineButtonWidget, OO.ui.mixin.TabIndexedElement );\nOO.mixinClass( ve.ui.MWTransclusionOutlineButtonWidget, ve.ui.MWAriaDescribe );\n\nve.ui.MWTransclusionOutlineButtonWidget.static.highlightable = false;\nve.ui.MWTransclusionOutlineButtonWidget.static.pressable = false;\n\n/* Events */\n\n/**\n * @event ve.ui.MWTransclusionOutlineButtonWidget#keyPressed\n * @param {number} key Typically one of the {@see OO.ui.Keys} constants\n */\n\n/**\n * @inheritDoc OO.ui.mixin.ButtonElement\n * @param {jQuery.Event} e\n * @fires ve.ui.MWTransclusionOutlineButtonWidget#keyPressed\n */\nve.ui.MWTransclusionOutlineButtonWidget.prototype.onKeyDown = function ( e ) {\n\tconst isMac = ve.getSystemPlatform() === 'mac';\n\tconst withMetaKey = isMac ? e.metaKey : e.ctrlKey;\n\n\tif ( e.which === OO.ui.Keys.SPACE &&\n\t\t!withMetaKey && !e.shiftKey && !e.altKey\n\t) {\n\t\t// We know we can only select another part, so don't even try to unselect this one\n\t\tif ( !this.isSelected() ) {\n\t\t\tthis.emit( 'keyPressed', e.which );\n\t\t}\n\t\t// The default behavior of pressing space is to scroll down\n\t\te.preventDefault();\n\t\treturn;\n\t}\n\n\treturn OO.ui.mixin.ButtonElement.prototype.onKeyDown.call( this, e );\n};\n\n/**\n * @inheritDoc\n */\nve.ui.MWTransclusionOutlineButtonWidget.prototype.setSelected = function ( state ) {\n\tif ( this.$button ) {\n\t\tthis.$button.attr( 'aria-selected', state.toString() );\n\t}\n\treturn ve.ui.MWTransclusionOutlineButtonWidget.super.prototype.setSelected.call( this, state );\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlineControlsWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":23,"column":27,"nodeType":"NewExpression","messageId":"noLabel","endLine":27,"endColumn":5},{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":28,"column":27,"nodeType":"NewExpression","messageId":"noLabel","endLine":32,"endColumn":5},{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":33,"column":18,"nodeType":"NewExpression","messageId":"noLabel","endLine":38,"endColumn":5},{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":39,"column":20,"nodeType":"NewExpression","messageId":"noLabel","endLine":44,"endColumn":5},{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":45,"column":22,"nodeType":"NewExpression","messageId":"noLabel","endLine":50,"endColumn":5}],"suppressedMessages":[],"errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Toolbar at the bottom of the template dialog sidebar.  Provides buttons to\n * reorder and delete top-level parts, and buttons to add templates or raw\n * wikitext.\n *\n * When there is only one template in the transclusion, the sidebar may be\n * hidden.\n *\n * @class\n * @extends OO.ui.Widget\n * @mixes OO.ui.mixin.GroupElement\n *\n * @constructor\n */\nve.ui.MWTransclusionOutlineControlsWidget = function OoUiOutlineControlsWidget() {\n\t// Parent constructor\n\tve.ui.MWTransclusionOutlineControlsWidget.super.call( this );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this );\n\n\t// Properties\n\tthis.addTemplateButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'puzzle',\n\t\ttitle: ve.msg( 'visualeditor-dialog-transclusion-add-template-button' )\n\t} );\n\tthis.addWikitextButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'wikiText',\n\t\ttitle: ve.msg( 'visualeditor-dialog-transclusion-add-wikitext' )\n\t} );\n\tthis.upButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'upTriangle',\n\t\ttitle: ve.msg( 'ooui-outline-control-move-up' ),\n\t\tdisabled: true\n\t} );\n\tthis.downButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'downTriangle',\n\t\ttitle: ve.msg( 'ooui-outline-control-move-down' ),\n\t\tdisabled: true\n\t} );\n\tthis.removeButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'trash',\n\t\ttitle: ve.msg( 'ooui-outline-control-remove' ),\n\t\tdisabled: true\n\t} );\n\n\t// Events\n\tthis.addTemplateButton.connect( this, {\n\t\tclick: [ 'emit', 'addTemplate' ]\n\t} );\n\tthis.addWikitextButton.connect( this, {\n\t\tclick: [ 'emit', 'addWikitext' ]\n\t} );\n\tthis.upButton.connect( this, {\n\t\tclick: [ 'emit', 'move', -1 ]\n\t} );\n\tthis.downButton.connect( this, {\n\t\tclick: [ 'emit', 'move', 1 ]\n\t} );\n\tthis.removeButton.connect( this, {\n\t\tclick: [ 'emit', 'remove' ]\n\t} );\n\n\t// Initialization\n\tthis.$element.addClass( 've-ui-mwTransclusionOutlineControlsWidget' );\n\tthis.$group.addClass( 've-ui-mwTransclusionOutlineControlsWidget-items' )\n\t\t.append(\n\t\t\tthis.addTemplateButton.$element,\n\t\t\tthis.addWikitextButton.$element\n\t\t);\n\tconst $movers = $( '<div>' )\n\t\t.addClass( 've-ui-mwTransclusionOutlineControlsWidget-movers' )\n\t\t.append(\n\t\t\tthis.upButton.$element,\n\t\t\tthis.downButton.$element,\n\t\t\tthis.removeButton.$element\n\t\t);\n\tthis.$element.append( this.$icon, this.$group, $movers );\n};\n\n/* Setup */\n\nOO.inheritClass( ve.ui.MWTransclusionOutlineControlsWidget, OO.ui.Widget );\nOO.mixinClass( ve.ui.MWTransclusionOutlineControlsWidget, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * Emitted when the \"Add template\" button in the toolbar is clicked\n *\n * @event ve.ui.MWTransclusionOutlineControlsWidget#addTemplate\n */\n\n/**\n * Emitted when the \"Add wikitext\" button in the toolbar is clicked\n *\n * @event ve.ui.MWTransclusionOutlineControlsWidget#addWikitext\n */\n\n/**\n * Emitted when one of the two \"Move item up/down\" buttons in the toolbar is clicked\n *\n * @event ve.ui.MWTransclusionOutlineControlsWidget#move\n * @param {number} places Number of places to move, typically -1 or 1\n */\n\n/**\n * Emitted when the \"Remove item\" button in the toolbar is clicked\n *\n * @event ve.ui.MWTransclusionOutlineControlsWidget#remove\n */\n\n/* Methods */\n\n/**\n * Change buttons\n *\n * @param {Object} states List of abilities with canMoveUp, canMoveDown and canBeDeleted\n * @param {boolean} states.canMoveUp Allow moving item up\n * @param {boolean} states.canMoveDown Allow moving item down\n * @param {boolean} states.canBeDeleted Allow removing removable item\n */\nve.ui.MWTransclusionOutlineControlsWidget.prototype.setButtonsEnabled = function ( states ) {\n\tthis.upButton.setDisabled( !states.canMoveUp );\n\tthis.downButton.setDisabled( !states.canMoveDown );\n\tthis.removeButton.setDisabled( !states.canBeDeleted );\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterSelectWidget.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":5,"column":1,"nodeType":"Block","endLine":5,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":52,"column":1,"nodeType":"Block","endLine":52,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":195,"column":1,"nodeType":"Block","endLine":195,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":184,"column":8,"nodeType":"CallExpression","endLine":184,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * List of template parameters, each of which can be added or removed using a\n * checkbox.\n *\n * This is modelled after {@see OO.ui.OutlineSelectWidget}.  Currently we use\n * the SelectWidget in multi-select mode, and selection maps to checked\n * checkboxes.\n *\n * @class\n * @extends OO.ui.SelectWidget\n * @mixes OO.ui.mixin.TabIndexedElement\n * @mixes ve.ui.MWAriaDescribe\n *\n * @constructor\n * @param {Object} config\n * @param {ve.ui.MWTransclusionOutlineParameterWidget[]} config.items\n * @property {string|null} activeParameter Name of the currently selected parameter\n * @property {number} stickyHeaderHeight\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget = function VeUiMWTransclusionOutlineParameterSelectWidget( config ) {\n\t// Parent constructor\n\tve.ui.MWTransclusionOutlineParameterSelectWidget.super.call( this, ve.extendObject( config, {\n\t\tclasses: [ 've-ui-mwTransclusionOutlineParameterSelectWidget' ],\n\t\tmultiselect: true\n\t} ) );\n\n\t// Mixin constructors\n\tOO.ui.mixin.TabIndexedElement.call( this, {\n\t\ttabIndex: this.isEmpty() ? -1 : 0\n\t} );\n\tve.ui.MWAriaDescribe.call( this, config );\n\n\tthis.$element\n\t\t.on( {\n\t\t\tfocus: this.bindDocumentKeyDownListener.bind( this ),\n\t\t\tblur: this.onBlur.bind( this )\n\t\t} );\n\n\tthis.activeParameter = null;\n\tthis.stickyHeaderHeight = 0;\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWTransclusionOutlineParameterSelectWidget, OO.ui.SelectWidget );\nOO.mixinClass( ve.ui.MWTransclusionOutlineParameterSelectWidget, OO.ui.mixin.TabIndexedElement );\nOO.mixinClass( ve.ui.MWTransclusionOutlineParameterSelectWidget, ve.ui.MWAriaDescribe );\n\n/* Events */\n\n/**\n * This is fired instead of the \"choose\" event from the {@see OO.ui.SelectWidget} base class when\n * pressing space on a parameter to toggle it or scroll it into view, without losing the focus.\n *\n * @event ve.ui.MWTransclusionOutlineParameterSelectWidget#templateParameterSpaceDown\n * @param {ve.ui.MWTransclusionOutlineParameterWidget} item\n * @param {boolean} selected\n */\n\n/* Static Methods */\n\n/**\n * @param {Object} config\n * @param {string} config.data Parameter name\n * @param {string} config.label\n * @param {boolean} [config.required=false] Required parameters can't be unchecked\n * @param {boolean} [config.selected=false] If the parameter is currently used (checked)\n * @return {ve.ui.MWTransclusionOutlineParameterWidget}\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget.static.createItem = function ( config ) {\n\treturn new ve.ui.MWTransclusionOutlineParameterWidget( config );\n};\n\n/* Methods */\n\n/**\n * @inheritDoc OO.ui.mixin.GroupElement\n * @param {ve.ui.MWTransclusionOutlineParameterWidget[]} items\n * @param {number} [index]\n * @return {ve.ui.MWTransclusionOutlineParameterSelectWidget}\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.addItems = function ( items, index ) {\n\titems.forEach( ( item ) => {\n\t\titem.connect( this, {\n\t\t\tchange: [ 'onCheckboxChange', item ]\n\t\t} );\n\t} );\n\n\tve.ui.MWTransclusionOutlineParameterSelectWidget.super.prototype.addItems.call( this, items, index );\n\tthis.setTabIndex( this.isEmpty() ? -1 : 0 );\n\treturn this;\n};\n\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.ensureVisibilityOfFirstCheckedParameter = function () {\n\t// TODO: Replace with {@see OO.ui.SelectWidget.findFirstSelectedItem} when available\n\tconst firstChecked = this.findSelectedItems()[ 0 ];\n\tif ( firstChecked ) {\n\t\tfirstChecked.ensureVisibility( this.stickyHeaderHeight );\n\t}\n};\n\n/**\n * @param {string|null} [paramName] Parameter name to set, e.g. \"param1\". Omit to remove setting.\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.setActiveParameter = function ( paramName ) {\n\t// Note: We know unnamed parameter placeholders never have an item here\n\tconst newItem = paramName ? this.findItemFromData( paramName ) : null;\n\t// Unhighlight when called with no parameter name\n\tthis.highlightItem( newItem );\n\n\tparamName = paramName || null;\n\tif ( this.activeParameter === paramName ) {\n\t\treturn;\n\t}\n\n\tconst currentItem = this.activeParameter ? this.findItemFromData( this.activeParameter ) : null;\n\tthis.activeParameter = paramName;\n\n\tif ( currentItem ) {\n\t\tcurrentItem.toggleActivePageIndicator( false );\n\t}\n\tif ( newItem ) {\n\t\tnewItem.toggleActivePageIndicator( true );\n\t}\n};\n\n/**\n * @inheritDoc OO.ui.SelectWidget\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.highlightItem = function ( item ) {\n\tif ( item ) {\n\t\titem.ensureVisibility( this.stickyHeaderHeight );\n\t}\n\tve.ui.MWTransclusionOutlineParameterSelectWidget.super.prototype.highlightItem.call( this, item );\n};\n\n/**\n * @param {string} paramName\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.markParameterAsUnused = function ( paramName ) {\n\t// There is no OO.ui.SelectWidget.unselectItemByData(), we need to do this manually\n\t/** @type {ve.ui.MWTransclusionOutlineParameterWidget} */\n\tconst item = paramName ? this.findItemFromData( paramName ) : null;\n\tif ( item ) {\n\t\titem.setSelected( false );\n\t\t// An unused parameter can't be the active (set) one; it doesn't exist in the content pane\n\t\tif ( this.activeParameter === paramName ) {\n\t\t\tthis.activeParameter = null;\n\t\t\titem.toggleActivePageIndicator( false );\n\t\t}\n\t}\n};\n\n/**\n * @private\n * @param {ve.ui.MWTransclusionOutlineParameterWidget} item\n * @param {boolean} value\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onCheckboxChange = function ( item, value ) {\n\t// This extra check shouldn't be necessary, but better be safe than sorry\n\tif ( item.isSelected() !== value ) {\n\t\t// Note: This should have been named `toggle…` as it toggles the item's selection\n\t\tthis.chooseItem( item );\n\t}\n};\n\n/**\n * @inheritDoc OO.ui.SelectWidget\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onFocus = function ( event ) {\n\tif ( event.target !== this.$element[ 0 ] || this.findHighlightedItem() ) {\n\t\treturn;\n\t}\n\n\tlet index = 0;\n\tif ( event.relatedTarget ) {\n\t\tconst toolbarClass = 've-ui-mwTransclusionOutlineControlsWidget',\n\t\t\t// The only elements below a parameter list can be another part or the toolbar\n\t\t\tselector = '.ve-ui-mwTransclusionOutlinePartWidget, .' + toolbarClass,\n\t\t\t$fromPart = $( event.relatedTarget ).closest( selector ),\n\t\t\t$toPart = $( event.target ).closest( selector );\n\t\t// When shift+tabbing into the list, highlight the last parameter\n\t\t// eslint-disable-next-line no-jquery/no-class-state\n\t\tif ( $fromPart.hasClass( toolbarClass ) || $fromPart.index() > $toPart.index() ) {\n\t\t\tindex = this.getItemCount() - 1;\n\t\t}\n\t}\n\tthis.highlightItem( this.items[ index ] );\n\n\t// Don't call the parent. It makes assumptions what should be done here.\n};\n\n/**\n * @inheritDoc OO.ui.SelectWidget\n * @param {jQuery.Event} e\n * @fires OO.ui.SelectWidget#choose\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onMouseDown = function ( e ) {\n\tif ( e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tconst item = this.findTargetItem( e );\n\t\t// Same as pressing enter, see below.\n\t\tif ( item && item.isSelected() ) {\n\t\t\tthis.emit( 'choose', item, item.isSelected() );\n\n\t\t\t// Don't call the parent, i.e. can't click to unselect the item\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tve.ui.MWTransclusionOutlineParameterSelectWidget.super.prototype.onMouseDown.call( this, e );\n};\n\n/**\n * @inheritDoc OO.ui.SelectWidget\n * @param {KeyboardEvent} e\n * @fires OO.ui.SelectWidget#choose\n * @fires ve.ui.MWTransclusionOutlineParameterSelectWidget#templateParameterSpaceDown\n */\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onDocumentKeyDown = function ( e ) {\n\tlet item;\n\n\tswitch ( e.keyCode ) {\n\t\tcase OO.ui.Keys.HOME:\n\t\t\titem = this.items[ 0 ];\n\t\t\tif ( item ) {\n\t\t\t\tthis.highlightItem( item );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase OO.ui.Keys.END:\n\t\t\titem = this.items[ this.items.length - 1 ];\n\t\t\tif ( item ) {\n\t\t\t\tthis.highlightItem( item );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase OO.ui.Keys.SPACE:\n\t\t\titem = this.findHighlightedItem();\n\t\t\tif ( item ) {\n\t\t\t\t// Warning, this intentionally doesn't call .chooseItem() because we don't want this\n\t\t\t\t// to fire a \"choose\" event!\n\t\t\t\tif ( item.isSelected() ) {\n\t\t\t\t\tthis.unselectItem( item );\n\t\t\t\t} else {\n\t\t\t\t\tthis.selectItem( item );\n\t\t\t\t}\n\t\t\t\tthis.emit( 'templateParameterSpaceDown', item, item.isSelected() );\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\tbreak;\n\t\tcase OO.ui.Keys.ENTER:\n\t\t\titem = this.findHighlightedItem();\n\t\t\t// Same as clicking with the mouse, see above.\n\t\t\tif ( item && item.isSelected() ) {\n\t\t\t\tthis.emit( 'choose', item, item.isSelected() );\n\t\t\t\te.preventDefault();\n\n\t\t\t\t// Don't call the parent, i.e. can't use enter to unselect the item\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tve.ui.MWTransclusionOutlineParameterSelectWidget.super.prototype.onDocumentKeyDown.call( this, e );\n};\n\nve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onBlur = function () {\n\tthis.highlightItem();\n\tthis.unbindDocumentKeyDownListener();\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterWidget.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Event' is undefined.","line":56,"column":1,"nodeType":"Block","endLine":56,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * A widget that represents a template parameter, with a checkbox to add/remove the parameter.\n * Modelled after {@see OO.ui.OutlineOptionWidget}. Also see {@see OO.ui.CheckboxMultioptionWidget}\n * for inspiration.\n *\n * @class\n * @extends OO.ui.OptionWidget\n *\n * @constructor\n * @param {Object} config\n * @param {string} config.data Parameter name\n * @param {string} config.label\n * @param {boolean} [config.required=false] Required parameters can't be unchecked\n * @param {boolean} [config.selected=false] If the parameter is currently used (checked)\n * @param {boolean} [config.hasValue=false] If the parameter has a value that's not empty\n */\nve.ui.MWTransclusionOutlineParameterWidget = function VeUiMWTransclusionOutlineParameterWidget( config ) {\n\tthis.checkbox = new OO.ui.CheckboxInputWidget( {\n\t\ttitle: config.required ?\n\t\t\tve.msg( 'visualeditor-dialog-transclusion-required-parameter' ) :\n\t\t\tnull,\n\t\tdisabled: config.required,\n\t\tselected: config.selected || config.required,\n\t\t// Keyboard navigation is handled by the outer OO.ui.SelectWidget\n\t\ttabIndex: -1\n\t} )\n\t\t.connect( this, {\n\t\t\t// The array syntax is a way to call `this.emit( 'change' )`.\n\t\t\tchange: [ 'emit', 'change' ]\n\t\t} );\n\tthis.checkbox.$input.on( {\n\t\tmousedown: this.onMouseDown.bind( this )\n\t} );\n\n\t// Parent constructor\n\tve.ui.MWTransclusionOutlineParameterWidget.super.call( this, ve.extendObject( config, {\n\t\tclasses: [ 've-ui-mwTransclusionOutlineParameterWidget' ],\n\t\t$label: $( '<label>' )\n\t} ) );\n\n\tthis.toggleHasValue( config.hasValue );\n\n\t// Initialization\n\tthis.$element\n\t\t.append( this.checkbox.$element, this.$label );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWTransclusionOutlineParameterWidget, OO.ui.OptionWidget );\n\n/* Methods */\n\n/**\n * @private\n * @param {jQuery.Event} e\n */\nve.ui.MWTransclusionOutlineParameterWidget.prototype.onMouseDown = function ( e ) {\n\t// Mouse clicks conflict with the click handler in {@see OO.ui.SelectWidget}\n\te.stopPropagation();\n};\n\n/**\n * @inheritDoc OO.ui.OptionWidget\n */\nve.ui.MWTransclusionOutlineParameterWidget.prototype.setSelected = function ( state ) {\n\t// Never uncheck a required parameter\n\tstate = state || this.checkbox.isDisabled();\n\n\tthis.checkbox.setSelected( state, true );\n\treturn ve.ui.MWTransclusionOutlineParameterWidget.super.prototype.setSelected.call( this, state );\n};\n\n/**\n * @param {boolean} state\n */\nve.ui.MWTransclusionOutlineParameterWidget.prototype.toggleActivePageIndicator = function ( state ) {\n\tthis.$element.toggleClass( 've-ui-mwTransclusionOutlineParameterWidget-activePage', state );\n};\n\n/**\n * @param {boolean} hasValue\n */\nve.ui.MWTransclusionOutlineParameterWidget.prototype.toggleHasValue = function ( hasValue ) {\n\tthis.$element.toggleClass( 've-ui-mwTransclusionOutlineParameterWidget-hasValue', hasValue );\n};\n\n/**\n * Custom method to scroll parameter into view respecting the sticky part that sits above\n *\n * @param {number} paddingTop\n */\nve.ui.MWTransclusionOutlineParameterWidget.prototype.ensureVisibility = function ( paddingTop ) {\n\t// make sure parameter is visible and scrolled underneath the sticky\n\tthis.scrollElementIntoView( { animate: false, padding: { top: paddingTop } } );\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlinePartWidget.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":3,"column":1,"nodeType":"Block","endLine":3,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":79,"column":1,"nodeType":"Block","endLine":79,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":89,"column":1,"nodeType":"Block","endLine":89,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":108,"column":1,"nodeType":"Block","endLine":108,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":117,"column":1,"nodeType":"Block","endLine":117,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":10,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Common base class for top-level items (a.k.a. \"parts\") in the template editor sidebar. Subclasses\n * should exist for all subclasses of {@see ve.dm.MWTransclusionPartModel}:\n * - {@see ve.dm.MWTemplateModel}\n * - {@see ve.dm.MWTemplatePlaceholderModel}\n * - {@see ve.dm.MWTransclusionContentModel}\n *\n * This is inspired by and meant to replace {@see OO.ui.DecoratedOptionWidget} in the context of the\n * template dialog. Also see {@see OO.ui.ButtonWidget} for inspiration.\n *\n * @abstract\n * @class\n * @extends OO.ui.Widget\n *\n * @constructor\n * @param {ve.dm.MWTransclusionPartModel} part\n * @param {Object} config\n * @param {string} [config.icon=''] Symbolic name of an icon, e.g. \"puzzle\" or \"wikiText\"\n * @param {string} config.label\n * @param {string} config.ariaDescriptionUnselected\n * @param {string} config.ariaDescriptionSelected\n * @param {string} config.ariaDescriptionSelectedSingle\n */\nve.ui.MWTransclusionOutlinePartWidget = function VeUiMWTransclusionOutlinePartWidget( part, config ) {\n\tthis.part = part;\n\n\t// Parent constructor\n\tve.ui.MWTransclusionOutlinePartWidget.super.call( this, ve.extendObject( config, {\n\t\tclasses: [ 've-ui-mwTransclusionOutlinePartWidget' ],\n\t\tdata: part.getId()\n\t} ) );\n\n\tthis.header = new ve.ui.MWTransclusionOutlineButtonWidget( config )\n\t\t.connect( this, {\n\t\t\tkeyPressed: 'onHeaderKeyPressed',\n\t\t\t// The array syntax is a way to call `this.emit( 'transclusionOutlineItemSelected', … )`.\n\t\t\tclick: [ 'emit', 'transclusionOutlineItemSelected', part.getId() ]\n\t\t} );\n\n\tif ( config.ariaDescriptionUnselected ) {\n\t\tthis.$ariaDescriptionUnselected = $( '<span>' )\n\t\t\t.text( config.ariaDescriptionUnselected )\n\t\t\t.addClass( 've-ui-mwTransclusionOutline-ariaHidden' );\n\n\t\tthis.$ariaDescriptionSelected = $( '<span>' )\n\t\t\t.text( config.ariaDescriptionSelected )\n\t\t\t.addClass( 've-ui-mwTransclusionOutline-ariaHidden' );\n\n\t\tthis.$ariaDescriptionSelectedSingle = $( '<span>' )\n\t\t\t.text( config.ariaDescriptionSelectedSingle )\n\t\t\t.addClass( 've-ui-mwTransclusionOutline-ariaHidden' );\n\n\t\tthis.header\n\t\t\t.setAriaDescribedBy( this.$ariaDescriptionUnselected )\n\t\t\t.$element.prepend(\n\t\t\t\tthis.$ariaDescriptionUnselected,\n\t\t\t\tthis.$ariaDescriptionSelected,\n\t\t\t\tthis.$ariaDescriptionSelectedSingle\n\t\t\t);\n\t}\n\n\tthis.transclusionModel = this.part.getTransclusion().connect( this, {\n\t\treplace: 'updateButtonAriaDescription'\n\t} );\n\n\tthis.$element.append( this.header.$element );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWTransclusionOutlinePartWidget, OO.ui.Widget );\n\n/* Events */\n\n/**\n * \"Soft\" selection with space.\n *\n * @event ve.ui.MWTransclusionOutlinePartWidget#transclusionPartSoftSelected\n * @param {string} partId Unique id of the {@see ve.dm.MWTransclusionPartModel}, e.g. something like\n *  \"part_1\".\n */\n\n/**\n * Triggered when the user interacts with any sidebar element in a meaningful way, and that should\n * be reflected in the content pane of the dialog. This includes e.g. selecting something that was\n * already selected.\n *\n * @event ve.ui.MWTransclusionOutlinePartWidget#transclusionOutlineItemSelected\n * @param {string} pageName Unique id of the {@see OO.ui.BookletLayout} page, e.g. something like\n *  \"part_1\" or \"part_1/param1\".\n * @param {boolean} [soft] If true, focus should stay in the sidebar. Defaults to false.\n */\n\n/* Methods */\n\n/**\n * @private\n * @param {number} key\n * @fires ve.ui.MWTransclusionOutlinePartWidget#transclusionPartSoftSelected\n */\nve.ui.MWTransclusionOutlinePartWidget.prototype.onHeaderKeyPressed = function ( key ) {\n\tif ( key === OO.ui.Keys.SPACE ) {\n\t\tthis.emit( 'transclusionPartSoftSelected', this.getData() );\n\t}\n};\n\n/**\n * Convenience method, modelled after {@see OO.ui.OptionWidget}, but this isn't one.\n *\n * @return {boolean}\n */\nve.ui.MWTransclusionOutlinePartWidget.prototype.isSelected = function () {\n\treturn this.header.isSelected();\n};\n\n/**\n * Convenience method, modelled after {@see OO.ui.OptionWidget}, but this isn't one.\n *\n * @param {boolean} state\n */\nve.ui.MWTransclusionOutlinePartWidget.prototype.setSelected = function ( state ) {\n\tif ( state !== this.isSelected() ) {\n\t\tthis.updateButtonAriaDescription( state );\n\t\tthis.header\n\t\t\t.setSelected( state )\n\t\t\t.setFlags( { progressive: state } );\n\t}\n};\n\n/**\n * @private\n * @param {boolean} state\n */\nve.ui.MWTransclusionOutlinePartWidget.prototype.updateButtonAriaDescription = function ( state ) {\n\tthis.header.setAriaDescribedBy( !state ? this.$ariaDescriptionUnselected :\n\t\t( this.transclusionModel.isSingleTemplate() ? this.$ariaDescriptionSelectedSingle : this.$ariaDescriptionSelected )\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlinePlaceholderWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlineToggleUnusedWidget.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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlineWidget.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":30,"column":1,"nodeType":"Block","endLine":30,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":38,"column":1,"nodeType":"Block","endLine":38,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":150,"column":1,"nodeType":"Block","endLine":150,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":188,"column":1,"nodeType":"Block","endLine":188,"endColumn":1},{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc inline tag name \"see\"","line":206,"column":1,"nodeType":"Block","endLine":206,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Container for the entire transclusion dialog sidebar, may contain a single or\n * multiple templates or raw wikitext snippets.\n *\n * @class\n * @extends OO.ui.Widget\n *\n * @constructor\n * @property {Object.<string,ve.ui.MWTransclusionOutlinePartWidget>} partWidgets Map of top-level\n *  items currently visible in this container, indexed by part id\n */\nve.ui.MWTransclusionOutlineWidget = function VeUiMWTransclusionOutlineWidget() {\n\t// Parent constructor\n\tve.ui.MWTransclusionOutlineWidget.super.call( this, {\n\t\tclasses: [ 've-ui-mwTransclusionOutlineWidget' ]\n\t} );\n\n\t// Initialization\n\tthis.partWidgets = {};\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWTransclusionOutlineWidget, OO.ui.Widget );\n\n/* Events */\n\n/**\n * @event ve.ui.MWTransclusionOutlineWidget#filterPagesByName\n * @param {Object.<string,boolean>} visibility Keyed by unique id of the {@see OO.ui.BookletLayout}\n *  page, e.g. something like \"part_1/param1\".\n */\n\n/**\n * Respond to the intent to select a sidebar item\n *\n * @event ve.ui.MWTransclusionOutlineWidget#sidebarItemSelected\n * @param {string} pageName Unique id of the {@see OO.ui.BookletLayout} page, e.g. something like\n *  \"part_1\" or \"part_1/param1\".\n * @param {boolean} [soft] If true, don't focus the content pane.  Defaults to false.\n */\n\n/* Methods */\n\n/**\n * @param {ve.dm.MWTransclusionPartModel|null} removed Removed part\n * @param {ve.dm.MWTransclusionPartModel|null} added Added part\n * @param {number} [newPosition]\n */\nve.ui.MWTransclusionOutlineWidget.prototype.onReplacePart = function ( removed, added, newPosition ) {\n\tif ( removed ) {\n\t\tthis.removePartWidget( removed );\n\t}\n\tif ( added ) {\n\t\tthis.addPartWidget( added, newPosition, removed );\n\t}\n};\n\n/**\n * Handle spacebar in a part header\n *\n * @param {string} pageName\n * @fires ve.ui.MWTransclusionOutlineWidget#sidebarItemSelected\n */\nve.ui.MWTransclusionOutlineWidget.prototype.onTransclusionPartSoftSelected = function ( pageName ) {\n\tthis.emit( 'sidebarItemSelected', pageName, true );\n};\n\n/**\n * @private\n * @param {ve.dm.MWTransclusionPartModel} part\n */\nve.ui.MWTransclusionOutlineWidget.prototype.removePartWidget = function ( part ) {\n\tconst id = part.getId();\n\tif ( id in this.partWidgets ) {\n\t\tthis.partWidgets[ id ]\n\t\t\t.disconnect( this )\n\t\t\t.$element.remove();\n\t\tdelete this.partWidgets[ id ];\n\t}\n};\n\n/**\n * @private\n * @param {ve.dm.MWTransclusionPartModel} part\n * @param {number} [newPosition]\n * @param {ve.dm.MWTransclusionPartModel|null} [removed]\n * @fires ve.ui.MWTransclusionOutlineWidget#filterPagesByName\n */\nve.ui.MWTransclusionOutlineWidget.prototype.addPartWidget = function ( part, newPosition, removed ) {\n\tconst keys = Object.keys( this.partWidgets ),\n\t\tonlyPart = keys.length === 1 && this.partWidgets[ keys[ 0 ] ];\n\tif ( onlyPart instanceof ve.ui.MWTransclusionOutlineTemplateWidget ) {\n\t\t// To recalculate the height of the sticky header when we enter multi-part mode\n\t\tonlyPart.recalculateStickyHeaderHeight();\n\t}\n\n\tlet widget;\n\tif ( part instanceof ve.dm.MWTemplateModel ) {\n\t\twidget = new ve.ui.MWTransclusionOutlineTemplateWidget( part, removed instanceof ve.dm.MWTemplatePlaceholderModel );\n\t\t// This forwards events from the nested ve.ui.MWTransclusionOutlineTemplateWidget upwards.\n\t\twidget.connect( this, {\n\t\t\tfilterParametersById: 'onFilterParametersByName'\n\t\t} );\n\t} else if ( part instanceof ve.dm.MWTemplatePlaceholderModel ) {\n\t\twidget = new ve.ui.MWTransclusionOutlinePlaceholderWidget( part );\n\t} else if ( part instanceof ve.dm.MWTransclusionContentModel ) {\n\t\twidget = new ve.ui.MWTransclusionOutlineWikitextWidget( part );\n\t}\n\n\twidget.connect( this, {\n\t\ttransclusionPartSoftSelected: 'onTransclusionPartSoftSelected',\n\t\ttransclusionOutlineItemSelected: [ 'emit', 'sidebarItemSelected' ]\n\t} );\n\n\tthis.partWidgets[ part.getId() ] = widget;\n\tif ( typeof newPosition === 'number' && newPosition < this.$element.children().length ) {\n\t\tthis.$element.children().eq( newPosition ).before( widget.$element );\n\t} else {\n\t\tthis.$element.append( widget.$element );\n\t}\n\n\tif ( widget instanceof ve.ui.MWTransclusionOutlineTemplateWidget ) {\n\t\t// We can do this only after the widget is visible on screen\n\t\twidget.recalculateStickyHeaderHeight();\n\t}\n};\n\nve.ui.MWTransclusionOutlineWidget.prototype.hideAllUnusedParameters = function () {\n\tfor ( const id in this.partWidgets ) {\n\t\tconst partWidget = this.partWidgets[ id ];\n\t\tif ( partWidget instanceof ve.ui.MWTransclusionOutlineTemplateWidget &&\n\t\t\tpartWidget.toggleUnusedWidget\n\t\t) {\n\t\t\tpartWidget.toggleUnusedWidget.toggleUnusedParameters( false );\n\t\t}\n\t}\n};\n\nve.ui.MWTransclusionOutlineWidget.prototype.initializeAllStickyHeaderHeights = function () {\n\tfor ( const id in this.partWidgets ) {\n\t\tconst partWidget = this.partWidgets[ id ];\n\t\tif ( partWidget instanceof ve.ui.MWTransclusionOutlineTemplateWidget ) {\n\t\t\tpartWidget.recalculateStickyHeaderHeight();\n\t\t}\n\t}\n};\n\n/**\n * This is inspired by {@see OO.ui.SelectWidget.selectItem}, but isn't one.\n *\n * @param {string} [pageName] Symbolic name of page. Omit to remove current selection.\n */\nve.ui.MWTransclusionOutlineWidget.prototype.setSelectionByPageName = function ( pageName ) {\n\tconst selectedPartId = pageName ? pageName.split( '/', 1 )[ 0 ] : null,\n\t\tisParameter = pageName ? pageName.length > selectedPartId.length : false;\n\n\tfor ( const partId in this.partWidgets ) {\n\t\tconst partWidget = this.partWidgets[ partId ],\n\t\t\tselected = partId === pageName;\n\n\t\tpartWidget.setSelected( selected );\n\t\tif ( selected && !isParameter ) {\n\t\t\tpartWidget.scrollElementIntoView();\n\t\t}\n\n\t\tif ( partWidget instanceof ve.ui.MWTransclusionOutlineTemplateWidget ) {\n\t\t\tconst selectedParamName = ( partId === selectedPartId && isParameter ) ?\n\t\t\t\tpageName.slice( selectedPartId.length + 1 ) : null;\n\t\t\tpartWidget.setParameter( selectedParamName );\n\t\t}\n\t}\n};\n\n/**\n * @param {string} pageName\n * @param {boolean} hasValue\n */\nve.ui.MWTransclusionOutlineWidget.prototype.toggleHasValueByPageName = function ( pageName, hasValue ) {\n\tconst idParts = pageName.split( '/', 2 ),\n\t\ttemplatePartWidget = this.partWidgets[ idParts[ 0 ] ];\n\n\ttemplatePartWidget.toggleHasValue( idParts[ 1 ], hasValue );\n};\n\n/**\n * Checks if the provided DOM element belongs to the DOM structure of one of the top-level\n * {@see ve.ui.MWTransclusionOutlinePartWidget}s, and returns its id. Useful for e.g. mouse click or\n * keyboard handlers.\n *\n * @param {HTMLElement} element\n * @return {string|undefined} Always a top-level part id, e.g. \"part_0\"\n */\nve.ui.MWTransclusionOutlineWidget.prototype.findPartIdContainingElement = function ( element ) {\n\tif ( element ) {\n\t\tfor ( const id in this.partWidgets ) {\n\t\t\tconst part = this.partWidgets[ id ];\n\t\t\tif ( $.contains( part.$element[ 0 ], element ) ) {\n\t\t\t\treturn id;\n\t\t\t}\n\t\t}\n\t}\n};\n\n/**\n * Removes all {@see ve.ui.MWTransclusionOutlinePartWidget}, i.e. empties the list.\n */\nve.ui.MWTransclusionOutlineWidget.prototype.clear = function () {\n\tfor ( const id in this.partWidgets ) {\n\t\tthis.partWidgets[ id ]\n\t\t\t.disconnect( this )\n\t\t\t.$element.remove();\n\t}\n\tthis.partWidgets = {};\n};\n\n/**\n * @private\n * @param {Object.<string,boolean>} visibility\n * @fires ve.ui.MWTransclusionOutlineWidget#filterPagesByName\n */\nve.ui.MWTransclusionOutlineWidget.prototype.onFilterParametersByName = function ( visibility ) {\n\tthis.emit( 'filterPagesByName', visibility );\n\tthis.setSelectionByPageName();\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":"implicit-arrow-linebreak","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-mw/ui/widgets/ve.ui.MWTransclusionOutlineWikitextWidget.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":"implicit-arrow-linebreak","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-mw/ve.track.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":"implicit-arrow-linebreak","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":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","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/package.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":"implicit-arrow-linebreak","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/api-testing/edit.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":"implicit-arrow-linebreak","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/.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":"implicit-arrow-linebreak","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/package.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":"implicit-arrow-linebreak","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/pageobjects/edit.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":"implicit-arrow-linebreak","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/content_editable.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":"implicit-arrow-linebreak","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/toolbar.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":"implicit-arrow-linebreak","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":"implicit-arrow-linebreak","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 ---
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-reduce' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-toarray' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-toarray' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in modules/ve-mw/dm/.eslintrc.json) on modules/ve-mw/dm/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in modules/ve-mw/dm/.eslintrc.json) on modules/ve-mw/dm/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in modules/ve-mw/dm/.eslintrc.json) on modules/ve-mw/dm/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in modules/ve-mw/dm/.eslintrc.json) on modules/ve-mw/dm/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-toarray' (broken in modules/ve-mw/dm/.eslintrc.json) on modules/ve-mw/dm/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-toarray' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-toarray' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-reduce' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-toarray' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in modules/ve-mw/preinit/.eslintrc.json) on modules/ve-mw/preinit/.eslintrc.json
Disabling eslint rule 'mediawiki/no-storage' (broken in modules/ve-mw/tests/.eslintrc.json) on modules/ve-mw/tests/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-toarray' (broken in modules/ve-mw/tests/.eslintrc.json) on modules/ve-mw/tests/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-every' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'es-x/no-iterator-prototype-some' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in modules/.eslintrc.json) on modules/.eslintrc.json
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated lodash.isequal@4.5.0: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
npm WARN deprecated glob@8.1.0: Glob versions prior to v9 are 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 node-domexception@1.0.0: Use your platform's native DOMException instead
--- stdout ---

added 1044 packages, and audited 1045 packages in 21s

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

12 vulnerabilities (1 low, 9 moderate, 2 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

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

> visualeditor@0.0.0 test
> grunt test && node build/checkModules.js && npm run minify-svg

Running "tyops:src" (tyops) task
>> No typos found; 468 files checked for 21 typos.

Running "eslint:all" (eslint) task

/src/repo/build/screenshots.js
  97:6  warning  Found writeFile from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/editcheck/modules/EditCheckAction.js
   50:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  239:9   warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  241:10  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  314:10  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some

/src/repo/editcheck/modules/EditCheckActionWidget.js
  109:1  warning  The type 'jQuery.Event' is undefined    jsdoc/no-undefined-types
  146:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/editcheck/modules/EditCheckGutterSectionWidget.js
  132:14  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/editcheck/modules/controller.js
  158:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  192:19  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  204:1   warning  The type 'Controller.position' is undefined            jsdoc/no-undefined-types
  215:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  256:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  300:53  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  301:60  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  321:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  347:1   warning  The type 'Controller.focusAction' is undefined         jsdoc/no-undefined-types
  348:1   warning  The type 'Controller.position' is undefined            jsdoc/no-undefined-types
  406:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  407:1   warning  The type 'Controller.focusAction' is undefined         jsdoc/no-undefined-types
  430:16  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  823:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  838:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types

/src/repo/editcheck/modules/dialogs/EditCheckDialog.js
   60:24  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
   68:20  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  163:9   warning  ES2025 'Iterator.prototype.some' method is forbidden                                                        es-x/no-iterator-prototype-some
  328:1   warning  The type 'jQuery.Promise' is undefined                                                                      jsdoc/no-undefined-types
  343:1   warning  The type 'jQuery.Promise' is undefined                                                                      jsdoc/no-undefined-types

/src/repo/editcheck/modules/dialogs/GutterSidebarEditCheckDialog.js
  151:5  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/editcheck/modules/editchecks/BaseEditCheck.js
  148:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  327:3   warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  432:10  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  536:24  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some

/src/repo/editcheck/modules/editchecks/experimental/ExternalLinksEditCheck.js
  41:4  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/editcheck/modules/editchecks/experimental/TextMatchEditCheck.js
  101:12  warning  ES2025 'Iterator.prototype.reduce' method is forbidden                                 es-x/no-iterator-prototype-reduce
  118:10  warning  ES2025 'Iterator.prototype.some' method is forbidden                                   es-x/no-iterator-prototype-some
  144:25  warning  ES2025 'Iterator.prototype.some' method is forbidden                                   es-x/no-iterator-prototype-some
  252:1   warning  The type 'jQuery.Promise' is undefined                                                 jsdoc/no-undefined-types
  274:9   warning  ES2025 'Iterator.prototype.every' method is forbidden                                  es-x/no-iterator-prototype-every
  276:10  warning  ES2025 'Iterator.prototype.some' method is forbidden                                   es-x/no-iterator-prototype-some
  308:1   warning  Expected @param names to be "item, id, collator". Got "matchItem, item, id, collator"  jsdoc/check-param-names
  309:1   warning  Missing JSDoc @param "item" type                                                       jsdoc/require-param-type
  311:1   warning  The type 'Collator' is undefined                                                       jsdoc/no-undefined-types

/src/repo/editcheck/modules/init.js
  102:25  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
  110:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types
  140:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
  140:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types
  168:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWSignatureNode.js
  145:11  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWTableNode.js
  123:24  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
  199:1  warning  The type 'jQuery.Deferred' is undefined                  jsdoc/no-undefined-types
  258:9  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  264:1  warning  The type 'jQuery.Deferred' is undefined                  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/dm/models/ve.dm.MWParameterModel.js
   11:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   11:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   21:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  104:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTemplateModel.js
   10:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  130:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  158:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  249:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  249:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  314:22  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTemplatePlaceholderModel.js
  10:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTemplateSpecModel.js
   89:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  171:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  213:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  247:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  275:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  275:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  439:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionContentModel.js
  10:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js
   18:1   warning  The type 'jQuery.Deferred' is undefined                jsdoc/no-undefined-types
   43:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
   88:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  171:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  326:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  393:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  444:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  469:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  502:10  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  590:10  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionPartModel.js
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  74:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  74:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
  317:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
  220:10  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  456:9   warning  ES2025 'Iterator.prototype.some' method is forbidden     es-x/no-iterator-prototype-some
  489:1   warning  Invalid JSDoc inline tag name "see"                      jsdoc/check-tag-names

/src/repo/modules/ve-mw/init/apiresponsecache/ve.init.mw.ApiResponseCache.js
   74:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  136:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/targets/ve.init.mw.ArticleTarget.js
   870:2  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  1016:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1100:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1101:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1279:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1312:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1361:1  warning  The type 'jQuery.Deferred' is undefined                  jsdoc/no-undefined-types
  1488:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1590:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1677:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1819:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2274:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2306:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2374:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2464:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js
   58:27  warning  ES2025 'Iterator.prototype.reduce' method is forbidden   es-x/no-iterator-prototype-reduce
   58:27  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  387:1   warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  389:1   warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  827:1   warning  The type 'jQuery.Event' is undefined                     jsdoc/no-undefined-types
  893:1   warning  The type 'jQuery.Event' is undefined                     jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/targets/ve.init.mw.Target.js
  526:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  564:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  606:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/ve.init.mw.Platform.js
  109:9  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray

/src/repo/modules/ve-mw/init/ve.init.mw.ViewportZoomHandler.js
  106:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types
  119:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types
  128:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/preinit/ve.init.mw.ArticleTargetLoader.js
  116:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  239:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  319:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  513:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/preinit/ve.init.mw.ArticleTargetSaver.js
   33:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  119:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  133:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  156:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  172:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  215:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js
   252:1   warning  The type 'jQuery.Event' is undefined                   jsdoc/no-undefined-types
   282:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
   411:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
   573:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  1077:1   warning  The type 'jQuery.Event' is undefined                   jsdoc/no-undefined-types
  1180:1   warning  The type 'jQuery.Event' is undefined                   jsdoc/no-undefined-types
  1367:10  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/modules/ve-mw/preinit/ve.init.mw.DiffLoader.js
  48:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  49:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  81:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  82:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  83:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  86:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/tests/init/targets/ve.init.mw.DesktopArticleTarget.test.js
  143:35  warning  Avoid direct access to sessionStorage. Use mw.storage.session instead  mediawiki/no-storage

/src/repo/modules/ve-mw/tests/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.test.js
  21:1  warning  The type 'QUnit.Assert' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/tests/ve.test.utils.js
  45:10  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWExtensionDialog.js
  113:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWFloatingHelpDialog.js
  9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWGalleryDialog.js
  618:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js
  747:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js
   95:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types
  134:1  warning  The type 'jQuery.Promise' is undefined   jsdoc/no-undefined-types
  135:1  warning  The type 'jQuery.Promise' is undefined   jsdoc/no-undefined-types
  418:1  warning  The type 'jQuery.Promise' is undefined   jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTemplateDialog.js
   12:1  warning  Invalid JSDoc inline tag name "see"      jsdoc/check-tag-names
   12:1  warning  Invalid JSDoc inline tag name "see"      jsdoc/check-tag-names
   52:1  warning  Invalid JSDoc inline tag name "see"      jsdoc/check-tag-names
  312:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTransclusionDialog.js
   13:1  warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  151:1  warning  The type 'jQuery.Event' is undefined                  jsdoc/no-undefined-types
  266:1  warning  The type 'jQuery.Event' is undefined                  jsdoc/no-undefined-types
  302:3  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some
  437:1  warning  The type 'jQuery.Promise' is undefined                jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/elements/ve.ui.MWExpandableErrorElement.js
  33:16  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget

/src/repo/modules/ve-mw/ui/inspectors/ve.ui.MWLinkAnnotationInspector.js
  208:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js
    2:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  102:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  171:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWAdvancedSettingsPage.js
  194:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWCategoriesPage.js
  227:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js
  124:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js
  282:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/tools/ve.ui.MWPopupTool.js
  58:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/ve.ui.MWWikitextDataTransferHandlerFactory.js
  56:73  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryPopupWidget.js
   31:22  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  101:1   warning  The type 'jQuery.Event' is undefined                                                                        jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js
  295:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  367:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWEditSummaryWidget.js
  132:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWEducationPopupWidget.js
  95:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWExternalLinkAnnotationWidget.js
  81:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWGalleryItemWidget.js
  92:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js
  203:27  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some
  221:56  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineButtonWidget.js
   3:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  63:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  68:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineControlsWidget.js
  23:27  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  28:27  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  33:18  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  39:20  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  45:22  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterSelectWidget.js
    5:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
   52:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  195:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterWidget.js
   3:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
   3:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  56:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlinePartWidget.js
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   79:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   89:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  108:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  117:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineWidget.js
   30:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   38:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  150:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  188:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  206:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

✖ 217 problems (0 errors, 217 warnings)


Running "stylelint:all" (stylelint) task
>> editcheck/modules/EditCheck.less
>>   113:2  ⚠  Unexpected browser feature "flexbox-gap" is not supported by Safari 12,13,14,11.1,12.1,13.1, Safari on iOS 11.3-11.4,12.0-12.1,12.2-12.5,13.0-13.1,13.2,13.3,13.4-13.7,14.0-14.4  plugin/no-unsupported-browser-features
>> 
>> ⚠ 1 problem (0 errors, 1 warning)

⚠ 1 warning

>> Linted 85 files without errors

Running "banana:VisualEditor" (banana) task
>> 7 message directories checked.

Done.
No missing files.


> visualeditor@0.0.0 minify-svg
> svgo --config=.svgo.config.js -q -r -f images/


--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "@jimp/core": {
      "name": "@jimp/core",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "phin"
      ],
      "effects": [
        "@jimp/custom"
      ],
      "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0",
      "nodes": [
        "node_modules/@jimp/core"
      ],
      "fixAvailable": {
        "name": "jimp",
        "version": "1.6.0",
        "isSemVerMajor": true
      }
    },
    "@jimp/custom": {
      "name": "@jimp/custom",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "@jimp/core"
      ],
      "effects": [
        "jimp"
      ],
      "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0",
      "nodes": [
        "node_modules/@jimp/custom"
      ],
      "fixAvailable": {
        "name": "jimp",
        "version": "1.6.0",
        "isSemVerMajor": true
      }
    },
    "form-data": {
      "name": "form-data",
      "severity": "critical",
      "isDirect": false,
      "via": [
        {
          "source": 1109540,
          "name": "form-data",
          "dependency": "form-data",
          "title": "form-data uses unsafe random function in form-data for choosing boundary",
          "url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4",
          "severity": "critical",
          "cwe": [
            "CWE-330"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<2.5.4"
        }
      ],
      "effects": [
        "request"
      ],
      "range": "<2.5.4",
      "nodes": [
        "node_modules/form-data"
      ],
      "fixAvailable": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "jimp": {
      "name": "jimp",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "@jimp/custom"
      ],
      "effects": [],
      "range": "0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0",
      "nodes": [
        "node_modules/jimp"
      ],
      "fixAvailable": {
        "name": "jimp",
        "version": "1.6.0",
        "isSemVerMajor": true
      }
    },
    "mwbot": {
      "name": "mwbot",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "request"
      ],
      "effects": [
        "wdio-mediawiki"
      ],
      "range": ">=0.1.6",
      "nodes": [
        "node_modules/mwbot"
      ],
      "fixAvailable": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "phin": {
      "name": "phin",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096967,
          "name": "phin",
          "dependency": "phin",
          "title": "phin may include sensitive headers in subsequent requests after redirect",
          "url": "https://github.com/advisories/GHSA-x565-32qp-m3vf",
          "severity": "moderate",
          "cwe": [
            "CWE-200"
          ],
          "cvss": {
            "score": 4.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N"
          },
          "range": "<3.7.1"
        }
      ],
      "effects": [
        "@jimp/core"
      ],
      "range": "<3.7.1",
      "nodes": [
        "node_modules/phin"
      ],
      "fixAvailable": {
        "name": "jimp",
        "version": "1.6.0",
        "isSemVerMajor": true
      }
    },
    "request": {
      "name": "request",
      "severity": "critical",
      "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"
        },
        "form-data",
        "tough-cookie"
      ],
      "effects": [
        "mwbot"
      ],
      "range": "*",
      "nodes": [
        "node_modules/request"
      ],
      "fixAvailable": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "selenium-webdriver": {
      "name": "selenium-webdriver",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "tmp",
        "xml2js"
      ],
      "effects": [],
      "range": "2.43.1 - 4.0.0-rc-2",
      "nodes": [
        "node_modules/selenium-webdriver"
      ],
      "fixAvailable": {
        "name": "selenium-webdriver",
        "version": "4.38.0",
        "isSemVerMajor": true
      }
    },
    "tmp": {
      "name": "tmp",
      "severity": "low",
      "isDirect": false,
      "via": [
        {
          "source": 1109537,
          "name": "tmp",
          "dependency": "tmp",
          "title": "tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter",
          "url": "https://github.com/advisories/GHSA-52f5-9888-hmc6",
          "severity": "low",
          "cwe": [
            "CWE-59"
          ],
          "cvss": {
            "score": 2.5,
            "vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"
          },
          "range": "<=0.2.3"
        }
      ],
      "effects": [],
      "range": "<=0.2.3",
      "nodes": [
        "node_modules/tmp"
      ],
      "fixAvailable": true
    },
    "tough-cookie": {
      "name": "tough-cookie",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1097682,
          "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": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "wdio-mediawiki": {
      "name": "wdio-mediawiki",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "mwbot"
      ],
      "effects": [],
      "range": "<=5.1.0",
      "nodes": [
        "node_modules/wdio-mediawiki"
      ],
      "fixAvailable": {
        "name": "wdio-mediawiki",
        "version": "6.0.0",
        "isSemVerMajor": true
      }
    },
    "xml2js": {
      "name": "xml2js",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096693,
          "name": "xml2js",
          "dependency": "xml2js",
          "title": "xml2js is vulnerable to prototype pollution",
          "url": "https://github.com/advisories/GHSA-776f-qx25-q3cc",
          "severity": "moderate",
          "cwe": [
            "CWE-1321"
          ],
          "cvss": {
            "score": 5.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
          },
          "range": "<0.5.0"
        }
      ],
      "effects": [
        "selenium-webdriver"
      ],
      "range": "<0.5.0",
      "nodes": [
        "node_modules/xml2js"
      ],
      "fixAvailable": {
        "name": "selenium-webdriver",
        "version": "4.38.0",
        "isSemVerMajor": true
      }
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 1,
      "moderate": 9,
      "high": 0,
      "critical": 2,
      "total": 12
    },
    "dependencies": {
      "prod": 1,
      "dev": 1069,
      "optional": 37,
      "peer": 1,
      "peerOptional": 0,
      "total": 1069
    }
  }
}

--- 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": 25,
  "removed": 0,
  "changed": 0,
  "audited": 1070,
  "funding": 209,
  "audit": {
    "auditReportVersion": 2,
    "vulnerabilities": {
      "@jimp/core": {
        "name": "@jimp/core",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          "phin"
        ],
        "effects": [
          "@jimp/custom"
        ],
        "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0",
        "nodes": [
          "node_modules/@jimp/core"
        ],
        "fixAvailable": {
          "name": "jimp",
          "version": "1.6.0",
          "isSemVerMajor": true
        }
      },
      "@jimp/custom": {
        "name": "@jimp/custom",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          "@jimp/core"
        ],
        "effects": [
          "jimp"
        ],
        "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0",
        "nodes": [
          "node_modules/@jimp/custom"
        ],
        "fixAvailable": {
          "name": "jimp",
          "version": "1.6.0",
          "isSemVerMajor": true
        }
      },
      "form-data": {
        "name": "form-data",
        "severity": "critical",
        "isDirect": false,
        "via": [
          {
            "source": 1109540,
            "name": "form-data",
            "dependency": "form-data",
            "title": "form-data uses unsafe random function in form-data for choosing boundary",
            "url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4",
            "severity": "critical",
            "cwe": [
              "CWE-330"
            ],
            "cvss": {
              "score": 0,
              "vectorString": null
            },
            "range": "<2.5.4"
          }
        ],
        "effects": [
          "request"
        ],
        "range": "<2.5.4",
        "nodes": [
          "node_modules/form-data"
        ],
        "fixAvailable": {
          "name": "wdio-mediawiki",
          "version": "6.0.0",
          "isSemVerMajor": true
        }
      },
      "jimp": {
        "name": "jimp",
        "severity": "moderate",
        "isDirect": true,
        "via": [
          "@jimp/custom"
        ],
        "effects": [],
        "range": "0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0",
        "nodes": [
          "node_modules/jimp"
        ],
        "fixAvailable": {
          "name": "jimp",
          "version": "1.6.0",
          "isSemVerMajor": true
        }
      },
      "mwbot": {
        "name": "mwbot",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          "request"
        ],
        "effects": [
          "wdio-mediawiki"
        ],
        "range": ">=0.1.6",
        "nodes": [
          "node_modules/mwbot"
        ],
        "fixAvailable": {
          "name": "wdio-mediawiki",
          "version": "6.0.0",
          "isSemVerMajor": true
        }
      },
      "phin": {
        "name": "phin",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          {
            "source": 1096967,
            "name": "phin",
            "dependency": "phin",
            "title": "phin may include sensitive headers in subsequent requests after redirect",
            "url": "https://github.com/advisories/GHSA-x565-32qp-m3vf",
            "severity": "moderate",
            "cwe": [
              "CWE-200"
            ],
            "cvss": {
              "score": 4.3,
              "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N"
            },
            "range": "<3.7.1"
          }
        ],
        "effects": [
          "@jimp/core"
        ],
        "range": "<3.7.1",
        "nodes": [
          "node_modules/phin"
        ],
        "fixAvailable": {
          "name": "jimp",
          "version": "1.6.0",
          "isSemVerMajor": true
        }
      },
      "request": {
        "name": "request",
        "severity": "critical",
        "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"
          },
          "form-data",
          "tough-cookie"
        ],
        "effects": [
          "mwbot"
        ],
        "range": "*",
        "nodes": [
          "node_modules/request"
        ],
        "fixAvailable": {
          "name": "wdio-mediawiki",
          "version": "6.0.0",
          "isSemVerMajor": true
        }
      },
      "selenium-webdriver": {
        "name": "selenium-webdriver",
        "severity": "moderate",
        "isDirect": true,
        "via": [
          "tmp",
          "xml2js"
        ],
        "effects": [],
        "range": "2.43.1 - 4.0.0-rc-2",
        "nodes": [
          "node_modules/selenium-webdriver"
        ],
        "fixAvailable": {
          "name": "selenium-webdriver",
          "version": "4.38.0",
          "isSemVerMajor": true
        }
      },
      "tmp": {
        "name": "tmp",
        "severity": "low",
        "isDirect": false,
        "via": [
          {
            "source": 1109537,
            "name": "tmp",
            "dependency": "tmp",
            "title": "tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter",
            "url": "https://github.com/advisories/GHSA-52f5-9888-hmc6",
            "severity": "low",
            "cwe": [
              "CWE-59"
            ],
            "cvss": {
              "score": 2.5,
              "vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"
            },
            "range": "<=0.2.3"
          }
        ],
        "effects": [],
        "range": "<=0.2.3",
        "nodes": [
          "node_modules/tmp"
        ],
        "fixAvailable": true
      },
      "tough-cookie": {
        "name": "tough-cookie",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          {
            "source": 1097682,
            "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": {
          "name": "wdio-mediawiki",
          "version": "6.0.0",
          "isSemVerMajor": true
        }
      },
      "wdio-mediawiki": {
        "name": "wdio-mediawiki",
        "severity": "moderate",
        "isDirect": true,
        "via": [
          "mwbot"
        ],
        "effects": [],
        "range": "<=5.1.0",
        "nodes": [
          "node_modules/wdio-mediawiki"
        ],
        "fixAvailable": {
          "name": "wdio-mediawiki",
          "version": "6.0.0",
          "isSemVerMajor": true
        }
      },
      "xml2js": {
        "name": "xml2js",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          {
            "source": 1096693,
            "name": "xml2js",
            "dependency": "xml2js",
            "title": "xml2js is vulnerable to prototype pollution",
            "url": "https://github.com/advisories/GHSA-776f-qx25-q3cc",
            "severity": "moderate",
            "cwe": [
              "CWE-1321"
            ],
            "cvss": {
              "score": 5.3,
              "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
            },
            "range": "<0.5.0"
          }
        ],
        "effects": [
          "selenium-webdriver"
        ],
        "range": "<0.5.0",
        "nodes": [
          "node_modules/xml2js"
        ],
        "fixAvailable": {
          "name": "selenium-webdriver",
          "version": "4.38.0",
          "isSemVerMajor": true
        }
      }
    },
    "metadata": {
      "vulnerabilities": {
        "info": 0,
        "low": 1,
        "moderate": 9,
        "high": 0,
        "critical": 2,
        "total": 12
      },
      "dependencies": {
        "prod": 1,
        "dev": 1069,
        "optional": 37,
        "peer": 1,
        "peerOptional": 0,
        "total": 1069
      }
    }
  }
}

--- end ---
{"added": 25, "removed": 0, "changed": 0, "audited": 1070, "funding": 209, "audit": {"auditReportVersion": 2, "vulnerabilities": {"@jimp/core": {"name": "@jimp/core", "severity": "moderate", "isDirect": false, "via": ["phin"], "effects": ["@jimp/custom"], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": ["node_modules/@jimp/core"], "fixAvailable": {"name": "jimp", "version": "1.6.0", "isSemVerMajor": true}}, "@jimp/custom": {"name": "@jimp/custom", "severity": "moderate", "isDirect": false, "via": ["@jimp/core"], "effects": ["jimp"], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": ["node_modules/@jimp/custom"], "fixAvailable": {"name": "jimp", "version": "1.6.0", "isSemVerMajor": true}}, "form-data": {"name": "form-data", "severity": "critical", "isDirect": false, "via": [{"source": 1109540, "name": "form-data", "dependency": "form-data", "title": "form-data uses unsafe random function in form-data for choosing boundary", "url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4", "severity": "critical", "cwe": ["CWE-330"], "cvss": {"score": 0, "vectorString": null}, "range": "<2.5.4"}], "effects": ["request"], "range": "<2.5.4", "nodes": ["node_modules/form-data"], "fixAvailable": {"name": "wdio-mediawiki", "version": "6.0.0", "isSemVerMajor": true}}, "jimp": {"name": "jimp", "severity": "moderate", "isDirect": true, "via": ["@jimp/custom"], "effects": [], "range": "0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": ["node_modules/jimp"], "fixAvailable": {"name": "jimp", "version": "1.6.0", "isSemVerMajor": true}}, "mwbot": {"name": "mwbot", "severity": "moderate", "isDirect": false, "via": ["request"], "effects": ["wdio-mediawiki"], "range": ">=0.1.6", "nodes": ["node_modules/mwbot"], "fixAvailable": {"name": "wdio-mediawiki", "version": "6.0.0", "isSemVerMajor": true}}, "phin": {"name": "phin", "severity": "moderate", "isDirect": false, "via": [{"source": 1096967, "name": "phin", "dependency": "phin", "title": "phin may include sensitive headers in subsequent requests after redirect", "url": "https://github.com/advisories/GHSA-x565-32qp-m3vf", "severity": "moderate", "cwe": ["CWE-200"], "cvss": {"score": 4.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N"}, "range": "<3.7.1"}], "effects": ["@jimp/core"], "range": "<3.7.1", "nodes": ["node_modules/phin"], "fixAvailable": {"name": "jimp", "version": "1.6.0", "isSemVerMajor": true}}, "request": {"name": "request", "severity": "critical", "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"}, "form-data", "tough-cookie"], "effects": ["mwbot"], "range": "*", "nodes": ["node_modules/request"], "fixAvailable": {"name": "wdio-mediawiki", "version": "6.0.0", "isSemVerMajor": true}}, "selenium-webdriver": {"name": "selenium-webdriver", "severity": "moderate", "isDirect": true, "via": ["tmp", "xml2js"], "effects": [], "range": "2.43.1 - 4.0.0-rc-2", "nodes": ["node_modules/selenium-webdriver"], "fixAvailable": {"name": "selenium-webdriver", "version": "4.38.0", "isSemVerMajor": true}}, "tmp": {"name": "tmp", "severity": "low", "isDirect": false, "via": [{"source": 1109537, "name": "tmp", "dependency": "tmp", "title": "tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter", "url": "https://github.com/advisories/GHSA-52f5-9888-hmc6", "severity": "low", "cwe": ["CWE-59"], "cvss": {"score": 2.5, "vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"}, "range": "<=0.2.3"}], "effects": [], "range": "<=0.2.3", "nodes": ["node_modules/tmp"], "fixAvailable": true}, "tough-cookie": {"name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [{"source": 1097682, "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": {"name": "wdio-mediawiki", "version": "6.0.0", "isSemVerMajor": true}}, "wdio-mediawiki": {"name": "wdio-mediawiki", "severity": "moderate", "isDirect": true, "via": ["mwbot"], "effects": [], "range": "<=5.1.0", "nodes": ["node_modules/wdio-mediawiki"], "fixAvailable": {"name": "wdio-mediawiki", "version": "6.0.0", "isSemVerMajor": true}}, "xml2js": {"name": "xml2js", "severity": "moderate", "isDirect": false, "via": [{"source": 1096693, "name": "xml2js", "dependency": "xml2js", "title": "xml2js is vulnerable to prototype pollution", "url": "https://github.com/advisories/GHSA-776f-qx25-q3cc", "severity": "moderate", "cwe": ["CWE-1321"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"}, "range": "<0.5.0"}], "effects": ["selenium-webdriver"], "range": "<0.5.0", "nodes": ["node_modules/xml2js"], "fixAvailable": {"name": "selenium-webdriver", "version": "4.38.0", "isSemVerMajor": true}}}, "metadata": {"vulnerabilities": {"info": 0, "low": 1, "moderate": 9, "high": 0, "critical": 2, "total": 12}, "dependencies": {"prod": 1, "dev": 1069, "optional": 37, "peer": 1, "peerOptional": 0, "total": 1069}}}}
$ /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 1045 packages in 6s

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

# npm audit report

form-data  <2.5.4
Severity: critical
form-data uses unsafe random function in form-data for choosing boundary - https://github.com/advisories/GHSA-fjxv-7rqg-78g4
fix available via `npm audit fix --force`
Will install wdio-mediawiki@6.0.0, which is a breaking change
node_modules/form-data
  request  *
  Depends on vulnerable versions of form-data
  Depends on vulnerable versions of tough-cookie
  node_modules/request
    mwbot  >=0.1.6
    Depends on vulnerable versions of request
    node_modules/mwbot
      wdio-mediawiki  <=5.1.0
      Depends on vulnerable versions of mwbot
      node_modules/wdio-mediawiki

phin  <3.7.1
Severity: moderate
phin may include sensitive headers in subsequent requests after redirect - https://github.com/advisories/GHSA-x565-32qp-m3vf
fix available via `npm audit fix --force`
Will install jimp@1.6.0, which is a breaking change
node_modules/phin
  @jimp/core  <=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0
  Depends on vulnerable versions of phin
  node_modules/@jimp/core
    @jimp/custom  <=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0
    Depends on vulnerable versions of @jimp/core
    node_modules/@jimp/custom
      jimp  0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0
      Depends on vulnerable versions of @jimp/custom
      node_modules/jimp


tmp  <=0.2.3
tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter - https://github.com/advisories/GHSA-52f5-9888-hmc6
fix available via `npm audit fix`
node_modules/tmp

tough-cookie  <4.1.3
Severity: moderate
tough-cookie Prototype Pollution vulnerability - https://github.com/advisories/GHSA-72xf-g2v4-qvf3
fix available via `npm audit fix --force`
Will install wdio-mediawiki@6.0.0, which is a breaking change
node_modules/tough-cookie

xml2js  <0.5.0
Severity: moderate
xml2js is vulnerable to prototype pollution - https://github.com/advisories/GHSA-776f-qx25-q3cc
fix available via `npm audit fix --force`
Will install selenium-webdriver@4.38.0, which is a breaking change
node_modules/xml2js
  selenium-webdriver  2.43.1 - 4.0.0-rc-2
  Depends on vulnerable versions of tmp
  Depends on vulnerable versions of xml2js
  node_modules/selenium-webdriver

12 vulnerabilities (1 low, 9 moderate, 2 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

--- end ---
Verifying that tests still pass
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated lodash.isequal@4.5.0: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
npm WARN deprecated glob@8.1.0: Glob versions prior to v9 are 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 node-domexception@1.0.0: Use your platform's native DOMException instead
--- stdout ---

added 1044 packages, and audited 1045 packages in 21s

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

12 vulnerabilities (1 low, 9 moderate, 2 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

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

> visualeditor@0.0.0 test
> grunt test && node build/checkModules.js && npm run minify-svg

Running "tyops:src" (tyops) task
>> No typos found; 468 files checked for 21 typos.

Running "eslint:all" (eslint) task

/src/repo/build/screenshots.js
  97:6  warning  Found writeFile from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/editcheck/modules/EditCheckAction.js
   50:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  239:9   warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  241:10  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  314:10  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some

/src/repo/editcheck/modules/EditCheckActionWidget.js
  109:1  warning  The type 'jQuery.Event' is undefined    jsdoc/no-undefined-types
  146:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/editcheck/modules/EditCheckGutterSectionWidget.js
  132:14  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/editcheck/modules/controller.js
  158:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  192:19  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  204:1   warning  The type 'Controller.position' is undefined            jsdoc/no-undefined-types
  215:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  256:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  300:53  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  301:60  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  321:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  347:1   warning  The type 'Controller.focusAction' is undefined         jsdoc/no-undefined-types
  348:1   warning  The type 'Controller.position' is undefined            jsdoc/no-undefined-types
  406:1   warning  The type 'Controller.actionsUpdated' is undefined      jsdoc/no-undefined-types
  407:1   warning  The type 'Controller.focusAction' is undefined         jsdoc/no-undefined-types
  430:16  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  823:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  838:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types

/src/repo/editcheck/modules/dialogs/EditCheckDialog.js
   60:24  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
   68:20  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  163:9   warning  ES2025 'Iterator.prototype.some' method is forbidden                                                        es-x/no-iterator-prototype-some
  328:1   warning  The type 'jQuery.Promise' is undefined                                                                      jsdoc/no-undefined-types
  343:1   warning  The type 'jQuery.Promise' is undefined                                                                      jsdoc/no-undefined-types

/src/repo/editcheck/modules/dialogs/GutterSidebarEditCheckDialog.js
  151:5  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/editcheck/modules/editchecks/BaseEditCheck.js
  148:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  327:3   warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  432:10  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some
  536:24  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some

/src/repo/editcheck/modules/editchecks/experimental/ExternalLinksEditCheck.js
  41:4  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/editcheck/modules/editchecks/experimental/TextMatchEditCheck.js
  101:12  warning  ES2025 'Iterator.prototype.reduce' method is forbidden                                 es-x/no-iterator-prototype-reduce
  118:10  warning  ES2025 'Iterator.prototype.some' method is forbidden                                   es-x/no-iterator-prototype-some
  144:25  warning  ES2025 'Iterator.prototype.some' method is forbidden                                   es-x/no-iterator-prototype-some
  252:1   warning  The type 'jQuery.Promise' is undefined                                                 jsdoc/no-undefined-types
  274:9   warning  ES2025 'Iterator.prototype.every' method is forbidden                                  es-x/no-iterator-prototype-every
  276:10  warning  ES2025 'Iterator.prototype.some' method is forbidden                                   es-x/no-iterator-prototype-some
  308:1   warning  Expected @param names to be "item, id, collator". Got "matchItem, item, id, collator"  jsdoc/check-param-names
  309:1   warning  Missing JSDoc @param "item" type                                                       jsdoc/require-param-type
  311:1   warning  The type 'Collator' is undefined                                                       jsdoc/no-undefined-types

/src/repo/editcheck/modules/init.js
  102:25  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
  110:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types
  140:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
  140:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types
  168:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWSignatureNode.js
  145:11  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWTableNode.js
  123:24  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
  199:1  warning  The type 'jQuery.Deferred' is undefined                  jsdoc/no-undefined-types
  258:9  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  264:1  warning  The type 'jQuery.Deferred' is undefined                  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/dm/models/ve.dm.MWParameterModel.js
   11:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   11:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   21:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  104:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTemplateModel.js
   10:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  130:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  158:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  249:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  249:1   warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  314:22  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTemplatePlaceholderModel.js
  10:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTemplateSpecModel.js
   89:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  171:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  213:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  247:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  275:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  275:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  439:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionContentModel.js
  10:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js
   18:1   warning  The type 'jQuery.Deferred' is undefined                jsdoc/no-undefined-types
   43:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
   88:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  171:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  326:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  393:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  444:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  469:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  502:10  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every
  590:10  warning  ES2025 'Iterator.prototype.some' method is forbidden   es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionPartModel.js
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  74:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  74:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
  317:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
  220:10  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  456:9   warning  ES2025 'Iterator.prototype.some' method is forbidden     es-x/no-iterator-prototype-some
  489:1   warning  Invalid JSDoc inline tag name "see"                      jsdoc/check-tag-names

/src/repo/modules/ve-mw/init/apiresponsecache/ve.init.mw.ApiResponseCache.js
   74:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  136:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/targets/ve.init.mw.ArticleTarget.js
   870:2  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  1016:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1100:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1101:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1279:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1312:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1361:1  warning  The type 'jQuery.Deferred' is undefined                  jsdoc/no-undefined-types
  1488:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1590:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1677:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  1819:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2274:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2306:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2374:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  2464:1  warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js
   58:27  warning  ES2025 'Iterator.prototype.reduce' method is forbidden   es-x/no-iterator-prototype-reduce
   58:27  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray
  387:1   warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  389:1   warning  The type 'jQuery.Promise' is undefined                   jsdoc/no-undefined-types
  827:1   warning  The type 'jQuery.Event' is undefined                     jsdoc/no-undefined-types
  893:1   warning  The type 'jQuery.Event' is undefined                     jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/targets/ve.init.mw.Target.js
  526:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  564:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  606:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/init/ve.init.mw.Platform.js
  109:9  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray

/src/repo/modules/ve-mw/init/ve.init.mw.ViewportZoomHandler.js
  106:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types
  119:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types
  128:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/preinit/ve.init.mw.ArticleTargetLoader.js
  116:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  239:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  319:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  513:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/preinit/ve.init.mw.ArticleTargetSaver.js
   33:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  119:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  133:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  156:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  172:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  215:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js
   252:1   warning  The type 'jQuery.Event' is undefined                   jsdoc/no-undefined-types
   282:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
   411:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
   573:1   warning  The type 'jQuery.Promise' is undefined                 jsdoc/no-undefined-types
  1077:1   warning  The type 'jQuery.Event' is undefined                   jsdoc/no-undefined-types
  1180:1   warning  The type 'jQuery.Event' is undefined                   jsdoc/no-undefined-types
  1367:10  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/modules/ve-mw/preinit/ve.init.mw.DiffLoader.js
  48:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  49:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  81:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  82:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  83:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  86:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/tests/init/targets/ve.init.mw.DesktopArticleTarget.test.js
  143:35  warning  Avoid direct access to sessionStorage. Use mw.storage.session instead  mediawiki/no-storage

/src/repo/modules/ve-mw/tests/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.test.js
  21:1  warning  The type 'QUnit.Assert' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/tests/ve.test.utils.js
  45:10  warning  ES2025 'Iterator.prototype.toArray' method is forbidden  es-x/no-iterator-prototype-toarray

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWExtensionDialog.js
  113:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWFloatingHelpDialog.js
  9:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWGalleryDialog.js
  618:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js
  747:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js
   95:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types
  134:1  warning  The type 'jQuery.Promise' is undefined   jsdoc/no-undefined-types
  135:1  warning  The type 'jQuery.Promise' is undefined   jsdoc/no-undefined-types
  418:1  warning  The type 'jQuery.Promise' is undefined   jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTemplateDialog.js
   12:1  warning  Invalid JSDoc inline tag name "see"      jsdoc/check-tag-names
   12:1  warning  Invalid JSDoc inline tag name "see"      jsdoc/check-tag-names
   52:1  warning  Invalid JSDoc inline tag name "see"      jsdoc/check-tag-names
  312:1  warning  The type 'jQuery.Deferred' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTransclusionDialog.js
   13:1  warning  Invalid JSDoc inline tag name "see"                   jsdoc/check-tag-names
  151:1  warning  The type 'jQuery.Event' is undefined                  jsdoc/no-undefined-types
  266:1  warning  The type 'jQuery.Event' is undefined                  jsdoc/no-undefined-types
  302:3  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some
  437:1  warning  The type 'jQuery.Promise' is undefined                jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/elements/ve.ui.MWExpandableErrorElement.js
  33:16  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget

/src/repo/modules/ve-mw/ui/inspectors/ve.ui.MWLinkAnnotationInspector.js
  208:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js
    2:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  102:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  171:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWAdvancedSettingsPage.js
  194:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWCategoriesPage.js
  227:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js
  124:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js
  282:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/tools/ve.ui.MWPopupTool.js
  58:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/ve.ui.MWWikitextDataTransferHandlerFactory.js
  56:73  warning  ES2025 'Iterator.prototype.every' method is forbidden  es-x/no-iterator-prototype-every

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryPopupWidget.js
   31:22  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  101:1   warning  The type 'jQuery.Event' is undefined                                                                        jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js
  295:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types
  367:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWEditSummaryWidget.js
  132:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWEducationPopupWidget.js
  95:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWExternalLinkAnnotationWidget.js
  81:1  warning  The type 'jQuery.Promise' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWGalleryItemWidget.js
  92:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js
  203:27  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some
  221:56  warning  ES2025 'Iterator.prototype.some' method is forbidden  es-x/no-iterator-prototype-some

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineButtonWidget.js
   3:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  63:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  68:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineControlsWidget.js
  23:27  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  28:27  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  33:18  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  39:20  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget
  45:22  warning  OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true  mediawiki/no-unlabeled-buttonwidget

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterSelectWidget.js
    5:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
   52:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  195:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterWidget.js
   3:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
   3:1  warning  Invalid JSDoc inline tag name "see"   jsdoc/check-tag-names
  56:1  warning  The type 'jQuery.Event' is undefined  jsdoc/no-undefined-types

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlinePartWidget.js
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
    3:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   79:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   89:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  108:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  117:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineWidget.js
   30:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
   38:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  150:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  188:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names
  206:1  warning  Invalid JSDoc inline tag name "see"  jsdoc/check-tag-names

✖ 217 problems (0 errors, 217 warnings)


Running "stylelint:all" (stylelint) task
>> editcheck/modules/EditCheck.less
>>   113:2  ⚠  Unexpected browser feature "flexbox-gap" is not supported by Safari 12,13,14,11.1,12.1,13.1, Safari on iOS 11.3-11.4,12.0-12.1,12.2-12.5,13.0-13.1,13.2,13.3,13.4-13.7,14.0-14.4  plugin/no-unsupported-browser-features
>> 
>> ⚠ 1 problem (0 errors, 1 warning)

⚠ 1 warning

>> Linted 85 files without errors

Running "banana:VisualEditor" (banana) task
>> 7 message directories checked.

Done.
No missing files.


> visualeditor@0.0.0 minify-svg
> svgo --config=.svgo.config.js -q -r -f images/


--- end ---
{"1109537": {"source": 1109537, "name": "tmp", "dependency": "tmp", "title": "tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter", "url": "https://github.com/advisories/GHSA-52f5-9888-hmc6", "severity": "low", "cwe": ["CWE-59"], "cvss": {"score": 2.5, "vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"}, "range": "<=0.2.3"}}
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

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

The following rules are failing and were disabled:
* editcheck/modules:
  * es-x/no-iterator-prototype-some
  * es-x/no-iterator-prototype-every
  * es-x/no-iterator-prototype-reduce
  * mediawiki/no-unlabeled-buttonwidget
* modules:
  * es-x/no-iterator-prototype-some
  * es-x/no-iterator-prototype-toarray
  * es-x/no-iterator-prototype-every
  * es-x/no-iterator-prototype-reduce
  * mediawiki/no-unlabeled-buttonwidget
* modules/ve-mw/dm:
  * es-x/no-iterator-prototype-some
  * es-x/no-iterator-prototype-toarray
  * es-x/no-iterator-prototype-every
* modules/ve-mw/preinit:
  * es-x/no-iterator-prototype-every
* modules/ve-mw/tests:
  * es-x/no-iterator-prototype-toarray
  * mediawiki/no-storage

$ git add .
--- stdout ---

--- end ---
$ git commit -F /tmp/tmpxtq08h75
--- stdout ---
[master c87db17] build: Updating eslint-config-wikimedia to 0.32.0
 7 files changed, 884 insertions(+), 1484 deletions(-)

--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From c87db17afd64d5759292ceb56ed7de1e71f4028e Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Thu, 13 Nov 2025 15:35:06 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.32.0

The following rules are failing and were disabled:
* editcheck/modules:
  * es-x/no-iterator-prototype-some
  * es-x/no-iterator-prototype-every
  * es-x/no-iterator-prototype-reduce
  * mediawiki/no-unlabeled-buttonwidget
* modules:
  * es-x/no-iterator-prototype-some
  * es-x/no-iterator-prototype-toarray
  * es-x/no-iterator-prototype-every
  * es-x/no-iterator-prototype-reduce
  * mediawiki/no-unlabeled-buttonwidget
* modules/ve-mw/dm:
  * es-x/no-iterator-prototype-some
  * es-x/no-iterator-prototype-toarray
  * es-x/no-iterator-prototype-every
* modules/ve-mw/preinit:
  * es-x/no-iterator-prototype-every
* modules/ve-mw/tests:
  * es-x/no-iterator-prototype-toarray
  * mediawiki/no-storage

Change-Id: I7e5c7214b82c013dee2ffdae62777970391b17de
---
 editcheck/modules/.eslintrc.json     |    6 +-
 modules/.eslintrc.json               |    7 +-
 modules/ve-mw/dm/.eslintrc.json      |    5 +-
 modules/ve-mw/preinit/.eslintrc.json |    3 +-
 modules/ve-mw/tests/.eslintrc.json   |    4 +-
 package-lock.json                    | 2341 ++++++++++----------------
 package.json                         |    2 +-
 7 files changed, 884 insertions(+), 1484 deletions(-)

diff --git a/editcheck/modules/.eslintrc.json b/editcheck/modules/.eslintrc.json
index 2320d18..d5b42cf 100644
--- a/editcheck/modules/.eslintrc.json
+++ b/editcheck/modules/.eslintrc.json
@@ -4,6 +4,10 @@
 		"../../modules/.eslintrc"
 	],
 	"rules": {
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"es-x/no-iterator-prototype-some": "warn",
+		"es-x/no-iterator-prototype-every": "warn",
+		"mediawiki/no-unlabeled-buttonwidget": "warn",
+		"es-x/no-iterator-prototype-reduce": "warn"
 	}
 }
diff --git a/modules/.eslintrc.json b/modules/.eslintrc.json
index 2931d67..edb8a97 100644
--- a/modules/.eslintrc.json
+++ b/modules/.eslintrc.json
@@ -8,6 +8,11 @@
 	],
 	"rules": {
 		"no-jquery/no-append-html": "warn",
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"es-x/no-iterator-prototype-toarray": "warn",
+		"es-x/no-iterator-prototype-every": "warn",
+		"es-x/no-iterator-prototype-reduce": "warn",
+		"es-x/no-iterator-prototype-some": "warn",
+		"mediawiki/no-unlabeled-buttonwidget": "warn"
 	}
 }
diff --git a/modules/ve-mw/dm/.eslintrc.json b/modules/ve-mw/dm/.eslintrc.json
index 11f19c4..e482b80 100644
--- a/modules/ve-mw/dm/.eslintrc.json
+++ b/modules/ve-mw/dm/.eslintrc.json
@@ -12,6 +12,9 @@
 	"rules": {
 		"local/no-unsanitized-href": "off",
 		"no-jquery/no-append-html": "warn",
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"es-x/no-iterator-prototype-some": "warn",
+		"es-x/no-iterator-prototype-every": "warn",
+		"es-x/no-iterator-prototype-toarray": "warn"
 	}
 }
diff --git a/modules/ve-mw/preinit/.eslintrc.json b/modules/ve-mw/preinit/.eslintrc.json
index 99f9238..9bfa962 100644
--- a/modules/ve-mw/preinit/.eslintrc.json
+++ b/modules/ve-mw/preinit/.eslintrc.json
@@ -6,6 +6,7 @@
 		"no-jquery/no-extend": "off",
 		"no-jquery/no-deferred": "off",
 		"no-jquery/no-when": "off",
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"es-x/no-iterator-prototype-every": "warn"
 	}
 }
diff --git a/modules/ve-mw/tests/.eslintrc.json b/modules/ve-mw/tests/.eslintrc.json
index 494aabf..fa0cf09 100644
--- a/modules/ve-mw/tests/.eslintrc.json
+++ b/modules/ve-mw/tests/.eslintrc.json
@@ -20,7 +20,9 @@
 		"indent": "off",
 		"no-jquery/no-html": "off",
 		"no-jquery/no-parse-html-literal": "off",
-		"no-jquery/no-done-fail": "warn"
+		"no-jquery/no-done-fail": "warn",
+		"mediawiki/no-storage": "warn",
+		"es-x/no-iterator-prototype-toarray": "warn"
 	},
 	"parserOptions": {
 		"ecmaVersion": 2018
diff --git a/package-lock.json b/package-lock.json
index 784f124..1efe1d4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,7 +14,7 @@
 				"@wdio/mocha-framework": "9.15.0",
 				"@wdio/spec-reporter": "9.15.0",
 				"api-testing": "1.7.1",
-				"eslint-config-wikimedia": "0.31.0",
+				"eslint-config-wikimedia": "0.32.0",
 				"eslint-plugin-local": "^4.2.2",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.13.0",
@@ -177,20 +177,19 @@
 			}
 		},
 		"node_modules/@es-joy/jsdoccomment": {
-			"version": "0.43.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
-			"integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
+			"version": "0.75.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
+			"integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
 			"dev": true,
 			"dependencies": {
-				"@types/eslint": "^8.56.5",
-				"@types/estree": "^1.0.5",
-				"@typescript-eslint/types": "^7.2.0",
+				"@types/estree": "^1.0.8",
+				"@typescript-eslint/types": "^8.46.0",
 				"comment-parser": "1.4.1",
-				"esquery": "^1.5.0",
-				"jsdoc-type-pratt-parser": "~4.0.0"
+				"esquery": "^1.6.0",
+				"jsdoc-type-pratt-parser": "~6.9.1"
 			},
 			"engines": {
-				"node": ">=16"
+				"node": ">=20.11.0"
 			}
 		},
 		"node_modules/@esbuild/aix-ppc64": {
@@ -612,9 +611,9 @@
 			}
 		},
 		"node_modules/@eslint-community/regexpp": {
-			"version": "4.10.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
-			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+			"version": "4.12.2",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+			"integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
 			"dev": true,
 			"engines": {
 				"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -1687,9 +1686,9 @@
 			}
 		},
 		"node_modules/@mdn/browser-compat-data": {
-			"version": "5.4.1",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.4.1.tgz",
-			"integrity": "sha512-rD1yrH+vrinzmdgtLjj7qeE4FmYh0VezWQaB3DqVrLSBcGtz61pqV/yCO7piJQc8XmgOIKQIF9Go3LUdS9ORHg==",
+			"version": "5.7.6",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz",
+			"integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==",
 			"dev": true
 		},
 		"node_modules/@noble/hashes": {
@@ -1842,113 +1841,6 @@
 				"eslint": ">=8.40.0"
 			}
 		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
-			"integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/types": "8.38.0",
-				"@typescript-eslint/visitor-keys": "8.38.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/types": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
-			"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
-			"integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/project-service": "8.38.0",
-				"@typescript-eslint/tsconfig-utils": "8.38.0",
-				"@typescript-eslint/types": "8.38.0",
-				"@typescript-eslint/visitor-keys": "8.38.0",
-				"debug": "^4.3.4",
-				"fast-glob": "^3.3.2",
-				"is-glob": "^4.0.3",
-				"minimatch": "^9.0.4",
-				"semver": "^7.6.0",
-				"ts-api-utils": "^2.1.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/utils": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
-			"integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
-			"dev": true,
-			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.7.0",
-				"@typescript-eslint/scope-manager": "8.38.0",
-				"@typescript-eslint/types": "8.38.0",
-				"@typescript-eslint/typescript-estree": "8.38.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
-			"integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/types": "8.38.0",
-				"eslint-visitor-keys": "^4.2.1"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/brace-expansion": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-			"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-			"dev": true,
-			"dependencies": {
-				"balanced-match": "^1.0.0"
-			}
-		},
 		"node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": {
 			"version": "4.2.1",
 			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
@@ -1978,21 +1870,6 @@
 				"url": "https://opencollective.com/eslint"
 			}
 		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/minimatch": {
-			"version": "9.0.5",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-			"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-			"dev": true,
-			"dependencies": {
-				"brace-expansion": "^2.0.1"
-			},
-			"engines": {
-				"node": ">=16 || 14 >=14.17"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/isaacs"
-			}
-		},
 		"node_modules/@stylistic/eslint-plugin/node_modules/picomatch": {
 			"version": "4.0.3",
 			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
@@ -2005,18 +1882,6 @@
 				"url": "https://github.com/sponsors/jonschlinkert"
 			}
 		},
-		"node_modules/@stylistic/eslint-plugin/node_modules/ts-api-utils": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
-			"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=18.12"
-			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4"
-			}
-		},
 		"node_modules/@stylistic/stylelint-config": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-2.0.0.tgz",
@@ -2066,20 +1931,6 @@
 				"node": ">=0.10.0"
 			}
 		},
-		"node_modules/@stylistic/stylelint-plugin/node_modules/postcss-selector-parser": {
-			"version": "6.1.2",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
-			"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"cssesc": "^3.0.0",
-				"util-deprecate": "^1.0.2"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
 		"node_modules/@thisismanta/pessimist": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/@thisismanta/pessimist/-/pessimist-1.2.0.tgz",
@@ -2099,20 +1950,10 @@
 			"integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
 			"dev": true
 		},
-		"node_modules/@types/eslint": {
-			"version": "8.56.10",
-			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
-			"integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
-			"dev": true,
-			"dependencies": {
-				"@types/estree": "*",
-				"@types/json-schema": "*"
-			}
-		},
 		"node_modules/@types/estree": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
-			"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+			"version": "1.0.8",
+			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+			"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
 			"dev": true
 		},
 		"node_modules/@types/istanbul-lib-coverage": {
@@ -2139,12 +1980,6 @@
 				"@types/istanbul-lib-report": "*"
 			}
 		},
-		"node_modules/@types/json-schema": {
-			"version": "7.0.15",
-			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-			"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-			"dev": true
-		},
 		"node_modules/@types/linkify-it": {
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
@@ -2248,93 +2083,75 @@
 			}
 		},
 		"node_modules/@typescript-eslint/eslint-plugin": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
-			"integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+			"integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"dependencies": {
 				"@eslint-community/regexpp": "^4.10.0",
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/type-utils": "7.18.0",
-				"@typescript-eslint/utils": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/type-utils": "8.46.0",
+				"@typescript-eslint/utils": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"graphemer": "^1.4.0",
-				"ignore": "^5.3.1",
+				"ignore": "^7.0.0",
 				"natural-compare": "^1.4.0",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/parser": "^7.0.0",
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
+				"@typescript-eslint/parser": "^8.46.0",
+				"eslint": "^8.57.0 || ^9.0.0",
+				"typescript": ">=4.8.4 <6.0.0"
+			}
+		},
+		"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+			"version": "7.0.5",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+			"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+			"dev": true,
+			"engines": {
+				"node": ">= 4"
 			}
 		},
 		"node_modules/@typescript-eslint/parser": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
-			"integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+			"integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"dependencies": {
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/typescript-estree": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"debug": "^4.3.4"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-			"dev": true,
-			"optional": true,
-			"peer": true,
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"eslint": "^8.57.0 || ^9.0.0",
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/project-service": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
-			"integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+			"integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/tsconfig-utils": "^8.38.0",
-				"@typescript-eslint/types": "^8.38.0",
+				"@typescript-eslint/tsconfig-utils": "^8.46.0",
+				"@typescript-eslint/types": "^8.46.0",
 				"debug": "^4.3.4"
 			},
 			"engines": {
@@ -2345,46 +2162,20 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
-			"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/scope-manager": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
-			"integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+			"integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0"
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -2392,9 +2183,9 @@
 			}
 		},
 		"node_modules/@typescript-eslint/tsconfig-utils": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
-			"integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+			"integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
 			"dev": true,
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2404,45 +2195,40 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/type-utils": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
-			"integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+			"integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"dependencies": {
-				"@typescript-eslint/typescript-estree": "7.18.0",
-				"@typescript-eslint/utils": "7.18.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0",
+				"@typescript-eslint/utils": "8.46.0",
 				"debug": "^4.3.4",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
+				"eslint": "^8.57.0 || ^9.0.0",
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/types": {
-			"version": "7.12.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
-			"integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+			"integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
 			"dev": true,
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -2450,44 +2236,31 @@
 			}
 		},
 		"node_modules/@typescript-eslint/typescript-estree": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
-			"integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+			"integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/project-service": "8.46.0",
+				"@typescript-eslint/tsconfig-utils": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"debug": "^4.3.4",
-				"globby": "^11.1.0",
+				"fast-glob": "^3.3.2",
 				"is-glob": "^4.0.3",
 				"minimatch": "^9.0.4",
 				"semver": "^7.6.0",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+			"peerDependencies": {
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
@@ -2515,68 +2288,55 @@
 			}
 		},
 		"node_modules/@typescript-eslint/utils": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
-			"integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+			"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/typescript-estree": "7.18.0"
+				"@eslint-community/eslint-utils": "^4.7.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"eslint": "^8.56.0"
-			}
-		},
-		"node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"eslint": "^8.57.0 || ^9.0.0",
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/visitor-keys": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
-			"integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+			"integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "7.18.0",
-				"eslint-visitor-keys": "^3.4.3"
+				"@typescript-eslint/types": "8.46.0",
+				"eslint-visitor-keys": "^4.2.1"
 			},
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			}
 		},
-		"node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-			"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+		"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+			"version": "4.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+			"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
 			"dev": true,
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/@ungap/structured-clone": {
@@ -4073,12 +3833,12 @@
 			}
 		},
 		"node_modules/ast-metadata-inferer": {
-			"version": "0.8.0",
-			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
-			"integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
+			"integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
 			"dev": true,
 			"dependencies": {
-				"@mdn/browser-compat-data": "^5.2.34"
+				"@mdn/browser-compat-data": "^5.6.19"
 			}
 		},
 		"node_modules/ast-types": {
@@ -4246,6 +4006,15 @@
 				}
 			]
 		},
+		"node_modules/baseline-browser-mapping": {
+			"version": "2.8.28",
+			"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz",
+			"integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==",
+			"dev": true,
+			"bin": {
+				"baseline-browser-mapping": "dist/cli.js"
+			}
+		},
 		"node_modules/basic-ftp": {
 			"version": "5.0.5",
 			"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
@@ -4332,9 +4101,9 @@
 			"dev": true
 		},
 		"node_modules/browserslist": {
-			"version": "4.24.4",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
-			"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+			"version": "4.28.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
+			"integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -4350,12 +4119,12 @@
 					"url": "https://github.com/sponsors/ai"
 				}
 			],
-			"license": "MIT",
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001688",
-				"electron-to-chromium": "^1.5.73",
-				"node-releases": "^2.0.19",
-				"update-browserslist-db": "^1.1.1"
+				"baseline-browser-mapping": "^2.8.25",
+				"caniuse-lite": "^1.0.30001754",
+				"electron-to-chromium": "^1.5.249",
+				"node-releases": "^2.0.27",
+				"update-browserslist-db": "^1.1.4"
 			},
 			"bin": {
 				"browserslist": "cli.js"
@@ -4469,9 +4238,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001692",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
-			"integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+			"version": "1.0.30001754",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+			"integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
 			"dev": true,
 			"funding": [
 				{
@@ -4486,8 +4255,7 @@
 					"type": "github",
 					"url": "https://github.com/sponsors/ai"
 				}
-			],
-			"license": "CC-BY-4.0"
+			]
 		},
 		"node_modules/caseless": {
 			"version": "0.12.0",
@@ -4914,12 +4682,12 @@
 			"dev": true
 		},
 		"node_modules/core-js-compat": {
-			"version": "3.37.1",
-			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
-			"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+			"version": "3.46.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz",
+			"integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==",
 			"dev": true,
 			"dependencies": {
-				"browserslist": "^4.23.0"
+				"browserslist": "^4.26.3"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -5489,9 +5257,9 @@
 			}
 		},
 		"node_modules/debug": {
-			"version": "4.4.1",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
-			"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+			"version": "4.4.3",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+			"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
 			"dev": true,
 			"dependencies": {
 				"ms": "^2.1.3"
@@ -5608,6 +5376,15 @@
 				"node": ">=0.3.1"
 			}
 		},
+		"node_modules/diff-sequences": {
+			"version": "27.5.1",
+			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+			"integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+			"dev": true,
+			"engines": {
+				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+			}
+		},
 		"node_modules/dir-glob": {
 			"version": "3.0.1",
 			"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -5874,11 +5651,10 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.5.79",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.79.tgz",
-			"integrity": "sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==",
-			"dev": true,
-			"license": "ISC"
+			"version": "1.5.250",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz",
+			"integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==",
+			"dev": true
 		},
 		"node_modules/emoji-regex": {
 			"version": "8.0.0",
@@ -5909,9 +5685,9 @@
 			}
 		},
 		"node_modules/enhanced-resolve": {
-			"version": "5.16.1",
-			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz",
-			"integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==",
+			"version": "5.18.3",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+			"integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
 			"dev": true,
 			"dependencies": {
 				"graceful-fs": "^4.2.4",
@@ -6155,9 +5931,9 @@
 			}
 		},
 		"node_modules/eslint-compat-utils": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
-			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+			"version": "0.6.5",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+			"integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
 			"dev": true,
 			"dependencies": {
 				"semver": "^7.5.4"
@@ -6170,257 +5946,143 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.31.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.31.0.tgz",
-			"integrity": "sha512-Z/t/zGPdxs/ehxb0EM6THNWAzueT7GtuqzjUvmBpkxcTKzZPJEXWnnpswdj/hgv8Ce8PIeDp0zwQxR4e3c9CIw==",
+			"version": "0.32.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.0.tgz",
+			"integrity": "sha512-kTuvtzzbvAgCIUjPsG7d+wilFK7MGAx3Fhb9onr16UsrFlyplXqNKetUu2awPrH4q4W+4V2JU5ju192A0blLvQ==",
 			"dev": true,
 			"dependencies": {
 				"@stylistic/eslint-plugin": "^3.1.0",
-				"@typescript-eslint/eslint-plugin": "8.35.1",
-				"@typescript-eslint/parser": "8.35.1",
+				"@typescript-eslint/eslint-plugin": "8.46.0",
+				"@typescript-eslint/parser": "8.46.0",
 				"browserslist-config-wikimedia": "^0.7.0",
 				"eslint": "^8.57.0",
-				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.6.0",
-				"eslint-plugin-jest": "^28.5.0",
-				"eslint-plugin-jsdoc": "48.2.5",
+				"eslint-plugin-compat": "^6.0.2",
+				"eslint-plugin-es-x": "^8.7.0",
+				"eslint-plugin-jest": "^29.0.1",
+				"eslint-plugin-jsdoc": "61.0.0",
 				"eslint-plugin-json-es": "^1.6.0",
-				"eslint-plugin-mediawiki": "^0.7.0",
-				"eslint-plugin-mocha": "^10.4.3",
-				"eslint-plugin-n": "^17.7.0",
+				"eslint-plugin-mediawiki": "^0.8.1",
+				"eslint-plugin-mocha": "^10.5.0",
+				"eslint-plugin-n": "^17.23.1",
 				"eslint-plugin-no-jquery": "^3.1.1",
-				"eslint-plugin-qunit": "^8.1.1",
-				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^53.0.0",
-				"eslint-plugin-vue": "^9.26.0",
-				"eslint-plugin-wdio": "^8.24.12",
-				"eslint-plugin-yml": "^1.14.0"
+				"eslint-plugin-qunit": "^8.2.5",
+				"eslint-plugin-security": "^3.0.1",
+				"eslint-plugin-unicorn": "^56.0.1",
+				"eslint-plugin-vue": "^9.33.0",
+				"eslint-plugin-wdio": "^9.16.2",
+				"eslint-plugin-yml": "^1.19.0"
 			},
 			"engines": {
-				"node": ">=18 <25"
+				"node": ">=20 <25"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
-			"integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
+		"node_modules/eslint-plugin-compat": {
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
+			"integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/regexpp": "^4.10.0",
-				"@typescript-eslint/scope-manager": "8.35.1",
-				"@typescript-eslint/type-utils": "8.35.1",
-				"@typescript-eslint/utils": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1",
-				"graphemer": "^1.4.0",
-				"ignore": "^7.0.0",
-				"natural-compare": "^1.4.0",
-				"ts-api-utils": "^2.1.0"
+				"@mdn/browser-compat-data": "^5.5.35",
+				"ast-metadata-inferer": "^0.8.1",
+				"browserslist": "^4.24.2",
+				"caniuse-lite": "^1.0.30001687",
+				"find-up": "^5.0.0",
+				"globals": "^15.7.0",
+				"lodash.memoize": "^4.1.2",
+				"semver": "^7.6.2"
 			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": ">=18.x"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/parser": "^8.35.1",
-				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
-			"integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
+		"node_modules/eslint-plugin-compat/node_modules/globals": {
+			"version": "15.15.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+			"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
 			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/typescript-estree": "8.35.1",
-				"@typescript-eslint/utils": "8.35.1",
-				"debug": "^4.3.4",
-				"ts-api-utils": "^2.1.0"
-			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+				"node": ">=18"
 			},
 			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
-			"integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
+		"node_modules/eslint-plugin-es-x": {
+			"version": "8.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-8.7.0.tgz",
+			"integrity": "sha512-Du5Sb067sjqzmglaPhsfcEQgE1EYfL8sko+4jOMcAB/XKGoCxntSrOmTYuVzswA1rzM9+MZwH6+GOp0G3/wVCg==",
 			"dev": true,
+			"funding": [
+				"https://github.com/sponsors/ota-meshi",
+				"https://opencollective.com/eslint"
+			],
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.7.0",
-				"@typescript-eslint/scope-manager": "8.35.1",
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/typescript-estree": "8.35.1"
+				"@eslint-community/eslint-utils": "^4.1.2",
+				"@eslint-community/regexpp": "^4.12.1",
+				"eslint-compat-utils": "^0.6.3"
 			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": "^14.18.0 || >=16.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"eslint": ">=8"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/parser": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
-			"integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
+		"node_modules/eslint-plugin-jest": {
+			"version": "29.1.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
+			"integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/scope-manager": "8.35.1",
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/typescript-estree": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1",
-				"debug": "^4.3.4"
+				"@typescript-eslint/utils": "^8.0.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": "^20.12.0 || ^22.0.0 || >=24.0.0"
 			},
 			"peerDependencies": {
+				"@typescript-eslint/eslint-plugin": "^8.0.0",
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/project-service": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
-			"integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/tsconfig-utils": "^8.35.1",
-				"@typescript-eslint/types": "^8.35.1",
-				"debug": "^4.3.4"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"jest": "*"
 			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
+			"peerDependenciesMeta": {
+				"@typescript-eslint/eslint-plugin": {
+					"optional": true
+				},
+				"jest": {
+					"optional": true
+				}
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/scope-manager": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
-			"integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
+		"node_modules/eslint-plugin-jsdoc": {
+			"version": "61.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
+			"integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1"
+				"@es-joy/jsdoccomment": "~0.75.0",
+				"are-docs-informative": "^0.0.2",
+				"comment-parser": "1.4.1",
+				"debug": "^4.4.3",
+				"escape-string-regexp": "^4.0.0",
+				"espree": "^10.4.0",
+				"esquery": "^1.6.0",
+				"html-entities": "^2.6.0",
+				"object-deep-merge": "^1.0.5",
+				"parse-imports-exports": "^0.2.4",
+				"semver": "^7.7.3",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/tsconfig-utils": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
-			"integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": ">=20.11.0"
 			},
 			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/types": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
-			"integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/typescript-estree": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
-			"integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/project-service": "8.35.1",
-				"@typescript-eslint/tsconfig-utils": "8.35.1",
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1",
-				"debug": "^4.3.4",
-				"fast-glob": "^3.3.2",
-				"is-glob": "^4.0.3",
-				"minimatch": "^9.0.4",
-				"semver": "^7.6.0",
-				"ts-api-utils": "^2.1.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4 <5.9.0"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/visitor-keys": {
-			"version": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
-			"integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/types": "8.35.1",
-				"eslint-visitor-keys": "^4.2.1"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/brace-expansion": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-			"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-			"dev": true,
-			"dependencies": {
-				"balanced-match": "^1.0.0"
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/eslint-visitor-keys": {
+		"node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": {
 			"version": "4.2.1",
 			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
 			"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
@@ -6432,129 +6094,21 @@
 				"url": "https://opencollective.com/eslint"
 			}
 		},
-		"node_modules/eslint-config-wikimedia/node_modules/ignore": {
-			"version": "7.0.5",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
-			"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
-			"dev": true,
-			"engines": {
-				"node": ">= 4"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/minimatch": {
-			"version": "9.0.5",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-			"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-			"dev": true,
-			"dependencies": {
-				"brace-expansion": "^2.0.1"
-			},
-			"engines": {
-				"node": ">=16 || 14 >=14.17"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/isaacs"
-			}
-		},
-		"node_modules/eslint-config-wikimedia/node_modules/ts-api-utils": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
-			"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=18.12"
-			},
-			"peerDependencies": {
-				"typescript": ">=4.8.4"
-			}
-		},
-		"node_modules/eslint-plugin-compat": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
-			"integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
-			"dev": true,
-			"dependencies": {
-				"@mdn/browser-compat-data": "^5.3.13",
-				"ast-metadata-inferer": "^0.8.0",
-				"browserslist": "^4.21.10",
-				"caniuse-lite": "^1.0.30001524",
-				"find-up": "^5.0.0",
-				"lodash.memoize": "^4.1.2",
-				"semver": "^7.5.4"
-			},
-			"engines": {
-				"node": ">=14.x"
-			},
-			"peerDependencies": {
-				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
-			}
-		},
-		"node_modules/eslint-plugin-es-x": {
-			"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==",
+		"node_modules/eslint-plugin-jsdoc/node_modules/espree": {
+			"version": "10.4.0",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+			"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.1.2",
-				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.5.0"
+				"acorn": "^8.15.0",
+				"acorn-jsx": "^5.3.2",
+				"eslint-visitor-keys": "^4.2.1"
 			},
 			"engines": {
-				"node": "^14.18.0 || >=16.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
-				"url": "https://github.com/sponsors/ota-meshi"
-			},
-			"peerDependencies": {
-				"eslint": ">=8"
-			}
-		},
-		"node_modules/eslint-plugin-jest": {
-			"version": "28.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz",
-			"integrity": "sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
-			},
-			"engines": {
-				"node": "^16.10.0 || ^18.12.0 || >=20.0.0"
-			},
-			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0",
-				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
-				"jest": "*"
-			},
-			"peerDependenciesMeta": {
-				"@typescript-eslint/eslint-plugin": {
-					"optional": true
-				},
-				"jest": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/eslint-plugin-jsdoc": {
-			"version": "48.2.5",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
-			"integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
-			"dev": true,
-			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.43.0",
-				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.4.1",
-				"debug": "^4.3.4",
-				"escape-string-regexp": "^4.0.0",
-				"esquery": "^1.5.0",
-				"is-builtin-module": "^3.2.1",
-				"semver": "^7.6.1",
-				"spdx-expression-parse": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=18"
-			},
-			"peerDependencies": {
-				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": {
@@ -6598,12 +6152,11 @@
 			}
 		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
-			"integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
+			"integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
 			"dev": true,
 			"dependencies": {
-				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			},
 			"peerDependencies": {
@@ -6611,9 +6164,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-mocha": {
-			"version": "10.4.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
-			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
+			"version": "10.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz",
+			"integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
@@ -6628,19 +6181,20 @@
 			}
 		},
 		"node_modules/eslint-plugin-n": {
-			"version": "17.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.7.0.tgz",
-			"integrity": "sha512-4Jg4ZKVE4VjHig2caBqPHYNW5na84RVufUuipFLJbgM/G57O6FdpUKJbHakCDJb/yjQuyqVzYWRtU3HNYaZUwg==",
-			"dev": true,
-			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"enhanced-resolve": "^5.15.0",
-				"eslint-plugin-es-x": "^7.5.0",
-				"get-tsconfig": "^4.7.0",
-				"globals": "^15.0.0",
-				"ignore": "^5.2.4",
-				"minimatch": "^9.0.0",
-				"semver": "^7.5.3"
+			"version": "17.23.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
+			"integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+			"dev": true,
+			"dependencies": {
+				"@eslint-community/eslint-utils": "^4.5.0",
+				"enhanced-resolve": "^5.17.1",
+				"eslint-plugin-es-x": "^7.8.0",
+				"get-tsconfig": "^4.8.1",
+				"globals": "^15.11.0",
+				"globrex": "^0.1.2",
+				"ignore": "^5.3.2",
+				"semver": "^7.6.3",
+				"ts-declaration-location": "^1.0.6"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -6652,40 +6206,52 @@
 				"eslint": ">=8.23.0"
 			}
 		},
-		"node_modules/eslint-plugin-n/node_modules/brace-expansion": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-			"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+		"node_modules/eslint-plugin-n/node_modules/eslint-compat-utils": {
+			"version": "0.5.1",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
 			"dev": true,
 			"dependencies": {
-				"balanced-match": "^1.0.0"
+				"semver": "^7.5.4"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"peerDependencies": {
+				"eslint": ">=6.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-n/node_modules/globals": {
-			"version": "15.3.0",
-			"resolved": "https://registry.npmjs.org/globals/-/globals-15.3.0.tgz",
-			"integrity": "sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==",
+		"node_modules/eslint-plugin-n/node_modules/eslint-plugin-es-x": {
+			"version": "7.8.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+			"integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
 			"dev": true,
+			"funding": [
+				"https://github.com/sponsors/ota-meshi",
+				"https://opencollective.com/eslint"
+			],
+			"dependencies": {
+				"@eslint-community/eslint-utils": "^4.1.2",
+				"@eslint-community/regexpp": "^4.11.0",
+				"eslint-compat-utils": "^0.5.1"
+			},
 			"engines": {
-				"node": ">=18"
+				"node": "^14.18.0 || >=16.0.0"
 			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
+			"peerDependencies": {
+				"eslint": ">=8"
 			}
 		},
-		"node_modules/eslint-plugin-n/node_modules/minimatch": {
-			"version": "9.0.4",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
-			"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+		"node_modules/eslint-plugin-n/node_modules/globals": {
+			"version": "15.15.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+			"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
 			"dev": true,
-			"dependencies": {
-				"brace-expansion": "^2.0.1"
-			},
 			"engines": {
-				"node": ">=16 || 14 >=14.17"
+				"node": ">=18"
 			},
 			"funding": {
-				"url": "https://github.com/sponsors/isaacs"
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
@@ -6699,9 +6265,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-qunit": {
-			"version": "8.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
-			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
+			"version": "8.2.5",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
+			"integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
@@ -6712,27 +6278,33 @@
 			}
 		},
 		"node_modules/eslint-plugin-security": {
-			"version": "1.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz",
-			"integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==",
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
+			"integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
 			"dev": true,
 			"dependencies": {
 				"safe-regex": "^2.1.1"
+			},
+			"engines": {
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/eslint-plugin-unicorn": {
-			"version": "53.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
-			"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
+			"version": "56.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+			"integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.24.5",
+				"@babel/helper-validator-identifier": "^7.24.7",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"@eslint/eslintrc": "^3.0.2",
 				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
-				"core-js-compat": "^3.37.0",
-				"esquery": "^1.5.0",
+				"core-js-compat": "^3.38.1",
+				"esquery": "^1.6.0",
+				"globals": "^15.9.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
@@ -6740,7 +6312,7 @@
 				"read-pkg-up": "^7.0.1",
 				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"semver": "^7.6.1",
+				"semver": "^7.6.3",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
@@ -6753,62 +6325,10 @@
 				"eslint": ">=8.56.0"
 			}
 		},
-		"node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
-			"integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
-			"dev": true,
-			"dependencies": {
-				"ajv": "^6.12.4",
-				"debug": "^4.3.2",
-				"espree": "^10.0.1",
-				"globals": "^14.0.0",
-				"ignore": "^5.2.0",
-				"import-fresh": "^3.2.1",
-				"js-yaml": "^4.1.0",
-				"minimatch": "^3.1.2",
-				"strip-json-comments": "^3.1.1"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"url": "https://opencollective.com/eslint"
-			}
-		},
-		"node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
-			"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"url": "https://opencollective.com/eslint"
-			}
-		},
-		"node_modules/eslint-plugin-unicorn/node_modules/espree": {
-			"version": "10.0.1",
-			"resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
-			"integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
-			"dev": true,
-			"dependencies": {
-				"acorn": "^8.11.3",
-				"acorn-jsx": "^5.3.2",
-				"eslint-visitor-keys": "^4.0.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-			},
-			"funding": {
-				"url": "https://opencollective.com/eslint"
-			}
-		},
 		"node_modules/eslint-plugin-unicorn/node_modules/globals": {
-			"version": "14.0.0",
-			"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
-			"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+			"version": "15.15.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+			"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
 			"dev": true,
 			"engines": {
 				"node": ">=18"
@@ -6818,9 +6338,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "9.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz",
-			"integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==",
+			"version": "9.33.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+			"integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
@@ -6828,8 +6348,8 @@
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
 				"postcss-selector-parser": "^6.0.15",
-				"semver": "^7.6.0",
-				"vue-eslint-parser": "^9.4.2",
+				"semver": "^7.6.3",
+				"vue-eslint-parser": "^9.4.3",
 				"xml-name-validator": "^4.0.0"
 			},
 			"engines": {
@@ -6840,23 +6360,24 @@
 			}
 		},
 		"node_modules/eslint-plugin-wdio": {
-			"version": "8.24.12",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
-			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
+			"version": "9.16.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
+			"integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
 			"dev": true,
 			"engines": {
-				"node": "^16.13 || >=18"
+				"node": ">=18.20.0"
 			}
 		},
 		"node_modules/eslint-plugin-yml": {
-			"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==",
+			"version": "1.19.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.0.tgz",
+			"integrity": "sha512-S+4GbcCWksFKAvFJtf0vpdiCkZZvDJCV4Zsi9ahmYkYOYcf+LRqqzvzkb/ST7vTYV6sFwXOvawzYyL/jFT2nQA==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.5.0",
-				"lodash": "^4.17.21",
+				"diff-sequences": "^27.5.1",
+				"escape-string-regexp": "4.0.0",
+				"eslint-compat-utils": "^0.6.0",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
 			},
@@ -6968,9 +6489,9 @@
 			}
 		},
 		"node_modules/esquery": {
-			"version": "1.5.0",
-			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
-			"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+			"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
 			"dev": true,
 			"dependencies": {
 				"estraverse": "^5.1.0"
@@ -7821,9 +7342,9 @@
 			}
 		},
 		"node_modules/get-tsconfig": {
-			"version": "4.7.5",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
-			"integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+			"version": "4.13.0",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+			"integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
 			"dev": true,
 			"dependencies": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -8006,6 +7527,12 @@
 			"integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
 			"dev": true
 		},
+		"node_modules/globrex": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+			"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+			"dev": true
+		},
 		"node_modules/globule": {
 			"version": "1.3.3",
 			"resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz",
@@ -8489,6 +8016,22 @@
 			"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
 			"dev": true
 		},
+		"node_modules/html-entities": {
+			"version": "2.6.0",
+			"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+			"integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+			"dev": true,
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/mdevils"
+				},
+				{
+					"type": "patreon",
+					"url": "https://patreon.com/mdevils"
+				}
+			]
+		},
 		"node_modules/html-tags": {
 			"version": "3.3.1",
 			"resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
@@ -8616,9 +8159,9 @@
 			]
 		},
 		"node_modules/ignore": {
-			"version": "5.3.1",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
-			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+			"version": "5.3.2",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+			"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
 			"dev": true,
 			"engines": {
 				"node": ">= 4"
@@ -9235,12 +8778,12 @@
 			"dev": true
 		},
 		"node_modules/jsdoc-type-pratt-parser": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
-			"integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+			"version": "6.9.1",
+			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
+			"integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
 			"dev": true,
 			"engines": {
-				"node": ">=12.0.0"
+				"node": ">=20.0.0"
 			}
 		},
 		"node_modules/jsdoc-wmf-theme": {
@@ -9280,9 +8823,9 @@
 			}
 		},
 		"node_modules/jsesc": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
-			"integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+			"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
 			"dev": true,
 			"bin": {
 				"jsesc": "bin/jsesc"
@@ -10216,11 +9759,10 @@
 			}
 		},
 		"node_modules/node-releases": {
-			"version": "2.0.19",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
-			"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
-			"dev": true,
-			"license": "MIT"
+			"version": "2.0.27",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+			"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+			"dev": true
 		},
 		"node_modules/nopt": {
 			"version": "3.0.6",
@@ -10328,6 +9870,27 @@
 				"node": ">=0.10.0"
 			}
 		},
+		"node_modules/object-deep-merge": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
+			"integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
+			"dev": true,
+			"dependencies": {
+				"type-fest": "4.2.0"
+			}
+		},
+		"node_modules/object-deep-merge/node_modules/type-fest": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
+			"integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
+			"dev": true,
+			"engines": {
+				"node": ">=16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
 		"node_modules/object-inspect": {
 			"version": "1.13.4",
 			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -10600,6 +10163,15 @@
 			"integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==",
 			"dev": true
 		},
+		"node_modules/parse-imports-exports": {
+			"version": "0.2.4",
+			"resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+			"integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+			"dev": true,
+			"dependencies": {
+				"parse-statements": "1.0.11"
+			}
+		},
 		"node_modules/parse-json": {
 			"version": "5.2.0",
 			"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -10639,6 +10211,12 @@
 				"node": ">=0.10.0"
 			}
 		},
+		"node_modules/parse-statements": {
+			"version": "1.0.11",
+			"resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+			"integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+			"dev": true
+		},
 		"node_modules/parse5": {
 			"version": "7.3.0",
 			"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
@@ -10939,9 +10517,9 @@
 			}
 		},
 		"node_modules/postcss-selector-parser": {
-			"version": "6.0.16",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
-			"integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
+			"version": "6.1.2",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+			"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
 			"dev": true,
 			"dependencies": {
 				"cssesc": "^3.0.0",
@@ -11861,9 +11439,9 @@
 			}
 		},
 		"node_modules/semver": {
-			"version": "7.7.2",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
-			"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+			"version": "7.7.3",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+			"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
 			"dev": true,
 			"bin": {
 				"semver": "bin/semver.js"
@@ -12875,12 +12453,16 @@
 			"license": "MIT"
 		},
 		"node_modules/tapable": {
-			"version": "2.2.1",
-			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+			"integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
 			"dev": true,
 			"engines": {
 				"node": ">=6"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/webpack"
 			}
 		},
 		"node_modules/tar-fs": {
@@ -13008,15 +12590,49 @@
 			}
 		},
 		"node_modules/ts-api-utils": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
-			"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+			"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
 			"dev": true,
 			"engines": {
-				"node": ">=16"
+				"node": ">=18.12"
+			},
+			"peerDependencies": {
+				"typescript": ">=4.8.4"
+			}
+		},
+		"node_modules/ts-declaration-location": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+			"integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+			"dev": true,
+			"funding": [
+				{
+					"type": "ko-fi",
+					"url": "https://ko-fi.com/rebeccastevens"
+				},
+				{
+					"type": "tidelift",
+					"url": "https://tidelift.com/funding/github/npm/ts-declaration-location"
+				}
+			],
+			"dependencies": {
+				"picomatch": "^4.0.2"
 			},
 			"peerDependencies": {
-				"typescript": ">=4.2.0"
+				"typescript": ">=4.0.0"
+			}
+		},
+		"node_modules/ts-declaration-location/node_modules/picomatch": {
+			"version": "4.0.3",
+			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+			"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+			"dev": true,
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/jonschlinkert"
 			}
 		},
 		"node_modules/tslib": {
@@ -13181,9 +12797,9 @@
 			}
 		},
 		"node_modules/update-browserslist-db": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
-			"integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+			"version": "1.1.4",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+			"integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
 			"dev": true,
 			"funding": [
 				{
@@ -13199,7 +12815,6 @@
 					"url": "https://github.com/sponsors/ai"
 				}
 			],
-			"license": "MIT",
 			"dependencies": {
 				"escalade": "^3.2.0",
 				"picocolors": "^1.1.1"
@@ -13663,25 +13278,24 @@
 			}
 		},
 		"node_modules/yaml": {
-			"version": "2.4.3",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz",
-			"integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==",
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+			"integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
 			"dev": true,
 			"bin": {
 				"yaml": "bin.mjs"
 			},
 			"engines": {
-				"node": ">= 14"
+				"node": ">= 14.6"
 			}
 		},
 		"node_modules/yaml-eslint-parser": {
-			"version": "1.2.3",
-			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
-			"integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz",
+			"integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==",
 			"dev": true,
 			"dependencies": {
 				"eslint-visitor-keys": "^3.0.0",
-				"lodash": "^4.17.21",
 				"yaml": "^2.0.0"
 			},
 			"engines": {
@@ -13955,17 +13569,16 @@
 			"dev": true
 		},
 		"@es-joy/jsdoccomment": {
-			"version": "0.43.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
-			"integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
+			"version": "0.75.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
+			"integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
 			"dev": true,
 			"requires": {
-				"@types/eslint": "^8.56.5",
-				"@types/estree": "^1.0.5",
-				"@typescript-eslint/types": "^7.2.0",
+				"@types/estree": "^1.0.8",
+				"@typescript-eslint/types": "^8.46.0",
 				"comment-parser": "1.4.1",
-				"esquery": "^1.5.0",
-				"jsdoc-type-pratt-parser": "~4.0.0"
+				"esquery": "^1.6.0",
+				"jsdoc-type-pratt-parser": "~6.9.1"
 			}
 		},
 		"@esbuild/aix-ppc64": {
@@ -14153,9 +13766,9 @@
 			}
 		},
 		"@eslint-community/regexpp": {
-			"version": "4.10.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
-			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+			"version": "4.12.2",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+			"integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
 			"dev": true
 		},
 		"@eslint/eslintrc": {
@@ -14891,9 +14504,9 @@
 			}
 		},
 		"@mdn/browser-compat-data": {
-			"version": "5.4.1",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.4.1.tgz",
-			"integrity": "sha512-rD1yrH+vrinzmdgtLjj7qeE4FmYh0VezWQaB3DqVrLSBcGtz61pqV/yCO7piJQc8XmgOIKQIF9Go3LUdS9ORHg==",
+			"version": "5.7.6",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz",
+			"integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==",
 			"dev": true
 		},
 		"@noble/hashes": {
@@ -14999,71 +14612,6 @@
 				"picomatch": "^4.0.2"
 			},
 			"dependencies": {
-				"@typescript-eslint/scope-manager": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
-					"integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/types": "8.38.0",
-						"@typescript-eslint/visitor-keys": "8.38.0"
-					}
-				},
-				"@typescript-eslint/types": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
-					"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
-					"dev": true
-				},
-				"@typescript-eslint/typescript-estree": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
-					"integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/project-service": "8.38.0",
-						"@typescript-eslint/tsconfig-utils": "8.38.0",
-						"@typescript-eslint/types": "8.38.0",
-						"@typescript-eslint/visitor-keys": "8.38.0",
-						"debug": "^4.3.4",
-						"fast-glob": "^3.3.2",
-						"is-glob": "^4.0.3",
-						"minimatch": "^9.0.4",
-						"semver": "^7.6.0",
-						"ts-api-utils": "^2.1.0"
-					}
-				},
-				"@typescript-eslint/utils": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
-					"integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
-					"dev": true,
-					"requires": {
-						"@eslint-community/eslint-utils": "^4.7.0",
-						"@typescript-eslint/scope-manager": "8.38.0",
-						"@typescript-eslint/types": "8.38.0",
-						"@typescript-eslint/typescript-estree": "8.38.0"
-					}
-				},
-				"@typescript-eslint/visitor-keys": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
-					"integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/types": "8.38.0",
-						"eslint-visitor-keys": "^4.2.1"
-					}
-				},
-				"brace-expansion": {
-					"version": "2.0.2",
-					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-					"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-					"dev": true,
-					"requires": {
-						"balanced-match": "^1.0.0"
-					}
-				},
 				"eslint-visitor-keys": {
 					"version": "4.2.1",
 					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
@@ -15081,27 +14629,11 @@
 						"eslint-visitor-keys": "^4.2.1"
 					}
 				},
-				"minimatch": {
-					"version": "9.0.5",
-					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-					"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-					"dev": true,
-					"requires": {
-						"brace-expansion": "^2.0.1"
-					}
-				},
 				"picomatch": {
 					"version": "4.0.3",
 					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
 					"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
 					"dev": true
-				},
-				"ts-api-utils": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
-					"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
-					"dev": true,
-					"requires": {}
 				}
 			}
 		},
@@ -15135,16 +14667,6 @@
 					"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
 					"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
 					"dev": true
-				},
-				"postcss-selector-parser": {
-					"version": "6.1.2",
-					"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
-					"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
-					"dev": true,
-					"requires": {
-						"cssesc": "^3.0.0",
-						"util-deprecate": "^1.0.2"
-					}
 				}
 			}
 		},
@@ -15163,20 +14685,10 @@
 			"integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
 			"dev": true
 		},
-		"@types/eslint": {
-			"version": "8.56.10",
-			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
-			"integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
-			"dev": true,
-			"requires": {
-				"@types/estree": "*",
-				"@types/json-schema": "*"
-			}
-		},
 		"@types/estree": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
-			"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+			"version": "1.0.8",
+			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+			"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
 			"dev": true
 		},
 		"@types/istanbul-lib-coverage": {
@@ -15203,12 +14715,6 @@
 				"@types/istanbul-lib-report": "*"
 			}
 		},
-		"@types/json-schema": {
-			"version": "7.0.15",
-			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-			"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-			"dev": true
-		},
 		"@types/linkify-it": {
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
@@ -15311,135 +14817,108 @@
 			}
 		},
 		"@typescript-eslint/eslint-plugin": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
-			"integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+			"integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"requires": {
 				"@eslint-community/regexpp": "^4.10.0",
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/type-utils": "7.18.0",
-				"@typescript-eslint/utils": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/type-utils": "8.46.0",
+				"@typescript-eslint/utils": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"graphemer": "^1.4.0",
-				"ignore": "^5.3.1",
+				"ignore": "^7.0.0",
 				"natural-compare": "^1.4.0",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
+			},
+			"dependencies": {
+				"ignore": {
+					"version": "7.0.5",
+					"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+					"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+					"dev": true
+				}
 			}
 		},
 		"@typescript-eslint/parser": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
-			"integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+			"integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"requires": {
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/typescript-estree": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"debug": "^4.3.4"
-			},
-			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-					"dev": true,
-					"optional": true,
-					"peer": true
-				}
 			}
 		},
 		"@typescript-eslint/project-service": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
-			"integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+			"integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/tsconfig-utils": "^8.38.0",
-				"@typescript-eslint/types": "^8.38.0",
+				"@typescript-eslint/tsconfig-utils": "^8.46.0",
+				"@typescript-eslint/types": "^8.46.0",
 				"debug": "^4.3.4"
-			},
-			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "8.38.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
-					"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
-					"dev": true
-				}
 			}
 		},
 		"@typescript-eslint/scope-manager": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
-			"integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+			"integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0"
-			},
-			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-					"dev": true
-				}
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0"
 			}
 		},
 		"@typescript-eslint/tsconfig-utils": {
-			"version": "8.38.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
-			"integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+			"integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
 			"dev": true,
 			"requires": {}
 		},
 		"@typescript-eslint/type-utils": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
-			"integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+			"integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
 			"dev": true,
-			"optional": true,
-			"peer": true,
 			"requires": {
-				"@typescript-eslint/typescript-estree": "7.18.0",
-				"@typescript-eslint/utils": "7.18.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0",
+				"@typescript-eslint/utils": "8.46.0",
 				"debug": "^4.3.4",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			}
 		},
 		"@typescript-eslint/types": {
-			"version": "7.12.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
-			"integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+			"integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
 			"dev": true
 		},
 		"@typescript-eslint/typescript-estree": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
-			"integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+			"integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/visitor-keys": "7.18.0",
+				"@typescript-eslint/project-service": "8.46.0",
+				"@typescript-eslint/tsconfig-utils": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0",
 				"debug": "^4.3.4",
-				"globby": "^11.1.0",
+				"fast-glob": "^3.3.2",
 				"is-glob": "^4.0.3",
 				"minimatch": "^9.0.4",
 				"semver": "^7.6.0",
-				"ts-api-utils": "^1.3.0"
+				"ts-api-utils": "^2.1.0"
 			},
 			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-					"dev": true
-				},
 				"brace-expansion": {
 					"version": "2.0.2",
 					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -15461,39 +14940,31 @@
 			}
 		},
 		"@typescript-eslint/utils": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
-			"integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+			"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
 			"dev": true,
 			"requires": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"@typescript-eslint/scope-manager": "7.18.0",
-				"@typescript-eslint/types": "7.18.0",
-				"@typescript-eslint/typescript-estree": "7.18.0"
-			},
-			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-					"dev": true
-				}
+				"@eslint-community/eslint-utils": "^4.7.0",
+				"@typescript-eslint/scope-manager": "8.46.0",
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/typescript-estree": "8.46.0"
 			}
 		},
 		"@typescript-eslint/visitor-keys": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
-			"integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+			"integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "7.18.0",
-				"eslint-visitor-keys": "^3.4.3"
+				"@typescript-eslint/types": "8.46.0",
+				"eslint-visitor-keys": "^4.2.1"
 			},
 			"dependencies": {
-				"@typescript-eslint/types": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-					"integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+				"eslint-visitor-keys": {
+					"version": "4.2.1",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+					"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
 					"dev": true
 				}
 			}
@@ -16581,12 +16052,12 @@
 			"dev": true
 		},
 		"ast-metadata-inferer": {
-			"version": "0.8.0",
-			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
-			"integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
+			"integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
 			"dev": true,
 			"requires": {
-				"@mdn/browser-compat-data": "^5.2.34"
+				"@mdn/browser-compat-data": "^5.6.19"
 			}
 		},
 		"ast-types": {
@@ -16701,6 +16172,12 @@
 			"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
 			"dev": true
 		},
+		"baseline-browser-mapping": {
+			"version": "2.8.28",
+			"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz",
+			"integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==",
+			"dev": true
+		},
 		"basic-ftp": {
 			"version": "5.0.5",
 			"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
@@ -16778,15 +16255,16 @@
 			"dev": true
 		},
 		"browserslist": {
-			"version": "4.24.4",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
-			"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+			"version": "4.28.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
+			"integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001688",
-				"electron-to-chromium": "^1.5.73",
-				"node-releases": "^2.0.19",
-				"update-browserslist-db": "^1.1.1"
+				"baseline-browser-mapping": "^2.8.25",
+				"caniuse-lite": "^1.0.30001754",
+				"electron-to-chromium": "^1.5.249",
+				"node-releases": "^2.0.27",
+				"update-browserslist-db": "^1.1.4"
 			}
 		},
 		"browserslist-config-wikimedia": {
@@ -16856,9 +16334,9 @@
 			"dev": true
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001692",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
-			"integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+			"version": "1.0.30001754",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+			"integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
 			"dev": true
 		},
 		"caseless": {
@@ -17177,12 +16655,12 @@
 			"dev": true
 		},
 		"core-js-compat": {
-			"version": "3.37.1",
-			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
-			"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+			"version": "3.46.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz",
+			"integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==",
 			"dev": true,
 			"requires": {
-				"browserslist": "^4.23.0"
+				"browserslist": "^4.26.3"
 			}
 		},
 		"core-util-is": {
@@ -17575,9 +17053,9 @@
 			"dev": true
 		},
 		"debug": {
-			"version": "4.4.1",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
-			"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+			"version": "4.4.3",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+			"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
 			"dev": true,
 			"requires": {
 				"ms": "^2.1.3"
@@ -17659,6 +17137,12 @@
 			"integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
 			"dev": true
 		},
+		"diff-sequences": {
+			"version": "27.5.1",
+			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+			"integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+			"dev": true
+		},
 		"dir-glob": {
 			"version": "3.0.1",
 			"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -17851,9 +17335,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.5.79",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.79.tgz",
-			"integrity": "sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==",
+			"version": "1.5.250",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz",
+			"integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==",
 			"dev": true
 		},
 		"emoji-regex": {
@@ -17882,9 +17366,9 @@
 			}
 		},
 		"enhanced-resolve": {
-			"version": "5.16.1",
-			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz",
-			"integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==",
+			"version": "5.18.3",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+			"integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
 			"dev": true,
 			"requires": {
 				"graceful-fs": "^4.2.4",
@@ -18078,251 +17562,123 @@
 			}
 		},
 		"eslint-compat-utils": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
-			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+			"version": "0.6.5",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+			"integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
 			"dev": true,
 			"requires": {
 				"semver": "^7.5.4"
 			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.31.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.31.0.tgz",
-			"integrity": "sha512-Z/t/zGPdxs/ehxb0EM6THNWAzueT7GtuqzjUvmBpkxcTKzZPJEXWnnpswdj/hgv8Ce8PIeDp0zwQxR4e3c9CIw==",
+			"version": "0.32.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.0.tgz",
+			"integrity": "sha512-kTuvtzzbvAgCIUjPsG7d+wilFK7MGAx3Fhb9onr16UsrFlyplXqNKetUu2awPrH4q4W+4V2JU5ju192A0blLvQ==",
 			"dev": true,
 			"requires": {
 				"@stylistic/eslint-plugin": "^3.1.0",
-				"@typescript-eslint/eslint-plugin": "8.35.1",
-				"@typescript-eslint/parser": "8.35.1",
+				"@typescript-eslint/eslint-plugin": "8.46.0",
+				"@typescript-eslint/parser": "8.46.0",
 				"browserslist-config-wikimedia": "^0.7.0",
 				"eslint": "^8.57.0",
-				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.6.0",
-				"eslint-plugin-jest": "^28.5.0",
-				"eslint-plugin-jsdoc": "48.2.5",
+				"eslint-plugin-compat": "^6.0.2",
+				"eslint-plugin-es-x": "^8.7.0",
+				"eslint-plugin-jest": "^29.0.1",
+				"eslint-plugin-jsdoc": "61.0.0",
 				"eslint-plugin-json-es": "^1.6.0",
-				"eslint-plugin-mediawiki": "^0.7.0",
-				"eslint-plugin-mocha": "^10.4.3",
-				"eslint-plugin-n": "^17.7.0",
+				"eslint-plugin-mediawiki": "^0.8.1",
+				"eslint-plugin-mocha": "^10.5.0",
+				"eslint-plugin-n": "^17.23.1",
 				"eslint-plugin-no-jquery": "^3.1.1",
-				"eslint-plugin-qunit": "^8.1.1",
-				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^53.0.0",
-				"eslint-plugin-vue": "^9.26.0",
-				"eslint-plugin-wdio": "^8.24.12",
-				"eslint-plugin-yml": "^1.14.0"
-			},
-			"dependencies": {
-				"@typescript-eslint/eslint-plugin": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
-					"integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
-					"dev": true,
-					"requires": {
-						"@eslint-community/regexpp": "^4.10.0",
-						"@typescript-eslint/scope-manager": "8.35.1",
-						"@typescript-eslint/type-utils": "8.35.1",
-						"@typescript-eslint/utils": "8.35.1",
-						"@typescript-eslint/visitor-keys": "8.35.1",
-						"graphemer": "^1.4.0",
-						"ignore": "^7.0.0",
-						"natural-compare": "^1.4.0",
-						"ts-api-utils": "^2.1.0"
-					},
-					"dependencies": {
-						"@typescript-eslint/type-utils": {
-							"version": "8.35.1",
-							"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
-							"integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
-							"dev": true,
-							"requires": {
-								"@typescript-eslint/typescript-estree": "8.35.1",
-								"@typescript-eslint/utils": "8.35.1",
-								"debug": "^4.3.4",
-								"ts-api-utils": "^2.1.0"
-							}
-						},
-						"@typescript-eslint/utils": {
-							"version": "8.35.1",
-							"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
-							"integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
-							"dev": true,
-							"requires": {
-								"@eslint-community/eslint-utils": "^4.7.0",
-								"@typescript-eslint/scope-manager": "8.35.1",
-								"@typescript-eslint/types": "8.35.1",
-								"@typescript-eslint/typescript-estree": "8.35.1"
-							}
-						}
-					}
-				},
-				"@typescript-eslint/parser": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
-					"integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/scope-manager": "8.35.1",
-						"@typescript-eslint/types": "8.35.1",
-						"@typescript-eslint/typescript-estree": "8.35.1",
-						"@typescript-eslint/visitor-keys": "8.35.1",
-						"debug": "^4.3.4"
-					}
-				},
-				"@typescript-eslint/project-service": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
-					"integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/tsconfig-utils": "^8.35.1",
-						"@typescript-eslint/types": "^8.35.1",
-						"debug": "^4.3.4"
-					}
-				},
-				"@typescript-eslint/scope-manager": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
-					"integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/types": "8.35.1",
-						"@typescript-eslint/visitor-keys": "8.35.1"
-					}
-				},
-				"@typescript-eslint/tsconfig-utils": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
-					"integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
-					"dev": true,
-					"requires": {}
-				},
-				"@typescript-eslint/types": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
-					"integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
-					"dev": true
-				},
-				"@typescript-eslint/typescript-estree": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
-					"integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/project-service": "8.35.1",
-						"@typescript-eslint/tsconfig-utils": "8.35.1",
-						"@typescript-eslint/types": "8.35.1",
-						"@typescript-eslint/visitor-keys": "8.35.1",
-						"debug": "^4.3.4",
-						"fast-glob": "^3.3.2",
-						"is-glob": "^4.0.3",
-						"minimatch": "^9.0.4",
-						"semver": "^7.6.0",
-						"ts-api-utils": "^2.1.0"
-					}
-				},
-				"@typescript-eslint/visitor-keys": {
-					"version": "8.35.1",
-					"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
-					"integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
-					"dev": true,
-					"requires": {
-						"@typescript-eslint/types": "8.35.1",
-						"eslint-visitor-keys": "^4.2.1"
-					}
-				},
-				"brace-expansion": {
-					"version": "2.0.2",
-					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-					"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-					"dev": true,
-					"requires": {
-						"balanced-match": "^1.0.0"
-					}
-				},
-				"eslint-visitor-keys": {
-					"version": "4.2.1",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
-					"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
-					"dev": true
-				},
-				"ignore": {
-					"version": "7.0.5",
-					"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
-					"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
-					"dev": true
-				},
-				"minimatch": {
-					"version": "9.0.5",
-					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-					"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-					"dev": true,
-					"requires": {
-						"brace-expansion": "^2.0.1"
-					}
-				},
-				"ts-api-utils": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
-					"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
-					"dev": true,
-					"requires": {}
-				}
+				"eslint-plugin-qunit": "^8.2.5",
+				"eslint-plugin-security": "^3.0.1",
+				"eslint-plugin-unicorn": "^56.0.1",
+				"eslint-plugin-vue": "^9.33.0",
+				"eslint-plugin-wdio": "^9.16.2",
+				"eslint-plugin-yml": "^1.19.0"
 			}
 		},
 		"eslint-plugin-compat": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
-			"integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
+			"integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
 			"dev": true,
 			"requires": {
-				"@mdn/browser-compat-data": "^5.3.13",
-				"ast-metadata-inferer": "^0.8.0",
-				"browserslist": "^4.21.10",
-				"caniuse-lite": "^1.0.30001524",
+				"@mdn/browser-compat-data": "^5.5.35",
+				"ast-metadata-inferer": "^0.8.1",
+				"browserslist": "^4.24.2",
+				"caniuse-lite": "^1.0.30001687",
 				"find-up": "^5.0.0",
+				"globals": "^15.7.0",
 				"lodash.memoize": "^4.1.2",
-				"semver": "^7.5.4"
+				"semver": "^7.6.2"
+			},
+			"dependencies": {
+				"globals": {
+					"version": "15.15.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+					"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+					"dev": true
+				}
 			}
 		},
 		"eslint-plugin-es-x": {
-			"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==",
+			"version": "8.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-8.7.0.tgz",
+			"integrity": "sha512-Du5Sb067sjqzmglaPhsfcEQgE1EYfL8sko+4jOMcAB/XKGoCxntSrOmTYuVzswA1rzM9+MZwH6+GOp0G3/wVCg==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.1.2",
-				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.5.0"
+				"@eslint-community/regexpp": "^4.12.1",
+				"eslint-compat-utils": "^0.6.3"
 			}
 		},
 		"eslint-plugin-jest": {
-			"version": "28.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz",
-			"integrity": "sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==",
+			"version": "29.1.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
+			"integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
+				"@typescript-eslint/utils": "^8.0.0"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "48.2.5",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
-			"integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
+			"version": "61.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
+			"integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
 			"dev": true,
 			"requires": {
-				"@es-joy/jsdoccomment": "~0.43.0",
+				"@es-joy/jsdoccomment": "~0.75.0",
 				"are-docs-informative": "^0.0.2",
 				"comment-parser": "1.4.1",
-				"debug": "^4.3.4",
+				"debug": "^4.4.3",
 				"escape-string-regexp": "^4.0.0",
-				"esquery": "^1.5.0",
-				"is-builtin-module": "^3.2.1",
-				"semver": "^7.6.1",
+				"espree": "^10.4.0",
+				"esquery": "^1.6.0",
+				"html-entities": "^2.6.0",
+				"object-deep-merge": "^1.0.5",
+				"parse-imports-exports": "^0.2.4",
+				"semver": "^7.7.3",
 				"spdx-expression-parse": "^4.0.0"
 			},
 			"dependencies": {
+				"eslint-visitor-keys": {
+					"version": "4.2.1",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+					"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+					"dev": true
+				},
+				"espree": {
+					"version": "10.4.0",
+					"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+					"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+					"dev": true,
+					"requires": {
+						"acorn": "^8.15.0",
+						"acorn-jsx": "^5.3.2",
+						"eslint-visitor-keys": "^4.2.1"
+					}
+				},
 				"spdx-expression-parse": {
 					"version": "4.0.0",
 					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
@@ -18356,19 +17712,18 @@
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
-			"integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
+			"integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			}
 		},
 		"eslint-plugin-mocha": {
-			"version": "10.4.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
-			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
+			"version": "10.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz",
+			"integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -18377,44 +17732,47 @@
 			}
 		},
 		"eslint-plugin-n": {
-			"version": "17.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.7.0.tgz",
-			"integrity": "sha512-4Jg4ZKVE4VjHig2caBqPHYNW5na84RVufUuipFLJbgM/G57O6FdpUKJbHakCDJb/yjQuyqVzYWRtU3HNYaZUwg==",
-			"dev": true,
-			"requires": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"enhanced-resolve": "^5.15.0",
-				"eslint-plugin-es-x": "^7.5.0",
-				"get-tsconfig": "^4.7.0",
-				"globals": "^15.0.0",
-				"ignore": "^5.2.4",
-				"minimatch": "^9.0.0",
-				"semver": "^7.5.3"
+			"version": "17.23.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
+			"integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+			"dev": true,
+			"requires": {
+				"@eslint-community/eslint-utils": "^4.5.0",
+				"enhanced-resolve": "^5.17.1",
+				"eslint-plugin-es-x": "^7.8.0",
+				"get-tsconfig": "^4.8.1",
+				"globals": "^15.11.0",
+				"globrex": "^0.1.2",
+				"ignore": "^5.3.2",
+				"semver": "^7.6.3",
+				"ts-declaration-location": "^1.0.6"
 			},
 			"dependencies": {
-				"brace-expansion": {
-					"version": "2.0.2",
-					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-					"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+				"eslint-compat-utils": {
+					"version": "0.5.1",
+					"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+					"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
 					"dev": true,
 					"requires": {
-						"balanced-match": "^1.0.0"
+						"semver": "^7.5.4"
 					}
 				},
-				"globals": {
-					"version": "15.3.0",
-					"resolved": "https://registry.npmjs.org/globals/-/globals-15.3.0.tgz",
-					"integrity": "sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==",
-					"dev": true
-				},
-				"minimatch": {
-					"version": "9.0.4",
-					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
-					"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+				"eslint-plugin-es-x": {
+					"version": "7.8.0",
+					"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+					"integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
 					"dev": true,
 					"requires": {
-						"brace-expansion": "^2.0.1"
+						"@eslint-community/eslint-utils": "^4.1.2",
+						"@eslint-community/regexpp": "^4.11.0",
+						"eslint-compat-utils": "^0.5.1"
 					}
+				},
+				"globals": {
+					"version": "15.15.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+					"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+					"dev": true
 				}
 			}
 		},
@@ -18426,9 +17784,9 @@
 			"requires": {}
 		},
 		"eslint-plugin-qunit": {
-			"version": "8.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
-			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
+			"version": "8.2.5",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
+			"integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -18436,27 +17794,27 @@
 			}
 		},
 		"eslint-plugin-security": {
-			"version": "1.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz",
-			"integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==",
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
+			"integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
 			"dev": true,
 			"requires": {
 				"safe-regex": "^2.1.1"
 			}
 		},
 		"eslint-plugin-unicorn": {
-			"version": "53.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
-			"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
+			"version": "56.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+			"integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.24.5",
+				"@babel/helper-validator-identifier": "^7.24.7",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"@eslint/eslintrc": "^3.0.2",
 				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
-				"core-js-compat": "^3.37.0",
-				"esquery": "^1.5.0",
+				"core-js-compat": "^3.38.1",
+				"esquery": "^1.6.0",
+				"globals": "^15.9.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
@@ -18464,56 +17822,22 @@
 				"read-pkg-up": "^7.0.1",
 				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"semver": "^7.6.1",
+				"semver": "^7.6.3",
 				"strip-indent": "^3.0.0"
 			},
 			"dependencies": {
-				"@eslint/eslintrc": {
-					"version": "3.1.0",
-					"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
-					"integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
-					"dev": true,
-					"requires": {
-						"ajv": "^6.12.4",
-						"debug": "^4.3.2",
-						"espree": "^10.0.1",
-						"globals": "^14.0.0",
-						"ignore": "^5.2.0",
-						"import-fresh": "^3.2.1",
-						"js-yaml": "^4.1.0",
-						"minimatch": "^3.1.2",
-						"strip-json-comments": "^3.1.1"
-					}
-				},
-				"eslint-visitor-keys": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
-					"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
-					"dev": true
-				},
-				"espree": {
-					"version": "10.0.1",
-					"resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
-					"integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
-					"dev": true,
-					"requires": {
-						"acorn": "^8.11.3",
-						"acorn-jsx": "^5.3.2",
-						"eslint-visitor-keys": "^4.0.0"
-					}
-				},
 				"globals": {
-					"version": "14.0.0",
-					"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
-					"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+					"version": "15.15.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+					"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
 					"dev": true
 				}
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "9.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz",
-			"integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==",
+			"version": "9.33.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+			"integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
@@ -18521,26 +17845,27 @@
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
 				"postcss-selector-parser": "^6.0.15",
-				"semver": "^7.6.0",
-				"vue-eslint-parser": "^9.4.2",
+				"semver": "^7.6.3",
+				"vue-eslint-parser": "^9.4.3",
 				"xml-name-validator": "^4.0.0"
 			}
 		},
 		"eslint-plugin-wdio": {
-			"version": "8.24.12",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
-			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
+			"version": "9.16.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
+			"integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
 			"dev": true
 		},
 		"eslint-plugin-yml": {
-			"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==",
+			"version": "1.19.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.0.tgz",
+			"integrity": "sha512-S+4GbcCWksFKAvFJtf0vpdiCkZZvDJCV4Zsi9ahmYkYOYcf+LRqqzvzkb/ST7vTYV6sFwXOvawzYyL/jFT2nQA==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.5.0",
-				"lodash": "^4.17.21",
+				"diff-sequences": "^27.5.1",
+				"escape-string-regexp": "4.0.0",
+				"eslint-compat-utils": "^0.6.0",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
 			}
@@ -18596,9 +17921,9 @@
 			"dev": true
 		},
 		"esquery": {
-			"version": "1.5.0",
-			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
-			"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+			"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
 			"dev": true,
 			"requires": {
 				"estraverse": "^5.1.0"
@@ -19199,9 +18524,9 @@
 			}
 		},
 		"get-tsconfig": {
-			"version": "4.7.5",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
-			"integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+			"version": "4.13.0",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+			"integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
 			"dev": true,
 			"requires": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -19344,6 +18669,12 @@
 			"integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
 			"dev": true
 		},
+		"globrex": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+			"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+			"dev": true
+		},
 		"globule": {
 			"version": "1.3.3",
 			"resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz",
@@ -19708,6 +19039,12 @@
 			"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
 			"dev": true
 		},
+		"html-entities": {
+			"version": "2.6.0",
+			"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+			"integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+			"dev": true
+		},
 		"html-tags": {
 			"version": "3.3.1",
 			"resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
@@ -19791,9 +19128,9 @@
 			"dev": true
 		},
 		"ignore": {
-			"version": "5.3.1",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
-			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+			"version": "5.3.2",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+			"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
 			"dev": true
 		},
 		"image-q": {
@@ -20279,9 +19616,9 @@
 			"dev": true
 		},
 		"jsdoc-type-pratt-parser": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
-			"integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+			"version": "6.9.1",
+			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
+			"integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
 			"dev": true
 		},
 		"jsdoc-wmf-theme": {
@@ -20308,9 +19645,9 @@
 			}
 		},
 		"jsesc": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
-			"integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+			"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
 			"dev": true
 		},
 		"json-buffer": {
@@ -21044,9 +20381,9 @@
 			}
 		},
 		"node-releases": {
-			"version": "2.0.19",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
-			"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+			"version": "2.0.27",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+			"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
 			"dev": true
 		},
 		"nopt": {
@@ -21129,6 +20466,23 @@
 			"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
 			"dev": true
 		},
+		"object-deep-merge": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
+			"integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
+			"dev": true,
+			"requires": {
+				"type-fest": "4.2.0"
+			},
+			"dependencies": {
+				"type-fest": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
+					"integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
+					"dev": true
+				}
+			}
+		},
 		"object-inspect": {
 			"version": "1.13.4",
 			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -21345,6 +20699,15 @@
 			"integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==",
 			"dev": true
 		},
+		"parse-imports-exports": {
+			"version": "0.2.4",
+			"resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+			"integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+			"dev": true,
+			"requires": {
+				"parse-statements": "1.0.11"
+			}
+		},
 		"parse-json": {
 			"version": "5.2.0",
 			"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -21369,6 +20732,12 @@
 			"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
 			"dev": true
 		},
+		"parse-statements": {
+			"version": "1.0.11",
+			"resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+			"integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+			"dev": true
+		},
 		"parse5": {
 			"version": "7.3.0",
 			"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
@@ -21575,9 +20944,9 @@
 			"requires": {}
 		},
 		"postcss-selector-parser": {
-			"version": "6.0.16",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
-			"integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
+			"version": "6.1.2",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+			"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
 			"dev": true,
 			"requires": {
 				"cssesc": "^3.0.0",
@@ -22279,9 +21648,9 @@
 			}
 		},
 		"semver": {
-			"version": "7.7.2",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
-			"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+			"version": "7.7.3",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+			"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
 			"dev": true
 		},
 		"serialize-error": {
@@ -22961,9 +22330,9 @@
 			}
 		},
 		"tapable": {
-			"version": "2.2.1",
-			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+			"integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
 			"dev": true
 		},
 		"tar-fs": {
@@ -23078,12 +22447,29 @@
 			}
 		},
 		"ts-api-utils": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
-			"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+			"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
 			"dev": true,
 			"requires": {}
 		},
+		"ts-declaration-location": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+			"integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+			"dev": true,
+			"requires": {
+				"picomatch": "^4.0.2"
+			},
+			"dependencies": {
+				"picomatch": {
+					"version": "4.0.3",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+					"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+					"dev": true
+				}
+			}
+		},
 		"tslib": {
 			"version": "2.8.1",
 			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -23197,9 +22583,9 @@
 			"dev": true
 		},
 		"update-browserslist-db": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
-			"integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+			"version": "1.1.4",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+			"integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
 			"dev": true,
 			"requires": {
 				"escalade": "^3.2.0",
@@ -23547,19 +22933,18 @@
 			"dev": true
 		},
 		"yaml": {
-			"version": "2.4.3",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz",
-			"integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==",
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+			"integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
 			"dev": true
 		},
 		"yaml-eslint-parser": {
-			"version": "1.2.3",
-			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
-			"integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz",
+			"integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==",
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^3.0.0",
-				"lodash": "^4.17.21",
 				"yaml": "^2.0.0"
 			}
 		},
diff --git a/package.json b/package.json
index a7046c5..84f7f9d 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
 		"@wdio/mocha-framework": "9.15.0",
 		"@wdio/spec-reporter": "9.15.0",
 		"api-testing": "1.7.1",
-		"eslint-config-wikimedia": "0.31.0",
+		"eslint-config-wikimedia": "0.32.0",
 		"eslint-plugin-local": "^4.2.2",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.13.0",
-- 
2.47.3


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