mediawiki/services/cxserver: main (log #2459039)

sourcepatches

This run took 181 seconds.

From 1445c9b1d85c3603ecc65373a967b439cc820bdc Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Fri, 1 May 2026 09:43:26 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.32.3

Change-Id: I2abb15ddbaa321fc49e934e8e81ea5b32ad1feea
---
 package-lock.json | 605 ++++++++++++++++++++++++++--------------------
 package.json      |   2 +-
 2 files changed, 339 insertions(+), 268 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 782fd3a..bc0b1d3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -45,7 +45,7 @@
 				"@eslint/js": "^9.34.0",
 				"argparse": "^2.0.1",
 				"async": "^3.2.3",
-				"eslint-config-wikimedia": "0.31.0",
+				"eslint-config-wikimedia": "0.32.3",
 				"eslint-plugin-import": "^2.31.0",
 				"globals": "^15.12.0",
 				"nodemon": "^3.0.1",
@@ -1833,35 +1833,28 @@
 			}
 		},
 		"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.76.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
+			"integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
 			"dev": true,
-			"license": "MIT",
 			"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.10.0"
 			},
 			"engines": {
-				"node": ">=16"
+				"node": ">=20.11.0"
 			}
 		},
-		"node_modules/@es-joy/jsdoccomment/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/@es-joy/resolve.exports": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+			"integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": ">=10"
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
@@ -2201,11 +2194,10 @@
 			}
 		},
 		"node_modules/@mdn/browser-compat-data": {
-			"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,
-			"license": "CC0-1.0"
+			"version": "6.1.5",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-6.1.5.tgz",
+			"integrity": "sha512-PzdZZzRhcXvKB0begee28n5lvwAcinGKYuLZOVxHAZm+n7y01ddEGfdS1ZXRuVcV+ndG6mSEAE8vgudom5UjYg==",
+			"dev": true
 		},
 		"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
 			"version": "5.1.1-v1",
@@ -2364,6 +2356,18 @@
 			"hasInstallScript": true,
 			"license": "Apache-2.0"
 		},
+		"node_modules/@sindresorhus/base62": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+			"integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+			"dev": true,
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
 		"node_modules/@so-ric/colorspace": {
 			"version": "1.1.6",
 			"resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz",
@@ -2407,30 +2411,11 @@
 				"url": "https://opencollective.com/eslint"
 			}
 		},
-		"node_modules/@types/eslint": {
-			"version": "8.56.12",
-			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
-			"integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"@types/estree": "*",
-				"@types/json-schema": "*"
-			}
-		},
 		"node_modules/@types/estree": {
 			"version": "1.0.8",
 			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
 			"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
-			"dev": true,
-			"license": "MIT"
-		},
-		"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,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/@types/json5": {
 			"version": "0.0.29",
@@ -2443,8 +2428,7 @@
 			"version": "2.4.4",
 			"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
 			"integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/@types/triple-beam": {
 			"version": "1.3.5",
@@ -2460,17 +2444,16 @@
 			"optional": true
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"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",
+				"@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": "^7.0.0",
 				"natural-compare": "^1.4.0",
@@ -2484,22 +2467,21 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/parser": "^8.35.1",
+				"@typescript-eslint/parser": "^8.46.0",
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"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==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+			"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
 			"dev": true,
-			"license": "MIT",
 			"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"
+				"@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.9.0 || >=21.1.0"
@@ -2510,7 +2492,7 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
@@ -2518,22 +2500,20 @@
 			"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
 			"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">= 4"
 			}
 		},
 		"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==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+			"integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
 			"dev": true,
-			"license": "MIT",
 			"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",
+				"@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": {
@@ -2545,18 +2525,17 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/tsconfig-utils": "^8.35.1",
-				"@typescript-eslint/types": "^8.35.1",
+				"@typescript-eslint/tsconfig-utils": "^8.46.0",
+				"@typescript-eslint/types": "^8.46.0",
 				"debug": "^4.3.4"
 			},
 			"engines": {
@@ -2567,18 +2546,17 @@
 				"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/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==",
+			"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,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1"
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2589,11 +2567,10 @@
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
@@ -2602,18 +2579,18 @@
 				"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": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
-			"integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
+			"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,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/typescript-estree": "8.35.1",
-				"@typescript-eslint/utils": "8.35.1",
+				"@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": "^2.1.0"
 			},
@@ -2626,20 +2603,19 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/type-utils/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==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+			"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
 			"dev": true,
-			"license": "MIT",
 			"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"
+				"@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.9.0 || >=21.1.0"
@@ -2650,15 +2626,14 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
@@ -2668,16 +2643,15 @@
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"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",
+				"@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",
 				"fast-glob": "^3.3.2",
 				"is-glob": "^4.0.3",
@@ -2693,7 +2667,7 @@
 				"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/typescript-estree/node_modules/brace-expansion": {
@@ -2701,7 +2675,6 @@
 			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
 			"integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"balanced-match": "^1.0.0"
 			}
@@ -2711,7 +2684,6 @@
 			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
 			"integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
 			"dev": true,
-			"license": "ISC",
 			"dependencies": {
 				"brace-expansion": "^2.0.2"
 			},
@@ -2727,7 +2699,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
 			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -2942,13 +2913,12 @@
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/types": "8.35.1",
+				"@typescript-eslint/types": "8.46.0",
 				"eslint-visitor-keys": "^4.2.1"
 			},
 			"engines": {
@@ -2964,7 +2934,6 @@
 			"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,
-			"license": "Apache-2.0",
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
@@ -3199,7 +3168,6 @@
 			"resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
 			"integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=14"
 			}
@@ -3350,11 +3318,16 @@
 			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
 			"integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"@mdn/browser-compat-data": "^5.6.19"
 			}
 		},
+		"node_modules/ast-metadata-inferer/node_modules/@mdn/browser-compat-data": {
+			"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/async": {
 			"version": "3.2.6",
 			"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
@@ -3684,7 +3657,6 @@
 			"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
 			"integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=6"
 			},
@@ -3983,7 +3955,6 @@
 					"url": "https://github.com/sponsors/sibiraj-s"
 				}
 			],
-			"license": "MIT",
 			"engines": {
 				"node": ">=8"
 			}
@@ -3993,7 +3964,6 @@
 			"resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
 			"integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"escape-string-regexp": "^1.0.5"
 			},
@@ -4006,7 +3976,6 @@
 			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
 			"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=0.8.0"
 			}
@@ -4135,7 +4104,6 @@
 			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
 			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">= 12.0.0"
 			}
@@ -4691,7 +4659,6 @@
 			"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
 			"integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"is-arrayish": "^0.2.1"
 			}
@@ -4964,35 +4931,114 @@
 			}
 		},
 		"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.3",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.3.tgz",
+			"integrity": "sha512-Ekz2/ozpCCjQl3VbC6dW7ChqoW7FRilLDxmJ+FJOZhIxxzZSZR5QqQOAGWSZAlG1ONkZbYV/TPwGLWZcrNxyaA==",
 			"dev": true,
-			"license": "MIT",
 			"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.3.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.2",
+				"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": ">=20 <25"
+			}
+		},
+		"node_modules/eslint-config-wikimedia/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.1.2",
+				"@eslint-community/regexpp": "^4.12.1",
+				"eslint-compat-utils": "^0.6.3"
+			},
+			"engines": {
+				"node": "^14.18.0 || >=16.0.0"
+			},
+			"peerDependencies": {
+				"eslint": ">=8"
+			}
+		},
+		"node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-es-x/node_modules/eslint-compat-utils": {
+			"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"
 			},
 			"engines": {
-				"node": ">=18 <25"
+				"node": ">=12"
+			},
+			"peerDependencies": {
+				"eslint": ">=6.0.0"
+			}
+		},
+		"node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio": {
+			"version": "9.27.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.27.1.tgz",
+			"integrity": "sha512-p/e1nKlb4tGFHv06DJh8ChuoJnQJGrj2ed/RrFQrX3Q3Kx0+GcRYWjyWMhO4DIA1DjU+7JEr957IPanHmz7UHw==",
+			"dev": true,
+			"engines": {
+				"node": ">=18.20.0"
+			},
+			"peerDependencies": {
+				"eslint": "^9.39.2",
+				"globals": "^16.5.0",
+				"typescript-eslint": "^8.54.0"
+			},
+			"peerDependenciesMeta": {
+				"typescript-eslint": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/eslint-config-wikimedia/node_modules/globals": {
+			"version": "16.5.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+			"integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+			"dev": true,
+			"peer": true,
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/eslint-config-wikimedia/node_modules/semver": {
+			"version": "7.7.4",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+			"dev": true,
+			"bin": {
+				"semver": "bin/semver.js"
+			},
+			"engines": {
+				"node": ">=10"
 			}
 		},
 		"node_modules/eslint-import-resolver-node": {
@@ -5070,25 +5116,24 @@
 			}
 		},
 		"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==",
+			"version": "6.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.2.1.tgz",
+			"integrity": "sha512-gLKqUH+lQcCL+HzsROUjBDvakc5Zaga51Y4ZAkPCXc41pzKBfyluqTr2j8zOx8QQQb7zyglu1LVoL5aSNWf2SQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
-				"@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": "^6.1.1",
+				"ast-metadata-inferer": "^0.8.1",
+				"browserslist": "^4.25.2",
 				"find-up": "^5.0.0",
+				"globals": "^15.7.0",
 				"lodash.memoize": "^4.1.2",
-				"semver": "^7.5.4"
+				"semver": "^7.6.2"
 			},
 			"engines": {
-				"node": ">=14.x"
+				"node": ">=18.x"
 			},
 			"peerDependencies": {
-				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-compat/node_modules/semver": {
@@ -5096,7 +5141,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
 			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -5184,21 +5228,21 @@
 			}
 		},
 		"node_modules/eslint-plugin-jest": {
-			"version": "28.14.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz",
-			"integrity": "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==",
+			"version": "29.15.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz",
+			"integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0"
+				"@typescript-eslint/utils": "^8.0.0"
 			},
 			"engines": {
-				"node": "^16.10.0 || ^18.12.0 || >=20.0.0"
+				"node": "^20.12.0 || ^22.0.0 || >=24.0.0"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0",
-				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
-				"jest": "*"
+				"@typescript-eslint/eslint-plugin": "^8.0.0",
+				"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+				"jest": "*",
+				"typescript": ">=4.8.4 <7.0.0"
 			},
 			"peerDependenciesMeta": {
 				"@typescript-eslint/eslint-plugin": {
@@ -5206,28 +5250,35 @@
 				},
 				"jest": {
 					"optional": true
+				},
+				"typescript": {
+					"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==",
+			"version": "61.3.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.3.0.tgz",
+			"integrity": "sha512-E4m/5J5lrasd63Z74q4CCZ4PFnywnnrcvA7zZ98802NPhrZKKTp5NH+XAT+afcjXp2ps2/OQF5gPSWCT2XFCJg==",
 			"dev": true,
-			"license": "BSD-3-Clause",
 			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.43.0",
+				"@es-joy/jsdoccomment": "~0.76.0",
+				"@es-joy/resolve.exports": "1.2.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",
-				"spdx-expression-parse": "^4.0.0"
+				"espree": "^10.4.0",
+				"esquery": "^1.6.0",
+				"html-entities": "^2.6.0",
+				"object-deep-merge": "^2.0.0",
+				"parse-imports-exports": "^0.2.4",
+				"semver": "^7.7.3",
+				"spdx-expression-parse": "^4.0.0",
+				"to-valid-identifier": "^1.0.0"
 			},
 			"engines": {
-				"node": ">=18"
+				"node": ">=20.11.0"
 			},
 			"peerDependencies": {
 				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
@@ -5238,7 +5289,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
 			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -5292,11 +5342,10 @@
 			}
 		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.1.tgz",
-			"integrity": "sha512-C/OfySlkkjHJrZl1ieHlL8AyebgrppyX49DUYEVXk7n0qu7dD/vuOnzeQz28H2MkUVj3GnoFSUxqbczG6IUwwg==",
+			"version": "0.8.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
+			"integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"upath": "^2.0.1"
 			},
@@ -5419,29 +5468,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,
-			"license": "Apache-2.0",
 			"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,
-			"license": "MIT",
 			"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",
@@ -5449,7 +5502,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": {
@@ -5467,7 +5520,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
 			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -5540,16 +5592,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/eslint-plugin-wdio": {
-			"version": "8.37.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.37.0.tgz",
-			"integrity": "sha512-X217zXxSqj1IPWu3bxN7D/xEUmNk7Jg5lBf2JwYH3mCogaqL2tnHZnwt0EQ5D9oEejfEl2+4zqHSzhXq1X7F2A==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": "^16.13 || >=18"
-			}
-		},
 		"node_modules/eslint-plugin-yml": {
 			"version": "1.19.1",
 			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.1.tgz",
@@ -6043,7 +6085,6 @@
 			"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
 			"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"@nodelib/fs.stat": "^2.0.2",
 				"@nodelib/fs.walk": "^1.2.3",
@@ -6060,7 +6101,6 @@
 			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 			"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 			"dev": true,
-			"license": "ISC",
 			"dependencies": {
 				"is-glob": "^4.0.1"
 			},
@@ -6777,8 +6817,7 @@
 			"version": "2.8.9",
 			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
 			"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-			"dev": true,
-			"license": "ISC"
+			"dev": true
 		},
 		"node_modules/html-encoding-sniffer": {
 			"version": "6.0.0",
@@ -6792,6 +6831,22 @@
 				"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
 			}
 		},
+		"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-escaper": {
 			"version": "2.0.2",
 			"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -7034,8 +7089,7 @@
 			"version": "0.2.1",
 			"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
 			"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/is-async-function": {
 			"version": "2.1.1",
@@ -7108,7 +7162,6 @@
 			"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
 			"integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"builtin-modules": "^3.3.0"
 			},
@@ -7657,13 +7710,12 @@
 			}
 		},
 		"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.10.0",
+			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz",
+			"integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
-				"node": ">=12.0.0"
+				"node": ">=20.0.0"
 			}
 		},
 		"node_modules/jsdom": {
@@ -7748,8 +7800,7 @@
 			"version": "2.3.1",
 			"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
 			"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/json-schema-traverse": {
 			"version": "0.4.1",
@@ -7867,8 +7918,7 @@
 			"version": "1.2.4",
 			"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
 			"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/locate-path": {
 			"version": "6.0.0",
@@ -7947,8 +7997,7 @@
 			"version": "4.1.2",
 			"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
 			"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/lodash.merge": {
 			"version": "4.6.2",
@@ -8080,7 +8129,6 @@
 			"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
 			"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">= 8"
 			}
@@ -8099,7 +8147,6 @@
 			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
 			"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"braces": "^3.0.3",
 				"picomatch": "^2.3.1"
@@ -8113,7 +8160,6 @@
 			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
 			"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=8.6"
 			},
@@ -8180,7 +8226,6 @@
 			"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
 			"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=4"
 			}
@@ -8654,7 +8699,6 @@
 			"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
 			"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
 			"dev": true,
-			"license": "BSD-2-Clause",
 			"dependencies": {
 				"hosted-git-info": "^2.1.4",
 				"resolve": "^1.10.0",
@@ -8667,7 +8711,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 			"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver"
 			}
@@ -8881,6 +8924,12 @@
 				"node": ">=6"
 			}
 		},
+		"node_modules/object-deep-merge": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+			"integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+			"dev": true
+		},
 		"node_modules/object-inspect": {
 			"version": "1.13.4",
 			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -9196,12 +9245,20 @@
 				"node": ">=6"
 			}
 		},
+		"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",
 			"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"@babel/code-frame": "^7.0.0",
 				"error-ex": "^1.3.1",
@@ -9215,6 +9272,12 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
+		"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": "8.0.0",
 			"resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz",
@@ -9400,7 +9463,6 @@
 			"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
 			"integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=4"
 			}
@@ -9643,7 +9705,6 @@
 			"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
 			"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"@types/normalize-package-data": "^2.4.0",
 				"normalize-package-data": "^2.5.0",
@@ -9659,7 +9720,6 @@
 			"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
 			"integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"find-up": "^4.1.0",
 				"read-pkg": "^5.2.0",
@@ -9677,7 +9737,6 @@
 			"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
 			"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"locate-path": "^5.0.0",
 				"path-exists": "^4.0.0"
@@ -9691,7 +9750,6 @@
 			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
 			"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"p-locate": "^4.1.0"
 			},
@@ -9704,7 +9762,6 @@
 			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
 			"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"p-try": "^2.0.0"
 			},
@@ -9720,7 +9777,6 @@
 			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
 			"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"p-limit": "^2.2.0"
 			},
@@ -9733,7 +9789,6 @@
 			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
 			"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
 			"dev": true,
-			"license": "(MIT OR CC0-1.0)",
 			"engines": {
 				"node": ">=8"
 			}
@@ -9833,7 +9888,6 @@
 			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
 			"integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
 			"dev": true,
-			"license": "MIT",
 			"bin": {
 				"regexp-tree": "bin/regexp-tree"
 			}
@@ -9902,7 +9956,6 @@
 			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz",
 			"integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==",
 			"dev": true,
-			"license": "BSD-2-Clause",
 			"dependencies": {
 				"jsesc": "~0.5.0"
 			},
@@ -9967,6 +10020,18 @@
 				"node": ">=0.10.5"
 			}
 		},
+		"node_modules/reserved-identifiers": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+			"integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+			"dev": true,
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
 		"node_modules/resolve": {
 			"version": "1.22.12",
 			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
@@ -10137,7 +10202,6 @@
 			"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz",
 			"integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"regexp-tree": "~0.1.1"
 			}
@@ -10659,7 +10723,6 @@
 			"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
 			"integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"dependencies": {
 				"spdx-expression-parse": "^3.0.0",
 				"spdx-license-ids": "^3.0.0"
@@ -10670,7 +10733,6 @@
 			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
 			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"spdx-exceptions": "^2.1.0",
 				"spdx-license-ids": "^3.0.0"
@@ -10680,15 +10742,13 @@
 			"version": "2.5.0",
 			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
 			"integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
-			"dev": true,
-			"license": "CC-BY-3.0"
+			"dev": true
 		},
 		"node_modules/spdx-expression-parse": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
 			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"spdx-exceptions": "^2.1.0",
 				"spdx-license-ids": "^3.0.0"
@@ -10698,8 +10758,7 @@
 			"version": "3.0.23",
 			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
 			"integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
-			"dev": true,
-			"license": "CC0-1.0"
+			"dev": true
 		},
 		"node_modules/sprintf-js": {
 			"version": "1.0.3",
@@ -10909,7 +10968,6 @@
 			"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
 			"integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"min-indent": "^1.0.0"
 			},
@@ -11249,6 +11307,22 @@
 				"node": ">=8.0"
 			}
 		},
+		"node_modules/to-valid-identifier": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+			"integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+			"dev": true,
+			"dependencies": {
+				"@sindresorhus/base62": "^1.0.0",
+				"reserved-identifiers": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=20"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
 		"node_modules/toidentifier": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -11634,7 +11708,6 @@
 			"resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
 			"integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=4",
 				"yarn": "*"
@@ -11711,7 +11784,6 @@
 			"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
 			"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"dependencies": {
 				"spdx-correct": "^3.0.0",
 				"spdx-expression-parse": "^3.0.0"
@@ -11722,7 +11794,6 @@
 			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
 			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"spdx-exceptions": "^2.1.0",
 				"spdx-license-ids": "^3.0.0"
diff --git a/package.json b/package.json
index 31cc9f6..055ce6c 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
 		"@eslint/js": "^9.34.0",
 		"argparse": "^2.0.1",
 		"async": "^3.2.3",
-		"eslint-config-wikimedia": "0.31.0",
+		"eslint-config-wikimedia": "0.32.3",
 		"eslint-plugin-import": "^2.31.0",
 		"globals": "^15.12.0",
 		"nodemon": "^3.0.1",
-- 
2.47.3

$ date
--- stdout ---
Fri May  1 09:40:35 UTC 2026

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

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

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

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

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

--- end ---
$ git show-ref refs/heads/master
--- stdout ---
7584ba0f46f15044de083cf4cd2088a6afe5f366 refs/heads/master

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "istanbul-lib-processinfo": {
      "name": "istanbul-lib-processinfo",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "uuid"
      ],
      "effects": [
        "nyc"
      ],
      "range": "*",
      "nodes": [
        "node_modules/istanbul-lib-processinfo"
      ],
      "fixAvailable": {
        "name": "nyc",
        "version": "14.1.1",
        "isSemVerMajor": true
      }
    },
    "nyc": {
      "name": "nyc",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "istanbul-lib-processinfo"
      ],
      "effects": [],
      "range": ">=15.0.0-alpha.0",
      "nodes": [
        "node_modules/nyc"
      ],
      "fixAvailable": {
        "name": "nyc",
        "version": "14.1.1",
        "isSemVerMajor": true
      }
    },
    "swagger-router": {
      "name": "swagger-router",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "uuid"
      ],
      "effects": [],
      "range": ">=0.7.4",
      "nodes": [
        "node_modules/swagger-router"
      ],
      "fixAvailable": {
        "name": "swagger-router",
        "version": "0.7.3",
        "isSemVerMajor": true
      }
    },
    "uuid": {
      "name": "uuid",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1116970,
          "name": "uuid",
          "dependency": "uuid",
          "title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided",
          "url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq",
          "severity": "moderate",
          "cwe": [
            "CWE-787",
            "CWE-1285"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<14.0.0"
        }
      ],
      "effects": [
        "istanbul-lib-processinfo",
        "swagger-router"
      ],
      "range": "<14.0.0",
      "nodes": [
        "node_modules/swagger-router/node_modules/uuid",
        "node_modules/uuid"
      ],
      "fixAvailable": {
        "name": "swagger-router",
        "version": "0.7.3",
        "isSemVerMajor": true
      }
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 4,
      "high": 0,
      "critical": 0,
      "total": 4
    },
    "dependencies": {
      "prod": 268,
      "dev": 585,
      "optional": 52,
      "peer": 1,
      "peerOptional": 0,
      "total": 903
    }
  }
}

--- end ---
Upgrading n:eslint-config-wikimedia from 0.31.0 -> 0.32.3
$ /usr/bin/npm install
--- stderr ---
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN   peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN   node_modules/@babel/eslint-parser
npm WARN     dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN   29 more (@eslint-community/eslint-utils, ...)
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN   eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN   node_modules/eslint-config-wikimedia
npm WARN 
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN   peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN   node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN     eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN     node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'cxserver@1.2.1',
npm WARN EBADENGINE   required: { node: '>=24' },
npm WARN EBADENGINE   current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm WARN deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm WARN deprecated prebuild-install@7.1.3: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
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 eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.
--- stdout ---

added 908 packages, and audited 909 packages in 16s

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

4 moderate severity vulnerabilities

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

Run `npm audit` for details.

--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json

--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json

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

/src/repo/app.js
   51:1   warning  The type 'Express' is undefined                                            jsdoc/no-undefined-types
   83:34  warning  Found non-literal argument to RegExp Constructor                           security/detect-non-literal-regexp
   89:25  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  264:9   warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  265:10  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/bin/segment.js
  17:33  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/Config.js
  42:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  64:38  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  97:29  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/adaptation/TemplateParameterMapper.js
  110:5  warning  Mixed spaces and tabs                         no-mixed-spaces-and-tabs
  110:7  warning  Expected no linebreak before this expression  implicit-arrow-linebreak
  113:4  warning  Mixed spaces and tabs                         no-mixed-spaces-and-tabs

/src/repo/lib/lineardoc/MwContextualizer.js
  143:35  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/lib/logging.js
  7:1  warning  The type 'winston.Logger' is undefined  jsdoc/no-undefined-types

/src/repo/lib/mw/MWPageLoader.js
  19:33  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/suggestion/SectionSuggester.js
  13:1  warning  Missing JSDoc @param "dbPool" type  jsdoc/require-param-type

/src/repo/lib/swagger-ui.js
  26:9  warning  Found readFile from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/translationunits/MWCategory.js
  15:41  warning  Unsafe Regular Expression  security/detect-unsafe-regex

/src/repo/lib/translationunits/MWFile.js
  44:51  warning  Unsafe Regular Expression  security/detect-unsafe-regex

/src/repo/lib/translationunits/MWImage.js
  123:68  warning  Unsafe Regular Expression  security/detect-unsafe-regex

/src/repo/lib/util.js
  133:23  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/scripts/template-mapping.js
  108:7   warning  Found existsSync from package "fs" with non literal argument at index 0    security/detect-non-literal-fs-filename
  114:14  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/spec.yaml
  197:1  warning  This line has a length of 139. Maximum allowed is 100  max-len
  248:1  warning  This line has a length of 139. Maximum allowed is 100  max-len
  470:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  503:1  warning  This line has a length of 216. Maximum allowed is 100  max-len
  540:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  547:1  warning  This line has a length of 216. Maximum allowed is 100  max-len
  589:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  606:1  warning  This line has a length of 134. Maximum allowed is 100  max-len
  621:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  653:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  670:1  warning  This line has a length of 134. Maximum allowed is 100  max-len

/src/repo/test/adaptation/SectionTest.js
  31:20  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/features/app/spec.js
   21:16  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  168:10  warning  Found non-literal argument to RegExp Constructor                           security/detect-non-literal-regexp

/src/repo/test/lineardoc/LinearDoc.test.js
   28:22  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
   32:24  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
   36:26  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
   78:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  101:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  156:27  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  249:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/mw/MWPageLoaderTest.js
  37:27  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  46:5   warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/mw/SectionWrap.test.js
  17:33  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/segmentation/CXSegmenter.test.js
  28:19  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  34:3   warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/testutils.js
  22:5  warning  Found writeFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/translationunits/MWReference.test.js
  38:21  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  55:27  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/utils/assert.js
  8:40  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

✖ 53 problems (0 errors, 53 warnings)


--- end ---
$ ./node_modules/.bin/eslint . -f json
--- stdout ---
[{"filePath":"/src/repo/app.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Express' is undefined.","line":51,"column":1,"nodeType":"Block","endLine":51,"endColumn":1},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":83,"column":34,"nodeType":"NewExpression","endLine":86,"endColumn":3},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":89,"column":25,"nodeType":"CallExpression","endLine":89,"endColumn":58},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":264,"column":9,"nodeType":"CallExpression","endLine":264,"endColumn":45},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":265,"column":10,"nodeType":"CallExpression","endLine":265,"endColumn":46}],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'compression_level' is not in camel case.","line":32,"column":2,"nodeType":"Identifier","messageId":"notCamelCase","endLine":32,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'log_header_whitelist' is not in camel case.","line":36,"column":2,"nodeType":"Identifier","messageId":"notCamelCase","endLine":36,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'log_header_whitelist' is not in camel case.","line":83,"column":11,"nodeType":"Identifier","messageId":"notCamelCase","endLine":83,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @external Application\n */\n\nimport { createServer as createHTTPServer } from 'http';\nimport { createServer as createHTTPSServer } from 'https';\nimport { readFileSync } from 'fs';\nimport { inspect, promisify } from 'util';\nimport { randomUUID } from 'crypto';\nimport express from 'express';\nimport compression from 'compression';\nimport { load } from 'js-yaml';\nimport bodyParser from 'body-parser';\nimport addShutdown from 'http-shutdown';\nimport { createPool } from 'mysql';\nimport { HTTPError, responseTimeMetricsMiddleware } from './lib/util.js';\nimport MTClientError from './lib/mt/MTClientError.js';\nimport packageInfo from './package.json' with { type: 'json' };\nimport CXConfig from './lib/Config.js';\nimport PrometheusClient from './lib/metric.js';\nimport { logger } from './lib/logging.js';\nimport infoRoutes from './lib/routes/info.js';\nimport rootRoutes from './lib/routes/root.js';\nimport { router as v1Routes } from './lib/routes/v1.js';\nimport v2Routes from './lib/routes/v2.js';\n\nconst defaultConfig = {\n\tname: packageInfo.name,\n\tport: 8888,\n\tinterface: '0.0.0.0',\n\t// eslint-disable-next-line camelcase\n\tcompression_level: 3,\n\tcors: '*',\n\tcsp: \"default-src 'self'; object-src 'none'; media-src *; img-src *; style-src *; frame-ancestors 'self'\",\n\t// eslint-disable-next-line camelcase\n\tlog_header_whitelist: [\n\t\t'cache-control',\n\t\t'content-type',\n\t\t'content-length',\n\t\t'if-match',\n\t\t'user-agent',\n\t\t'x-request-id'\n\t],\n\tspecfile: './spec.yaml'\n};\n\n/**\n * Creates an express app and initialises it\n *\n * @param {Object} options the options to initialise the app with\n * @return {Express} the express app object\n */\nexport async function initApp( options ) {\n\tconst app = express();\n\n\toptions = Object.assign( {}, defaultConfig, options );\n\n\t// get the options and make them available in the app\n\tapp.logger = logger( options.name, options.logging );\n\tapp.logger.log( 'info', `Starting ${ options.name }` );\n\tapp.conf = options; // this app's config options\n\tapp.info = packageInfo; // this app's package info\n\tapp.metrics = new PrometheusClient( {\n\t\tcollectDefaultMetrics: true,\n\t\tstaticLabels: { service: options.name }\n\t} ); // the metrics\n\n\t// set outgoing proxy\n\tif ( app.conf.proxy ) {\n\t\tprocess.env.HTTP_PROXY = app.conf.proxy;\n\t\t// if there is a list of domains which should\n\t\t// not be proxied, set it\n\t\tif ( app.conf.no_proxy_list ) {\n\t\t\tif ( Array.isArray( app.conf.no_proxy_list ) ) {\n\t\t\t\tprocess.env.NO_PROXY = app.conf.no_proxy_list.join( ',' );\n\t\t\t} else {\n\t\t\t\tprocess.env.NO_PROXY = app.conf.no_proxy_list;\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line camelcase\n\tapp.conf.log_header_whitelist = new RegExp(\n\t\t`^(?:${ app.conf.log_header_whitelist.map( ( item ) => item.trim() ).join( '|' ) })$`,\n\t\t'i'\n\t);\n\n\ttry {\n\t\tapp.conf.spec = load( readFileSync( app.conf.specfile ) );\n\t} catch ( e ) {\n\t\tapp.logger.log( 'warn/spec', `Could not load the spec: ${ e }` );\n\t\tapp.conf.spec = {};\n\t}\n\n\t// set the CORS and CSP headers.\n\tapp.all( '*', ( req, res, next ) => {\n\t\tif ( app.conf.cors !== false ) {\n\t\t\tres.header( 'access-control-allow-origin', app.conf.cors );\n\t\t\tres.header(\n\t\t\t\t'access-control-allow-headers',\n\t\t\t\t'accept, authorization, x-requested-with, content-type, x-wikimedia-debug'\n\t\t\t);\n\t\t\tres.header( 'access-control-expose-headers', 'etag' );\n\t\t}\n\t\tif ( app.conf.csp !== false ) {\n\t\t\tres.header( 'x-xss-protection', '1; mode=block' );\n\t\t\tres.header( 'x-content-type-options', 'nosniff' );\n\t\t\tres.header( 'x-frame-options', 'SAMEORIGIN' );\n\t\t\tres.header( 'content-security-policy', app.conf.csp );\n\t\t\tres.header( 'x-content-security-policy', app.conf.csp );\n\t\t\tres.header( 'x-webkit-csp', app.conf.csp );\n\t\t}\n\n\t\tnext();\n\t} );\n\n\t// disable the X-Powered-By header\n\tapp.set( 'x-powered-by', false );\n\t// disable the ETag header.Yet to identify a valid need for cxserver.\n\tapp.set( 'etag', false );\n\t// enable compression\n\tapp.use(\n\t\tcompression( {\n\t\t\tlevel: app.conf.compression_level\n\t\t} )\n\t);\n\t// use the application/x-www-form-urlencoded parser\n\tapp.use(\n\t\tbodyParser.urlencoded( {\n\t\t\textended: true,\n\t\t\tlimit: 500000 // 0.5 megabyte\n\t\t} )\n\t);\n\t// use the JSON body parser\n\tapp.use(\n\t\tbodyParser.json( {\n\t\t\tlimit: 500000\n\t\t} )\n\t);\n\n\t// Add a middleware to log the response time\n\tapp.use( responseTimeMetricsMiddleware( app ) );\n\n\tapp.use( ( req, res, next ) => {\n\t\tapp.logger = app.logger.child( {\n\t\t\turl: {\n\t\t\t\tpath: req.url\n\t\t\t},\n\t\t\thttp: {\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: req.method,\n\t\t\t\t\tid: randomUUID()\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\tnext();\n\t} );\n\n\tapp.use( '/', rootRoutes );\n\tapp.use( '/v1', v1Routes );\n\tapp.use( '/v2', v2Routes );\n\tapp.use( '/_info', infoRoutes );\n\tapp.get( '/metrics', async ( req, res ) => {\n\t\tres.set( 'Content-Type', app.metrics.client.register.contentType );\n\t\tres.end( await app.metrics.metrics() );\n\t} );\n\n\t// Catch and handle propagated errors\n\tapp.use( ( err, req, res, next ) => {\n\t\tif ( err.cause ) {\n\t\t\t// ECS doesn't support a \"cause\" field in error\n\t\t\t// Log the error to a custom field.\n\t\t\t// See: https://www.elastic.co/guide/en/ecs/current/ecs-custom-fields-in-ecs.html\n\t\t\terr.Cause = inspect( err, { depth: 4 } );\n\t\t}\n\n\t\tif ( err instanceof HTTPError ) {\n\t\t\t// For HTTPError, only log errors with 500+ status codes\n\t\t\tif ( err.status >= 500 ) {\n\t\t\t\tapp.logger.error( 'HTTP Error details:', err );\n\t\t\t}\n\t\t} else if ( err instanceof MTClientError ) {\n\t\t\tif ( err.status >= 500 ) {\n\t\t\t\tapp.logger.error( 'MT Client Error', err );\n\t\t\t}\n\t\t} else {\n\t\t\tapp.logger.error( 'Error details:', err );\n\t\t}\n\n\t\tif ( res.writableFinished ) {\n\t\t\t// response has been sent and we've logged the error\n\t\t\t// Avoid passing the error to Express error handler to have\n\t\t\t// it be logged again by Express in a format that's not supported.\n\t\t\t// See: T377966\n\t\t\treturn;\n\t\t}\n\n\t\tif ( res.headersSent ) {\n\t\t\t// Headers have been sent, but the response has not been flushed out.\n\t\t\t// Send the error to Express to log and flush the response.\n\t\t\treturn next( err );\n\t\t}\n\n\t\tres.status( err.status || 500 );\n\n\t\tres.json( {\n\t\t\terror: {\n\t\t\t\tmessage: err.message || 'Internal Server Error',\n\t\t\t\tstatus: err.status\n\t\t\t}\n\t\t} );\n\t} );\n\n\tconst config = new CXConfig( app );\n\tawait config.parseAndLoadConfig();\n\tapp.registry = config;\n\n\t// Initialize database connection pool for section mapping\n\tif ( app.conf.sectionmapping?.type === 'mysql' ) {\n\t\ttry {\n\t\t\tapp.dbPool = createPool( {\n\t\t\t\tconnectionLimit: 10,\n\t\t\t\thost: app.conf.sectionmapping.host,\n\t\t\t\tuser: app.conf.sectionmapping.user,\n\t\t\t\tpassword: app.conf.sectionmapping.password,\n\t\t\t\tdatabase: app.conf.sectionmapping.database,\n\t\t\t\tacquireTimeout: 60000,\n\t\t\t\ttimeout: 60000,\n\t\t\t\treconnect: true,\n\t\t\t\tmultipleStatements: false\n\t\t\t} );\n\n\t\t\tapp.logger.log(\n\t\t\t\t'info',\n\t\t\t\t'MySQL connection pool initialized for section mapping'\n\t\t\t);\n\n\t\t\t// Test the connection\n\t\t\tconst testQuery = promisify( app.dbPool.query ).bind( app.dbPool );\n\t\t\tawait testQuery( 'SELECT 1' );\n\t\t\tapp.logger.log( 'debug', 'Database connection pool test successful' );\n\t\t} catch ( error ) {\n\t\t\tapp.logger.error( 'Failed to initialize MySQL connection pool:', error );\n\t\t\t// Don't fail the entire app startup, just log the error\n\t\t}\n\t}\n\treturn app;\n}\n\n/**\n * Creates and starts the service's web server\n *\n * @param {Application} app the app object to use in the service\n * @return {Promise} a promise creating the web server\n */\nfunction createServer( app ) {\n\t// return a promise which creates an HTTP or HTTPS server,\n\t// attaches the app to it, and starts accepting\n\t// incoming client requests\n\tlet server;\n\tconst isHttps = app.conf.private_key && app.conf.certificate;\n\tif ( isHttps ) {\n\t\tconst credentials = {\n\t\t\tkey: readFileSync( app.conf.private_key ),\n\t\t\tcert: readFileSync( app.conf.certificate )\n\t\t};\n\t\tserver = createHTTPSServer( credentials, app );\n\t} else {\n\t\tserver = createHTTPServer( app );\n\t}\n\n\treturn new Promise( ( resolve ) => {\n\t\tserver = server.listen( app.conf.port, app.conf.interface, resolve );\n\t\tserver = addShutdown( server );\n\n\t\t// Add graceful database cleanup\n\t\tconst originalShutdown = server.shutdown;\n\t\tserver.shutdown = ( callback ) => {\n\t\t\tif ( app.dbPool ) {\n\t\t\t\tapp.dbPool.end( () => {\n\t\t\t\t\tapp.logger.log( 'info', 'MySQL connection pool closed gracefully' );\n\t\t\t\t\treturn originalShutdown.call( server, callback );\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\treturn originalShutdown.call( server, callback );\n\t\t\t}\n\t\t};\n\t} ).then( () => {\n\t\tapp.logger.log(\n\t\t\t'info',\n\t\t\t`Worker ${ process.pid } listening on http${ isHttps ? 's' : '' }://${ app.conf.interface || '*' }:${ app.conf.port }`\n\t\t);\n\t\treturn server;\n\t} );\n}\n\nexport default async function ( options ) {\n\tconst app = await initApp( options );\n\tcreateServer( app );\n\tprocess.on( 'unhandledRejection', ( reason /* promise */ ) => {\n\t\tapp.logger.error( 'Unhandled Promise Rejection', {\n\t\t\terror: reason,\n\t\t\tstack: reason.stack\n\t\t} );\n\t} );\n\treturn app;\n}\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/bin/adapt.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":26,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":26,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/linear-reduce.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":12,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":12,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/linearize.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":13,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":13,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/mt.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":24,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":24,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":44,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":44,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":61,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":61,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/section-wrap.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":15,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":15,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/segment.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":17,"column":33,"nodeType":"CallExpression","endLine":17,"endColumn":89}],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":35,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":35,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/* eslint-disable n/no-process-exit */\n\nimport { readFileSync } from 'fs';\nimport { load } from 'js-yaml';\nimport Segmenter from '../lib/segmentation/CXSegmenter.js';\nimport { Normalizer, Parser, MwContextualizer } from '../lib/lineardoc/index.js';\nconst dirname = import.meta.dirname;\n\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /[\\t\\r\\n]+/g, '' ) );\n\treturn normalizer.getHtml();\n}\n\nfunction getParsedDoc( content ) {\n\tconst pageloaderConfig = load( readFileSync( dirname + '/../config/MWPageLoader.yaml' ) );\n\tconst parser = new Parser( new MwContextualizer(\n\t\t{ removableSections: pageloaderConfig.removableSections }\n\t), {\n\t\twrapSections: true\n\t} );\n\tparser.init();\n\tparser.write( content );\n\treturn parser.builder.doc;\n}\n\nconst inputHtml = readFileSync( '/dev/stdin', 'utf8' );\nif ( inputHtml.trim() === '' ) {\n\tconst script = process.argv[ 1 ];\n\tprocess.stderr.write(\n\t\t'Usage: node ' + script + ' < file\\n' +\n\t\t'Input must be wrapped in a block element such as <p>...</p> or <div>..</div>.\\n'\n\t);\n\tprocess.exit( 1 );\n\n}\nconst language = process.argv[ 2 ];\nconst parsedDoc = getParsedDoc( inputHtml );\nconst segmenter = new Segmenter();\nconst segmentedLinearDoc = segmenter.segment( parsedDoc, language );\nconst result = normalize( segmentedLinearDoc.getHtml() );\nprocess.stdout.write( result + '\\n' );\nprocess.stdout.write( '==Categories==\\n' );\nprocess.stdout.write( JSON.stringify( parsedDoc.categories, null, 2 ) + '\\n' );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/template-params.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/translate.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":27,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":27,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":37,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":37,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/config.dev.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config.prod.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/Apertium.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/Elia.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/Google.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/JsonDict.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/LingoCloud.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/MWPageLoader.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/MinT.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/TestClient.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/languages.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/mt-defaults.wikimedia.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/config/transform.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/docker-compose.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/eslint.config.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/jsduck.categories.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/jsduck.config.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/lib/Adapter.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/Config.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":42,"column":28,"nodeType":"CallExpression","endLine":42,"endColumn":67},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":64,"column":38,"nodeType":"CallExpression","endLine":64,"endColumn":65},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":97,"column":29,"nodeType":"CallExpression","endLine":97,"endColumn":59}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { readFileSync } from 'fs';\nimport { load } from 'js-yaml';\n\nclass CXConfig {\n\tconstructor( app ) {\n\t\tthis.app = app;\n\t\tthis.logger = app.logger;\n\t\tthis.languages = null;\n\t\tthis.mt = {};\n\t}\n\n\tlog( level, info ) {\n\t\tif ( this.logger && this.logger.log ) {\n\t\t\tthis.logger.log( level, info );\n\t\t}\n\t}\n\n\tisObject( x ) {\n\t\treturn ( !!x ) && ( x.constructor === Object );\n\t}\n\n\tisString( x ) {\n\t\treturn typeof x === 'string' || x instanceof String;\n\t}\n\n\tasync parseAndLoadConfig() {\n\t\t// Supported languages\n\t\tthis.loadLanguageConf();\n\t\tthis.log( 'debug', `Found ${ this.languages?.length } languages from the configuration` );\n\t\t// Machine translation providers\n\t\tthis.mt = await this.loadServiceConf( this.app.conf.mt, 'mt' );\n\t\tthis.log( 'debug', `Found ${ Object.keys( this.mt ).length } MT providers` );\n\t}\n\n\tloadLanguageConf() {\n\t\tif ( Array.isArray( this.app.conf.languages ) ) {\n\t\t\t// Configuration is provided as an array\n\t\t\tthis.languages = this.app.conf.languages;\n\t\t} else if ( this.isString( this.app.conf.languages ) ) {\n\t\t\t// Configuration is provided in the named file\n\t\t\ttry {\n\t\t\t\tthis.languages = load( readFileSync( this.app.conf.languages ) );\n\t\t\t} catch ( e ) {\n\t\t\t\tthis.log( 'warn/spec', 'Could not load the languages registry: ' + e );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.log( 'error', 'Could not parse cxserver.conf.languages' );\n\t\t}\n\t}\n\n\tasync loadServiceConf( input, type ) {\n\t\tconst output = {};\n\t\tconst providers = Object.keys( input ).filter( ( item ) => item !== 'defaults' );\n\n\t\tfor ( const providerName of providers ) {\n\t\t\tconst languageRef = input[ providerName ].languages;\n\n\t\t\tif ( this.isObject( languageRef ) ) {\n\t\t\t\t// Language configuration is provided as an object\n\t\t\t\toutput[ providerName ] = languageRef;\n\t\t\t} else if ( this.isString( languageRef ) ) {\n\t\t\t\t// Language configuration is provided in the named file\n\t\t\t\ttry {\n\t\t\t\t\tconst providerLanguages = load( readFileSync( languageRef ) );\n\n\t\t\t\t\t// Allow hooking in JavaScript code to define the language pairs\n\t\t\t\t\tif ( providerLanguages.handler ) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst Handler = ( await import( '../config/' + providerLanguages.handler ) ).default;\n\t\t\t\t\t\t\toutput[ providerName ] = new Handler( providerLanguages ).languages;\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\tthis.log( 'error', `Could not load handler '${ providerLanguages.handler }': ${ e }` );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput[ providerName ] = providerLanguages;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tthis.log( 'error', `Could not load or parse file '${ languageRef }': ${ e }` );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.log( 'error', `Could not parse cxserver.conf.${ type }.${ providerName }` );\n\t\t\t}\n\t\t}\n\n\t\t// Handle \"default provider\" configuration separately\n\t\tif ( !input.defaults ) {\n\t\t\treturn output;\n\t\t}\n\n\t\tif ( Array.isArray( input.defaults ) ) {\n\t\t\t// \"Default provider\" configuration is provided as an array\n\t\t\toutput.defaults = input.defaults;\n\t\t} else if ( this.isString( input.defaults ) ) {\n\t\t\t// \"Default provider\" configuration is provided in the named file\n\t\t\ttry {\n\t\t\t\toutput.defaults = load( readFileSync( input.defaults ) );\n\t\t\t} catch ( e ) {\n\t\t\t\tthis.log( 'error', `Could not load or parse file '${ input.defaults }': ${ e }` );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.log( 'error', `Could not parse cxserver.conf.${ type }.defaults` );\n\t\t}\n\n\t\treturn output;\n\t}\n\n\t/**\n\t * Return all language pairs.\n\t *\n\t * @return {Object} The languages, indexed by source language\n\t *   pointing to a list of target languages.\n\t */\n\tget LanguagePairs() {\n\t\treturn {\n\t\t\tsource: this.languages,\n\t\t\ttarget: this.languages\n\t\t};\n\t}\n\n\tget MTPairs() {\n\t\treturn this.mt;\n\t}\n\n\t/**\n\t * Get the available toolset for the given language\n\t *\n\t * @param {string} language\n\t * @return {Object} The toolset for the given language\n\t */\n\tgetToolSetForLanguage( language ) {\n\t\tconst tools = { mt: this.mt },\n\t\t\tresult = { mt: {} };\n\n\t\tObject.keys( tools ).forEach( ( toolName ) => {\n\t\t\tconst tool = tools[ toolName ], providers = Object.keys( tool );\n\n\t\t\t// Go through default MTs for language pairs and filter out the pairs where\n\t\t\t// source language is equal to the language provided as param of this method.\n\t\t\t// Then, add target language and default MT to the result object.\n\t\t\tObject.keys( tool.defaults || {} )\n\t\t\t\t.filter( ( pair ) => pair.indexOf( language + '-' ) === 0 )\n\t\t\t\t.forEach( ( pair ) => {\n\t\t\t\t\tconst targetLanguage = pair.slice( language.length + 1 );\n\n\t\t\t\t\tresult[ toolName ][ targetLanguage ] =\n\t\t\t\t\t\tresult[ toolName ][ targetLanguage ] || [];\n\t\t\t\t\tresult[ toolName ][ targetLanguage ].push( tool.defaults[ pair ] );\n\t\t\t\t} );\n\n\t\t\tfor ( let i = 0, length = providers.length; i < length; i++ ) {\n\t\t\t\tconst provider = providers[ i ], languages = tool[ provider ][ language ];\n\n\t\t\t\tif ( !languages ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Add each target language to the result object as key\n\t\t\t\t// and push MT provider to the values array.\n\t\t\t\tfor ( let j = 0, langsLength = languages.length; j < langsLength; j++ ) {\n\t\t\t\t\tconst targetLanguage = languages[ j ],\n\t\t\t\t\t\tresults = result[ toolName ][ targetLanguage ];\n\n\t\t\t\t\tif ( !results ) {\n\t\t\t\t\t\tresult[ toolName ][ targetLanguage ] = [ provider ];\n\t\t\t\t\t} else if ( !results.includes( provider ) ) { // Don't duplicate providers\n\t\t\t\t\t\tresult[ toolName ][ targetLanguage ].push( provider );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get the available toolset for the given language pair\n\t *\n\t * @param {string} from source language\n\t * @param {string} to target language\n\t * @return {Object} the toolset (empty object if nothing available)\n\t */\n\tgetToolSet( from, to ) {\n\t\tconst result = {};\n\n\t\tif ( !to ) {\n\t\t\treturn this.getToolSetForLanguage( from );\n\t\t}\n\n\t\t// Known tools\n\t\tconst tools = { mt: this.mt };\n\n\t\tObject.keys( tools ).forEach( ( toolname ) => {\n\t\t\tlet defaultProvider;\n\t\t\tconst tool = tools[ toolname ];\n\t\t\tconst providers = Object.keys( tool );\n\t\t\t// If there is a default provider, add it to the beginning of array.\n\t\t\tif ( tool.defaults && tool.defaults[ from + '-' + to ] ) {\n\t\t\t\tdefaultProvider = tool.defaults[ from + '-' + to ];\n\t\t\t\tresult[ toolname ] = [ defaultProvider ];\n\t\t\t}\n\t\t\tfor ( let j = 0; j < providers.length; j++ ) {\n\t\t\t\tconst provider = tool[ providers[ j ] ];\n\t\t\t\tif ( provider[ from ] && provider[ from ].includes( to ) &&\n\t\t\t\t\tdefaultProvider !== providers[ j ]\n\t\t\t\t) {\n\t\t\t\t\tresult[ toolname ] = result[ toolname ] || [];\n\t\t\t\t\tresult[ toolname ].push( providers[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get the valid toolsets for the given language pair.\n\t * If the provider name is given, it is validated.\n\t * If provider name is not given, the first one that appears in the registry will be returned.\n\t * If not valid provider is found, the returns null.\n\t *\n\t * @param {string} from source language\n\t * @param {string} to target language\n\t * @param {string} serviceType Service type from the registry, such as 'mt' or 'dictionary'\n\t * @param {string} [providerName] If given, the provider is validated.\n\t * @return {string|null|boolean} Provider name\n\t */\n\tgetValidProvider( from, to, serviceType, providerName ) {\n\t\tconst toolset = this.getToolSet( from, to );\n\n\t\tif ( !toolset[ serviceType ] ) {\n\t\t\t// No tools found for this service for this language pair\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( providerName ) {\n\t\t\tif ( !toolset[ serviceType ].includes( providerName ) ) {\n\t\t\t\t// The requested provider doesn't appear in the registry,\n\t\t\t\t// so it's invalid\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// The provider is valid\n\t\t\treturn providerName;\n\t\t}\n\n\t\t// If provider not given, use the first one in the registry\n\t\treturn toolset[ serviceType ][ 0 ];\n\t}\n}\n\nexport default CXConfig;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/TemplateParameterMapper.js","messages":[{"ruleId":"no-mixed-spaces-and-tabs","severity":1,"message":"Mixed spaces and tabs.","line":110,"column":5,"nodeType":"Program","messageId":"mixedSpacesAndTabs","endLine":110,"endColumn":7},{"ruleId":"implicit-arrow-linebreak","severity":1,"message":"Expected no linebreak before this expression.","line":110,"column":7,"nodeType":"Identifier","messageId":"unexpected","endLine":110,"endColumn":26},{"ruleId":"no-mixed-spaces-and-tabs","severity":1,"message":"Mixed spaces and tabs.","line":113,"column":4,"nodeType":"Program","messageId":"mixedSpacesAndTabs","endLine":113,"endColumn":6}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { getProp } from '../util.js';\n\nclass TemplateParameterMapper {\n\tconstructor( sourceParams, sourceTemplateData, targetTemplateData, mappingFromDatabase = {} ) {\n\t\tthis.sourceParams = sourceParams;\n\t\tthis.sourceTemplateData = sourceTemplateData;\n\t\tthis.targetTemplateData = targetTemplateData;\n\t\tthis.parameterMap = {};\n\t\tthis.parametersAreMapped = false;\n\t\tthis.mappingFromDatabase = mappingFromDatabase;\n\t}\n\n\tgetAdaptedParameters() {\n\t\tconst adaptedParameters = {};\n\t\tconst parameterMap = this.getParameterMap();\n\t\tfor ( const name in this.sourceParams ) {\n\t\t\tif ( name in parameterMap ) {\n\t\t\t\tadaptedParameters[ parameterMap[ name ] ] = this.sourceParams[ name ];\n\t\t\t}\n\t\t}\n\n\t\treturn adaptedParameters;\n\t}\n\n\tgetMandatoryParamsForTarget() {\n\t\tif ( !this.targetTemplateData.params ) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Object.keys( this.targetTemplateData.params ).filter(\n\t\t\t( paramName ) => this.targetTemplateData.params[ paramName ].required === true\n\t\t);\n\t}\n\n\tgetOptionalParamsForTarget() {\n\t\tif ( !this.targetTemplateData.params ) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Object.keys( this.targetTemplateData.params ).filter(\n\t\t\t( paramName ) => this.targetTemplateData.params[ paramName ].required === false\n\t\t);\n\t}\n\n\t/**\n\t * Find target template parameter mapping for all the parameters in source template.\n\t *\n\t * @return {Object} Object with mapping from each source param to param name in target template.\n\t */\n\tgetParameterMap() {\n\t\tif ( this.parametersAreMapped ) {\n\t\t\treturn this.parameterMap;\n\t\t}\n\n\t\tconst sourceCitoidMap = getProp( [ 'maps', 'citoid' ], this.sourceTemplateData ) || {};\n\t\tconst targetCitoidMap = getProp( [ 'maps', 'citoid' ], this.targetTemplateData ) || {};\n\n\t\tfor ( const name in this.sourceParams ) {\n\t\t\tif ( !isNaN( name ) ) {\n\t\t\t\t// Unnamed parameters, which are named 1, 2, 3...\n\t\t\t\tthis.parameterMap[ name ] = name;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !this.targetTemplateData.params ) {\n\t\t\t\t// No params in target template data definition\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Try to locate this source param in the source template data definition\n\t\t\tconst normalizedKey = name.trim().toLowerCase().replace( /[\\s+_-]+/g, '' );\n\t\t\tconst sourceTemplateParam = this.sourceTemplateData.params[ name ] ||\n\t\t\t\tthis.sourceTemplateData.params[ normalizedKey ];\n\t\t\tlet sourceAliases = sourceTemplateParam ? sourceTemplateParam.aliases : [];\n\n\t\t\tif ( !sourceTemplateParam ) {\n\t\t\t\t// The source param name can be in the aliases of other params in source\n\t\t\t\t//  template data. If so find that param and add aliases to sourceAliases\n\t\t\t\tconst paramMatchingAlias = Object.keys( this.sourceTemplateData.params ).find(\n\t\t\t\t\t( key ) => ( this.sourceTemplateData.params[ key ].aliases || [] )\n\t\t\t\t\t\t.includes( name )\n\t\t\t\t);\n\t\t\t\tif ( paramMatchingAlias ) {\n\t\t\t\t\tsourceAliases.push( paramMatchingAlias );\n\t\t\t\t\tsourceAliases = sourceAliases.concat(\n\t\t\t\t\t\tthis.sourceTemplateData.params[ paramMatchingAlias ].aliases || []\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst sourceKeyAndAliases = new Set( sourceAliases );\n\t\t\tsourceKeyAndAliases.add( name );\n\t\t\tsourceKeyAndAliases.add( normalizedKey );\n\n\t\t\t// Search in the aliases for a match - case insensitive.\n\t\t\tfor ( const paramName in this.targetTemplateData.params ) {\n\t\t\t\tconst param = this.targetTemplateData.params[ paramName ];\n\n\t\t\t\tconst targetKeyAndAliases = new Set(\n\t\t\t\t\t[\n\t\t\t\t\t\t...( param.aliases || [] ),\n\t\t\t\t\t\tparamName,\n\t\t\t\t\t\t// The citoid map inside the template data has parameter name mapping.\n\t\t\t\t\t\t// consider each of those mapping as an alias to target params.\n\t\t\t\t\t\t...this.getNameAliasesFromCitoid( paramName, sourceCitoidMap ),\n\t\t\t\t\t\t...this.getNameAliasesFromCitoid( paramName, targetCitoidMap )\n\t\t\t\t\t]\n\t\t\t\t);\n\n\t\t\t\t// Find intersection of sourceKeyAndAliases and targetKeyAndAliases\n\t\t\t\tconst match = ( [ ...targetKeyAndAliases ].some( ( key ) =>\n\t\t\t\t\t// key can be integer or string.\n\t\t\t\t\t sourceKeyAndAliases.has(\n\t\t\t\t\t\t`${ key }`.trim().toLowerCase().replace( /[\\s+_-]+/g, '' )\n\t\t\t\t\t)\n\t\t\t\t ) );\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\t// Found a match\n\t\t\t\t\tthis.parameterMap[ name ] = paramName;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Still not found? Try templatemapping database\n\t\t\tif ( !this.parameterMap[ name ] && this.mappingFromDatabase[ name ] ) {\n\t\t\t\tthis.parameterMap[ name ] = this.mappingFromDatabase[ name ];\n\t\t\t}\n\t\t}\n\n\t\tthis.parametersAreMapped = true;\n\t\treturn this.parameterMap;\n\t}\n\n\t/**\n\t * For the given parameter name, get the aliases from the citoid map\n\t *\n\t * @param {string} paramName\n\t * @param {Object} citoidMap\n\t * @return {Set}\n\t */\n\tgetNameAliasesFromCitoid( paramName, citoidMap ) {\n\t\tconst aliases = new Set();\n\t\tconst citoidAliases = citoidMap[ paramName ];\n\t\tif ( !citoidAliases ) {\n\t\t\treturn aliases;\n\t\t}\n\t\tif ( !Array.isArray( citoidAliases ) ) {\n\t\t\taliases.add( citoidAliases );\n\t\t} else {\n\t\t\t// Sometimes citoid map values are nested arrays like\n\t\t\t// \"author\": [ [ \"first\", \"last\" ], [ \"first2\", \"last2\" ] ]\n\t\t\t// That is not a useful information to do parameter mapping.\n\t\t\tcitoidAliases\n\t\t\t\t.filter( ( alias ) => !Array.isArray( alias ) )\n\t\t\t\t.forEach( ( alias ) => aliases.add( alias ) );\n\t\t}\n\t\treturn aliases;\n\t}\n}\n\nexport default TemplateParameterMapper;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/TemplateTransclusion.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/TransclusionAdapter.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/TransclusionFactory.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/UnsupportedTransclusion.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/language-domain-mapping.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/lib/lineardoc/Builder.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Contextualizer.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Doc.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/MwContextualizer.js","messages":[{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":143,"column":35,"nodeType":"NewExpression","endLine":143,"endColumn":90}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import Contextualizer from './Contextualizer.js';\nimport { getProp } from './../util.js';\nconst contentBranchNodeNames = [ 'blockquote', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'pre', 'div', 'table', 'ol', 'ul', 'dl', 'figure', 'center', 'section' ];\n\n/**\n * Contextualizer for MediaWiki DOM HTML\n *\n * See https://www.mediawiki.org/wiki/Specs/HTML\n *\n * @class\n * @extends Contextualizer\n * @constructor\n */\nclass MwContextualizer extends Contextualizer {\n\t/**\n\t * @param {Object} config\n\t * @param {Object} config.removableSections containing array of classes and rdfa values.\n\t *  Tags matching these classes or rdfa values will be marked as removable.\n\t *  See config/MWPageLoader.yaml\n\t */\n\tconstructor( config ) {\n\t\tsuper( config );\n\t\t// Array holding transclusion fragment ids(about attribute values)\n\t\tthis.removableTransclusionFragments = [];\n\t}\n\n\t/**\n\t * @inheritdoc\n\t */\n\tgetChildContext( tag ) {\n\t\tconst context = this.getContext(),\n\t\t\ttype = tag.attributes.typeof || tag.attributes.rel || '';\n\n\t\tif ( context === 'removable' || this.isRemovable( tag ) ) {\n\t\t\treturn 'removable';\n\t\t}\n\n\t\t// Any descendent of Transclusion/Placeholder is verbatim\n\t\tif ( context === 'verbatim' || type.match( /(^|\\s)(mw:Transclusion|mw:Placeholder)\\b/ ) ) {\n\t\t\treturn 'verbatim';\n\t\t}\n\n\t\t// Otherwise, figure is media\n\t\tif ( tag.name === 'figure' ) {\n\t\t\treturn 'media';\n\t\t}\n\n\t\tif ( tag.name === 'span' && type.match( /(^|\\s)(mw:File|mw:Image|mw:Video|mw:Audio)\\b/ ) ) {\n\t\t\treturn 'media-inline';\n\t\t}\n\n\t\t// Immediate childrens of body are sections\n\t\tif ( context === undefined && tag.name === 'body' ) {\n\t\t\treturn 'section';\n\t\t}\n\n\t\t// And figure//figcaption is contentBranch\n\t\tif ( ( context === 'media' || context === 'media-inline' ) && tag.name === 'figcaption' ) {\n\t\t\treturn 'contentBranch';\n\t\t}\n\n\t\t// And ContentBranchNodes are contentBranch\n\t\tif ( ( context === 'section' || context === undefined ) && contentBranchNodeNames.includes( tag.name ) ) {\n\t\t\treturn 'contentBranch';\n\t\t}\n\n\t\t// Else same as parent context\n\t\treturn context;\n\t}\n\n\t/**\n\t * @inheritdoc\n\t */\n\tcanSegment() {\n\t\treturn this.getContext() === 'contentBranch';\n\t}\n\n\t/**\n\t * Check if the tag need to be ignored while parsing and hence removed.\n\t *\n\t * @param {Object} tag\n\t * @return {boolean}\n\t */\n\tisRemovable( tag ) {\n\t\tconst removableSections = this.config.removableSections;\n\t\tif ( !this.config.removableSections ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.removableTransclusionFragments.includes( tag.attributes.about ) ) {\n\t\t\t// Once a transclusion is removed, make sure their fragments also removed\n\t\t\t// even if the fragment does not match with removableSections configuration.\n\t\t\treturn true;\n\t\t}\n\n\t\tconst classList = tag.attributes.class ? tag.attributes.class.split( ' ' ) : [];\n\t\tfor ( let i = 0; i < removableSections.classes.length; i++ ) {\n\t\t\tif ( classList.includes( removableSections.classes[ i ] ) ) {\n\t\t\t\tif ( tag.attributes.about ) {\n\t\t\t\t\tthis.removableTransclusionFragments.push( tag.attributes.about );\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tconst types = tag.attributes.typeof ? tag.attributes.typeof.split( ' ' ) : [];\n\t\tconst rels = tag.attributes.rel ? tag.attributes.rel.split( ' ' ) : [];\n\t\tconst rdfa = types.concat( rels );\n\t\tfor ( let i = 0; i < removableSections.rdfa.length; i++ ) {\n\t\t\t// Make sure that the rdfa value matches with removable section rdfa and does not\n\t\t\t// have other rdfas in same element.\n\t\t\tif ( rdfa.includes( removableSections.rdfa[ i ] && rdfa.length === 1 ) ) {\n\t\t\t\tif ( tag.attributes.about ) {\n\t\t\t\t\tthis.removableTransclusionFragments.push( tag.attributes.about );\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tconst dataMW = tag.attributes[ 'data-mw' ];\n\t\tif ( !dataMW ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// See https://phabricator.wikimedia.org/T274133 for more info\n\t\tlet mwData = {};\n\t\ttry {\n\t\t\tmwData = JSON.parse( dataMW );\n\t\t} catch ( e ) {\n\t\t\treturn false;\n\t\t}\n\t\tconst templateName = getProp( [ 'parts', 0, 'template', 'target', 'wt' ], mwData );\n\t\tif ( !templateName ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor ( let i = 0; i < removableSections.templates.length; i++ ) {\n\t\t\tlet removableTemplateNameRegExp;\n\t\t\tconst removableTemplateName = removableSections.templates[ i ];\n\n\t\t\tif ( removableTemplateName[ 0 ] === '/' && removableTemplateName.slice( -1 ) === '/' ) {\n\t\t\t\t// A regular expression is given.\n\t\t\t\tremovableTemplateNameRegExp = new RegExp( removableTemplateName.slice( 1, -1 ), 'i' );\n\t\t\t}\n\n\t\t\tconst match = removableTemplateNameRegExp ?\n\t\t\t\ttemplateName.match( removableTemplateNameRegExp ) :\n\t\t\t\ttemplateName.toLowerCase() === removableTemplateName.toLowerCase();\n\n\t\t\tif ( match ) {\n\t\t\t\tif ( tag.attributes.about ) {\n\t\t\t\t\tthis.removableTransclusionFragments.push( tag.attributes.about );\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n}\n\nexport default MwContextualizer;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Normalizer.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Parser.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/TextBlock.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/TextChunk.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Utils.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lllang-param-mapping.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/lib/logging.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'winston.Logger' is undefined.","line":7,"column":1,"nodeType":"Block","endLine":7,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { createLogger, format as logFormat, transports as logTransports } from 'winston';\nimport { ecsFormat } from '@elastic/ecs-winston-format';\n\n/**\n * @param {string} serviceName Name of the service. Added to default metadata of the logger.\n * @param {Object} options WinstonLoggerOptions, not to be confused with winston.LoggerOptions\n * @return {winston.Logger}\n */\nconst createWinstonLogger = ( serviceName, options = {} ) => {\n\t// Uses spread operator to fill options\n\t// with defaults first and then override with config\n\toptions = {\n\t\t...{\n\t\t\tlevel: 'info',\n\t\t\tstacktrace: true,\n\t\t\tformat: 'json',\n\t\t\ttransports: [ { transport: 'Console' } ]\n\t\t},\n\t\t...options\n\t};\n\n\treturn createLogger( {\n\t\tlevel: options.level,\n\t\tformat: logFormat.combine(\n\t\t\t// Enable stacktrace for errors\n\t\t\tlogFormat.errors( { stack: options.stacktrace } ),\n\t\t\toptions.format === 'ecs' ?\n\t\t\t\tecsFormat( options.formatOptions ) :\n\t\t\t\tlogFormat[ options.format || 'json' ](\n\t\t\t\t\toptions.format ? options.formatOptions : undefined\n\t\t\t\t)\n\t\t),\n\t\tdefaultMeta: {\n\t\t\tservice: serviceName\n\t\t},\n\t\ttransports: ( options.transports || [] ).map(\n\t\t\t( { transport, options: transportOptions } ) => new logTransports[ transport ]( {\n\t\t\t\t...transportOptions,\n\t\t\t\t// Spread format separately so we can add on options as parameters\n\t\t\t\t...( transportOptions && transportOptions.format ?\n\t\t\t\t\t{\n\t\t\t\t\t\tformat: logFormat.combine(\n\t\t\t\t\t\t\tlogFormat.errors( { stack: options.stacktrace } ),\n\t\t\t\t\t\t\ttransportOptions.format === 'ecs' ?\n\t\t\t\t\t\t\t\tecsFormat( transportOptions.formatOptions ) :\n\t\t\t\t\t\t\t\tlogFormat[ transportOptions.format ](\n\t\t\t\t\t\t\t\t\ttransportOptions.formatOptions\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\t{} )\n\t\t\t} )\n\t\t)\n\t} );\n};\n\nexport const logger = createWinstonLogger;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/metric.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/Apertium.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/Apertium.languagenames.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/lib/mt/Elia.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'api_id' is not in camel case.","line":69,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":69,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'api_key' is not in camel case.","line":70,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":70,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'translation_engine' is not in camel case.","line":71,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":71,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'content_type' is not in camel case.","line":72,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":72,"endColumn":16,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'language_pair' is not in camel case.","line":73,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":73,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/Google.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/LingoCloud.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'request_id' is not in camel case.","line":52,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":52,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'trans_type' is not in camel case.","line":54,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":54,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/MTClient.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/MTClientError.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/MinT.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'source_language' is not in camel case.","line":46,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":46,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'target_language' is not in camel case.","line":48,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":48,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/TestClient.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/annotationmapper/LevenshteinDistance.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/annotationmapper/SubsequenceMatcher.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/BatchedAPIRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/MWApiRequestManager.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/MWPageLoader.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":19,"column":33,"nodeType":"CallExpression","endLine":19,"endColumn":92}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @external MTClient\n */\n\nimport { readFileSync } from 'fs';\nimport { load } from 'js-yaml';\nimport { Title } from 'mediawiki-title';\nimport { MwContextualizer, Parser } from '../lineardoc/index.js';\nimport CXSegmenter from '../segmentation/CXSegmenter.js';\nimport Adapter from '../Adapter.js';\nimport { getProp, HTTPError } from '../util.js';\nimport MWApiRequestManager from './MWApiRequestManager.js';\nimport ApiRequest from './MwApiRequest.js';\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nclass MWPageLoader extends ApiRequest {\n\tconstructor( config ) {\n\t\tsuper( config );\n\t\tthis.pageloaderConfig = load( readFileSync( dirname + '/../../config/MWPageLoader.yaml' ) );\n\t}\n\n\t/**\n\t * @param {string} page The page title\n\t * @param {string} revision The revision id\n\t * @param {boolean} wrapSections Whether translatable sections should be wrapped in\n\t *   <section> tag\n\t * @return {Promise}\n\t */\n\tgetPage( page, revision, wrapSections ) {\n\t\treturn this.fetch( page, revision ).then( ( response ) => {\n\t\t\tlet parsedDoc = this.getParsedDoc( response.body );\n\t\t\tif ( wrapSections ) {\n\t\t\t\tparsedDoc = parsedDoc.wrapSections();\n\t\t\t}\n\t\t\t// Extract category tags from source document.\n\t\t\tconst sourceCategoryTags = parsedDoc.categories;\n\t\t\tconst segmentedDoc = new CXSegmenter().segment( parsedDoc, this.sourceLanguage );\n\n\t\t\tif ( this.targetLanguage ) {\n\t\t\t\tconst api = new MWApiRequestManager( this.context, this.context.logger );\n\t\t\t\tconst adapter = new Adapter(\n\t\t\t\t\tthis.sourceLanguage, this.targetLanguage, api, this.context\n\t\t\t\t);\n\n\t\t\t\treturn this.adaptCategories( sourceCategoryTags, adapter ).then( ( categories ) => ( {\n\t\t\t\t\tcontent: segmentedDoc.getHtml(),\n\t\t\t\t\tcategories,\n\t\t\t\t\trevision: response.revision\n\t\t\t\t} ) );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: segmentedDoc.getHtml(),\n\t\t\t\trevision: response.revision\n\t\t\t};\n\t\t} );\n\t}\n\n\t/**\n\t * @param {string} content\n\t * @param {boolean} wrapSections Whether translatable sections should be wrapped in\n\t *   <section> tag\n\t * @return {Object}\n\t */\n\tgetParsedDoc( content, wrapSections ) {\n\t\tconst parser = new Parser( new MwContextualizer(\n\t\t\t{ removableSections: this.pageloaderConfig.removableSections }\n\t\t), {\n\t\t\twrapSections\n\t\t} );\n\t\tparser.init();\n\t\tparser.write( content );\n\t\treturn parser.builder.doc;\n\t}\n\n\t/**\n\t * @param {string} page The page title\n\t * @param {string} revision The revision id\n\t * @return {Promise}\n\t */\n\tasync fetch( page, revision ) {\n\t\tlet path;\n\t\tconst domain = this.getDomain( this.sourceLanguage );\n\t\tconst mwApi = new MWApiRequestManager( this.context, this.context.logger );\n\t\tconst siteInfo = await mwApi.siteInfoRequest( this.sourceLanguage );\n\t\tconst titleObject = Title.newFromText( page, siteInfo );\n\t\t// Manual normalisation to always transform multi-word page titles to underscore-separated titles\n\t\tconst title = titleObject.getPrefixedDBKey();\n\n\t\tif ( revision ) {\n\t\t\tpath = `/revision/${ revision }/html`;\n\t\t} else {\n\t\t\tpath = `/page/${ encodeURIComponent( title ) }/html`;\n\t\t}\n\n\t\tconst restReq = {\n\t\t\theaders: {\n\t\t\t\t// See https://www.mediawiki.org/wiki/Specs/HTML/2.8.0\n\t\t\t\taccept: 'text/html; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/HTML/2.8.0\"'\n\t\t\t}\n\t\t};\n\n\t\treturn this.restApiGet( domain, path, restReq ).then( async ( { statusCode, headers, body } ) => {\n\t\t\tif ( statusCode !== 200 ) {\n\t\t\t// there was an error when calling the upstream service, propagate that\n\t\t\t\tthrow new HTTPError( {\n\t\t\t\t\tstatus: statusCode,\n\t\t\t\t\ttype: 'api_error',\n\t\t\t\t\tdetail: `Error while fetching page ${ this.sourceLanguage }:${ title }`\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tbody: await body.text(),\n\t\t\t\trevision: headers[ 'content-revision-id' ]\n\t\t\t};\n\t\t} );\n\t}\n\n\tasync adaptCategories( sourceCategoryTags, adapter ) {\n\t\tconst categoryAdaptationRequests = [];\n\n\t\t// Deduplicate sourceCategoryTags based on their href\n\t\tsourceCategoryTags = [\n\t\t\t...new Map(\n\t\t\t\tsourceCategoryTags.map( ( tag ) => [ tag.attributes.href, tag ] )\n\t\t\t).values()\n\t\t];\n\n\t\tfor ( let i = 0; i < sourceCategoryTags.length; i++ ) {\n\t\t\tconst translationunit = adapter.getAdapter( sourceCategoryTags[ i ] );\n\t\t\tconst request = translationunit.adapt( sourceCategoryTags[ i ] ).then( ( adaptedCategory ) => JSON.parse( adaptedCategory.attributes[ 'data-cx' ] ) );\n\t\t\tcategoryAdaptationRequests.push( request );\n\t\t}\n\n\t\treturn await Promise.all( categoryAdaptationRequests );\n\t}\n\n\t/**\n\t * Given a source title and an MTClient instance, this method returns a promise resolving\n\t * to an object that contains the source language,the target language, the source title and\n\t * the suggested target title. The suggested title is fetched from Wikidata API, if it exists\n\t * for the given target language. If not, the source title is translated using the given MTClient\n\t * for that language pair, and this translation is returned as suggested target title.\n\t * Finally, if the translation fails too, the source title is returned as suggested target title.\n\t *\n\t * @param {string} sourceTitle Source wiki page title (in `this.sourceLanguage`).\n\t * @param {MTClient} mtClient Machine translation client used as a fallback when Wikidata does not provide a label/title in `this.targetLanguage`.\n\t * @return {Promise<{sourceLanguage: string, targetLanguage: string, sourceTitle: string, targetTitle: string}|null>}\n\t */\n\tasync fetchTargetTitle( sourceTitle, mtClient ) {\n\t\tconst api = new MWApiRequestManager( this.context, this.context.logger );\n\n\t\t// First attempt: check whether there is already an existing target-language page title for this source title\n\t\tconst targetInfo = await api.titlePairRequest( sourceTitle, this.sourceLanguage, this.targetLanguage );\n\n\t\t// If the target page exists, return it immediately.\n\t\t// This is the best result because it points to a real existing page title.\n\t\tif ( targetInfo && !targetInfo.missing ) {\n\t\t\treturn {\n\t\t\t\tsourceLanguage: this.sourceLanguage,\n\t\t\t\ttargetLanguage: this.targetLanguage,\n\t\t\t\tsourceTitle,\n\t\t\t\ttargetTitle: targetInfo.targetTitle\n\t\t\t};\n\t\t}\n\n\t\t// Fetch info about the source title in the source wiki,\n\t\t// primarily to extract its associated Wikidata item id (QID) from pageprops.\n\t\tconst sourceTitleInfo = await api.titleInfoRequest( sourceTitle, this.sourceLanguage );\n\n\t\t// Extract the Wikidata QID\n\t\tconst qid = getProp( [ 'pageprops', 'wikibase_item' ], sourceTitleInfo );\n\n\t\t// If there is no QID, the title is not connected to Wikidata, so no cross-language\n\t\t// lookup/label suggestion can be made. Return null.\n\t\tif ( !qid ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Ask Wikidata for the label in the target language.\n\t\t// If present, this is usually a better “natural” title suggestion than MT.\n\t\tconst wikidataLabel = await api.wikidataRequest( qid, this.targetLanguage );\n\n\t\t// Initialize the result with a conservative default: fall back to the original sourceTitle.\n\t\tconst result = {\n\t\t\tsourceLanguage: this.sourceLanguage,\n\t\t\ttargetLanguage: this.targetLanguage,\n\t\t\tsourceTitle,\n\t\t\ttargetTitle: sourceTitle\n\t\t};\n\n\t\t// Preferred: Use Wikidata label when available for the target language.\n\t\tif ( wikidataLabel ) {\n\t\t\tresult.targetTitle = wikidataLabel;\n\t\t} else {\n\t\t\t// Fallback: If Wikidata does not provide a label, try machine translation of the title.\n\t\t\tconst translatedLabel = await mtClient.translate(\n\t\t\t\tthis.sourceLanguage,\n\t\t\t\tthis.targetLanguage,\n\t\t\t\tsourceTitle,\n\t\t\t\t'text'\n\t\t\t);\n\n\t\t\t// If MT succeeded, use the translated title as the suggestion.\n\t\t\tif ( translatedLabel ) {\n\t\t\t\tresult.targetTitle = translatedLabel;\n\t\t\t}\n\t\t}\n\n\t\t// Return the chosen suggestion (existing target title > Wikidata label > MT translation > sourceTitle).\n\t\treturn result;\n\t}\n\n}\nexport default MWPageLoader;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/MwApiRequest.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'mwapi_tpl' is not in camel case.","line":167,"column":16,"nodeType":"Identifier","messageId":"notCamelCase","endLine":167,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'restbase_tpl' is not in camel case.","line":173,"column":16,"nodeType":"Identifier","messageId":"notCamelCase","endLine":173,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/PageMetadataRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/SectionTitlesAndTargetTitleRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/SectionTitlesRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/SiteInfoRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/TemplateDataRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/TitleInfoRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/TitlePairRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/WikidataRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/routes/info.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/routes/root.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/routes/v1.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/routes/v2.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/section-extractor.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/segmentation/CXSegmenter.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/suggestion/SectionSuggester.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"dbPool\" type.","line":13,"column":1,"nodeType":"Block","endLine":13,"endColumn":1}],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'source_title' is not in camel case.","line":55,"column":14,"nodeType":"Identifier","messageId":"notCamelCase","endLine":55,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'target_title' is not in camel case.","line":59,"column":14,"nodeType":"Identifier","messageId":"notCamelCase","endLine":59,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '__LEAD_SECTION__'.","line":181,"column":4,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":181,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @external MWApiRequestManager\n */\n\nimport { promisify } from 'util';\nimport { open } from 'sqlite';\nimport sqlite3 from 'sqlite3';\n\nclass SectionSuggester {\n\t/**\n\t * @param {MWApiRequestManager} api\n\t * @param {string} sectionMappingDatabaseConf Database configuration\n\t * @param dbPool\n\t */\n\tconstructor( api, sectionMappingDatabaseConf, dbPool = null ) {\n\t\tthis.api = api;\n\t\tthis.sectionMappingDatabaseConf = sectionMappingDatabaseConf;\n\t\tthis.dbPool = dbPool;\n\t\tif ( !this.sectionMappingDatabaseConf ) {\n\t\t\tthrow new Error( 'Section mapping database is not configured' );\n\t\t}\n\t}\n\n\t/**\n\t * @param {string} sourceLanguage Language code\n\t * @param {string} targetLanguage Page title\n\t * @param {string[]} sourceSections\n\t * @return {Promise<{source_title: string, target_title: string, frequency: number}[]>}\n\t */\n\tasync querySectionMapping( sourceLanguage, targetLanguage, sourceSections ) {\n\t\tif ( sourceSections.length === 0 ) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif ( this.sectionMappingDatabaseConf.type === 'mysql' ) {\n\t\t\tif ( !this.dbPool ) {\n\t\t\t\tthrow new Error( 'MySQL connection pool not available' );\n\t\t\t}\n\n\t\t\tconst queryStr = `SELECT source_title, target_title, frequency\n\t\t\t\tFROM titles\n\t\t\t\tWHERE source_language=?\n\t\t\t\tAND target_language=?\n\t\t\t\tAND source_title IN (${ sourceSections.map( () => '?' ).join( ',' ) })\n\t\t\t\tORDER BY source_title, frequency DESC\n\t\t\t`;\n\t\t\ttry {\n\t\t\t\tconst query = promisify( this.dbPool.query ).bind( this.dbPool );\n\t\t\t\tconst results = await query( queryStr, [ sourceLanguage, targetLanguage, ...sourceSections ] );\n\n\t\t\t\t// Handle buffer conversion for blob columns\n\t\t\t\tresults.forEach( ( result ) => {\n\t\t\t\t\tif ( Buffer.isBuffer( result.source_title ) ) {\n\t\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\t\tresult.source_title = result.source_title.toString();\n\t\t\t\t\t}\n\t\t\t\t\tif ( Buffer.isBuffer( result.target_title ) ) {\n\t\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\t\tresult.target_title = result.target_title.toString();\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\treturn results;\n\n\t\t\t} catch ( error ) {\n\t\t\t\tthrow new Error( `Database query failed: ${ error.message }`, { cause:\nerror } );\n\t\t\t}\n\t\t}\n\n\t\tif ( this.sectionMappingDatabaseConf.type === 'sqlite' ) {\n\t\t\tconst queryStr = `SELECT source_title, target_title, frequency\n\t\t\t\tFROM titles\n\t\t\t\tWHERE source_language=?\n\t\t\t\tAND target_language=?\n\t\t\t\tAND source_title IN (${ sourceSections.map( () => '?' ) })\n\t\t\t\tORDER BY source_title, frequency DESC\n\t\t\t\t`;\n\t\t\tconst connection = await open( {\n\t\t\t\tfilename: this.sectionMappingDatabaseConf.database,\n\t\t\t\tdriver: sqlite3.Database\n\t\t\t} );\n\t\t\treturn await connection.all( queryStr, [ sourceLanguage, targetLanguage, ...sourceSections ] );\n\t\t} else {\n\t\t\tthrow new Error( 'Section mapping database is not configured. sqlite or mysql database configuration required.' );\n\t\t}\n\t}\n\n\t/**\n\t * Get list of sections for the given page. Only top level sections are returned\n\t *\n\t * @param {string} language Language code\n\t * @param {string} title Page title\n\t * @return {string[]}\n\t */\n\tasync getSections( language, title ) {\n\t\tconst metadata = await this.api.pageMetadataRequest( language, title );\n\t\tif ( !metadata || !metadata.sections ) {\n\t\t\t// Page may not exist.\n\t\t\treturn [];\n\t\t}\n\t\tconst headerSections = metadata.sections.filter( ( entry ) => entry.toclevel === 1 ) || [];\n\t\treturn headerSections.map( ( section ) => section.line );\n\t}\n\n\t/**\n\t * Get section objects with byte offsets and page size for size calculation\n\t *\n\t * @param {string} language Language code\n\t * @param {string} title Page title\n\t * @return {Promise<{ sections: { title, byteoffset }[], pageSize: number }>} Object with sections array and pageSize: {sections: Object[], pageSize?: number}\n\t */\n\tasync getSectionObjectsWithPageSize( language, title ) {\n\t\tconst [ metadata, titleInfo ] = await Promise.all( [\n\t\t\tthis.api.pageMetadataRequest( language, title ),\n\t\t\tthis.api.titleInfoRequest( title, language )\n\t\t] );\n\n\t\tif ( !metadata?.sections || !titleInfo?.length ) {\n\t\t\treturn { sections: [], pageSize: undefined };\n\t\t}\n\n\t\tconst headerSections = metadata.sections.filter( ( entry ) => entry.toclevel === 1 ) || [];\n\t\tconst sections = headerSections.map( ( section ) => ( {\n\t\t\ttitle: section.line,\n\t\t\tbyteoffset: section.byteoffset || 0\n\t\t} ) );\n\n\t\treturn { sections, pageSize: titleInfo.length };\n\t}\n\n\t/**\n\t * Find the section titles mapping from the sqlite database prepared.\n\t *\n\t * @param {string} sourceLanguage Source language code\n\t * @param {string[]} sourceSections Array of source section titles\n\t * @param {string} targetLanguage Target language code\n\t * @return {Object} Object with key as source section title and value as array of candidate titles in target language.\n\t *   This array will be in descending order of frequency. High frequency indicate better suggestion.\n\t */\n\tasync getSectionMapping( sourceLanguage, sourceSections, targetLanguage ) {\n\t\tconst mapping = {};\n\n\t\tconst results = await this.querySectionMapping( sourceLanguage, targetLanguage, sourceSections );\n\n\t\tlet maxFrequency = 0;\n\t\t// If there is no results, empty array will be returned.\n\t\tfor ( let i = 0; i < results.length; i++ ) {\n\t\t\tif ( !mapping[ results[ i ].source_title ] ) {\n\t\t\t\tmapping[ results[ i ].source_title ] = [];\n\t\t\t\t// First item will have maximum `frequency` as per the above query.\n\t\t\t\tmaxFrequency = results[ i ].frequency;\n\t\t\t}\n\n\t\t\tconst mappingsLength = mapping[ results[ i ].source_title ].length;\n\t\t\t// Reject results that has frequency less than half of max frequency, if we have mapping already.\n\t\t\t// This is to guard against entries in database that are probably typos, or unpopular relative to\n\t\t\t// most recommended translation.\n\t\t\tif ( mappingsLength > 0 && results[ i ].frequency < 100 && results[ i ].frequency < maxFrequency * 0.5 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapping[ results[ i ].source_title ].push( results[ i ].target_title );\n\t\t}\n\t\treturn mapping;\n\t}\n\n\t/**\n\t * Calculate section sizes in bytes using consecutive section byte offsets\n\t *\n\t * @param {Object[]} sectionObjects Array of section objects with title and byteoffset\n\t * @param {number} totalContentSize Total page content size in bytes\n\t * @return {Object} Object mapping section titles to their sizes in bytes\n\t */\n\tcalculateSectionSizes( sectionObjects, totalContentSize ) {\n\t\tconst sectionSizes = {};\n\n\t\t// Add lead section\n\t\tif ( sectionObjects.length ) {\n\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\tsectionSizes.__LEAD_SECTION__ = sectionObjects[ 0 ].byteoffset;\n\t\t}\n\n\t\tfor ( let i = 0; i < sectionObjects.length; i++ ) {\n\t\t\tconst currentSection = sectionObjects[ i ];\n\t\t\tconst nextSection = sectionObjects[ i + 1 ];\n\n\t\t\tlet sectionSize;\n\t\t\tif ( nextSection ) {\n\t\t\t\tsectionSize = nextSection.byteoffset - currentSection.byteoffset;\n\t\t\t} else {\n\t\t\t\tsectionSize = totalContentSize - currentSection.byteoffset;\n\t\t\t}\n\n\t\t\tsectionSizes[ currentSection.title ] = Math.max( 0, sectionSize );\n\t\t}\n\n\t\treturn sectionSizes;\n\t}\n\n\t/**\n\t * @param {string} sourceLanguage Source language code\n\t * @param {string} sourceTitle Source title\n\t * @param {string} targetLanguage Target language code\n\t * @param {string[]} sourceSections Array of sections in source article\n\t * @param {string[]} targetSections Array of sections in target article\n\t * @return {Promise<{ present: Object, missing: Object }>}\n\t */\n\tasync getPresentAndMissingSections(\n\t\tsourceLanguage,\n\t\tsourceTitle,\n\t\ttargetLanguage,\n\t\tsourceSections,\n\t\ttargetSections\n\t) {\n\t\tconst missing = {};\n\t\tconst present = {};\n\n\t\tconst mapping = await this.getSectionMapping( sourceLanguage, sourceSections, targetLanguage );\n\n\t\tfor ( let i = 0; i < sourceSections.length; i++ ) {\n\t\t\tconst sourceSectionTitle = sourceSections[ i ];\n\t\t\tconst candidateTargetSectionTitles = [ ...mapping[ sourceSectionTitle ] || [], ...mapping[ sourceSectionTitle.toLowerCase() ] || [] ];\n\t\t\t// candidateTargetSectionTitles will be in decreasing order of frequencies\n\t\t\tfor ( let j = 0; j < candidateTargetSectionTitles.length; j++ ) {\n\t\t\t\tif ( targetSections.includes( candidateTargetSectionTitles[ j ] ) ) {\n\t\t\t\t\tpresent[ sourceSectionTitle ] = candidateTargetSectionTitles[ j ];\n\t\t\t\t\t// Found a matching section in target article.\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !present[ sourceSectionTitle ] ) {\n\t\t\t\tif ( candidateTargetSectionTitles.length > 0 ) {\n\t\t\t\t\tmissing[ sourceSectionTitle ] = candidateTargetSectionTitles[ 0 ];\n\t\t\t\t} else if ( targetSections.length === 0 ) {\n\t\t\t\t\t// There is no sections in target article. So we are 100% sure that this\n\t\t\t\t\t// section is missing. Use sourceSectionTitle as fallback suggestion.\n\t\t\t\t\tmissing[ sourceSectionTitle ] = sourceSectionTitle;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( Object.keys( present ).length === targetSections.length ) {\n\t\t\t// All target sections were mapped to one of the source sections.\n\t\t\t// So, any remaining source section is surely missing in target article.\n\t\t\tfor ( let i = 0; i < sourceSections.length; i++ ) {\n\t\t\t\tconst sourceSectionTitle = sourceSections[ i ];\n\t\t\t\tif ( present[ sourceSectionTitle ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst candidates = mapping[ sourceSectionTitle ];\n\t\t\t\tmissing[ sourceSections[ i ] ] = candidates && candidates[ 0 ] || sourceSections[ i ];\n\t\t\t}\n\t\t}\n\n\t\t// As the last step, any section in sourceSections not present in `present`, add to `missing` if not present already.\n\t\tfor ( let i = 0; i < sourceSections.length; i++ ) {\n\t\t\tif ( !present[ sourceSections[ i ] ] && !missing[ sourceSections[ i ] ] ) {\n\t\t\t\tmissing[ sourceSections[ i ] ] = sourceSections[ i ];\n\t\t\t}\n\t\t}\n\n\t\treturn { present, missing };\n\t}\n\n\t/**\n\t * @param {string} language\n\t * @param {string} title\n\t * @return {Promise<{ sections: { title, byteoffset }[], pageSize: number }|null>}\n\t */\n\tasync getSectionSizes( language, title ) {\n\t\tconst sourceData = await this.getSectionObjectsWithPageSize( language, title );\n\t\tif ( sourceData.pageSize && sourceData.sections.length > 0 ) {\n\t\t\treturn this.calculateSectionSizes( sourceData.sections, sourceData.pageSize );\n\t\t}\n\n\t\treturn null;\n\t}\n}\n\nexport default SectionSuggester;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/suggestion/SourceSuggester.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/suggestion/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/swagger-ui.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFile from package \"fs\" with non literal argument at index 0","line":26,"column":9,"nodeType":"CallExpression","endLine":26,"endColumn":32}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { getAbsoluteFSPath } from 'swagger-ui-dist';\nimport { HTTPError } from '../lib/util.js';\n\n// Swagger-ui-dist helpfully exporting the absolute path of its dist directory\nconst docRoot = `${ getAbsoluteFSPath() }/`;\nconst DOC_CSP = \"default-src 'none'; \" +\n\t\"script-src 'self' 'unsafe-inline'; connect-src *; \" +\n\t\"style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';\";\n\nfunction processRequest( app, req, res ) {\n\tconst reqPath = req.query.path || '/index.html';\n\tconst filePath = join( docRoot, reqPath );\n\n\t// Disallow relative paths.\n\t// Test relies on docRoot ending on a slash.\n\tif ( filePath.slice( 0, docRoot.length ) !== docRoot ) {\n\t\tthrow new HTTPError( {\n\t\t\tstatus: 404,\n\t\t\ttype: 'not_found',\n\t\t\tdetail: `${ reqPath } could not be found.`\n\t\t} );\n\t}\n\n\treturn fs.readFile( filePath )\n\t\t.then( ( body ) => {\n\t\t\tif ( reqPath === './swagger-initializer.js' ) {\n\t\t\t\tbody = body.toString()\n\t\t\t\t\t.replace( /\"https:\\/\\/petstore.swagger.io\\/v2\\/swagger.json\"/g,\n\t\t\t\t\t\t'\"/?spec\"' );\n\t\t\t}\n\t\t\tif ( reqPath === '/index.html' ) {\n\t\t\t\tbody = body.toString()\n\t\t\t\t\t.replace( /((?:src|href)=['\"])/g, '$1?doc&path=' )\n\t\t\t\t\t.replace( /<title>[^<]*<\\/title>/, `<title>${ app.info.name }</title>` );\n\t\t\t}\n\n\t\t\tlet contentType = 'text/html';\n\t\t\tif ( /\\.js$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'text/javascript';\n\t\t\t} else if ( /\\.png$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'image/png';\n\t\t\t} else if ( /\\.map$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'application/json';\n\t\t\t} else if ( /\\.ttf$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'application/x-font-ttf';\n\t\t\t} else if ( /\\.css$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'text/css';\n\t\t\t\tbody = body.toString()\n\t\t\t\t\t.replace( /\\.\\.\\/(images|fonts)\\//g, '?doc&path=$1/' )\n\t\t\t\t\t.replace( /sourceMappingURL=/, 'sourceMappingURL=/?doc&path=' );\n\t\t\t}\n\n\t\t\tres.setHeader( 'Content-Type', contentType );\n\t\t\tres.header( 'content-security-policy', DOC_CSP );\n\t\t\tres.header( 'x-content-security-policy', DOC_CSP );\n\t\t\tres.header( 'x-webkit-csp', DOC_CSP );\n\t\t\tres.send( body.toString() );\n\t\t} )\n\t\t.catch( { code: 'ENOENT' }, () => {\n\t\t\tres.status( 404 )\n\t\t\t\t.type( 'not_found' )\n\t\t\t\t.send( 'not found' );\n\t\t} );\n\n}\n\nexport default {\n\tprocessRequest\n};\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWCategory.js","messages":[{"ruleId":"security/detect-unsafe-regex","severity":1,"message":"Unsafe Regular Expression","line":15,"column":41,"nodeType":"Literal","endLine":15,"endColumn":64}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import TranslationUnit from './TranslationUnit.js';\n\nclass MWCategory extends TranslationUnit {\n\tasync adapt() {\n\t\tconst dataCX = { adapted: false };\n\t\tconst categoryTitle = this.node.attributes.href;\n\t\tconst titlePairInfo = await this.api.titlePairRequest(\n\t\t\tcategoryTitle, this.sourceLanguage, this.targetLanguage\n\t\t);\n\n\t\tdataCX.sourceTitle = titlePairInfo.sourceTitle;\n\t\tif ( titlePairInfo.targetTitle ) {\n\t\t\tlet adaptedTitle = titlePairInfo.targetTitle;\n\t\t\tconst namespaceAlias = await this.api.getNamespaceAlias( 'Category', this.targetLanguage );\n\t\t\tadaptedTitle = adaptedTitle.replace( /^(\\.\\.?\\/)*([^:]+)(:)/, '$1' + namespaceAlias + '$3' );\n\t\t\tthis.node.attributes.href = adaptedTitle;\n\n\t\t\tdataCX.adapted = true;\n\t\t\tdataCX.targetTitle = titlePairInfo.targetTitle;\n\t\t}\n\n\t\tthis.node.attributes[ 'data-cx' ] = JSON.stringify( dataCX );\n\t\treturn this.node;\n\t}\n}\nMWCategory.matchTagNames = [ 'link' ];\nMWCategory.matchRdfaTypes = [ 'mw:PageProp/Category' ];\n\nexport default MWCategory;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWFile.js","messages":[{"ruleId":"security/detect-unsafe-regex","severity":1,"message":"Unsafe Regular Expression","line":44,"column":51,"nodeType":"Literal","endLine":44,"endColumn":74}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import TranslationUnit from './TranslationUnit.js';\nconst CommonsFilePathPrefix = '//upload.wikimedia.org/wikipedia/commons/';\n/**\n * This class is an adapter for <img>, <video> and <audio> nodes in the content.\n * It changes the `File` namespace prefix for resources to corresponding namespace\n * in target URL, if the resource is refering the file from Wikimedia commons.\n *\n * The node will get a new attribute data-cx with adapted key as true or false\n * depending on whether the namespace change happened or not.\n */\nclass MWFile extends TranslationUnit {\n\n\t/**\n\t * Check if an file is coming from Commons or not. Uses the URL pattern of the common file\n\t * repository to determine whether the file is stored there.\n\t *\n\t * @param {string} fileSrc\n\t * @return {boolean}\n\t */\n\tisCommonsResource( fileSrc ) {\n\t\treturn fileSrc.includes( CommonsFilePathPrefix );\n\t}\n\n\tasync adapt() {\n\t\tconst dataCX = { adapted: true };\n\t\tconst sourceResource = this.node.attributes.resource;\n\t\tlet resourceURL = this.node.attributes.src || this.node.attributes.poster;\n\t\tif ( !resourceURL && this.node.children ) {\n\t\t\tconst textChunks = this.node.children.textChunks;\n\t\t\tfor ( let i = 0, len = textChunks.length; i < len; i++ ) {\n\t\t\t\tconst chunk = textChunks[ i ];\n\t\t\t\tif ( chunk.inlineContent && chunk.inlineContent.name === 'source' ) {\n\t\t\t\t\tresourceURL = chunk.inlineContent.attributes.src;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( !resourceURL ) {\n\t\t\treturn this.node;\n\t\t}\n\n\t\tif ( this.isCommonsResource( resourceURL ) ) {\n\t\t\tconst namespaceAlias = await this.api.getNamespaceAlias( 'File', this.targetLanguage );\n\t\t\tconst targetResource = sourceResource.replace( /^(\\.\\.?\\/)*([^:]+)(:)/, '$1' + namespaceAlias + '$3' );\n\t\t\tthis.node.attributes.resource = targetResource;\n\t\t} else {\n\t\t\tdataCX.adapted = false;\n\t\t}\n\t\tthis.node.attributes[ 'data-cx' ] = JSON.stringify( dataCX );\n\n\t\treturn this.node;\n\t}\n}\n\nMWFile.matchTagNames = [\n\t'video',\n\t'audio',\n\t'img'\n];\n\nexport default MWFile;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWGallery.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWImage.js","messages":[{"ruleId":"security/detect-unsafe-regex","severity":1,"message":"Unsafe Regular Expression","line":123,"column":68,"nodeType":"Literal","endLine":123,"endColumn":91}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { getDir } from '@wikimedia/language-data';\nimport TranslationUnit from './TranslationUnit.js';\nimport MWTemplate from './MWTemplate.js';\nconst CommonsFilePathPrefix = '//upload.wikimedia.org/wikipedia/commons/';\n\n/**\n * This class is an adapter for block images(<figure>) and inline images(<span>).\n * a) It changes the `File` namespace prefix for resources to corresponding namespace\n *    in target URL, if the resource is refering the file from Wikimedia commons.\n * b) It flips the mw-halign-left or mw-halign-right classes depending language directionality\n *    of source and target language\n * c) If the image is a link, the namespace in the link URL will be adapted for target language.\n *\n * The node will get a new attribute data-cx with adapted key as true or false\n * depending on whether the namespace change happened or not.\n */\nclass MWImage extends TranslationUnit {\n\tisInlineMediaWithCaption() {\n\t\t// Figure can also mean Video or Audio too. https://www.mediawiki.org/wiki/Specs/HTML/2.4.0#Audio/Video\n\t\treturn this.node.name === 'span' && this.node.attributes.typeof &&\n\t\t\tthis.node.attributes.typeof.match( /(^|\\s)(mw:File|mw:Image)\\b/ ) &&\n\t\t\tthis.node.attributes[ 'data-mw' ] &&\n\t\t\tJSON.parse( this.node.attributes[ 'data-mw' ] ).caption;\n\t}\n\n\t/**\n\t * Check if an image is coming from Commons or not. Uses the URL pattern of the common file\n\t * repository to determine whether the image is stored there.\n\t *\n\t * @param {string} imageSrc\n\t * @return {boolean}\n\t */\n\tisCommonsResource( imageSrc ) {\n\t\treturn imageSrc.includes( CommonsFilePathPrefix );\n\t}\n\n\t/**\n\t * Adapt the image's alignment settings for the target language.\n\t */\n\tadaptImageAlignment() {\n\n\t\tconst sourceDirection = getDir( this.sourceLanguage );\n\t\tconst targetDirection = getDir( this.targetLanguage );\n\n\t\tif ( sourceDirection === targetDirection ) {\n\t\t\t// Source and target languages has same directionality. Nothing to do\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !this.node.attributes.class ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst classes = this.node.attributes.class.split( ' ' );\n\t\t// If the image has an explicit alignment class in HTML, this means that it has explicit\n\t\t// alignment defined in wiki syntax. It must be explicitly flipped if the target language's\n\t\t// direction is different.\n\t\tconst leftIndex = classes.indexOf( 'mw-halign-left' );\n\t\tconst rightIndex = classes.indexOf( 'mw-halign-right' );\n\t\tif ( leftIndex > -1 ) {\n\t\t\tclasses[ leftIndex ] = 'mw-halign-right';\n\t\t} else if ( rightIndex > -1 ) {\n\t\t\tclasses[ rightIndex ] = 'mw-halign-left';\n\t\t}\n\n\t\tthis.node.attributes.class = classes.join( ' ' );\n\t}\n\n\tasync adapt() {\n\t\tlet imageLink, sourceImage;\n\n\t\tif ( this.node.attributes.typeof.includes( 'mw:Transclusion' ) ) {\n\t\t\t// Node has typeof=\"mw:Transclusion mw:File\"\n\t\t\t// The image is generated by a template. So template adaptation will take care of it.\n\t\t\t// Bug: T298592\n\t\t\tconst adapter = new MWTemplate(\n\t\t\t\tthis.node, this.sourceLanguage, this.targetLanguage, this.api, this.context\n\t\t\t);\n\t\t\treturn adapter.adapt();\n\t\t}\n\t\tconst dataCX = { adapted: false };\n\n\t\tif ( this.isInlineMediaWithCaption() ) {\n\t\t\t// The image caption is in data-mw attribute.\n\t\t\tif ( this.context.mtClient ) {\n\t\t\t\t// This is an inline image, Adapting the caption alone.\n\t\t\t\tconst caption = JSON.parse( this.node.attributes[ 'data-mw' ] ).caption;\n\t\t\t\tconst translatedCaption = await this.context.mtClient.translate(\n\t\t\t\t\tthis.sourceLanguage, this.targetLanguage, caption\n\t\t\t\t);\n\t\t\t\tthis.node.attributes[ 'data-mw' ] = JSON.stringify( { caption: translatedCaption } );\n\t\t\t}\n\t\t\tdataCX.adapted = true;\n\t\t\tthis.node.attributes[ 'data-cx' ] = JSON.stringify( dataCX );\n\t\t\treturn this.node;\n\t\t}\n\n\t\t// The image is a block media or inline media without a caption.\n\n\t\tthis.adaptImageAlignment();\n\n\t\tif ( this.node.children ) {\n\t\t\tconst textChunks = this.node.children.textChunks;\n\t\t\tfor ( let i = 0, len = textChunks.length; i < len; i++ ) {\n\t\t\t\tconst chunk = this.node.children.textChunks[ i ];\n\t\t\t\tif ( chunk.tags[ 0 ] && chunk.tags[ 0 ].name === 'a' ) {\n\t\t\t\t\timageLink = chunk.tags[ 0 ];\n\t\t\t\t}\n\t\t\t\tif ( chunk.inlineContent && chunk.inlineContent.name === 'img' ) {\n\t\t\t\t\tsourceImage = chunk.inlineContent;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( !sourceImage ) {\n\t\t\t// This node is not a figure or span containing <img>. Could be audio or video\n\t\t\treturn this.node;\n\t\t}\n\n\t\tif ( sourceImage && this.isCommonsResource( sourceImage.attributes.src ) ) {\n\t\t\tconst namespaceAlias = await this.api.getNamespaceAlias( 'File', this.targetLanguage );\n\t\t\tconst targetResource = sourceImage.attributes.resource.replace( /^(\\.\\.?\\/)*([^:]+)(:)/, '$1' + namespaceAlias + '$3' );\n\n\t\t\t// Image does not have a link when it is created with \"link=\".\n\t\t\tif ( imageLink && imageLink.attributes.href ) {\n\t\t\t\timageLink.attributes.href = targetResource;\n\t\t\t}\n\t\t\tdataCX.adapted = true;\n\t\t}\n\n\t\tthis.node.attributes[ 'data-cx' ] = JSON.stringify( dataCX );\n\t\treturn this.node;\n\t}\n}\n\nMWImage.matchTagNames = [\n\t'figure',\n\t'span'\n];\n\nMWImage.matchRdfaTypes = [\n\t// mw:File(/.*)? will match figure or span containing images, video, and audio.\n\t// But in the adapt method we process only images. The <img>, <video> and <audio>\n\t// will be adapted by MWFile adapter module.\n\t'mw:File', 'mw:File/Thumb', 'mw:File/Frame', 'mw:File/Frameless',\n\t// TODO: Remove 'mw:Image(/.*)?' when version 2.4.0 of the content is no\n\t// longer supported\n\t'mw:Image', 'mw:Image/Thumb', 'mw:Image/Frame', 'mw:Image/Frameless'\n];\n\nexport default MWImage;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWLink.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWReference.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWTemplate.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/TranslationUnit.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/util.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":133,"column":23,"nodeType":"CallExpression","endLine":133,"endColumn":47}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @external Application\n * @external Request\n * @external Router\n */\n\nimport { readFileSync } from 'fs';\nimport { load } from 'js-yaml';\nimport languageData from '@wikimedia/language-data';\n\n/**\n * Error instance wrapping HTTP error responses\n */\nclass HTTPError extends Error {\n\n\tconstructor( response ) {\n\t\tsuper();\n\t\tError.captureStackTrace( this, HTTPError );\n\n\t\tthis.name = this.constructor.name;\n\t\tthis.message = `${ response.status }`;\n\t\tif ( response.detail ) {\n\t\t\tthis.message += `: ${ response.detail }`;\n\t\t}\n\n\t\tif ( response.type ) {\n\t\t\tthis.message += `: ${ response.type }`;\n\t\t}\n\n\t\tObject.assign( this, response );\n\t}\n\n\t/**\n\t * @param {Response} httpResponse\n\t * @return {HTTPError}\n\t */\n\tstatic fromResponse( httpResponse ) {\n\t\treturn new HTTPError( {\n\t\t\tstatus: httpResponse.status,\n\t\t\ttype: 'api_error',\n\t\t\tdetail: `Error from URL: ${ httpResponse.url }; status: ${ httpResponse.statusText }`\n\t\t} );\n\t}\n}\n\nfunction responseTimeMetricsMiddleware( app ) {\n\t// Create a histogram metric for HTTP request duration\n\tconst requestDuration = {\n\t\ttype: 'Histogram',\n\t\tname: `${ app.conf.name }_express_router_request_duration_seconds`,\n\t\thelp: 'request duration handled by router in seconds',\n\t\tbuckets: [ 0.01, 0.05, 0.1, 0.3, 1 ],\n\t\tlabels: {\n\t\t\tnames: [ 'path', 'method', 'status' ]\n\t\t}\n\t};\n\t// Create the metric\n\t// This will return the existing metric if it already exists\n\tconst responseTimeMetric = app.metrics.makeMetric( requestDuration );\n\tapp.logger.info( 'responseTimeMetric', responseTimeMetric.labels );\n\treturn ( req, res, next ) => {\n\t\tconst start = process.hrtime();\n\t\tconst originalEnd = res.end;\n\n\t\tres.end = ( ...args ) => {\n\t\t\t// Calculate the duration\n\t\t\tconst diff = process.hrtime( start );\n\t\t\tconst duration = diff[ 0 ] + diff[ 1 ] / 1e9;\n\n\t\t\tconst path = req.route ? req.route.path : req.path;\n\t\t\t// Observe the duration\n\t\t\tresponseTimeMetric.observe(\n\t\t\t\t{\n\t\t\t\t\tmethod: req.method,\n\t\t\t\t\tpath: path,\n\t\t\t\t\tstatus: res.statusCode\n\t\t\t\t},\n\t\t\t\tduration\n\t\t\t);\n\t\t\t// Call the original end function\n\t\t\toriginalEnd.apply( res, args );\n\t\t};\n\t\t// Continue processing the request\n\t\tnext();\n\t};\n}\n\nfunction Deferred() {\n\tthis.promise = new Promise( ( ( resolve, reject ) => {\n\t\tthis.resolve = resolve;\n\t\tthis.reject = reject;\n\t} ) );\n\n\tthis.then = this.promise.then.bind( this.promise );\n\tthis.catch = this.promise.catch.bind( this.promise );\n}\n\n/**\n * Check if the given content is plain text or contains html tags.\n * The check is performed by looking for open and close tags.\n * If the content has HTML entities, this test will not identify it.\n *\n * @param {string} content The content to test\n * @return {boolean} Return true if the content is plain text\n */\nfunction isPlainText( content ) {\n\treturn !content || !content.trim() || !/<[a-zA-Z][\\s\\S]*>/i.test( content );\n}\n\n/**\n * Null safe object getter\n * Example: To access obj.a.b.c[0].d in null safe way,\n * use getProp(['a', 'b', 'c', 0, 'd'], obj )\n *\n * @param {string|number} path access path\n * @param {Object} obj Object\n * @return {Object|string|number|null}\n */\nfunction getProp( path, obj ) {\n\treturn path.reduce(\n\t\t( accumulator, currentValue ) => ( accumulator && accumulator[ currentValue ] ) ?\n\t\t\taccumulator[ currentValue ] :\n\t\t\tnull,\n\t\tobj\n\t);\n}\n\nfunction getConfig( confPath ) {\n\tif ( !confPath ) {\n\t\tconst dirname = new URL( '.', import.meta.url ).pathname;\n\t\tconfPath = `${ dirname }/../config.dev.yaml`;\n\t}\n\tconst config = load( readFileSync( confPath ) );\n\tif ( !config ) {\n\t\tthrow new Error( 'Failed to load config from path: ' + confPath );\n\t}\n\treturn config;\n}\n\n/**\n * Asserts that the language codes, if provided, are valid.\n *\n * @param {Response} res Response object\n * @param {...string} languages Language codes\n */\nfunction assertValidLanguageCodes( res, ...languages ) {\n\tfor ( const language of languages ) {\n\t\tif ( language === undefined ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( !languageData.isKnown( language ) ) {\n\t\t\tres.status( 400 ).end( `Invalid language code ${ language }` );\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nexport {\n\tHTTPError,\n\tgetConfig,\n\tresponseTimeMetricsMiddleware,\n\tgetProp,\n\tDeferred,\n\tisPlainText,\n\tassertValidLanguageCodes\n};\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"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":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/scripts/SectionTitleAlignment/alignwithmt.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/scripts/template-mapping.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found existsSync from package \"fs\" with non literal argument at index 0","line":108,"column":7,"nodeType":"CallExpression","endLine":108,"endColumn":26},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":114,"column":14,"nodeType":"CallExpression","endLine":114,"endColumn":35}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { existsSync, readFileSync } from 'fs';\nimport { ArgumentParser } from 'argparse';\nimport { open } from 'sqlite';\nimport { Database } from 'sqlite3';\n\nasync function createTemplate( db, from, to, templateName ) {\n\tconst mapping = await db.get(\n\t\t`SELECT id FROM templates\n        WHERE source_lang = ? AND target_lang = ? AND template = ?`,\n\t\tfrom, to, templateName\n\t);\n\tif ( mapping && mapping.template_mapping_id ) {\n\t\treturn mapping.template_mapping_id;\n\t}\n\tconst result = await db.run(\n\t\t`INSERT OR IGNORE INTO templates\n        (source_lang, target_lang, template) VALUES(?,?,?)`,\n\t\tfrom, to, templateName\n\t);\n\treturn result.lastID;\n}\n\nasync function main( databaseFile, mapping, from, to ) {\n\tconst db = await open( { filename: databaseFile, driver: Database } );\n\n\tawait db.run(\n\t\t`CREATE TABLE IF NOT EXISTS templates (\n            id INTEGER PRIMARY KEY AUTOINCREMENT,\n            source_lang TEXT NOT NULL,\n            target_lang TEXT NOT NULL,\n            template TEXT NOT NULL,\n            UNIQUE(source_lang, target_lang, template)\n        )`\n\t);\n\tawait db.run(\n\t\t`CREATE TABLE IF NOT EXISTS mapping (\n            template_mapping_id INTEGER NOT NULL,\n            source_param TEXT NOT NULL,\n            target_param TEXT NOT NULL,\n            score REAL NOT NULL,\n            FOREIGN KEY(template_mapping_id) REFERENCES templates(id),\n            UNIQUE(template_mapping_id, source_param, target_param)\n        )`\n\t);\n\n\tfor ( const templateName in mapping ) {\n\t\tconst mappingData = mapping[ templateName ];\n\t\tif ( !mappingData || !mappingData.length ) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst mappingId = await createTemplate( db, from, to, templateName );\n\t\tprocess.stdout.write( `${ mappingId } ${ from } -> ${ to } ${ templateName }\\n` );\n\t\tfor ( const index in mappingData ) {\n\t\t\tconst paramMapping = mappingData[ index ];\n\t\t\tif ( !mappingId || !paramMapping[ from ] || !paramMapping[ to ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst score = 1 - paramMapping.d;\n\t\t\tdb.run(\n\t\t\t\t`INSERT OR IGNORE INTO mapping\n                (template_mapping_id, source_param, target_param, score)\n                VALUES(?,?,?,?)`,\n\t\t\t\tmappingId, paramMapping[ from ], paramMapping[ to ], score\n\t\t\t);\n\t\t\tprocess.stdout.write( `\\t${ paramMapping[ from ] } -> ${ paramMapping[ to ] } (${ score })\\n` );\n\t\t}\n\t}\n\tawait db.close();\n}\n\nconst argparser = new ArgumentParser( {\n\tadd_help: true,\n\tdescription: 'Prepare template mapping database'\n} );\n\nargparser.add_argument(\n\t'-d', '--database',\n\t{\n\t\thelp: 'template mapping database file',\n\t\tdefault: 'templatemapping.db'\n\t}\n);\nargparser.add_argument(\n\t'-i', '--input',\n\t{\n\t\thelp: 'JSON file with mapping.',\n\t\trequired: true\n\t}\n);\nargparser.add_argument(\n\t'--from',\n\t{\n\t\thelp: 'Source language',\n\t\trequired: true\n\t}\n);\nargparser.add_argument(\n\t'--to',\n\t{\n\t\thelp: 'Target language',\n\t\trequired: true\n\t}\n);\nconst args = argparser.parse_args();\n\nconst input = args.input;\nif ( !existsSync( input ) ) {\n\tthrow new Error( `File ${ input } does not exist` );\n}\n\nmain(\n\targs.database,\n\tJSON.parse( readFileSync( input ) ),\n\targs.from,\n\targs.to\n);\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/server.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/spec.yaml","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 139. Maximum allowed is 100.","line":197,"column":1,"nodeType":"Program","messageId":"max","endLine":197,"endColumn":140},{"ruleId":"max-len","severity":1,"message":"This line has a length of 139. Maximum allowed is 100.","line":248,"column":1,"nodeType":"Program","messageId":"max","endLine":248,"endColumn":140},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":470,"column":1,"nodeType":"Program","messageId":"max","endLine":470,"endColumn":110},{"ruleId":"max-len","severity":1,"message":"This line has a length of 216. Maximum allowed is 100.","line":503,"column":1,"nodeType":"Program","messageId":"max","endLine":503,"endColumn":217},{"ruleId":"max-len","severity":1,"message":"This line has a length of 110. Maximum allowed is 100.","line":540,"column":1,"nodeType":"Program","messageId":"max","endLine":540,"endColumn":111},{"ruleId":"max-len","severity":1,"message":"This line has a length of 216. Maximum allowed is 100.","line":547,"column":1,"nodeType":"Program","messageId":"max","endLine":547,"endColumn":217},{"ruleId":"max-len","severity":1,"message":"This line has a length of 106. Maximum allowed is 100.","line":589,"column":1,"nodeType":"Program","messageId":"max","endLine":589,"endColumn":107},{"ruleId":"max-len","severity":1,"message":"This line has a length of 134. Maximum allowed is 100.","line":606,"column":1,"nodeType":"Program","messageId":"max","endLine":606,"endColumn":135},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":621,"column":1,"nodeType":"Program","messageId":"max","endLine":621,"endColumn":110},{"ruleId":"max-len","severity":1,"message":"This line has a length of 106. Maximum allowed is 100.","line":653,"column":1,"nodeType":"Program","messageId":"max","endLine":653,"endColumn":107},{"ruleId":"max-len","severity":1,"message":"This line has a length of 134. Maximum allowed is 100.","line":670,"column":1,"nodeType":"Program","messageId":"max","endLine":670,"endColumn":135}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":"openapi: 3.0.1\ninfo:\n  version: 0.2.1\n  title: Content translation service\n  description: Content translation service for translating mediawiki pages between languages.\n  termsOfService: https://wikimediafoundation.org/wiki/Terms_of_Use\n  contact:\n    name: the Wikimedia Language team\n    url: https://www.mediawiki.org/wiki/Wikimedia_Language_engineering\n  license:\n    name: GPL-2.0-or-later\n    url: http://opensource.org/licenses/GPL-2.0\nx-default-params:\n  domain: en.wikipedia.org\n\npaths:\n  # from routes/root.js\n  /robots.txt:\n    get:\n      tags:\n        - Root\n        - Robots\n      summary: Gets robots.txt\n      responses:\n        200:\n          description: Success\n          content:\n            text/plain:\n              example:\n                \"User-agent: * \\nDisallow: /\"\n      x-amples:\n        - title: robots.txt check\n          request: {}\n          response:\n            status: 200\n  /:\n    get:\n      tags:\n        - Root\n      summary: The root service end-point\n      responses:\n        200:\n          description: Success\n      x-amples:\n        - title: root with no query params\n          request: {}\n          response:\n            status: 302\n        - title: spec from root\n          request:\n            query:\n              spec: true\n          response:\n            status: 200\n        - title: doc from root\n          request:\n            query:\n              doc: true\n          response:\n            status: 302\n        - title: root with wrong query param\n          request:\n            query:\n              fooo: true\n          response:\n            status: 302\n  # from routes/v1.js\n  /v1/page/{language}/{title}:\n    get:\n      tags:\n        - Page content\n      summary: Fetches segmented mediawiki page\n      parameters:\n        - $ref: \"#/components/parameters/language\"\n        - $ref: \"#/components/parameters/title\"\n      responses:\n        200:\n          description: Page fetched successfully\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  sourceLanguage:\n                    type: string\n                    example: es\n                  title:\n                    type: string\n                    example: Albert Einstein\n                  revision:\n                    type: string\n                    example: 165157183\n                  segmentedContent:\n                    type: string\n                    example: lorem ipsum\n        404:\n          description: Page not found\n      x-amples:\n        - title: Fetch enwiki protected page\n          request:\n            params:\n              language: en\n              title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n        - title: Fetch protected page with multi-word title\n          request:\n            params:\n              language: en\n              title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n  /v1/page/{language}/{title}/{revision}:\n    get:\n      tags:\n        - Page content\n      summary: Fetches segmented mediawiki page with revision\n      parameters:\n        - $ref: \"#/components/parameters/language\"\n        - $ref: \"#/components/parameters/title\"\n        - $ref: \"#/components/parameters/revision\"\n      responses:\n        200:\n          description: Success\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  sourceLanguage:\n                    type: string\n                    example: en\n                  title:\n                    type: string\n                    example: Albert Einstein\n                  revision:\n                    type: string\n                    example: 1234565\n                  segmentedContent:\n                    type: string\n                    example: lorem ipsum\n        404:\n          description: Page not found\n      x-amples:\n        - title: Fetch enwiki protected page with revision\n          request:\n            params:\n              language: en\n              title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n              revision: 1086816359\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n  /v1/mt/{from}/{to}:\n    post:\n      tags:\n        - Machine translation\n      summary: Fetches the machine translation. Some providers require an authorization header\n        and it is forbidden to use them outside the Content Translation tool.\n      parameters:\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n      requestBody:\n        content:\n          application/json:\n            schema:\n              required:\n                - html\n            example:\n              hello world:\n                value: { html: <p>hello world</p> }\n\n      responses:\n        200:\n          description: Machine translation fetched successfully\n          content:\n            application/json:\n              examples:\n                hello world:\n                  value: { html: <p>Bonjour le monde</p> }\n        400:\n          description: Invalid language code specified\n        500:\n          description: Internal error\n      x-amples:\n        - title: Machine translate an HTML fragment using TestClient.\n          request:\n            params:\n              from: en\n              to: qqq\n            body:\n              html: <p><a href='Oxygen'>Oxygen</a> is a chemical element with symbol O and <a href='Atomic number'>atomic number</a> 8.</p>\n          response:\n            status: 200\n            body:\n              contents: /.+/\n            headers:\n              content-type: application/json\n  /v1/mt/{from}/{to}/{mtprovider}:\n    post:\n      tags:\n        - Machine translation\n      summary: Fetches the machine translation. Some providers require an authorization header\n        and it is forbidden to use them outside the Content Translation tool.\n      parameters:\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n        - $ref: \"#/components/parameters/mtprovider\"\n      requestBody:\n        content:\n          application/json:\n            schema:\n              required:\n                - html\n              properties:\n                html:\n                  type: string\n                  description: The HTML content to translate\n                  x-textarea: true\n            examples:\n              hello world:\n                value: { html: <p>hello world</p> }\n              Let's translate:\n                value: { html: <p>Let's translate this paragraph.</p> }\n      responses:\n        200:\n          description: Machine translation fetched successfully\n          content:\n            application/json:\n              examples:\n                hello world:\n                  value: { html: <p>Bonjour le monde</p> }\n        400:\n          description: Not found\n      x-amples:\n        - title: Machine translate an HTML fragment using TestClient.\n          request:\n            params:\n              from: en\n              to: qqq\n              provider: TestClient\n            body:\n              html: <p><a href='Oxygen'>Oxygen</a> is a chemical element with symbol O and <a href='Atomic number'>atomic number</a> 8.</p>\n          response:\n            status: 200\n            body:\n              contents: /.+/\n            headers:\n              content-type: application/json\n  /v1/list/pair/{from}/{to}:\n    get:\n      tags:\n        - Tools\n      summary: Lists the tools for a given language pair\n      parameters:\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n      responses:\n        200:\n          description: Lists the tools for a given language pair fetched successfully\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  mt:\n                    type: array\n                    items:\n                      type: string\n                example: { mt: [ Google, Elia, MinT ] }\n        500:\n          description: Internal error\n      x-amples:\n        - title: Get the tools between two language pairs\n          request:\n            params:\n              from: en\n              to: es\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n  /v1/list/languagepairs:\n    get:\n      tags:\n        - Languages\n        - Service information\n      summary: Lists the language pairs supported by the server\n      responses:\n        200:\n          description: Success\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  sources:\n                    type: array\n                    items:\n                      type: string\n                      description: Source language code\n      x-amples:\n        - title: Get all the language pairs\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n  /v1/list/{tool}:\n    get:\n      tags:\n        - Tools\n        - Service information\n      summary: Lists all language pairs that tool supports.\n      parameters:\n        - $ref: \"#/components/parameters/tool\"\n      responses:\n        200:\n          description: List of all language pairs\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  sources:\n                    type: object\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Get the MT tool between two language pairs\n          request:\n            params:\n              tool: mt\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n  /v1/list/{tool}/{from}/{to}:\n    get:\n      tags:\n        - Tools\n        - Service information\n      summary: Lists the providers for the tool in that language pair.\n      parameters:\n        - $ref: \"#/components/parameters/tool\"\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n      responses:\n        200:\n          description: List mt tools available for the language pairs\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  mt:\n                    type: array\n                    items:\n                      type: string\n                example: { mt: [ Google, Elia, MinT ] }\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Get the MT tool between two language pairs\n          request:\n            params:\n              from: en\n              to: es\n              tool: mt\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n  # from routes/v2.js\n  /v2/page/{sourcelanguage}/{targetlanguage}/{title}:\n    get:\n      tags:\n        - Page content\n      summary: Fetches segmented mediawiki page\n      parameters:\n        - $ref: \"#/components/parameters/sourcelanguage\"\n        - $ref: \"#/components/parameters/targetlanguage\"\n        - $ref: \"#/components/parameters/title\"\n      responses:\n        200:\n          description: Success\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Translate enwiki protected page\n          request:\n            params:\n              sourcelanguage: en\n              targetlanguage: es\n              title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n        - title: Translate enwiki protected page with multi-word title\n          request:\n            params:\n              sourcelanguage: en\n              targetlanguage: es\n              title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n  /v2/page/{sourcelanguage}/{targetlanguage}/{title}/{revision}:\n    get:\n      tags:\n        - Page content\n      summary: Fetches segmented mediawiki page with revision\n      parameters:\n        - $ref: \"#/components/parameters/sourcelanguage\"\n        - $ref: \"#/components/parameters/targetlanguage\"\n        - $ref: \"#/components/parameters/title\"\n        - $ref: \"#/components/parameters/revision\"\n      responses:\n        200:\n          description: Success\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  sourceLanguage:\n                    type: string\n                    example: en\n                  title:\n                    type: string\n                    example: es\n                  revision:\n                    type: string\n                    example: 1234565\n                  segmentedContent:\n                    type: string\n                    example: lorem ipsum\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Translate enwiki protected page with revision\n          request:\n            params:\n              sourcelanguage: en\n              targetlanguage: es\n              title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n              revision: 1086816359\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n  /v2/translate/{from}/{to}:\n    post:\n      tags:\n        - Machine translation\n      description: Adapt the content for the target language wiki without performing any machine translation.\n      parameters:\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n      requestBody:\n        content:\n          application/json:\n            schema:\n              required:\n                - html\n              properties:\n                html:\n                  type: string\n            examples:\n              hello world:\n                value: { html: <p>hello world</p> }\n        required: true\n      responses:\n        200:\n          description: Success\n        400:\n          description: Invalid language code\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Machine translate an HTML fragment without provider, and an invalid language pair\n          request:\n            params:\n              from: en\n              to: qqq\n            body:\n              html: <p><a rel=\"mw:WikiLink\" href='./Oxygen' title='Oxygen'>Oxygen</a> is a chemical element with symbol O and <a rel=\"mw:WikiLink\" href='./Atomic number' title='Atomic number'>atomic number</a> 8.</p>\n          response:\n            status: 400\n\n  /v2/translate/{from}/{to}/{mtprovider}:\n    post:\n      tags:\n        - Machine translation\n      summary: Translate the given content from source language to target language.\n      description: Also adapt the content for the target language wiki. Some machine translation\n        providers require an authorization header and it is forbidden to use them outside the\n        Content Translation tool.\n      parameters:\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n        - $ref: \"#/components/parameters/mtprovider\"\n      requestBody:\n        content:\n          application/json:\n            schema:\n              required:\n                - html\n              properties:\n                html:\n                  type: string\n            examples:\n              hello world:\n                value: { html: <p>hello world</p> }\n        required: true\n      responses:\n        200:\n          description: Success\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.\n          request:\n            params:\n              from: en\n              to: qqq\n              mtprovider: TestClient\n            body:\n              html: <p><a rel=\"mw:WikiLink\" href='./Oxygen' title='Oxygen'>Oxygen</a> is a chemical element with symbol O and <a rel=\"mw:WikiLink\" href='./Atomic number' title='Atomic number'>atomic number</a> 8.</p>\n          response:\n            status: 200\n            body:\n              contents: /.+/\n            headers:\n              content-type: application/json\n  /v2/suggest/title/{title}/{from}/{to}:\n    get:\n      tags:\n        - Suggestions\n      summary: Suggest a target title for the given source title and language pairs\n      parameters:\n        - $ref: \"#/components/parameters/title\"\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n      responses:\n        200:\n          description: Success\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  history:\n                    type: array\n                    items:\n                      type: string\n                      description: Suggested title\n              example:\n                items:\n                  - Histoire\n                  - Historique\n        403:\n          description: Authentication error. The default MT provider for the given language pair\n            needs authorization, and the given JWT is invalid.\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Return the target language link for the given source title and language pairs\n          description: The invalid JWT key is not used, as default MT provider doesn't need authentication\n          request:\n            headers:\n              authorization: Test-auth\n            params:\n              title: Limonero\n              from: es\n              to: ca\n          response:\n            status: 200\n            body:\n              sourceLanguage: es\n              targetLanguage: ca\n              sourceTitle: Limonero\n              targetTitle: Llimoner\n            headers:\n              content-type: application/json\n        - title: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid\n          description: The invalid JWT key is used, as default MT provider needs authentication\n          request:\n            headers:\n              authorization: Test-auth\n            params:\n              title: Lemon\n              from: en\n              to: el\n          response:\n            status: 403\n  /v2/suggest/title/{title}/{from}/{to}/{mtprovider}:\n    get:\n      tags:\n        - Suggestions\n      summary: Suggest a target title for the given source title and language pairs with the given MT service\n      parameters:\n        - $ref: \"#/components/parameters/title\"\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n        - $ref: \"#/components/parameters/mtprovider\"\n      responses:\n        200:\n          description: Success\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  history:\n                    type: array\n                    items:\n                      type: string\n                      description: Suggested title\n              example:\n                items:\n                  - Histoire\n                  - Historique\n        403:\n          description: Authentication error. The default MT provider for the given language pair\n            needs authorization, and the given JWT is invalid.\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Return the target language link for the given source title and language pairs\n          description: The invalid JWT key is not used, as default MT provider doesn't need authentication\n          request:\n            headers:\n              authorization: Test-auth\n            params:\n              title: Limonero\n              from: es\n              to: ca\n          response:\n            status: 200\n            body:\n              sourceLanguage: es\n              targetLanguage: ca\n              sourceTitle: Limonero\n              targetTitle: Llimoner\n            headers:\n              content-type: application/json\n        - title: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid\n          description: The invalid JWT key is used, as default MT provider needs authentication\n          request:\n            headers:\n              authorization: Test-auth\n            params:\n              title: Lemon\n              from: en\n              to: el\n          response:\n            status: 403\n  /v2/suggest/source/{title}/{to}:\n    get:\n      tags:\n        - Suggestions\n      summary: Suggest a source article to use for creating given article in given target language\n        using translation\n      parameters:\n        - $ref: \"#/components/parameters/title\"\n        - $ref: \"#/components/parameters/to\"\n        - $ref: \"#/components/parameters/sourcelanguages\"\n      responses:\n        200:\n          description: Success\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  suggestions:\n                    type: array\n                    items:\n                      type: object\n                      properties:\n                        pageId:\n                          type: integer\n                          example: 736\n                        ns:\n                          type: integer\n                          example: 0\n                        title:\n                          type: string\n                          example: Albert Einstein\n                        pageprops:\n                          type: object\n                          properties:\n                            wikibase_item:\n                              type: string\n                              example: Q937\n                        thumbnail:\n                          type: object\n                          properties:\n                            source:\n                              type: string\n                              example: https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Einstein_1921_by_F_Schmutzer_-_restoration.jpg/80px-Einstein_1921_by_F_Schmutzer_-_restoration.jpg\n                            width:\n                              type: integer\n                              example: 80\n                            height:\n                              type: integer\n                              example: 105\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Suggest a source title to use for translation\n          request:\n            params:\n              to: ca\n              title: Paneer\n            query:\n              sourcelanguages: en\n          response:\n            status: 200\n            body:\n              suggestions: /^\\[.+\\]$/\n            headers:\n              content-type: application/json\n  /v2/suggest/sections/titles/{from}/{to}:\n    get:\n      tags:\n        - Suggestions\n      summary: Suggest target section titles based on provided source section titles. Titles are\n        provided as URL params under the key \"titles\"\n      parameters:\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n        - $ref: \"#/components/parameters/titles\"\n      responses:\n        200:\n          description: Success\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  history:\n                    type: array\n                    items:\n                      type: string\n                      description: Suggested section title\n                    example:\n                      - Histoire\n                      - Historique\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Suggest target section titles for given source sections\n          request:\n            params:\n              from: en\n              to: es\n            query:\n              titles: References|Notes|External Links\n          response:\n            status: 200\n            body:\n              References: [ Referencias, Bibliografía ]\n              Notes: [ Referencias, Notas ]\n              External Links: [ Enlaces externos ]\n            headers:\n              content-type: application/json\n  /v2/suggest/sections/{title}/{from}/{to}:\n    get:\n      tags:\n        - Suggestions\n      summary: Suggest sections to translate from a source article to its corresponding article\n        in target language.\n      parameters:\n        - $ref: \"#/components/parameters/title\"\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n        - $ref: \"#/components/parameters/include_section_sizes\"\n      responses:\n        200:\n          description: Success\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  sections:\n                    type: object\n                    properties:\n                      sourceLanguage:\n                        type: string\n                        example: en\n                      sourceTitle:\n                        type: string\n                        example: Albert Einstein\n                      targetLanguage:\n                        type: string\n                        example: fr\n                      targetTitle:\n                        type: string\n                        example: Albert Einstein\n                      sourceSections:\n                        type: array\n                        items:\n                          type: string\n                      targetSections:\n                        type: array\n                        items:\n                          type: string\n                      present:\n                        type: object\n                      missing:\n                        type: object\n        404:\n          description: Not Found\n        500:\n          description: Server Error\n      x-amples:\n        - title: Suggest source sections to translate\n          request:\n            params:\n              from: en\n              to: ml\n              title: Sitar\n          response:\n            status: 200\n            body:\n              sections:\n                sourceLanguage: /.+/\n                targetLanguage: /.+/\n                sourceTitle: /.+/\n                targetTitle: /.+/\n                present: /.+/\n                missing: /.+/\n            headers:\n              content-type: application/json\n  /v2/suggest/sections/{from}/{to}:\n    get:\n      tags:\n        - Suggestions\n      summary: Suggest sections to translate from source articles to their corresponding articles\n        in target language, for a given list of articles.\n      parameters:\n        - $ref: \"#/components/parameters/from\"\n        - $ref: \"#/components/parameters/to\"\n        - $ref: \"#/components/parameters/titles\"\n        - $ref: \"#/components/parameters/include_section_sizes\"\n      responses:\n        200:\n          description: Success\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  results:\n                    type: array\n                    items:\n                      type: object\n                      properties:\n                        sourceLanguage:\n                          type: string\n                          example: en\n                        sourceTitle:\n                          type: string\n                          example: Albert Einstein\n                        targetLanguage:\n                          type: string\n                          example: fr\n                        targetTitle:\n                          type: string\n                          example: Albert Einstein\n                        sourceSections:\n                          type: array\n                          items:\n                            type: string\n                        targetSections:\n                          type: array\n                          items:\n                            type: string\n                        present:\n                          type: object\n                        missing:\n                          type: object\n        400:\n          description: Invalid language code\n        500:\n          description: Server Error\n      x-amples:\n        - title: Suggest source sections to translate for multiple titles\n          request:\n            params:\n              from: en\n              to: ml\n            query:\n              titles: Pizza|Spaghetti\n              include_section_sizes: true\n          response:\n            status: 200\n            body:\n              results:\n                - sourceLanguage: en\n                  targetLanguage: ml\n                  sourceTitle: Pizza\n                  targetTitle: /.+/\n                  sourceSections: /.+/\n                  targetSections: /.+/\n                  present: /.+/\n                  missing: /.+/\n                  sourceSectionSizes: /.+/\n                - sourceLanguage: en\n                  targetLanguage: ml\n                  sourceTitle: Spaghetti\n                  targetTitle: /.+/\n                  sourceSections: /.+/\n                  targetSections: /.+/\n                  present: /.+/\n                  missing: /.+/\n                  sourceSectionSizes: /.+/\n            headers:\n              content-type: application/json\n\n  # from routes/info.js\n  /_info:\n    get:\n      tags:\n        - Service information\n      summary: Gets information about the service\n      responses:\n        200:\n          description: OK\n      x-amples:\n        - title: retrieve service info\n          request: {}\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n            body:\n              name: /.+/\n              description: /.+/\n              version: /.+/\n              home: /.+/\n  /_info/name:\n    get:\n      tags:\n        - Service information\n        - Service name\n      summary: Gets the name of the service\n      responses:\n        200:\n          description: OK\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  name:\n                    type: string\n              example: { name: cxserver }\n      x-amples:\n        - title: retrieve service name\n          request: {}\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n            body:\n              name: /.+/\n  /_info/version:\n    get:\n      tags:\n        - Service information\n        - Service version\n      summary: Gets the running version of the service\n      responses:\n        200:\n          description: OK\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  version:\n                    type: string\n              example: { version: 1.2.1 }\n      x-amples:\n        - title: retrieve service version\n          request: {}\n          response:\n            status: 200\n            headers:\n              content-type: application/json\n            body:\n              version: /.+/\n  /_info/home:\n    get:\n      tags:\n        - Service information\n        - Service homepage\n      summary: Redirects to the home page\n      responses:\n        301:\n          description: Redirect\n      x-amples:\n        - title: redirect to the home page\n          request: {}\n          response:\n            status: 301\ncomponents:\n  parameters:\n    domain:\n      in: path\n      name: domain\n      required: true\n      schema:\n        type: string\n      description: |\n        Project domain for the requested data.\n    language:\n      in: path\n      name: language\n      required: true\n      schema:\n        type: string\n      examples:\n        English:\n          value: en\n        Spanish:\n          value: es\n      description: |\n        Valid language code\n    revision:\n      in: path\n      name: revision\n      required: true\n      schema:\n        type: string\n      description: |\n        Revision Id\n      example:\n        1274260387:\n          value: 1274260387\n    title:\n      in: path\n      name: title\n      required: true\n      schema:\n        type: string\n      examples:\n        Albert Einstein:\n          value: Albert Einstein\n        Roller Coaster:\n          value: Roller coaster\n      description: |\n        Page title. Use underscores instead of spaces. Example: `Main_Page`\n    spec:\n      in: query\n      name: spec\n      required: false\n      schema:\n        type: string\n      examples:\n        spec:\n          value: true\n        doc:\n          value: true\n        fooo:\n          value: true\n      description: |\n        Page title. Use underscores instead of spaces. Example: `Main_Page`\n    prop:\n      in: path\n      name: prop\n      required: true\n      schema:\n        type: string\n      description: |\n        Site info prop.\n    from:\n      name: from\n      in: path\n      description: The source language code\n      examples:\n        English:\n          value: en\n        Spanish:\n          value: es\n      schema:\n        type: string\n      required: true\n    sourcelanguage:\n      name: sourcelanguage\n      in: path\n      description: The source language code\n      schema:\n        type: string\n      examples:\n        English:\n          value: en\n        Spanish:\n          value: es\n      required: true\n    to:\n      name: to\n      in: path\n      description: The target language code\n      schema:\n        type: string\n      examples:\n        Spanish:\n          value: es\n        French:\n          value: fr\n      required: true\n    targetlanguage:\n      name: targetlanguage\n      in: path\n      description: The target language code\n      schema:\n        type: string\n      examples:\n        French:\n          value: fr\n        Spanish:\n          value: es\n      required: true\n    titles:\n      in: query\n      name: titles\n      description: List of source section titles separated by pipe (\"|\") delimiter, based\n        on which target section suggestions will be given. Should be passed as array\n        inside URL params (e.g. titles=test1|test2)\n      schema:\n        type: string\n      required: true\n      examples:\n        History|Background:\n          value: History|Background\n        History:\n          value: History\n        Background:\n          value: Background\n    sourcelanguages:\n      name: sourcelanguages\n      in: query\n      description: Comma-separated list of candidate source languages. By default English(en)\n        is used as a source language unless that is the target language.\n      schema:\n        type: array\n        items:\n          type: string\n      examples:\n        en,es:\n          value: en,es\n      style: simple\n      explode: true\n      required: true\n    word:\n      name: word\n      in: path\n      description: The word to lookup\n      schema:\n        type: string\n      required: true\n    mtprovider:\n      name: mtprovider\n      in: path\n      description: The machine translation provider id\n      required: false\n      schema:\n        type: string\n        enum:\n          - MinT\n          - Apertium\n      examples:\n        MinT:\n          value: MinT\n    tool:\n      name: tool\n      in: path\n      description: The tool name\n      schema:\n        type: string\n        enum:\n          - mt\n      examples:\n        mt:\n          value: mt\n      required: true\n    include_section_sizes:\n      name: include_section_sizes\n      in: query\n      description: Whether to include section sizes in the response\n      schema:\n        type: boolean\n      examples:\n        true:\n          value: true\n        false:\n          value: false\n      required: false\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":[]}]},{"filePath":"/src/repo/test/adaptation/AdaptationTest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/adaptation/AdaptationTests.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/adaptation/AdaptationTests.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/adaptation/SectionTest.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":31,"column":20,"nodeType":"CallExpression","endLine":31,"endColumn":80}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { before, describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport { deepEqual } from 'node:assert/strict';\nimport { JSDOM } from 'jsdom';\nimport Adapter from '../../lib/Adapter.js';\nimport MWApiRequestManager from '../../lib/mw/MWApiRequestManager.js';\nimport { TestClient } from '../../lib/mt/index.js';\nimport { getConfig } from '../../lib/util.js';\nimport { initApp } from '../../app.js';\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nconst testcase = {\n\tdesc: 'section has lot of templates, but all are fragments of main template',\n\tfrom: 'en',\n\tto: 'es',\n\tsource: 'section-1.html',\n\tadaptationCount: 1\n};\n\ndescribe( 'Adaptation tests', () => {\n\tlet app;\n\n\tbefore( async () => {\n\t\tapp = await initApp( getConfig() );\n\t} );\n\n\tit( 'should adapt section when: ' + testcase.desc, async () => {\n\t\tconst api = new MWApiRequestManager( app );\n\t\tapp.mtClient = new TestClient( app );\n\t\tconst adapter = new Adapter( testcase.from, testcase.to, api, app );\n\t\tconst testData = readFileSync( dirname + '/data/' + testcase.source, 'utf8' );\n\t\tconst result = await adapter.adapt( testData );\n\t\tconst resultDom = new JSDOM( result.getHtml() );\n\t\tconst elementWithDataCX = resultDom.window.document.querySelectorAll( '[data-cx]' );\n\t\tdeepEqual( elementWithDataCX.length, testcase.adaptationCount );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/adaptation/TemplateParameterMapper.test.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'name_with_a_tailing_space' is not in camel case.","line":48,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":48,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/app/app.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/app/spec.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":21,"column":16,"nodeType":"CallExpression","endLine":21,"endColumn":40},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":168,"column":10,"nodeType":"NewExpression","endLine":168,"endColumn":47}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { before, describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport swaggerrouter from 'swagger-router';\nimport { load } from 'js-yaml';\nimport request from 'supertest';\nimport OpenAPISchemaValidator from 'openapi-schema-validator';\nimport { status as assertStatus, contentType, deepEqual, notDeepEqual } from '../../utils/assert.js';\nimport { getConfig } from '../../../lib/util.js';\nimport { initApp } from '../../../app.js';\n\nconst ValidatorClass = OpenAPISchemaValidator.default;\nconst validator = new ValidatorClass( { version: 3 } );\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction staticSpecLoad() {\n\n\tlet spec;\n\tconst myService = getConfig();\n\tconst specPath = `${ dirname }/../../../${ myService.spec ? myService.spec : 'spec.yaml' }`;\n\n\ttry {\n\t\tspec = load( readFileSync( specPath ) );\n\t} catch ( e ) {\n\t\tthrow new Error( `Cannot load spec file: ${ specPath }` );\n\t}\n\n\treturn spec;\n\n}\n\nfunction validateExamples( pathStr, defParams, mSpec ) {\n\n\tconst uri = new swaggerrouter.URI( pathStr, {}, true );\n\n\tif ( !mSpec ) {\n\t\ttry {\n\t\t\turi.expand( defParams );\n\t\t\treturn true;\n\t\t} catch ( e ) {\n\t\t\tthrow new Error( `Missing parameter for route ${ pathStr } : ${ e.message }` );\n\t\t}\n\t}\n\n\tif ( !Array.isArray( mSpec ) ) {\n\t\tthrow new Error( `Route ${ pathStr } : x-amples must be an array!` );\n\t}\n\n\tmSpec.forEach( ( ex, idx ) => {\n\t\tif ( !ex.title ) {\n\t\t\tthrow new Error( `Route ${ pathStr }, example ${ idx }: title missing!` );\n\t\t}\n\t\tex.request = ex.request || {};\n\t\ttry {\n\t\t\turi.expand( Object.assign( {}, defParams, ex.request.params || {} ) );\n\t\t} catch ( e ) {\n\t\t\tthrow new Error(\n\t\t\t\t`Route ${ pathStr }, example ${ idx } (${ ex.title }): missing parameter: ${ e.message }`\n\t\t\t);\n\t\t}\n\t} );\n\n\treturn true;\n\n}\n\nfunction constructTestCase( title, path, method, req, response ) {\n\n\treturn {\n\t\ttitle,\n\t\trequest: {\n\t\t\turi: '/' + ( path[ 0 ] === '/' ? path.slice( 1 ) : path ),\n\t\t\tmethod,\n\t\t\theaders: req.headers || { 'Content-Type': 'application/json' },\n\t\t\tquery: req.query,\n\t\t\tbody: req.body,\n\t\t\tfollowRedirect: false\n\t\t},\n\t\tresponse: {\n\t\t\tstatus: response.status || 200,\n\t\t\theaders: response.headers || {},\n\t\t\tbody: response.body\n\t\t}\n\t};\n\n}\n\nfunction constructTests( paths, defParams ) {\n\n\tconst ret = [];\n\n\tObject.keys( paths ).forEach( ( pathStr ) => {\n\t\tObject.keys( paths[ pathStr ] ).forEach( ( method ) => {\n\t\t\tconst p = paths[ pathStr ][ method ];\n\t\t\tif ( {}.hasOwnProperty.call( p, 'x-monitor' ) && !p[ 'x-monitor' ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst uri = new swaggerrouter.URI( pathStr, {}, true );\n\t\t\tif ( !p[ 'x-amples' ] ) {\n\t\t\t\tret.push( constructTestCase(\n\t\t\t\t\tpathStr,\n\t\t\t\t\turi.toString( { params: defParams } ),\n\t\t\t\t\tmethod,\n\t\t\t\t\t{},\n\t\t\t\t\t{}\n\t\t\t\t) );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tp[ 'x-amples' ].forEach( ( ex ) => {\n\t\t\t\tex.request = ex.request || {};\n\t\t\t\tret.push( constructTestCase(\n\t\t\t\t\tex.title,\n\t\t\t\t\turi.toString( {\n\t\t\t\t\t\tparams: Object.assign( {}, defParams, ex.request.params || {} )\n\t\t\t\t\t} ),\n\t\t\t\t\tmethod,\n\t\t\t\t\tex.request,\n\t\t\t\t\tex.response || {}\n\t\t\t\t) );\n\t\t\t} );\n\t\t} );\n\t} );\n\n\treturn ret;\n\n}\n\nfunction cmp( result, expected, errMsg ) {\n\n\tif ( expected === null || expected === undefined ) {\n\t\t// nothing to expect, so we can return\n\t\treturn true;\n\t}\n\tif ( result === null || result === undefined ) {\n\t\tresult = '';\n\t}\n\n\tif ( expected.constructor === Object ) {\n\t\tObject.keys( expected ).forEach( ( key ) => {\n\t\t\tconst val = expected[ key ];\n\t\t\tdeepEqual( {}.hasOwnProperty.call( result, key ), true,\n\t\t\t\t`Body field ${ key } not found in response!` );\n\t\t\tcmp( result[ key ], val, `${ key } body field mismatch!` );\n\t\t} );\n\t\treturn true;\n\t} else if ( expected.constructor === Array ) {\n\t\tif ( result.constructor !== Array ) {\n\t\t\tdeepEqual( result, expected, errMsg );\n\t\t\treturn true;\n\t\t}\n\t\t// only one item in expected - compare them all\n\t\tif ( expected.length === 1 && result.length > 1 ) {\n\t\t\tresult.forEach( ( item ) => {\n\t\t\t\tcmp( item, expected[ 0 ], errMsg );\n\t\t\t} );\n\t\t\treturn true;\n\t\t}\n\t\t// more than one item expected, check them one by one\n\t\tif ( expected.length !== result.length ) {\n\t\t\tdeepEqual( result, expected, errMsg );\n\t\t\treturn true;\n\t\t}\n\t\texpected.forEach( ( item, idx ) => {\n\t\t\tcmp( result[ idx ], item, errMsg );\n\t\t} );\n\t\treturn true;\n\t}\n\n\tif ( expected.length > 1 && expected[ 0 ] === '/' && expected[ expected.length - 1 ] === '/' ) {\n\t\tif ( ( new RegExp( expected.slice( 1, -1 ) ) ).test( result ) ) {\n\t\t\treturn true;\n\t\t}\n\t} else if ( expected.length === 0 && result.length === 0 ) {\n\t\treturn true;\n\t} else if ( result === expected || result.startsWith( expected ) ) {\n\t\treturn true;\n\t}\n\n\tdeepEqual( result, expected, errMsg );\n\treturn true;\n\n}\n\nasync function validateTestResponse( testCase, response ) {\n\n\tconst expRes = testCase.response;\n\tif ( response.statusCode === 500 ) {\n\t\tconsole.error( response );\n\t}\n\t// check the status\n\tdeepEqual( response.statusCode, expRes.status, 'Status mismatch!' );\n\n\t// check the headers\n\tObject.keys( expRes.headers ).forEach( ( key ) => {\n\t\tconst val = expRes.headers[ key ];\n\t\tdeepEqual( !!response.headers[ key ], true,\n\t\t\t`Header ${ key } not found in response!` );\n\t\tcmp( response.headers[ key ], val, `${ key } header mismatch!` );\n\t} );\n\n\t// check the body\n\tif ( !expRes.body ) {\n\t\treturn true;\n\t}\n\tlet body = await response.body || '';\n\tif ( Buffer.isBuffer( body ) ) {\n\t\tbody = body.toString();\n\t}\n\tif ( expRes.body.constructor !== body.constructor ) {\n\t\tif ( expRes.body.constructor === String ) {\n\t\t\tbody = JSON.stringify( body );\n\t\t} else {\n\t\t\tbody = JSON.parse( body );\n\t\t}\n\t}\n\t// check that the body type is the same\n\tif ( expRes.body.constructor !== body.constructor ) {\n\t\tthrow new Error(\n\t\t\t`Expected body type ${ expRes.body.constructor } but got ${ body.constructor }`\n\t\t);\n\t}\n\n\t// compare the bodies\n\tcmp( body, expRes.body, 'Body mismatch!' );\n\n\treturn true;\n\n}\n\ndescribe( 'Swagger spec', async () => {\n\tlet app;\n\n\tbefore( async () => {\n\t\tapp = await initApp( getConfig() );\n\t} );\n\n\t// the variable holding the spec\n\tlet spec = staticSpecLoad();\n\t// default params, if given\n\tlet defParams = spec[ 'x-default-params' ] || {};\n\n\tit( 'get the spec', async () => {\n\t\tconst response = await request( app ).get( '?spec' );\n\n\t\tconst data = await response.body;\n\t\tassertStatus( response, 200 );\n\t\tcontentType( response, 'application/json; charset=utf-8' );\n\t\tnotDeepEqual( data, undefined, 'No body received!' );\n\t\tspec = data;\n\t} );\n\n\tit( 'should expose valid OpenAPI spec', async () => {\n\t\tconst response = await request( app ).get( '?spec' );\n\t\tconst data = await response.body;\n\t\tdeepEqual( { errors: [] }, validator.validate( data ), 'Spec must have no validation errors' );\n\n\t} );\n\n\tit( 'spec validation', () => {\n\t\tif ( spec[ 'x-default-params' ] ) {\n\t\t\tdefParams = spec[ 'x-default-params' ];\n\t\t}\n\t\t// check the high-level attributes\n\t\t[ 'info', 'openapi', 'paths' ].forEach( ( prop ) => {\n\t\t\tdeepEqual( !!spec[ prop ], true, `No ${ prop } field present!` );\n\t\t} );\n\t\t// no paths - no love\n\t\tdeepEqual( !!Object.keys( spec.paths ), true, 'No paths given in the spec!' );\n\t\t// now check each path\n\t\tObject.keys( spec.paths ).forEach( ( pathStr ) => {\n\t\t\tdeepEqual( !!pathStr, true, 'A path cannot have a length of zero!' );\n\t\t\tconst path = spec.paths[ pathStr ];\n\t\t\tdeepEqual( !!Object.keys( path ), true, `No methods defined for path: ${ pathStr }` );\n\t\t\tObject.keys( path ).forEach( ( method ) => {\n\t\t\t\tconst mSpec = path[ method ];\n\t\t\t\tif ( {}.hasOwnProperty.call( mSpec, 'x-monitor' ) && !mSpec[ 'x-monitor' ] ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvalidateExamples( pathStr, defParams, mSpec[ 'x-amples' ] );\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tdescribe( 'routes', async () => {\n\t\tconstructTests( spec.paths, defParams ).forEach( ( testCase ) => {\n\t\t\tit( testCase.title, async () => {\n\t\t\t\tlet uri = testCase.request.uri;\n\t\t\t\tlet response;\n\t\t\t\tconst options = {\n\t\t\t\t\tmethod: testCase.request.method.toUpperCase(),\n\t\t\t\t\theaders: testCase.request.headers,\n\t\t\t\t\tredirect: 'manual'\n\t\t\t\t};\n\t\t\t\tif ( options.method === 'POST' && testCase.request.body ) {\n\t\t\t\t\toptions.body = JSON.stringify( testCase.request.body );\n\n\t\t\t\t\tresponse = await request( app ).post( uri ).send( options.body ).set( 'Content-Type', 'application/json' )\n\t\t\t\t\t\t.set( 'Accept', 'application/json' );\n\t\t\t\t} else {\n\t\t\t\t\turi = `${ uri }?${ new URLSearchParams( testCase.request.query ).toString() }`;\n\t\t\t\t\tresponse = await request( app ).get( uri, options );\n\t\t\t\t}\n\n\t\t\t\tconst result = await validateTestResponse( testCase, response );\n\n\t\t\t\treturn result;\n\t\t\t} );\n\t\t} );\n\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/info/info.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/v1/page.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/v2/page.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/lineardoc/LinearDoc.test.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":28,"column":22,"nodeType":"CallExpression","endLine":28,"endColumn":59},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":32,"column":24,"nodeType":"CallExpression","endLine":32,"endColumn":61},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":36,"column":26,"nodeType":"CallExpression","endLine":36,"endColumn":65},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":78,"column":28,"nodeType":"CallExpression","endLine":78,"endColumn":65},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":101,"column":28,"nodeType":"CallExpression","endLine":101,"endColumn":65},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":156,"column":27,"nodeType":"CallExpression","endLine":159,"endColumn":5},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":249,"column":28,"nodeType":"CallExpression","endLine":249,"endColumn":65}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport assert from 'node:assert/strict';\nimport { deepEqual } from '../utils/assert.js';\nimport {\n\tMwContextualizer,\n\tNormalizer,\n\tParser\n} from '../../lib/lineardoc/index.js';\nimport { isIgnorableBlock } from '../../lib/lineardoc/Utils.js';\nimport transTests from './translate.test.json' with { type: 'json' };\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /(\\r\\n|\\n|\\t|\\r)/gm, '' ) );\n\treturn normalizer.getHtml();\n}\n\ndescribe( 'LinearDoc', () => {\n\tit( 'should be possible to linearise all kind of HTML inputs', () => {\n\t\tconst numTests = 8;\n\t\tfor ( let i = 1; i <= numTests; i++ ) {\n\t\t\tconst testXhtmlFile = dirname + '/data/test' + i + '.xhtml';\n\t\t\tconst resultXmlFile = dirname + '/data/test' + i + '-result.xml';\n\t\t\tconst resultXhtmlFile = dirname + '/data/test' + i + '-result.xhtml';\n\t\t\tconst testXhtml = readFileSync( testXhtmlFile, 'utf8' ).replace(\n\t\t\t\t/^\\s+|\\s+$/,\n\t\t\t\t''\n\t\t\t);\n\t\t\tconst expectedXml = readFileSync( resultXmlFile, 'utf8' ).replace(\n\t\t\t\t/^\\s+|\\s+$/,\n\t\t\t\t''\n\t\t\t);\n\t\t\tconst expectedXhtml = readFileSync( resultXhtmlFile, 'utf8' ).replace(\n\t\t\t\t/^\\s+|\\s+$/,\n\t\t\t\t''\n\t\t\t);\n\t\t\tconst parser = new Parser( new MwContextualizer() );\n\t\t\tparser.init();\n\t\t\tparser.write( testXhtml );\n\t\t\tassert.ok(\n\t\t\t\t!isIgnorableBlock( parser.builder.doc ),\n\t\t\t\t'Not a section with block template'\n\t\t\t);\n\t\t\tdeepEqual(\n\t\t\t\tnormalize( parser.builder.doc.dumpXml() ),\n\t\t\t\tnormalize( expectedXml ),\n\t\t\t\t'Linearised structure'\n\t\t\t);\n\t\t\tdeepEqual(\n\t\t\t\tnormalize( parser.builder.doc.getHtml() ),\n\t\t\t\tnormalize( expectedXhtml ),\n\t\t\t\t'Reconstructed XHTML'\n\t\t\t);\n\t\t}\n\t} );\n\n\tit( 'should be possible to reconstruct the HTML from LinearDoc', () => {\n\t\tfor ( let i = 0, len = transTests.length; i < len; i++ ) {\n\t\t\tconst test = transTests[ i ];\n\t\t\tconst parser = new Parser( new MwContextualizer() );\n\t\t\tparser.init();\n\t\t\tparser.write( '<div>' + test.source + '</div>' );\n\t\t\tconst textBlock1 = parser.builder.doc.items[ 1 ].item;\n\t\t\tdeepEqual( textBlock1.getHtml(), test.source, 'Reconstructed source HTML' );\n\t\t\tconst textBlock2 = textBlock1.translateTags(\n\t\t\t\ttest.targetText,\n\t\t\t\ttest.rangeMappings\n\t\t\t);\n\t\t\tdeepEqual( textBlock2.getHtml(), test.expect, 'Translated HTML' );\n\t\t}\n\t} );\n\n\tit( 'should be possible to reduce and expand a document', () => {\n\t\tconst testXhtmlFile = dirname + '/data/test-figure-inline.html';\n\t\tconst contentForReduce = readFileSync( testXhtmlFile, 'utf8' ).replace(\n\t\t\t/^\\s+|\\s+$/,\n\t\t\t''\n\t\t);\n\t\tconst parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( contentForReduce );\n\t\tconst { reducedDoc, extractedData } = parser.builder.doc.reduce();\n\t\tdeepEqual(\n\t\t\tObject.keys( extractedData ).length,\n\t\t\t16,\n\t\t\t'Attributes for 16 tags extracted.'\n\t\t);\n\t\tconst expandedDoc = reducedDoc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( contentForReduce ),\n\t\t\t'Restored the original html after reduce and expand.'\n\t\t);\n\t} );\n\n\tit( 'test HTML compaction roundtrip with inline chunks', () => {\n\t\tconst testXhtmlFile = dirname + '/data/test-chunks-inline.html';\n\t\tconst contentForReduce = readFileSync( testXhtmlFile, 'utf8' ).replace(\n\t\t\t/^\\s+|\\s+$/,\n\t\t\t''\n\t\t);\n\t\tconst parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( contentForReduce );\n\t\tconst { reducedDoc, extractedData } = parser.builder.doc.reduce();\n\t\tdeepEqual(\n\t\t\tObject.keys( extractedData ).length,\n\t\t\t22,\n\t\t\t'Attributes for 22 tags extracted.'\n\t\t);\n\t\tconst expandedDoc = reducedDoc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( contentForReduce ),\n\t\t\t'Restored the original html after reduce and expand.'\n\t\t);\n\t} );\n\n\tit( 'test HTML expand with external attributes inserted', () => {\n\t\tconst corruptedDoc = `<p id=\"1\">\n\t\t\t<b id=\"2\" onclick=\"doSomething();\">Externally inserted attribute.</b>\n\t\t\t<a href=\"navigateThere();\">Externally inserted tag</a>\n\t\t\t<span id=\"mwEz\">Element with only id attribute is fine.</span>\n\t\t\t</p>`;\n\t\tconst sanitizedExpandedDoc = `<p class=\"paragraph\" id=\"mwEq\">\n\t\t\t<b class=\"bold\" id=\"mwEs\">Externally inserted attribute.</b>\n\t\t\t<a>Externally inserted tag</a>\n\t\t\t<span id=\"mwEz\">Element with only id attribute is fine.</span>\n\t\t\t</p>`;\n\t\tconst extractedData = {\n\t\t\t1: { attributes: { id: 'mwEq', class: 'paragraph' } },\n\t\t\t2: { attributes: { id: 'mwEs', class: 'bold' } }\n\t\t};\n\t\tconst parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( corruptedDoc );\n\t\tconst expandedDoc = parser.builder.doc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( sanitizedExpandedDoc ),\n\t\t\t'Expanded the corrupted document by removing all externally inserted attributes.'\n\t\t);\n\t} );\n\n\tit( 'test if the content is block level template', () => {\n\t\tconst testFiles = [\n\t\t\t'/data/test-block-template-section-1.html',\n\t\t\t'/data/test-block-template-section-2.html',\n\t\t\t'/data/test-block-template-section-3.html',\n\t\t\t'/data/test-block-template-section-4.html'\n\t\t];\n\t\tfor ( let i = 0; i < testFiles.length; i++ ) {\n\t\t\tconst contentForTest = readFileSync(\n\t\t\t\tdirname + testFiles[ i ],\n\t\t\t\t'utf8'\n\t\t\t).replace( /^\\s+|\\s+$/, '' );\n\t\t\tconst parser = new Parser( new MwContextualizer() );\n\t\t\tparser.init();\n\t\t\tparser.write( contentForTest );\n\t\t\tassert.ok(\n\t\t\t\tisIgnorableBlock( parser.builder.doc ),\n\t\t\t\t`File ${ testFiles[ i ] } is section with block template`\n\t\t\t);\n\t\t}\n\t} );\n\n\tit( 'test HTML compaction roundtrip with inline style content', () => {\n\t\tconst sourceDoc = `<section><p>\n\t\t<a href=\"Our title\">ABC</a>\n\t\t<style> a { background: url(https://en.wikipedia.org/css-background); } </style>\n\t\t<script>original script</script>\n\t\t<script type=\"module\" src=\"main.js\"></script>\n\t\t<span id=\"mwKJ\" typeof=\"mw:Entity\">&ndash;</span>\n\t\t</p>\n\t\t</section>`;\n\n\t\tconst expectedReducedDoc = `<section><p>\n\t\t<a id=\"1\">ABC</a>\n\t\t<style id=\"2\"></style>\n\t\t<script id=\"3\"></script>\n\t\t<script id=\"4\"></script>\n\t\t<span id=\"5\">&ndash;</span>\n\t\t</p>\n\t\t</section>`;\n\t\t// MT result from external MT service. Assuming that it altered the style and script content.\n\t\tconst corruptedMTInput = `<section><p>\n\t\t<a id=\"1\" href=\"Their title\">abc</a>\n\t\t<style id=\"2\"> a { background: url(https://leaking.via/css-background); } </style>\n\t\t<script id=\"3\">Corrupted script</script>\n\t\t<script id=\"4\" src=\"https://bad.via/main.js\"></script>\n\t\t<span id=\"5\">©</span>\n\t\t</p>\n\t\t</section>`;\n\t\t// Expected final output after fixing all external modification\n\t\tconst sanitizedExpandedDoc = `<section><p>\n\t\t<a href=\"Our title\">abc</a>\n\t\t<style> a { background: url(https://en.wikipedia.org/css-background); } </style>\n\t\t<script>original script</script>\n\t\t<script type=\"module\" src=\"main.js\"></script>\n\t\t<span id=\"mwKJ\" typeof=\"mw:Entity\">&ndash;</span>\n\t\t</p>\n\t\t</section>`;\n\t\tlet parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( sourceDoc );\n\t\tconst { reducedDoc, extractedData } = parser.builder.doc.reduce();\n\t\tdeepEqual(\n\t\t\tnormalize( reducedDoc.getHtml() ),\n\t\t\tnormalize( expectedReducedDoc ),\n\t\t\t'Expanded the corrupted document by removing all externally inserted attributes.'\n\t\t);\n\t\tdeepEqual(\n\t\t\tObject.keys( extractedData ).length,\n\t\t\t5,\n\t\t\t'Attributes for 2 tags extracted.'\n\t\t);\n\t\tdeepEqual(\n\t\t\t!!extractedData[ '2' ].content,\n\t\t\ttrue,\n\t\t\t'Content extracted for style tag'\n\t\t);\n\t\tdeepEqual(\n\t\t\t!!extractedData[ '3' ].content,\n\t\t\ttrue,\n\t\t\t'Content extracted for script tag'\n\t\t);\n\t\tdeepEqual(\n\t\t\t!!extractedData[ '5' ].content,\n\t\t\ttrue,\n\t\t\t'Content extracted for tag with mw:Entity'\n\t\t);\n\t\tparser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( corruptedMTInput );\n\t\tconst expandedDoc = parser.builder.doc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( sanitizedExpandedDoc ),\n\t\t\t'Expanded the corrupted document by ignoring modified style and script content'\n\t\t);\n\t} );\n\n\tit( 'test HTML compaction roundtrip with template with empty content', () => {\n\t\tconst testXhtmlFile =\n\t\t\tdirname + '/data/text-inline-template-empty-content.html';\n\t\tconst contentForReduce = readFileSync( testXhtmlFile, 'utf8' ).replace(\n\t\t\t/^\\s+|\\s+$/,\n\t\t\t''\n\t\t);\n\t\tconst parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( contentForReduce );\n\t\tconst { reducedDoc, extractedData } = parser.builder.doc.reduce();\n\t\tconst reducedParser = new Parser( new MwContextualizer() );\n\t\treducedParser.init();\n\t\treducedParser.write( reducedDoc.getHtml() );\n\t\tdeepEqual(\n\t\t\tObject.keys( extractedData ).length,\n\t\t\t6,\n\t\t\t'Attributes for 6 tags extracted.'\n\t\t);\n\t\tconst expandedDoc = reducedParser.builder.doc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( contentForReduce ),\n\t\t\t'Restored the original html after reduce and expand.'\n\t\t);\n\t} );\n\n\tit( 'test getRootItem for ignoring blockspaces', () => {\n\t\tconst sourceDoc = `<section data-mw-section-id=\"25\" id=\"mwArE\">\n\t\t<p id=\"mwArI\">Sestak voted for the <a rel=\"mw:WikiLink\" href=\"./Improving_Head_Start_Act\"\n\t\t\t\ttitle=\"Improving Head Start Act\" id=\"mwArM\" class=\"new\">Improving Head Start Act</a> and the <a\n\t\t\t\trel=\"mw:WikiLink\" href=\"./College_Cost_Reduction_and_Access_Act\"\n\t\t\t\ttitle=\"College Cost Reduction and Access Act\" id=\"mwArQ\"\n\t\t\t\tclass=\"new\">College Cost Reduction and Access Act</a>.\n\t\t\t</p>\n\t\t</section>`;\n\n\t\tconst parser = new Parser( new MwContextualizer(), {\n\t\t\tisolateSegments: true\n\t\t} );\n\t\tparser.init();\n\t\tparser.write( sourceDoc );\n\t\tconst rootItem = parser.builder.doc.getRootItem();\n\t\tdeepEqual(\n\t\t\trootItem.name,\n\t\t\t'p',\n\t\t\t'getRootItem should ignore the blockspaces in the beginning of the document'\n\t\t);\n\t} );\n\n\tit( 'test getRootItem for not ignoring non-whitespace content in textblock', () => {\n\t\tconst sourceDoc = `<p id=\"mwFg\">The tensor product of <span about=\"#mwt10\" class=\"texhtml \"\n\t\tdata-mw=\"{}\" id=\"mwFw\" typeof=\"mw:Transclusion\"><i>V</i></span> and.\n\t\t</p>`;\n\n\t\tconst parser = new Parser( new MwContextualizer(), {\n\t\t\tisolateSegments: true\n\t\t} );\n\t\tparser.init();\n\t\tparser.write( sourceDoc );\n\t\tconst parsedDoc = parser.builder.doc;\n\t\tconst textblock = parsedDoc.items.find( ( item ) => item.type === 'textblock' );\n\t\tconst rootItem = textblock.item.getRootItem();\n\t\tdeepEqual(\n\t\t\trootItem,\n\t\t\tnull,\n\t\t\t'getRootItem of textblock should consider non-whitespace content inside its textchunks'\n\t\t);\n\t} );\n\n\tit( 'test getRootItem for ignoring whitespace content in textblock', () => {\n\t\tconst sourceDoc = `<p id=\"mwFg\">\n\t\t <span about=\"#mwt10\" class=\"texhtml \"\n\t\tdata-mw=\"{}\" id=\"mwFw\" typeof=\"mw:Transclusion\"><i>V</i></span> and.\n\t\t</p>`;\n\n\t\tconst parser = new Parser( new MwContextualizer(), {\n\t\t\tisolateSegments: true\n\t\t} );\n\t\tparser.init();\n\t\tparser.write( sourceDoc );\n\t\tconst parsedDoc = parser.builder.doc;\n\t\tconst textblock = parsedDoc.items.find( ( item ) => item.type === 'textblock' );\n\t\tconst rootItem = textblock.item.getRootItem();\n\t\tdeepEqual(\n\t\t\trootItem.name,\n\t\t\t'span',\n\t\t\t'getRootItem of textblock should ignore whitespace content inside its textchunks'\n\t\t);\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/lineardoc/translate.test.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/mt/Apertium.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/Elia.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/Google.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/LingCloud.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/MTClient.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/Template.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/transform.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mw/MWPageLoaderTest.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":37,"column":27,"nodeType":"CallExpression","endLine":37,"endColumn":83},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":46,"column":5,"nodeType":"CallExpression","endLine":46,"endColumn":61}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { before, describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport { each } from 'async';\nimport { deepEqual } from '../utils/assert.js';\nimport { getConfig } from '../../lib/util.js';\nimport { Normalizer } from '../../lib/lineardoc/index.js';\nimport MWPageLoader from '../../lib/mw/MWPageLoader.js';\nimport { initApp } from '../../app.js';\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /[\\t\\r\\n]+/gm, '' ) );\n\treturn normalizer.getHtml();\n}\n\nconst tests = [\n\t{\n\t\tdesc: 'Add data-section-number attribute to every CX section',\n\t\tsource: 'test-data-section-number.html',\n\t\tsourceLanguage: 'en',\n\t\ttargetLanguage: 'es',\n\t\tresult: 'result-data-section-number.html'\n\t}\n];\ndescribe( 'MWPageLoader tests', () => {\n\tlet app;\n\tbefore( async () => {\n\t\tapp = await initApp( getConfig() );\n\t} );\n\n\teach( tests, ( test ) => {\n\t\tit( 'Test: ' + test.desc, () => {\n\t\t\t// Fake the actual MWPageLoader fetch call\n\t\t\tMWPageLoader.prototype.fetch = () => {\n\t\t\t\tconst sourceContent = readFileSync( dirname + '/data/' + test.source, 'utf8' );\n\t\t\t\treturn Promise.resolve( { body: sourceContent } );\n\t\t\t};\n\t\t\tconst pageloader = new MWPageLoader( {\n\t\t\t\tcontext: app,\n\t\t\t\tsourceLanguage: test.sourceLanguage,\n\t\t\t\ttargetLanguage: test.targetLanguage\n\t\t\t} );\n\t\t\tconst expectedResultData = normalize(\n\t\t\t\treadFileSync( dirname + '/data/' + test.result, 'utf8' )\n\t\t\t);\n\t\t\treturn pageloader.getPage( 'mockPage', null, true ).then( ( processedPageContent ) => {\n\t\t\t\tdeepEqual( normalize( processedPageContent.content ), expectedResultData, test.desc );\n\t\t\t} );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mw/SectionWrap.test.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":17,"column":33,"nodeType":"CallExpression","endLine":17,"endColumn":92}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport { forEach } from 'async';\nimport { load } from 'js-yaml';\nimport { deepEqual } from '../utils/assert.js';\nimport { MwContextualizer, Normalizer, Parser } from '../../lib/lineardoc/index.js';\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /[\\t\\r\\n]+/g, '' ) );\n\treturn normalizer.getHtml();\n}\n\nfunction getParsedDoc( content ) {\n\tconst pageloaderConfig = load( readFileSync( dirname + '/../../config/MWPageLoader.yaml' ) );\n\tconst parser = new Parser( new MwContextualizer(\n\t\t{ removableSections: pageloaderConfig.removableSections }\n\t), {\n\t\twrapSections: true\n\t} );\n\tparser.init();\n\tparser.write( content );\n\treturn parser.builder.doc;\n}\n\nconst sourceHTML = `<body>\n\t<section data-mw-section-id=\"0\">\n\t<p id=\"mwAb\">Paragraph <b>bold</b> <a href=\"/wiki/Title\">Title</a>.</p>\n\t</section>\n\t<section data-mw-section-id=\"1\">\n\t<h3>Heading</h3>\n\t<table><tr><td>data</td></tr></table>\n\t<div id=\"mwAc\">Content<div>innerdiv</div></div>\n\t</section>\n\t<section data-mw-section-id=\"2\">\n\t<p>Content<div>Div in paragraph</div></p>\n\t<ol><li>Item</li><li>Item</li></ol></section>\n\t<section data-mw-section-id=\"3\">\n\t<div typeof=\"mw:Transclusion\" about=\"#mwt1\" data-mw=\"{}\">Block template</div>\n\t</section>\n\t<section data-mw-section-id=\"4\">\n\t<span typeof=\"mw:Transclusion\" about=\"#mwt2\" data-mw=\"{}\">Some text content</span>\n\t<table about=\"#mwt2\"><tr><td>used value</td></tr></table>\n\t</section>\n\t<section data-mw-section-id=\"5\">\n\t<p>An inline <span typeof=\"mw:Transclusion\" about=\"#mwt3\" data-mw=\"{}\">template</span></p>\n\t</section>\n\t<section data-mw-section-id=\"6\">\n\t<span typeof=\"mw:Transclusion\" about=\"#mwt4\" data-mw=\"{}\">Template 4: Some text content</span>\n\t<table about=\"#mwt4\"><tr><td>Template 4: value</td></tr></table>\n\t<span typeof=\"mw:Transclusion\" about=\"#mwt5\" data-mw=\"{}\">Template 5: Some text content</span>\n\t<table about=\"#mwt5\"><tr><td>Template 5: value</td></tr></table>\n\t</section>\n\t<figure class=\"mw-default-size mw-halign-right\" id=\"mweA\" typeof=\"mw:File/Thumb\">\n\t<a href=\"./File:PriestleyFuseli.jpg\" id=\"mweQ\">\n\t<img alt=\"Alt text\" data-file-height=\"587\" data-file-type=\"bitmap\" data-file-width=\"457\" height=\"218\" id=\"mweg\" resource=\"./File:PriestleyFuseli.jpg\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/170px-PriestleyFuseli.jpg\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/340px-PriestleyFuseli.jpg 2x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/255px-PriestleyFuseli.jpg 1.5x\" width=\"170\" /></a>\n\t<figcaption id=\"mwew\">\n\t<a href=\"./Joseph_Priestley\" id=\"mwfA\" rel=\"mw:WikiLink\" title=\"Joseph Priestley\">Joseph Priestley</a> is usually given priority in the discovery.\n\t</figcaption>\n\t</figure>\n\t<dl id=\"mwAW8\">\n\t<dd id=\"mwAXA\">3 Fe + 4 H<sub id=\"mwAXE\">2</sub></dd>\n\t</dl>\n\t<link href=\"./Category:Category1\" id=\"mwCKQ\" rel=\"mw:PageProp/Category\" />\n\t<link rel=\"mw:PageProp/Category\" href=\"./Category:All_stub_articles\" about=\"#mwt8\" typeof=\"mw:Transclusion\" data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"nervous-system-drug-stub\",\"href\":\"./Template:Nervous-system-drug-stub\"},\"params\":{},\"i\":0}}]}'\n\tid=\"mwJg\" />\n\t<link rel=\"mw:PageProp/Category\" href=\"./Category:Nervous_system_drug_stubs\" about=\"#mwt8\" />\n\t<table class=\"plainlinks stub\" role=\"presentation\" style=\"background:transparent\" about=\"#mwt8\" id=\"mwJw\">\n\t<tbody></tbody>\n\t</table>\n\t<span id=\"empty_inline_annotation_transclusion\" about=\"#mwt335\" typeof=\"mw:Transclusion\" data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"anchor\",\"href\":\"./Template:Anchor\"},\"params\":{\"1\":{\"wt\":\"partial pressure\"}},\"i\":0}}]}'></span>\n\t<link rel=\"mw:PageProp/Category\" href=\"./Category:Wikipedia_indefinitely_move-protected_pages#Oxygen\" about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"pp-move-indef\",\"href\":\"./Template:Pp-move-indef\"},\"params\":{},\"i\":0}}]}' id=\"mwBg\" />\n\t<section data-mw-section-id=\"61\">\n\t<div role=\"navigation\" class=\"navbox\" about=\"#mwt61\" typeof=\"mw:Transclusion\" data-mw=\"{}\">\n\tSection to be removed from output based on the navbox class\n\t</div>\n\t<link rel=\"mw:PageProp/Category\" href=\"./Category:Food_preparation\" about=\"#mwt61\">\n\t<span about=\"#mwt61\">Fragment 2</span>\n\t</section>\n\t</body>`;\n\nconst expectedSectionWrappedHTML = `<body>\n\t<section rel=\"cx:Section\"><p id=\"mwAb\">Paragraph <b>bold</b> <a href=\"/wiki/Title\">Title</a>.</p></section>\n\t<section rel=\"cx:Section\"><h3>Heading</h3></section>\n\t<section rel=\"cx:Section\"><table><tr><td>data</td></tr></table></section>\n\t<section rel=\"cx:Section\"><div id=\"mwAc\">Content<div>innerdiv</div></div></section>\n\t<section rel=\"cx:Section\"><p>Content<div>Div in paragraph</div></p></section>\n\t<section rel=\"cx:Section\"><ol><li>Item</li><li>Item</li></ol></section>\n\t<section rel=\"cx:Section\">\n\t<div typeof=\"mw:Transclusion\" about=\"#mwt1\" data-mw=\"{}\">Block template</div>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<span typeof=\"mw:Transclusion\" about=\"#mwt2\" data-mw='{}'>Some text content</span>\n\t<table about=\"#mwt2\"><tr><td>used value</td></tr></table>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<p>An inline <span about=\"#mwt3\" data-mw=\"{}\" typeof=\"mw:Transclusion\">template</span></p>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<span about=\"#mwt4\" data-mw=\"{}\" typeof=\"mw:Transclusion\">Template 4: Some text content</span>\n\t<table about=\"#mwt4\"><tr><td>Template 4: value</td></tr></table>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<span about=\"#mwt5\" data-mw=\"{}\" typeof=\"mw:Transclusion\">Template 5: Some text content</span>\n\t<table about=\"#mwt5\"><tr><td>Template 5: value</td></tr></table>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<figure class=\"mw-default-size mw-halign-right\" id=\"mweA\" typeof=\"mw:File/Thumb\" rel=\"cx:Figure\">\n\t<a href=\"./File:PriestleyFuseli.jpg\" id=\"mweQ\"><img alt=\"Alt text\" data-file-height=\"587\" data-file-type=\"bitmap\" data-file-width=\"457\" height=\"218\" id=\"mweg\" resource=\"./File:PriestleyFuseli.jpg\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/170px-PriestleyFuseli.jpg\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/340px-PriestleyFuseli.jpg 2x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/255px-PriestleyFuseli.jpg 1.5x\" width=\"170\" /></a>\n\t<figcaption id=\"mwew\">\n\t<a href=\"./Joseph_Priestley\" id=\"mwfA\" rel=\"mw:WikiLink\" title=\"Joseph Priestley\">Joseph Priestley</a> is usually given priority in the discovery.\n\t</figcaption>\n\t</figure>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<dl id=\"mwAW8\">\n\t<dd id=\"mwAXA\">3 Fe + 4 H<sub id=\"mwAXE\">2</sub></dd>\n\t</dl>\n\t</section>\n\t</body>`;\n\nconst sectionWithCategories = `\n\t<body class=\"mw-content-ltr sitedir-ltr ltr mw-body-content parsoid-body mediawiki mw-parser-output\" dir=\"ltr\" id=\"mwAA\" lang=\"en\">\n\t<section data-mw-section-id=\"0\">\n\t<p id=\"mwAdo\">\n\n\t<span about=\"#mwt87\" class=\"noviewer\" data-mw=\"{&#34;parts&#34;:[{&#34;template&#34;:{&#34;target&#34;:{&#34;wt&#34;:&#34;Commonscat-inline&#34;,&#34;href&#34;:&#34;./Template:Commonscat-inline&#34;},&#34;params&#34;:{&#34;1&#34;:{&#34;wt&#34;:&#34;Attack aircraft&#34;}},&#34;i&#34;:0}}]}\" id=\"mwAds\" typeof=\"mw:Transclusion mw:Image\">\n\t<a href=\"./File:Commons-logo.svg\">\n\t<link href=\"./Category:Articles with inline\" about=\"#mwt87\" id=\"mwAd8\" rel=\"mw:PageProp/Category\" />\n\t<img alt=\"\" data-file-height=\"1376\" data-file-type=\"drawing\" data-file-width=\"1024\" height=\"16\" resource=\"./File:Commons-logo.svg\" src=\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/12px-Commons-logo.svg.png\" srcset=\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/24px-Commons-logo.svg.png 2x, //upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/18px-Commons-logo.svg.png 1.5x\" width=\"12\" />\n\t</a>\n\t</span>\n\t<span about=\"#mwt87\"> Media related to </span>\n\t<a about=\"#mwt87\" class=\"cx-link\" data-linkid=\"440\" href=\"https://commons.wikimedia.org/wiki/Category:Attack%20aircraft\" rel=\"mw:WikiLink/Interwiki\" title=\"commons:Category:Attack aircraft\">Attack aircraft</a>\n\t<span about=\"#mwt87\"> at Wikimedia Commons</span>\n\t</span>\n\t</p>\n\n\t<p>Another para</p>\n\t<link href=\"./Category:Fighter_aircraft\" id=\"mwAd4\" rel=\"mw:PageProp/Category\" />\n\t<link href=\"./Category:Attack_aircraft#%20\" id=\"mwAd8\" rel=\"mw:PageProp/Category\" />\n\n\t</section>\n\t</body>`;\n\nconst sectionWithCategoriesExpectedHtml = `\n\t<body class=\"mw-content-ltr sitedir-ltr ltr mw-body-content parsoid-body mediawiki mw-parser-output\" dir=\"ltr\" id=\"mwAA\" lang=\"en\">\n\t<section rel=\"cx:Section\">\n\n\t<p id=\"mwAdo\">\n\t<span about=\"#mwt87\" class=\"noviewer\" data-mw=\"{&#34;parts&#34;:[{&#34;template&#34;:{&#34;target&#34;:{&#34;wt&#34;:&#34;Commonscat-inline&#34;,&#34;href&#34;:&#34;./Template:Commonscat-inline&#34;},&#34;params&#34;:{&#34;1&#34;:{&#34;wt&#34;:&#34;Attack aircraft&#34;}},&#34;i&#34;:0}}]}\" id=\"mwAds\" typeof=\"mw:Transclusion mw:Image\">\n\t<a href=\"./File:Commons-logo.svg\">\n\t<link about=\"#mwt87\" href=\"./Category:Articles with inline\" id=\"mwAd8\" rel=\"mw:PageProp/Category\" />\n\t<img alt=\"\" data-file-height=\"1376\" data-file-type=\"drawing\" data-file-width=\"1024\" height=\"16\" resource=\"./File:Commons-logo.svg\" src=\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/12px-Commons-logo.svg.png\" srcset=\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/24px-Commons-logo.svg.png 2x, //upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/18px-Commons-logo.svg.png 1.5x\" width=\"12\" />\n\t</a>\n\t</span><span about=\"#mwt87\"> Media related to </span>\n\t<a about=\"#mwt87\" class=\"cx-link\" data-linkid=\"440\" href=\"https://commons.wikimedia.org/wiki/Category:Attack%20aircraft\" rel=\"mw:WikiLink/Interwiki\" title=\"commons:Category:Attack aircraft\">Attack aircraft</a>\n\t<span about=\"#mwt87\"> at Wikimedia Commons</span></span>\n\t</p>\n\t</section>\n\n\t<section rel=\"cx:Section\">\n\t<p>Another para</p>\n\t</section>\n\t</body>`;\n\nconst nestedSectionsWithTransclusion = `\n\t<body>\n\t<section data-mw-section-id=\"2\" id=\"mwVw\">\n\t<p id=\"mw5Q\">\n\t<span about=\"#mwt216\" typeof=\"mw:Transclusion\" data-mw=\"{}\" id=\"mw7Q\">10,000</span>\n\t<span typeof=\"mw:Entity\" about=\"#mwt216\">&nbsp;</span>\n\t<span about=\"#mwt216\">m (33,000</span>\n\t<span about=\"#mwt216\">mi)</span> in the\n\t</p>\n\t<section data-mw-section-id=\"3\" id=\"mwXw\">\n\t<h3>Heading</h3>\n\t<p id=\"mw6Q\">Para1</p>\n\t<p>Para2</p>\n\t</section>\n\t</section>\n\t</body>`;\n\nconst nestedSectionsWithTransclusionExpected = `\n\t<body>\n\t<section rel=\"cx:Section\">\n\t<p id=\"mw5Q\">\n\t<span about=\"#mwt216\" data-mw=\"{}\" id=\"mw7Q\" typeof=\"mw:Transclusion\">10,000</span>\n\t<span about=\"#mwt216\" typeof=\"mw:Entity\">&nbsp;</span>\n\t<span about=\"#mwt216\">m (33,000</span>\n\t<span about=\"#mwt216\">mi)</span> in the</p>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<h3>Heading</h3>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<p id=\"mw6Q\">Para1</p>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<p>Para2</p>\n\t</section>\n\t</body>`;\n\nconst sectionWithBlankTemplate = `\n<body>\n<section data-mw-section-id=\"0\" id=\"mwAQ\">\n<div class=\"shortdescription nomobile noexcerpt noprint searchaux\" style=\"display:none\" about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw=\"{}\" id=\"mwAw\">City in  Virovitica-Podravina, Croatia</div>\n<link rel=\"mw:PageProp/Category\" href=\"./Category:Articles_with_short_description\" about=\"#mwt3\">\n<table class=\"infobox\" id=\"mwBV\"></table>\n</section>\n</body>`;\n\nconst sectionWithBlankTemplateExpected = `\n<body>\n<section rel=\"cx:Section\">\n<div about=\"#mwt3\" class=\"shortdescription nomobile noexcerpt noprint searchaux\" data-mw=\"{}\" id=\"mwAw\" style=\"display:none\" typeof=\"mw:Transclusion\">City in  Virovitica-Podravina, Croatia</div>\n<link about=\"#mwt3\" href=\"./Category:Articles_with_short_description\" rel=\"mw:PageProp/Category\"></link>\n</section>\n<section rel=\"cx:Section\">\n<table class=\"infobox\" id=\"mwBV\"></table></section>\n</body>`;\n\nconst wholeBodySource = `\n<html>\n<head></head>\n<body id=\"mwAA\" lang=\"en\" >\n<section data-mw-section-id=\"1\" id=\"mwAQ\">\n<div typeof=\"mw:Transclusion\" about=\"#mwt2\" data-mw=\"{}\" id=\"mwAw\">Some text content</div>\n<table about=\"#mwt2\"><tr><td>used value</td></tr></table>\n</section>\n<section data-mw-section-id=\"2\" id=\"mwAQ\">\n<span typeof=\"mw:Transclusion\" about=\"#mwt3\" data-mw=\"{}\" id=\"mwAw\">Some text content</span>\n<table about=\"#mwt3\"><tr><td>used value</td></tr></table>\n</section>\n</body>\n</html>`;\n\nconst wholeBodyResult = `\n<html>\n<head></head>\n<body id=\"mwAA\" lang=\"en\">\n<section rel=\"cx:Section\">\n<div about=\"#mwt2\" data-mw=\"{}\" id=\"mwAw\" typeof=\"mw:Transclusion\">Some text content</div>\n<table about=\"#mwt2\"><tr><td>used value</td></tr></table>\n</section>\n<section rel=\"cx:Section\">\n<span about=\"#mwt3\" data-mw=\"{}\" id=\"mwAw\" typeof=\"mw:Transclusion\">Some text content</span>\n<table about=\"#mwt3\"><tr><td>used value</td></tr></table>\n</section>\n</body>\n</html>`;\n\nconst sectionWithMeta = `\n<body id=\"mwAA\" lang=\"he\">\n<section data-mw-section-id=\"0\" id=\"mwAQ\">\n<meta property=\"mw:PageProp/displaytitle\" content=\"פלמינג: האיש שרצה להיות בונד\" id=\"mwAg\" />\n<table class=\"infobox\" style=\"width: 270px; font-size: 95%;\" about=\"#mwt2\" typeof=\"mw:Transclusion\" data-mw='{}' id=\"mwAw\">\n\t<caption style=\"background: #C6C9FF;  border:1px solid #aaaaaa; border-bottom:0px;\">פלמינג: האיש שרצה להיות\n\t\tבונד<br />Fleming: The Man Who Would Be Bond</caption>\n\t<tbody>\n\t\t<tr>\n\t\t\t<td colspan=\"2\" style=\"text-align:center\"></td>\n\t\t</tr>\n\t</tbody>\n</table>\n<link rel=\"mw:PageProp/Category\" href=\"./קטגוריה:ויקינתונים_-_השוואת_ערכים:_חסר\" about=\"#mwt2\" />\n<p id=\"mwBQ\"><b id=\"mwBg\">פלמינג: האיש שרצה להיות בונד</b></p>\n</section>\n</body>\n`;\n\nconst sectionWithMetaResult = `\n<body id=\"mwAA\" lang=\"he\">\n<section rel=\"cx:Section\">\n<meta content=\"פלמינג: האיש שרצה להיות בונד\" id=\"mwAg\" property=\"mw:PageProp/displaytitle\" />\n</section>\n<section rel=\"cx:Section\">\n<table about=\"#mwt2\" class=\"infobox\" data-mw=\"{}\" id=\"mwAw\" style=\"width: 270px; font-size: 95%;\" typeof=\"mw:Transclusion\">\n<caption style=\"background: #C6C9FF;  border:1px solid #aaaaaa; border-bottom:0px;\">פלמינג: האיש שרצה להיותבונד\n<br />Fleming: The Man Who Would Be Bond</caption>\n<tbody>\n<tr><td colspan=\"2\" style=\"text-align:center\"></td></tr></tbody>\n</table><link about=\"#mwt2\" href=\"./קטגוריה:ויקינתונים_-_השוואת_ערכים:_חסר\" rel=\"mw:PageProp/Category\" />\n</section>\n<section rel=\"cx:Section\">\n<p id=\"mwBQ\"><b id=\"mwBg\">פלמינג: האיש שרצה להיות בונד</b>\n</p>\n</section>\n</body>\"\n`;\n\nconst sectionWithFigureInlineTemplate = `\n<html>\n\t<body>\n\t<h2 id=\"Enlaces_externos\">Enlaces externos</h2>\n\t<ul id=\"mwASA\">\n\t\t<li id=\"mwASE\"><a rel=\"mw:ExtLink\"\n\t\t\t\thref=\"http://www.portaloaca.com/historia/otroshistoria/94-la-leyenda-de-la-mano-negra.html\"\n\t\t\t\tclass=\"external text\" id=\"mwASI\">La leyenda de La Mano Negra</a></li>\n\t</ul>\n\t<span about=\"#mwt92\" typeof=\"mw:Transclusion\"\n\t\tdata-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;commonscat&quot;,&quot;href&quot;:&quot;./Plantilla:Commonscat&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;La Mano Negra&quot;}},&quot;i&quot;:0}},&quot;\\\\n\\\\n[[Categoría:Historia de la provincia de Cádiz]]\\\\n[[Categoría:Derecho de Andalucía]]\\\\n[[Categoría:Casos judiciales de España]]\\\\n[[Categoría:Sociedades secretas]]\\\\n[[Categoría:Reinado de Alfonso XII]]\\\\n[[Categoría:Casos judiciales anarquistas]]\\\\n[[Categoría:Teorías conspirativas]]\\\\n[[Categoría:Historia del anarquismo]]\\\\n[[Categoría:Anarquismo en España]]\\\\n[[Categoría:España en 1882]]\\\\n[[Categoría:España en 1883]]\\\\n[[Categoría:España en 1884]]\\\\n[[Categoría:Política en 1882]]\\\\n[[Categoría:Política en 1883]]\\\\n[[Categoría:Política en 1884]]\\\\n[[Categoría:Atentados anarquistas]]&quot;]}\"\n\t\tid=\"mwASk\">\n\t</span>\n\t<ul about=\"#mwt92\">\n\t\t<li>\n\t\t\t<span typeof=\"mw:Image\">\n\t\t\t<span>\n\t\t\t\t<img alt=\"\" resource=\"./Archivo:Commons-logo.svg\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/15px-Commons-logo.svg.png\" data-file-width=\"1024\" data-file-height=\"1376\" data-file-type=\"drawing\" height=\"20\" width=\"15\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png 2x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/23px-Commons-logo.svg.png 1.5x\">\n\t\t\t</span>\n\t\t\t</span>\n\t\t\t<a rel=\"mw:WikiLink\" href=\"./Wikimedia_Commons\" title=\"Wikimedia Commons\">Wikimedia Commons</a> alberga una categoría multimedia sobre<b><a rel=\"mw:WikiLink/Interwiki\" href=\"https://commons.wikimedia.org/wiki/Category:La%20Mano%20Negra\" title=\"commons:Category:La Mano Negra\">La Mano Negra</a></b>.\n\t\t\t<link rel=\"mw:PageProp/Category\" href=\"./Categoría:Historia_de_la_provincia_de_Cádiz\">\n\t\t\t<link rel=\"mw:PageProp/Category\" href=\"./Categoría:Derecho_de_Andalucía\">\n\t\t</li>\n\t</ul>\n</body>\n</html>\n`;\n\nconst sectionWithFigureInlineTemplateResult = `\n<html>\n<body>\n\t<section rel=\"cx:Section\">\n\t<h2 id=\"Enlaces_externos\">Enlaces externos</h2>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t\t<ul id=\"mwASA\">\n\t\t\t<li id=\"mwASE\">\n\t\t\t\t<a class=\"external text\" href=\"http://www.portaloaca.com/historia/otroshistoria/94-la-leyenda-de-la-mano-negra.html\" id=\"mwASI\" rel=\"mw:ExtLink\">La leyenda de La Mano Negra</a>\n\t\t\t</li>\n\t\t</ul>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t\t<span about=\"#mwt92\" data-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;commonscat&quot;,&quot;href&quot;:&quot;./Plantilla:Commonscat&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;La Mano Negra&quot;}},&quot;i&quot;:0}},&quot;\\\\n\\\\n[[Categoría:Historia de la provincia de Cádiz]]\\\\n[[Categoría:Derecho de Andalucía]]\\\\n[[Categoría:Casos judiciales de España]]\\\\n[[Categoría:Sociedades secretas]]\\\\n[[Categoría:Reinado de Alfonso XII]]\\\\n[[Categoría:Casos judiciales anarquistas]]\\\\n[[Categoría:Teorías conspirativas]]\\\\n[[Categoría:Historia del anarquismo]]\\\\n[[Categoría:Anarquismo en España]]\\\\n[[Categoría:España en 1882]]\\\\n[[Categoría:España en 1883]]\\\\n[[Categoría:España en 1884]]\\\\n[[Categoría:Política en 1882]]\\\\n[[Categoría:Política en 1883]]\\\\n[[Categoría:Política en 1884]]\\\\n[[Categoría:Atentados anarquistas]]&quot;]}\" id=\"mwASk\" typeof=\"mw:Transclusion\"></span>\n\t\t<ul about=\"#mwt92\">\n\t\t\t<li>\n\t\t\t\t<span typeof=\"mw:Image\">\n\t\t\t\t<span>\n\t\t\t\t\t<img alt=\"\" data-file-height=\"1376\" data-file-type=\"drawing\" data-file-width=\"1024\" height=\"20\" resource=\"./Archivo:Commons-logo.svg\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/15px-Commons-logo.svg.png\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png 2x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/23px-Commons-logo.svg.png 1.5x\" width=\"15\"></img>\n\t\t\t\t</span>\n\t\t\t\t</span>\n\t\t\t\t<a href=\"./Wikimedia_Commons\" rel=\"mw:WikiLink\" title=\"Wikimedia Commons\">Wikimedia Commons</a> alberga una categoría multimedia sobre<b><a href=\"https://commons.wikimedia.org/wiki/Category:La%20Mano%20Negra\" rel=\"mw:WikiLink/Interwiki\" title=\"commons:Category:La Mano Negra\">La Mano Negra</a></b>.\n\t\t\t</li>\n\t\t</ul>\n\t</section>\n</body>\n</html>\n`;\n\nconst sectionWithIgnorableTransclusionFragment = `\n<body>\n\t<section data-mw-section-id=\"0\" id=\"mwAQ\">\n\t\t<span about=\"#mwt4\" typeof=\"mw:Transclusion\"\n\t\t\tdata-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Generations Sidebar&quot;,&quot;href&quot;:&quot;./Template:Generations_Sidebar&quot;},&quot;params&quot;:{},&quot;i&quot;:0}}]}\"\n\t\t\tid=\"mwCA\">\n\t\t</span>\n\t\t<table class=\"vertical-navbox nowraplinks plainlist\"\n\t\t\tabout=\"#mwt4\" id=\"mwCQ\">\n\t\t\t<tbody>\n\t\t\t</tbody>\n\t\t</table>\n\t</section>\n\t<section data-mw-section-id=\"1\" id=\"mwFg\">\n\t\t<h2 id=\"Terminology\">Terminology</h2>\n\t</section>\n</body>\n`;\nconst sectionWithIgnorableTransclusionFragmentResult = `\n<body>\n\t<section rel=\"cx:Section\">\n\t\t<span about=\"#mwt4\" typeof=\"mw:Transclusion\"\n\t\t\tdata-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Generations Sidebar&quot;,&quot;href&quot;:&quot;./Template:Generations_Sidebar&quot;},&quot;params&quot;:{},&quot;i&quot;:0}}]}\"\n\t\t\tid=\"mwCA\">\n\t\t</span>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t\t<h2 id=\"Terminology\">Terminology</h2>\n\t</section>\n</body>\n`;\n\nconst sectionWithTemplateAndTemplateStyles = `\n<body>\n\t<section data-mw-section-id=\"0\" id=\"mwAQ\">\n\t<ul>\n\t<li>\n\t\t<link rel=\"mw-deduplicated-inline-style\" href=\"mw-data:TemplateStyles:r886058088\" about=\"#mwt79\"\n\t\ttypeof=\"mw:Extension/templatestyles mw:Transclusion\"\n\t\tdata-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;ISBN&quot;,&quot;href&quot;:&quot;./Template:ISBN&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;0-7100-9224-5&quot;}},&quot;i&quot;:0}}]}\"\n\t\tid=\"mwAQE\">\n\n\t\t<a rel=\"mw:WikiLink\" href=\"./International_Standard_Book_Number\"\n\t\ttitle=\"International Standard Book Number\" about=\"#mwt79\">ISBN</a>\n\n\t\t<span typeof=\"mw:Entity\"\n\t\tabout=\"#mwt79\">&nbsp;</span>\n\n\t\t<a rel=\"mw:WikiLink\" href=\"./Special:BookSources/0-7100-9224-5\"\n\t\ttitle=\"Special:BookSources/0-7100-9224-5\" about=\"#mwt79\" id=\"mwAQI\">0-7100-9224-5</a>\n\n\t</li>\n\t</ul>\n\t</section>\n</body>\n`;\n\nconst sectionWithTemplateAndTemplateStylesResult = `\n<body>\n\t<section rel=\"cx:Section\">\n\t<ul>\n\t<li>\n\t\t<link rel=\"mw-deduplicated-inline-style\" href=\"mw-data:TemplateStyles:r886058088\" about=\"#mwt79\"\n\t\ttypeof=\"mw:Extension/templatestyles mw:Transclusion\"\n\t\tdata-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;ISBN&quot;,&quot;href&quot;:&quot;./Template:ISBN&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;0-7100-9224-5&quot;}},&quot;i&quot;:0}}]}\"\n\t\tid=\"mwAQE\">\n\t\t</link>\n\t\t<a rel=\"mw:WikiLink\" href=\"./International_Standard_Book_Number\"\n\t\ttitle=\"International Standard Book Number\" about=\"#mwt79\">ISBN</a>\n\n\t\t<span typeof=\"mw:Entity\"\n\t\tabout=\"#mwt79\">&nbsp;</span>\n\n\t\t<a rel=\"mw:WikiLink\" href=\"./Special:BookSources/0-7100-9224-5\"\n\t\ttitle=\"Special:BookSources/0-7100-9224-5\" about=\"#mwt79\" id=\"mwAQI\">0-7100-9224-5</a>\n\n\t</li>\n\t</ul>\n\t</section>\n</body>\n`;\n\nconst tests = [\n\t{\n\t\tdesc: 'section has common pattern of elements',\n\t\tsource: sourceHTML,\n\t\tresult: expectedSectionWrappedHTML,\n\t\tcategories: 1\n\t},\n\t{\n\t\tdesc: 'section has categories to be extracted',\n\t\tsource: sectionWithCategories,\n\t\tresult: sectionWithCategoriesExpectedHtml,\n\t\tcategories: 2\n\t},\n\t{\n\t\tdesc: 'content has nested sections and tricky transclusion context',\n\t\tsource: nestedSectionsWithTransclusion,\n\t\tresult: nestedSectionsWithTransclusionExpected,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'content has blank template and then an unrelated table',\n\t\tsource: sectionWithBlankTemplate,\n\t\tresult: sectionWithBlankTemplateExpected,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'content is complete page content with html, head tags and body having two templates with fragments',\n\t\tsource: wholeBodySource,\n\t\tresult: wholeBodyResult,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'Content has self closing meta tag',\n\t\tsource: sectionWithMeta,\n\t\tresult: sectionWithMetaResult,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'Content has template fragments and one fragment is a section candidate. Section has categories too',\n\t\tsource: sectionWithFigureInlineTemplate,\n\t\tresult: sectionWithFigureInlineTemplateResult,\n\t\tcategories: 2\n\t},\n\t{\n\t\tdesc: 'Content has transclusion and one of its fragment get removed since it is ignorable.',\n\t\tsource: sectionWithIgnorableTransclusionFragment,\n\t\tresult: sectionWithIgnorableTransclusionFragmentResult,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'Content has transclusion and same element is removable templatestyle. So do not remove',\n\t\tsource: sectionWithTemplateAndTemplateStyles,\n\t\tresult: sectionWithTemplateAndTemplateStylesResult,\n\t\tcategories: 0\n\t}\n];\n\ndescribe( 'Section wrap tests', () => {\n\tforEach( tests, ( test ) => {\n\t\tconst parsedDoc = getParsedDoc( test.source );\n\t\tconst wrappedSectionDoc = parsedDoc.wrapSections();\n\t\tconst result = normalize( wrappedSectionDoc.getHtml() );\n\t\tconst expectedResultData = normalize( test.result );\n\t\tit( 'should parse correctly when ' + test.desc, () => {\n\t\t\tdeepEqual( result, expectedResultData );\n\t\t} );\n\t\tit( 'should extract correct number of categories when ' + test.desc, () => {\n\t\t\tdeepEqual( parsedDoc.categories.length, test.categories );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mw/TitlePairRequest.test.js","messages":[],"suppressedMessages":[{"ruleId":"no-loop-func","severity":2,"message":"Function declared in a loop contains unsafe references to variable(s) 'api'.","line":30,"column":68,"nodeType":"ArrowFunctionExpression","messageId":"unsafeRefs","endLine":37,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mw/TitlePairTests.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/mw/TitlePairTests.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/section-extractor.test.js","messages":[],"suppressedMessages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":15,"column":44,"nodeType":"CallExpression","endLine":15,"endColumn":121,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/segmentation/CXSegmenter.test.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":28,"column":19,"nodeType":"CallExpression","endLine":28,"endColumn":75},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":34,"column":3,"nodeType":"CallExpression","endLine":34,"endColumn":59}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport { deepEqual } from '../utils/assert.js';\nimport {\n\tMwContextualizer,\n\tNormalizer,\n\tParser\n} from '../../lib/lineardoc/index.js';\nimport Segmenter from '../../lib/segmentation/CXSegmenter.js';\nimport allTests from './SegmentationTests.json' with { type: 'json' };\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /[\\t\\r\\n]+/gm, '' ) );\n\treturn normalizer.getHtml();\n}\n\nfunction getParsedDoc( content ) {\n\tconst parser = new Parser( new MwContextualizer() );\n\tparser.init();\n\tparser.write( content );\n\treturn parser.builder.doc;\n}\n\nfunction runTest( test, lang ) {\n\tconst testData = readFileSync( dirname + '/data/' + test.source, 'utf8' );\n\tconst parsedDoc = getParsedDoc( testData );\n\tconst segmenter = new Segmenter();\n\tconst segmentedLinearDoc = segmenter.segment( parsedDoc, lang );\n\tconst result = normalize( segmentedLinearDoc.getHtml() );\n\tconst expectedResultData = normalize(\n\t\treadFileSync( dirname + '/data/' + test.result, 'utf8' )\n\t);\n\tit( 'should not have any errors when: ' + test.desc, () => {\n\t\tdeepEqual( result, expectedResultData, test.source + ': ' + test.desc || '' );\n\t} );\n}\n\nfor ( const lang in allTests ) {\n\tdescribe( 'Segmentation tests for ' + lang, () => {\n\t\tconst tests = allTests[ lang ];\n\t\tconst len = tests.length;\n\t\tfor ( let i = 0; i < len; i++ ) {\n\t\t\tif ( tests[ i ].skip ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trunTest( tests[ i ], lang );\n\t\t}\n\t} );\n}\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/segmentation/SegmentationTests.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/suggestions/SectionSuggestion.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/testutils.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found writeFileSync from package \"fs\" with non literal argument at index 0","line":22,"column":5,"nodeType":"CallExpression","endLine":22,"endColumn":65}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { existsSync, writeFileSync } from 'fs';\n\nclass TestUtils {\n\tconstructor( api ) {\n\t\tthis.api = api;\n\t}\n\n\tsetup( mocks ) {\n\t\tthis.api.clearCaches();\n\t\tthis.api.setRequestCache( new Map() );\n\t\tif ( existsSync( 'DUMPREQUESTS' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.api.loadCachedRequests( mocks );\n\t\tthis.api.enableOfflineMode();\n\t}\n\n\tdump( filename ) {\n\t\tif ( existsSync( 'DUMPREQUESTS' ) ) {\n\t\t\tthis.api.dumpCachedRequests().then( ( result ) => {\n\t\t\t\twriteFileSync( filename, JSON.stringify( result, null, 4 ) );\n\t\t\t\tthis.api.clearCaches();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.api.clearCaches();\n\t\t}\n\t}\n}\n\nexport default TestUtils;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWLink.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/translationunits/MWLink.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWLink.test.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/translationunits/MWReference.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/translationunits/MWReference.test.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":38,"column":21,"nodeType":"CallExpression","endLine":38,"endColumn":77},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":55,"column":27,"nodeType":"CallExpression","endLine":58,"endColumn":6}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { after, before, describe, it } from 'node:test';\nimport assert from 'node:assert/strict';\nimport { readFileSync } from 'fs';\nimport { each } from 'async';\nimport { JSDOM } from 'jsdom';\nimport Adapter from '../../lib/Adapter.js';\nimport MWApiRequestManager from '../../lib/mw/MWApiRequestManager.js';\nimport TestClient from '../../lib/mt/TestClient.js';\nimport TestUtils from '../testutils.js';\nimport { deepEqual } from '../utils/assert.js';\nimport { getConfig } from '../../lib/util.js';\nimport { initApp } from '../../app.js';\n\nimport mocks from './MWReference.mocks.json' with { type: 'json' };\nimport tests from './MWReference.test.json' with { type: 'json' };\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\ndescribe( 'Reference adaptation', () => {\n\tlet app, api, mocker;\n\n\tbefore( async () => {\n\t\tapp = await initApp( getConfig() );\n\t\tapi = new MWApiRequestManager( app );\n\t\tmocker = new TestUtils( api );\n\t\tmocker.setup( mocks );\n\t} );\n\n\tafter( () => {\n\t\tmocker.dump( dirname + '/MWReference.mocks.json' );\n\t} );\n\n\teach( tests, ( test, done ) => {\n\t\tit( test.desc, () => {\n\t\t\tapp.mtClient = new TestClient( app );\n\t\t\tapp.reduce = true;\n\t\t\tconst adapter = new Adapter( test.from, test.to, api, app );\n\t\t\tif ( typeof test.source === 'string' ) {\n\t\t\t\tconst content = readFileSync( dirname + '/data/' + test.source, 'utf8' );\n\t\t\t\tconst sourceDom = new JSDOM( content );\n\t\t\t\tconst sourceDomAttributes = sourceDom.window.document.querySelector(\n\t\t\t\t\t'[typeof=\"mw:Extension/ref\"]'\n\t\t\t\t).attributes;\n\t\t\t\ttest.source = {\n\t\t\t\t\tname: 'span',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tid: sourceDomAttributes.getNamedItem( 'id' ).value,\n\t\t\t\t\t\t'data-mw': sourceDomAttributes.getNamedItem( 'data-mw' ).value,\n\t\t\t\t\t\trel: 'dc:references',\n\t\t\t\t\t\ttypeof: 'mw:Extension/ref',\n\t\t\t\t\t\tclass: 'mw-ref'\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ( typeof test.result === 'string' ) {\n\t\t\t\tconst resultContent = readFileSync(\n\t\t\t\t\tdirname + '/data/' + test.result,\n\t\t\t\t\t'utf8'\n\t\t\t\t);\n\t\t\t\tconst resultDom = new JSDOM( resultContent );\n\t\t\t\tconst resultsDomAttributes = resultDom.window.document.querySelector(\n\t\t\t\t\t'[typeof=\"mw:Extension/ref\"]'\n\t\t\t\t).attributes;\n\t\t\t\ttest.result = {\n\t\t\t\t\tname: 'span',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t'data-cx': JSON.parse(\n\t\t\t\t\t\t\tresultsDomAttributes.getNamedItem( 'data-cx' ).value\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\tassert.ok( adapter, 'There is an adapter for references' );\n\t\t\tconst translationunit = adapter.getAdapter( test.source );\n\t\t\tassert.ok( translationunit, 'There is an translationunit for content' );\n\n\t\t\treturn translationunit.adapt( test.source ).then( ( adaptedNode ) => {\n\t\t\t\tconst actualDataCX = JSON.parse( adaptedNode.attributes[ 'data-cx' ] );\n\t\t\t\tconst expectedDataCX = test.result.attributes[ 'data-cx' ];\n\t\t\t\tdeepEqual( actualDataCX, expectedDataCX, 'data-cx matches' );\n\n\t\t\t\tif ( test.result.attributes[ 'data-mw' ] ) {\n\t\t\t\t\tconst expectedDataMW = test.result.attributes[ 'data-mw' ];\n\t\t\t\t\tconst actualDataMW = JSON.parse( adaptedNode.attributes[ 'data-mw' ] );\n\t\t\t\t\tdeepEqual( actualDataMW, expectedDataMW, 'data-mw matches' );\n\t\t\t\t}\n\n\t\t\t\tdone( null );\n\t\t\t} );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWReference.test.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/translationunits/MWTemplate.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/translationunits/MWTemplate.test.js","messages":[],"suppressedMessages":[{"ruleId":"no-loop-func","severity":2,"message":"Function declared in a loop contains unsafe references to variable(s) 'app', 'app', 'api', 'app'.","line":30,"column":32,"nodeType":"ArrowFunctionExpression","messageId":"unsafeRefs","endLine":52,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWTemplate.test.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","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":[]}]},{"filePath":"/src/repo/test/utils/assert.js","messages":[{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":8,"column":40,"nodeType":"NewExpression","endLine":8,"endColumn":62}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import assert from 'node:assert/strict';\nconst { JSDOM } = await import( 'jsdom' );\n\nfunction deepEqual( result, expected, message ) {\n\n\ttry {\n\t\tif ( typeof expected === 'string' ) {\n\t\t\tassert.ok( result === expected || ( new RegExp( expected ).test( result ) ) );\n\t\t} else {\n\t\t\tassert.deepEqual( result, expected, message );\n\t\t}\n\t} catch ( e ) {\n\t\tconsole.log( 'Expected:\\n' + JSON.stringify( expected, null, 2 ) );\n\t\tconsole.log( 'Result:\\n' + JSON.stringify( result, null, 2 ) );\n\t\tthrow e;\n\t}\n\n}\n\n/**\n * Asserts whether the return status was as expected\n *\n * @param {Object} res\n * @param {string} expected\n */\nfunction status( res, expected ) {\n\n\tassert.deepEqual( res.status, expected,\n\t\t'Expected status to be ' + expected + ', but was ' + res.status );\n\n}\n\n/**\n * Asserts whether content type was as expected\n *\n * @param {Object} res\n * @param {string} expected\n */\nfunction contentType( res, expected ) {\n\n\tconst actual = res.headers[ 'content-type' ];\n\tassert.deepEqual( actual, expected,\n\t\t'Expected content-type to be ' + expected + ', but was ' + actual );\n\n}\n\nfunction notDeepEqual( result, expected, message ) {\n\n\ttry {\n\t\tassert.notDeepEqual( result, expected, message );\n\t} catch ( e ) {\n\t\tconsole.log( 'Not expected:\\n' + JSON.stringify( expected, null, 2 ) );\n\t\tconsole.log( 'Result:\\n' + JSON.stringify( result, null, 2 ) );\n\t\tthrow e;\n\t}\n\n}\n\nfunction fails( promise, onRejected ) {\n\n\tlet failed = false;\n\n\tfunction trackFailure( e ) {\n\t\tfailed = true;\n\t\treturn onRejected( e );\n\t}\n\n\tfunction check() {\n\t\tif ( !failed ) {\n\t\t\tthrow new Error( 'expected error was not thrown' );\n\t\t}\n\t}\n\n\treturn promise.catch( trackFailure ).then( check );\n\n}\n\nfunction compareHTML( actual, expected, message ) {\n\tconst domActual = new JSDOM( actual ).window.document.body;\n\tconst domExpected = new JSDOM( expected ).window.document.body;\n\tconst result = domActual.isEqualNode( domExpected );\n\tif ( result === false ) {\n\t\t// The DOM nodes are not equal, so do a deepEqual to output the actual/expected content\n\t\tassert.deepEqual( actual, expected, message || 'HTML content does not match' );\n\t} else {\n\t\tassert.deepEqual( result, true, message || 'HTML content does not match' );\n\t}\n}\n\nexport {\n\tdeepEqual,\n\tnotDeepEqual,\n\tfails,\n\tstatus,\n\tcontentType,\n\tcompareHTML\n};\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","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":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]

--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN   peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN   node_modules/@babel/eslint-parser
npm WARN     dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN   29 more (@eslint-community/eslint-utils, ...)
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN   eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN   node_modules/eslint-config-wikimedia
npm WARN 
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN   peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN   node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN     eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN     node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'cxserver@1.2.1',
npm WARN EBADENGINE   required: { node: '>=24' },
npm WARN EBADENGINE   current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm WARN deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm WARN deprecated prebuild-install@7.1.3: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
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 eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.
--- stdout ---

added 908 packages, and audited 909 packages in 15s

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

4 moderate severity vulnerabilities

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

Run `npm audit` for details.

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

> cxserver@1.2.1 test
> npm run lint && npm run unittest


> cxserver@1.2.1 lint
> eslint .


/src/repo/app.js
   51:1   warning  The type 'Express' is undefined                                            jsdoc/no-undefined-types
   83:34  warning  Found non-literal argument to RegExp Constructor                           security/detect-non-literal-regexp
   89:25  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  264:9   warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  265:10  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/bin/segment.js
  17:33  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/Config.js
  42:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  64:38  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  97:29  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/adaptation/TemplateParameterMapper.js
  110:5  warning  Mixed spaces and tabs                         no-mixed-spaces-and-tabs
  110:7  warning  Expected no linebreak before this expression  implicit-arrow-linebreak
  113:4  warning  Mixed spaces and tabs                         no-mixed-spaces-and-tabs

/src/repo/lib/lineardoc/MwContextualizer.js
  143:35  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/lib/logging.js
  7:1  warning  The type 'winston.Logger' is undefined  jsdoc/no-undefined-types

/src/repo/lib/mw/MWPageLoader.js
  19:33  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/suggestion/SectionSuggester.js
  13:1  warning  Missing JSDoc @param "dbPool" type  jsdoc/require-param-type

/src/repo/lib/swagger-ui.js
  26:9  warning  Found readFile from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/translationunits/MWCategory.js
  15:41  warning  Unsafe Regular Expression  security/detect-unsafe-regex

/src/repo/lib/translationunits/MWFile.js
  44:51  warning  Unsafe Regular Expression  security/detect-unsafe-regex

/src/repo/lib/translationunits/MWImage.js
  123:68  warning  Unsafe Regular Expression  security/detect-unsafe-regex

/src/repo/lib/util.js
  133:23  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/scripts/template-mapping.js
  108:7   warning  Found existsSync from package "fs" with non literal argument at index 0    security/detect-non-literal-fs-filename
  114:14  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/spec.yaml
  197:1  warning  This line has a length of 139. Maximum allowed is 100  max-len
  248:1  warning  This line has a length of 139. Maximum allowed is 100  max-len
  470:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  503:1  warning  This line has a length of 216. Maximum allowed is 100  max-len
  540:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  547:1  warning  This line has a length of 216. Maximum allowed is 100  max-len
  589:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  606:1  warning  This line has a length of 134. Maximum allowed is 100  max-len
  621:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  653:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  670:1  warning  This line has a length of 134. Maximum allowed is 100  max-len

/src/repo/test/adaptation/SectionTest.js
  31:20  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/features/app/spec.js
   21:16  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  168:10  warning  Found non-literal argument to RegExp Constructor                           security/detect-non-literal-regexp

/src/repo/test/lineardoc/LinearDoc.test.js
   28:22  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
   32:24  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
   36:26  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
   78:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  101:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  156:27  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  249:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/mw/MWPageLoaderTest.js
  37:27  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  46:5   warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/mw/SectionWrap.test.js
  17:33  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/segmentation/CXSegmenter.test.js
  28:19  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  34:3   warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/testutils.js
  22:5  warning  Found writeFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/translationunits/MWReference.test.js
  38:21  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  55:27  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/utils/assert.js
  8:40  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

✖ 53 problems (0 errors, 53 warnings)


> cxserver@1.2.1 unittest
> NODE_ENV=test node --test

TAP version 13
# {"@timestamp":"2026-05-01T09:42:10.580Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.636Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.638Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.668Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.711Z","ecs.version":"8.10.0","log.level":"debug","message":"No title for the MWLink: {\\"name\\":\\"a\\",\\"attributes\\":{\\"rel\\":\\"mw:WikiLink\\",\\"href\\":\\"Oxygen\\",\\"id\\":\\"mwAA\\",\\"data-cx\\":\\"{\\\\\\"adapted\\\\\\":false}\\"},\\"isSelfClosing\\":false}","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.749Z","ecs.version":"8.10.0","log.level":"debug","message":"No title for the MWLink: {\\"name\\":\\"a\\",\\"attributes\\":{\\"rel\\":\\"mw:WikiLink\\",\\"href\\":\\"Atomic number\\",\\"id\\":\\"mwAB\\",\\"data-cx\\":\\"{\\\\\\"adapted\\\\\\":false}\\"},\\"isSelfClosing\\":false}","service":"cxserver-dev"}
# Subtest: Adaptation tests
    # Subtest: Link adaptation basic test
    ok 1 - Link adaptation basic test
      ---
      duration_ms: 389.903906
      ...
    # Subtest: Link adaptation - Full paragraph and relative links
    ok 2 - Link adaptation - Full paragraph and relative links
      ---
      duration_ms: 61.367859
      ...
    # Subtest: Image adaptation basic test
    ok 3 - Image adaptation basic test
      ---
      duration_ms: 135.465088
      ...
    # Subtest: Image adaptation - Inline image with span tag
    ok 4 - Image adaptation - Inline image with span tag
      ---
      duration_ms: 33.700354
      ...
    # Subtest: Image adaptation - Inline image with span tag
    ok 5 - Image adaptation - Inline image with span tag
      ---
      duration_ms: 14.691099
      ...
    # Subtest: Image adaptation - Source and target language directions differs
    ok 6 - Image adaptation - Source and target language directions differs
      ---
      duration_ms: 92.79191
      ...
    # Subtest: Image adaptation - Image is not in commons
    ok 7 - Image adaptation - Image is not in commons
      ---
      duration_ms: 32.242688
      ...
    # Subtest: Gallery adaptation
    ok 8 - Gallery adaptation
      ---
      duration_ms: 32.699999
      ...
    # Subtest: Reference adaptation test without a reference template
    ok 9 - Reference adaptation test without a reference template
      ---
      duration_ms: 24.063211
      ...
    # Subtest: Reference adaptation test where the content is reference and template at same time
    ok 10 - Reference adaptation test where the content is reference and template at same time
      ---
      duration_ms: 40.199552
      ...
    # Subtest: Reference adaptation test where source and target has no template data. Must use template mapping database
    ok 11 - Reference adaptation test where source and target has no template data. Must use template mapping database
      ---
      duration_ms: 101.6028
      ...
    # Subtest: Style tags holding template definition should not be ignored and used for template adaptation
    ok 12 - Style tags holding template definition should not be ignored and used for template adaptation
      ---
      duration_ms: 32.055284
      ...
    # Subtest: Audio adaptation
    ok 13 - Audio adaptation
      ---
      duration_ms: 32.652635
      ...
    # Subtest: Audio adaptation when audio is not in Commons
    ok 14 - Audio adaptation when audio is not in Commons
      ---
      duration_ms: 12.204403
      ...
    # Subtest: Video adaptation
    ok 15 - Video adaptation
      ---
      duration_ms: 12.275376
      ...
    # Subtest: Inline Video adaptation
    ok 16 - Inline Video adaptation
      ---
      duration_ms: 22.243996
      ...
    1..16
ok 1 - Adaptation tests
  ---
  duration_ms: 1212.351478
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:10.540Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.612Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.613Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.629Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Adaptation tests
    # Subtest: should adapt section when: section has lot of templates, but all are fragments of main template
    ok 1 - should adapt section when: section has lot of templates, but all are fragments of main template
      ---
      duration_ms: 580.548712
      ...
    1..1
ok 2 - Adaptation tests
  ---
  duration_ms: 685.035547
  type: 'suite'
  ...
# Subtest: Template parameter mapping test
    # Subtest: should not have any errors while mapping params
    ok 1 - should not have any errors while mapping params
      ---
      duration_ms: 8.991018
      ...
    1..1
ok 3 - Template parameter mapping test
  ---
  duration_ms: 10.733645
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:11.833Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:11.885Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:11.898Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:11.917Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: express app
    # Subtest: should get robots.txt
    ok 1 - should get robots.txt
      ---
      duration_ms: 28.925545
      ...
    # Subtest: should set CORS headers
    ok 2 - should set CORS headers
      ---
      duration_ms: 6.466792
      ...
    # Subtest: should set CSP headers
    ok 3 - should set CSP headers
      ---
      duration_ms: 4.55869
      ...
    1..3
ok 4 - express app
  ---
  duration_ms: 140.190973
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:13.465Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.501Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.503Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.528Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Swagger spec
    # Subtest: get the spec
    ok 1 - get the spec
      ---
      duration_ms: 46.54607
      ...
    # Subtest: should expose valid OpenAPI spec
    ok 2 - should expose valid OpenAPI spec
      ---
      duration_ms: 43.218021
      ...
    # Subtest: spec validation
    ok 3 - spec validation
      ---
      duration_ms: 1.458283
      ...
    # Subtest: routes
        # Subtest: robots.txt check
        ok 1 - robots.txt check
          ---
          duration_ms: 14.807715
          ...
        # Subtest: root with no query params
        ok 2 - root with no query params
          ---
          duration_ms: 5.099606
          ...
        # Subtest: spec from root
        ok 3 - spec from root
          ---
          duration_ms: 10.956847
          ...
        # Subtest: doc from root
        ok 4 - doc from root
          ---
          duration_ms: 3.741228
          ...
        # Subtest: root with wrong query param
        ok 5 - root with wrong query param
          ---
          duration_ms: 3.482492
          ...
# {"@timestamp":"2026-05-01T09:42:13.670Z","ecs.version":"8.10.0","http":{"request":{"id":"14384a56-2130-4110-b2e3-cd4a2c4ce89e","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:42:13.961Z","ecs.version":"8.10.0","http":{"request":{"id":"14384a56-2130-4110-b2e3-cd4a2c4ce89e","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
        # Subtest: Fetch enwiki protected page
        ok 6 - Fetch enwiki protected page
          ---
          duration_ms: 310.369219
          ...
# {"@timestamp":"2026-05-01T09:42:13.977Z","ecs.version":"8.10.0","http":{"request":{"id":"c7813e23-f364-4235-ab21-b1fd79b91b3d","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:42:14.157Z","ecs.version":"8.10.0","http":{"request":{"id":"c7813e23-f364-4235-ab21-b1fd79b91b3d","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
        # Subtest: Fetch protected page with multi-word title
        ok 7 - Fetch protected page with multi-word title
          ---
          duration_ms: 191.510218
          ...
# {"@timestamp":"2026-05-01T09:42:14.177Z","ecs.version":"8.10.0","http":{"request":{"id":"d8efe5eb-abaf-4e63-8fe9-bbd3ddc5a7b9","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# {"@timestamp":"2026-05-01T09:42:14.277Z","ecs.version":"8.10.0","http":{"request":{"id":"d8efe5eb-abaf-4e63-8fe9-bbd3ddc5a7b9","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
        # Subtest: Fetch enwiki protected page with revision
        ok 8 - Fetch enwiki protected page with revision
          ---
          duration_ms: 121.28374
          ...
        # Subtest: Machine translate an HTML fragment using TestClient.
        ok 9 - Machine translate an HTML fragment using TestClient.
          ---
          duration_ms: 241.596122
          ...
        # Subtest: Machine translate an HTML fragment using TestClient.
        ok 10 - Machine translate an HTML fragment using TestClient.
          ---
          duration_ms: 37.971173
          ...
        # Subtest: Get the tools between two language pairs
        ok 11 - Get the tools between two language pairs
          ---
          duration_ms: 3.640462
          ...
        # Subtest: Get all the language pairs
        ok 12 - Get all the language pairs
          ---
          duration_ms: 4.761193
          ...
        # Subtest: Get the MT tool between two language pairs
        ok 13 - Get the MT tool between two language pairs
          ---
          duration_ms: 21.59651
          ...
        # Subtest: Get the MT tool between two language pairs
        ok 14 - Get the MT tool between two language pairs
          ---
          duration_ms: 3.882056
          ...
# {"@timestamp":"2026-05-01T09:42:14.603Z","ecs.version":"8.10.0","http":{"request":{"id":"58993971-bbc4-40fa-899c-5432cf671b74","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:42:14.735Z","ecs.version":"8.10.0","http":{"request":{"id":"58993971-bbc4-40fa-899c-5432cf671b74","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
        # Subtest: Translate enwiki protected page
        ok 15 - Translate enwiki protected page
          ---
          duration_ms: 151.129029
          ...
# {"@timestamp":"2026-05-01T09:42:14.754Z","ecs.version":"8.10.0","http":{"request":{"id":"73e6829e-6cd5-4c3f-b46a-4270348ed181","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:42:14.899Z","ecs.version":"8.10.0","http":{"request":{"id":"73e6829e-6cd5-4c3f-b46a-4270348ed181","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
        # Subtest: Translate enwiki protected page with multi-word title
        ok 16 - Translate enwiki protected page with multi-word title
          ---
          duration_ms: 159.596231
          ...
# {"@timestamp":"2026-05-01T09:42:14.914Z","ecs.version":"8.10.0","http":{"request":{"id":"f72a5c2c-b007-4121-a944-deb3348b41b0","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# {"@timestamp":"2026-05-01T09:42:15.038Z","ecs.version":"8.10.0","http":{"request":{"id":"f72a5c2c-b007-4121-a944-deb3348b41b0","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
        # Subtest: Translate enwiki protected page with revision
        ok 17 - Translate enwiki protected page with revision
          ---
          duration_ms: 137.33826
          ...
        # Subtest: Machine translate an HTML fragment without provider, and an invalid language pair
        ok 18 - Machine translate an HTML fragment without provider, and an invalid language pair
          ---
          duration_ms: 5.804622
          ...
        # Subtest: Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.
        ok 19 - Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.
          ---
          duration_ms: 216.04186
          ...
        # Subtest: Return the target language link for the given source title and language pairs
        ok 20 - Return the target language link for the given source title and language pairs
          ---
          duration_ms: 150.334219
          ...
        # Subtest: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
        ok 21 - Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
          ---
          duration_ms: 27.317275
          ...
        # Subtest: Return the target language link for the given source title and language pairs
        ok 22 - Return the target language link for the given source title and language pairs
          ---
          duration_ms: 3.874338
          ...
        # Subtest: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
        ok 23 - Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
          ---
          duration_ms: 3.492988
          ...
# {"@timestamp":"2026-05-01T09:42:15.469Z","ecs.version":"8.10.0","http":{"request":{"id":"3b0d2efe-603e-48df-87bb-cddededd848f","method":"GET"}},"log.level":"debug","message":"Attempting Paneer in en","service":"cxserver-dev","url":{"path":"/v2/suggest/source/Paneer/ca?sourcelanguages=en"}}
        # Subtest: Suggest a source title to use for translation
        ok 24 - Suggest a source title to use for translation
          ---
          duration_ms: 85.483061
          ...
        # Subtest: Suggest target section titles for given source sections
        ok 25 - Suggest target section titles for given source sections
          ---
          duration_ms: 45.043509
          ...
        # Subtest: Suggest source sections to translate
        ok 26 - Suggest source sections to translate
          ---
          duration_ms: 143.332354
          ...
        # Subtest: Suggest source sections to translate for multiple titles
        ok 27 - Suggest source sections to translate for multiple titles
          ---
          duration_ms: 269.235192
          ...
        # Subtest: retrieve service info
        ok 28 - retrieve service info
          ---
          duration_ms: 4.244553
          ...
        # Subtest: retrieve service name
        ok 29 - retrieve service name
          ---
          duration_ms: 3.035343
          ...
        # Subtest: retrieve service version
        ok 30 - retrieve service version
          ---
          duration_ms: 2.438756
          ...
        # Subtest: redirect to the home page
        ok 31 - redirect to the home page
          ---
          duration_ms: 2.326207
          ...
        1..31
    ok 4 - routes
      ---
      duration_ms: 2399.841405
      type: 'suite'
      ...
    1..4
ok 5 - Swagger spec
  ---
  duration_ms: 2587.66735
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:13.856Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.899Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.914Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.931Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: service information
    # Subtest: should get the service name
    ok 1 - should get the service name
      ---
      duration_ms: 30.229081
      ...
    # Subtest: should get the service version
    ok 2 - should get the service version
      ---
      duration_ms: 5.764241
      ...
    # Subtest: should redirect to the service home page
    ok 3 - should redirect to the service home page
      ---
      duration_ms: 5.762646
      ...
    # Subtest: should get the service info
    ok 4 - should get the service info
      ---
      duration_ms: 3.825606
      ...
    1..4
ok 6 - service information
  ---
  duration_ms: 135.869351
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:14.037Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:14.093Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:14.094Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:14.124Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:14.149Z","ecs.version":"8.10.0","http":{"request":{"id":"e45259f5-397e-41f8-a4fb-1e8c66d324ca","method":"GET"}},"log.level":"debug","message":"Getting page en:Oxygen","service":"cxserver-dev","url":{"path":"/v1/page/en/Oxygen"}}
# {"@timestamp":"2026-05-01T09:42:14.921Z","ecs.version":"8.10.0","http":{"request":{"id":"e45259f5-397e-41f8-a4fb-1e8c66d324ca","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/Oxygen"}}
# Subtest: v1 api - page gets
    # Subtest: should get the whole page body
    ok 1 - should get the whole page body
      ---
      duration_ms: 836.999651
      ...
    # Subtest: should throw a 404 for a non-existent page
    ok 2 - should throw a 404 for a non-existent page
      ---
      duration_ms: 7.502937
      ...
    1..2
ok 7 - v1 api - page gets
  ---
  duration_ms: 946.005225
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:15.983Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:16.084Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:16.099Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:16.122Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:16.159Z","ecs.version":"8.10.0","http":{"request":{"id":"4421255a-fe34-4ff6-8cf4-8099265b918d","method":"GET"}},"log.level":"debug","message":"Getting page en:Pickling for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Pickling"}}
# {"@timestamp":"2026-05-01T09:42:16.744Z","ecs.version":"8.10.0","http":{"request":{"id":"4421255a-fe34-4ff6-8cf4-8099265b918d","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Pickling"}}
# Subtest: v2 api - page gets
    # Subtest: should get the whole page body
    ok 1 - should get the whole page body
      ---
      duration_ms: 630.326456
      ...
# {"@timestamp":"2026-05-01T09:42:16.769Z","ecs.version":"8.10.0","http":{"request":{"id":"33217623-f10a-462f-8397-7b35aeb1f21e","method":"GET"}},"log.level":"debug","message":"Getting page en:Wikipedia_content_translation_system for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Wikipedia_content_translation_system"}}
    # Subtest: should throw a 404 for a non-existent page
    ok 2 - should throw a 404 for a non-existent page
      ---
      duration_ms: 55.861783
      ...
    1..2
ok 8 - v2 api - page gets
  ---
  duration_ms: 852.352593
  type: 'suite'
  ...
# Subtest: LinearDoc
    # Subtest: should be possible to linearise all kind of HTML inputs
    ok 1 - should be possible to linearise all kind of HTML inputs
      ---
      duration_ms: 39.724259
      ...
    # Subtest: should be possible to reconstruct the HTML from LinearDoc
    ok 2 - should be possible to reconstruct the HTML from LinearDoc
      ---
      duration_ms: 2.045054
      ...
    # Subtest: should be possible to reduce and expand a document
    ok 3 - should be possible to reduce and expand a document
      ---
      duration_ms: 6.644689
      ...
    # Subtest: test HTML compaction roundtrip with inline chunks
    ok 4 - test HTML compaction roundtrip with inline chunks
      ---
      duration_ms: 6.515482
      ...
    # Subtest: test HTML expand with external attributes inserted
    ok 5 - test HTML expand with external attributes inserted
      ---
      duration_ms: 0.674868
      ...
    # Subtest: test if the content is block level template
    ok 6 - test if the content is block level template
      ---
      duration_ms: 97.471306
      ...
    # Subtest: test HTML compaction roundtrip with inline style content
    ok 7 - test HTML compaction roundtrip with inline style content
      ---
      duration_ms: 1.669955
      ...
    # Subtest: test HTML compaction roundtrip with template with empty content
    ok 8 - test HTML compaction roundtrip with template with empty content
      ---
      duration_ms: 2.801907
      ...
    # Subtest: test getRootItem for ignoring blockspaces
    ok 9 - test getRootItem for ignoring blockspaces
      ---
      duration_ms: 0.812025
      ...
    # Subtest: test getRootItem for not ignoring non-whitespace content in textblock
    ok 10 - test getRootItem for not ignoring non-whitespace content in textblock
      ---
      duration_ms: 0.54348
      ...
    # Subtest: test getRootItem for ignoring whitespace content in textblock
    ok 11 - test getRootItem for ignoring whitespace content in textblock
      ---
      duration_ms: 0.417392
      ...
    1..11
ok 9 - LinearDoc
  ---
  duration_ms: 161.852263
  type: 'suite'
  ...
# Subtest: Apertium machine translation
    # Subtest: Test: All caps words
    ok 1 - Test: All caps words
      ---
      duration_ms: 205.688775
      ...
    # Subtest: Test: Title caps one-to-many
    ok 2 - Test: Title caps one-to-many
      ---
      duration_ms: 25.393848
      ...
    # Subtest: Test: Reordering with nested tags
    ok 3 - Test: Reordering with nested tags
      ---
      duration_ms: 32.487539
      ...
    # Subtest: Test: Many-to-one with nested tags
    ok 4 - Test: Many-to-one with nested tags
      ---
      duration_ms: 45.488092
      ...
    # Subtest: Test: Reordering at either ends of a tag
    ok 5 - Test: Reordering at either ends of a tag
      ---
      duration_ms: 33.016349
      ...
    # Subtest: Test: Identical tags separated by whitespace
    ok 6 - Test: Identical tags separated by whitespace
      ---
      duration_ms: 33.17927
      ...
    # Subtest: Test: Non-identical links separated by whitespace
    ok 7 - Test: Non-identical links separated by whitespace
      ---
      duration_ms: 20.917903
      ...
    # Subtest: Test: Find longest match among multiple matches
    ok 8 - Test: Find longest match among multiple matches
      ---
      duration_ms: 39.791454
      ...
    # Subtest: Test: Do not translate content inside the style tags
    ok 9 - Test: Do not translate content inside the style tags
      ---
      duration_ms: 58.285397
      ...
    1..9
ok 10 - Apertium machine translation
  ---
  duration_ms: 496.811472
  type: 'suite'
  ...
# Subtest: Elia machine translation
    # Subtest: Should fail because of wrong key 
    ok 1 - Should fail because of wrong key 
      ---
      duration_ms: 17.929724
      ...
    1..1
ok 11 - Elia machine translation
  ---
  duration_ms: 19.500111
  type: 'suite'
  ...
# Subtest: Google machine translation
    # Subtest: Should fail because of wrong key 
    ok 1 - Should fail because of wrong key 
      ---
      duration_ms: 11.269713
      ...
    1..1
ok 12 - Google machine translation
  ---
  duration_ms: 12.922493
  type: 'suite'
  ...
# Subtest: LingoCloud machine translation
    # Subtest: Should fail because of wrong key 
    ok 1 - Should fail because of wrong key 
      ---
      duration_ms: 6.971333
      ...
    1..1
ok 13 - LingoCloud machine translation
  ---
  duration_ms: 8.546665
  type: 'suite'
  ...
# Subtest: Machine translation with wrapped html result
    # Subtest: Should throw error
    ok 1 - Should throw error
      ---
      duration_ms: 12.111979
      ...
    1..1
ok 14 - Machine translation with wrapped html result
  ---
  duration_ms: 13.702698
  type: 'suite'
  ...
# Subtest: Machine translation result with extra spaces
    # Subtest: Should be cleaned up
    ok 1 - Should be cleaned up
      ---
      duration_ms: 166.635472
      ...
    1..1
ok 15 - Machine translation result with extra spaces
  ---
  duration_ms: 166.926648
  type: 'suite'
  ...
# Subtest: Subsequence match finding
    # Subtest: Should return correct range mapping
    ok 1 - Should return correct range mapping
      ---
      duration_ms: 2.203292
      ...
    1..1
ok 16 - Subsequence match finding
  ---
  duration_ms: 2.512157
  type: 'suite'
  ...
# Subtest: Template translation
    # Subtest: should not translate the fragement contents.
    ok 1 - should not translate the fragement contents.
      ---
      duration_ms: 166.228745
      ...
    1..1
ok 17 - Template translation
  ---
  duration_ms: 167.877066
  type: 'suite'
  ...
# Subtest: Config transform tests
    # Subtest: Simple cross product of languages
    ok 1 - Simple cross product of languages
      ---
      duration_ms: 2.61046
      ...
    # Subtest: Do not translate between two variants of English
    ok 2 - Do not translate between two variants of English
      ---
      duration_ms: 0.31403
      ...
    # Subtest: Exclude "notAsTarget" languages
    ok 3 - Exclude "notAsTarget" languages
      ---
      duration_ms: 0.189567
      ...
    # Subtest: Handle pairs in the configuration
    ok 4 - Handle pairs in the configuration
      ---
      duration_ms: 0.427531
      ...
    1..4
ok 18 - Config transform tests
  ---
  duration_ms: 5.520206
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:21.078Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.115Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.117Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.132Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: MWPageLoader tests
    # Subtest: Test: Add data-section-number attribute to every CX section
    ok 1 - Test: Add data-section-number attribute to every CX section
      ---
      duration_ms: 20.947733
      ...
    1..1
ok 19 - MWPageLoader tests
  ---
  duration_ms: 89.280138
  type: 'suite'
  ...
# Subtest: Section wrap tests
    # Subtest: should parse correctly when section has common pattern of elements
    ok 1 - should parse correctly when section has common pattern of elements
      ---
      duration_ms: 2.159355
      ...
    # Subtest: should extract correct number of categories when section has common pattern of elements
    ok 2 - should extract correct number of categories when section has common pattern of elements
      ---
      duration_ms: 4.022886
      ...
    # Subtest: should parse correctly when section has categories to be extracted
    ok 3 - should parse correctly when section has categories to be extracted
      ---
      duration_ms: 0.167173
      ...
    # Subtest: should extract correct number of categories when section has categories to be extracted
    ok 4 - should extract correct number of categories when section has categories to be extracted
      ---
      duration_ms: 0.127381
      ...
    # Subtest: should parse correctly when content has nested sections and tricky transclusion context
    ok 5 - should parse correctly when content has nested sections and tricky transclusion context
      ---
      duration_ms: 0.130254
      ...
    # Subtest: should extract correct number of categories when content has nested sections and tricky transclusion context
    ok 6 - should extract correct number of categories when content has nested sections and tricky transclusion context
      ---
      duration_ms: 0.120237
      ...
    # Subtest: should parse correctly when content has blank template and then an unrelated table
    ok 7 - should parse correctly when content has blank template and then an unrelated table
      ---
      duration_ms: 0.289269
      ...
    # Subtest: should extract correct number of categories when content has blank template and then an unrelated table
    ok 8 - should extract correct number of categories when content has blank template and then an unrelated table
      ---
      duration_ms: 0.135639
      ...
    # Subtest: should parse correctly when content is complete page content with html, head tags and body having two templates with fragments
    ok 9 - should parse correctly when content is complete page content with html, head tags and body having two templates with fragments
      ---
      duration_ms: 0.35575
      ...
    # Subtest: should extract correct number of categories when content is complete page content with html, head tags and body having two templates with fragments
    ok 10 - should extract correct number of categories when content is complete page content with html, head tags and body having two templates with fragments
      ---
      duration_ms: 0.283289
      ...
    # Subtest: should parse correctly when Content has self closing meta tag
    ok 11 - should parse correctly when Content has self closing meta tag
      ---
      duration_ms: 0.149796
      ...
    # Subtest: should extract correct number of categories when Content has self closing meta tag
    ok 12 - should extract correct number of categories when Content has self closing meta tag
      ---
      duration_ms: 0.133826
      ...
    # Subtest: should parse correctly when Content has template fragments and one fragment is a section candidate. Section has categories too
    ok 13 - should parse correctly when Content has template fragments and one fragment is a section candidate. Section has categories too
      ---
      duration_ms: 0.220005
      ...
    # Subtest: should extract correct number of categories when Content has template fragments and one fragment is a section candidate. Section has categories too
    ok 14 - should extract correct number of categories when Content has template fragments and one fragment is a section candidate. Section has categories too
      ---
      duration_ms: 0.137099
      ...
    # Subtest: should parse correctly when Content has transclusion and one of its fragment get removed since it is ignorable.
    ok 15 - should parse correctly when Content has transclusion and one of its fragment get removed since it is ignorable.
      ---
      duration_ms: 0.275931
      ...
    # Subtest: should extract correct number of categories when Content has transclusion and one of its fragment get removed since it is ignorable.
    ok 16 - should extract correct number of categories when Content has transclusion and one of its fragment get removed since it is ignorable.
      ---
      duration_ms: 0.166398
      ...
    # Subtest: should parse correctly when Content has transclusion and same element is removable templatestyle. So do not remove
    ok 17 - should parse correctly when Content has transclusion and same element is removable templatestyle. So do not remove
      ---
      duration_ms: 0.131854
      ...
    # Subtest: should extract correct number of categories when Content has transclusion and same element is removable templatestyle. So do not remove
    ok 18 - should extract correct number of categories when Content has transclusion and same element is removable templatestyle. So do not remove
      ---
      duration_ms: 0.340702
      ...
    1..18
ok 20 - Section wrap tests
  ---
  duration_ms: 12.141984
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:21.204Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.278Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.279Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.312Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Title pair tests
    # Subtest: should adapt the title when: Corresponding title exist in target language
    ok 1 - should adapt the title when: Corresponding title exist in target language
      ---
      duration_ms: 132.94168
      ...
    # Subtest: should adapt the title when: Corresponding title exist in target language
    ok 2 - should adapt the title when: Corresponding title exist in target language
      ---
      duration_ms: 0.722752
      ...
    # Subtest: should adapt the title when: Corresponding title exist in target language and given title need normalization
    ok 3 - should adapt the title when: Corresponding title exist in target language and given title need normalization
      ---
      duration_ms: 0.275336
      ...
    # Subtest: should adapt the title when: Corresponding title does not exist in target language and given title need normalization
    ok 4 - should adapt the title when: Corresponding title does not exist in target language and given title need normalization
      ---
      duration_ms: 0.285915
      ...
    # Subtest: should adapt the title when: Corresponding title exist in target language and given title need normalization, has parenthesis
    ok 5 - should adapt the title when: Corresponding title exist in target language and given title need normalization, has parenthesis
      ---
      duration_ms: 0.231463
      ...
    # Subtest: should adapt the title when: Source title is percentage encoded, but should not throw error, should return corresponding title
    ok 6 - should adapt the title when: Source title is percentage encoded, but should not throw error, should return corresponding title
      ---
      duration_ms: 0.732006
      ...
    # Subtest: should have the queue size 50
    ok 7 - should have the queue size 50
      ---
      duration_ms: 2.468699
      ...
    1..7
ok 21 - Title pair tests
  ---
  duration_ms: 232.911561
  ...
# Subtest: Section extractor tests
    # Subtest: should extract section titles correctly
    ok 1 - should extract section titles correctly
      ---
      duration_ms: 4.284761
      ...
    # Subtest: should extract section sizes correctly
    ok 2 - should extract section sizes correctly
      ---
      duration_ms: 71.728811
      ...
    # Subtest: should extract section titles correctly
    ok 3 - should extract section titles correctly
      ---
      duration_ms: 1.180289
      ...
    # Subtest: should extract section sizes correctly
    ok 4 - should extract section sizes correctly
      ---
      duration_ms: 28.898565
      ...
    1..4
ok 22 - Section extractor tests
  ---
  duration_ms: 108.315989
  type: 'suite'
  ...
# Subtest: Segmentation tests for am
    # Subtest: should not have any errors when: Amharic segmentation - basic test
    ok 1 - should not have any errors when: Amharic segmentation - basic test
      ---
      duration_ms: 1.356922
      ...
    1..1
ok 23 - Segmentation tests for am
  ---
  duration_ms: 3.056171
  type: 'suite'
  ...
# Subtest: Segmentation tests for en
    # Subtest: should not have any errors when: Simple paragraph test
    ok 1 - should not have any errors when: Simple paragraph test
      ---
      duration_ms: 0.571923
      ...
    # Subtest: should not have any errors when: Sentence ending with )
    ok 2 - should not have any errors when: Sentence ending with )
      ---
      duration_ms: 0.182652
      ...
    # Subtest: should not have any errors when: Exclamation, punctuation test
    ok 3 - should not have any errors when: Exclamation, punctuation test
      ---
      duration_ms: 0.154136
      ...
    # Subtest: should not have any errors when: Multiple sentences
    ok 4 - should not have any errors when: Multiple sentences
      ---
      duration_ms: 0.147755
      ...
    # Subtest: should not have any errors when: Multiple sections - div, h1, paragraph
    ok 5 - should not have any errors when: Multiple sections - div, h1, paragraph
      ---
      duration_ms: 0.155606
      ...
    # Subtest: should not have any errors when: Sentence starting with a link
    ok 6 - should not have any errors when: Sentence starting with a link
      ---
      duration_ms: 0.146707
      ...
    # Subtest: should not have any errors when: Sentence starting with a link and ending with a link
    ok 7 - should not have any errors when: Sentence starting with a link and ending with a link
      ---
      duration_ms: 0.238476
      ...
    # Subtest: should not have any errors when: Figure
    ok 8 - should not have any errors when: Figure
      ---
      duration_ms: 0.413891
      ...
    # Subtest: should not have any errors when: References can appear after period without space. Example: Hydrogen is a gas.[1] It is ...
    ok 9 - should not have any errors when: References can appear after period without space. Example: Hydrogen is a gas.[1] It is ...
      ---
      duration_ms: 0.229352
      ...
    # Subtest: should not have any errors when: References can appear after period without space, repeated. Example: Hydrogen is a gas.[1][2][3] It is ...
    ok 10 - should not have any errors when: References can appear after period without space, repeated. Example: Hydrogen is a gas.[1][2][3] It is ...
      ---
      duration_ms: 0.139231
      ...
    # Subtest: should not have any errors when: References can appear inside a sentence. Example: Hydrogen is a gas[1] and it is ...
    ok 11 - should not have any errors when: References can appear inside a sentence. Example: Hydrogen is a gas[1] and it is ...
      ---
      duration_ms: 0.247899
      ...
    # Subtest: should not have any errors when: References can appear inside a sentence. Example:Hydrogen's atomic number is one. Hydrogen is a gas[1] and it is ..... Test the flags are reset properly
    ok 12 - should not have any errors when: References can appear inside a sentence. Example:Hydrogen's atomic number is one. Hydrogen is a gas[1] and it is ..... Test the flags are reset properly
      ---
      duration_ms: 0.170352
      ...
    # Subtest: should not have any errors when: References can appear repeated inside a sentence. Example: Hydrogen is a gas[1][2][3] and it is ...
    ok 13 - should not have any errors when: References can appear repeated inside a sentence. Example: Hydrogen is a gas[1][2][3] and it is ...
      ---
      duration_ms: 0.313095
      ...
    # Subtest: should not have any errors when: References can appear after period and space. Example: Hydrogen is a gas. [1] It is ...
    ok 14 - should not have any errors when: References can appear after period and space. Example: Hydrogen is a gas. [1] It is ...
      ---
      duration_ms: 0.162825
      ...
    # Subtest: should not have any errors when: Paragraph from Debian article- repeating references
    ok 15 - should not have any errors when: Paragraph from Debian article- repeating references
      ---
      duration_ms: 0.126301
      ...
    # Subtest: should not have any errors when: References after closing bracket and period.
    ok 16 - should not have any errors when: References after closing bracket and period.
      ---
      duration_ms: 0.140668
      ...
    # Subtest: should not have any errors when: Three sentences in a single text node
    ok 17 - should not have any errors when: Three sentences in a single text node
      ---
      duration_ms: 0.302207
      ...
    # Subtest: should not have any errors when: Paragraph ending with reference and already having reference in between. The second reference should not be identified as repeating reference. If identified as repeating reference, 7 letters from last word will be missing.
    ok 18 - should not have any errors when: Paragraph ending with reference and already having reference in between. The second reference should not be identified as repeating reference. If identified as repeating reference, 7 letters from last word will be missing.
      ---
      duration_ms: 0.172272
      ...
    # Subtest: should not have any errors when: Sentences ending with abbreviations
    ok 19 - should not have any errors when: Sentences ending with abbreviations
      ---
      duration_ms: 0.102049
      ...
    # Subtest: should not have any errors when: link element inside span element
    ok 20 - should not have any errors when: link element inside span element
      ---
      duration_ms: 0.092243
      ...
    # Subtest: should not have any errors when: Do not break inside of links with abbreviations. Example: Carl E. Wieman. See https://phabricator.wikimedia.org/T99504
    ok 21 - should not have any errors when: Do not break inside of links with abbreviations. Example: Carl E. Wieman. See https://phabricator.wikimedia.org/T99504
      ---
      duration_ms: 0.105992
      ...
    # Subtest: should not have any errors when: A non-segmentable text chunk inside a textblock should not mark the whole text chunk non-segmentable
    ok 22 - should not have any errors when: A non-segmentable text chunk inside a textblock should not mark the whole text chunk non-segmentable
      ---
      duration_ms: 0.082876
      ...
    # Subtest: should not have any errors when: Figure-inline segmentation. Do not violate the MediaWiki DOM spec https://www.mediawiki.org/wiki/Specs/HTML\#Images
    ok 23 - should not have any errors when: Figure-inline segmentation. Do not violate the MediaWiki DOM spec https://www.mediawiki.org/wiki/Specs/HTML\#Images
      ---
      duration_ms: 0.076536
      ...
    # Subtest: should not have any errors when: Figure-inline inside a transclusions
    ok 24 - should not have any errors when: Figure-inline inside a transclusions
      ---
      duration_ms: 0.103401
      ...
    # Subtest: should not have any errors when: Video tag in figure tag
    ok 25 - should not have any errors when: Video tag in figure tag
      ---
      duration_ms: 0.099199
      ...
    # Subtest: should not have any errors when: Audio tag in figure tag
    ok 26 - should not have any errors when: Audio tag in figure tag
      ---
      duration_ms: 0.078092
      ...
    # Subtest: should not have any errors when: Audio tag in figure-inline tag
    ok 27 - should not have any errors when: Audio tag in figure-inline tag
      ---
      duration_ms: 0.083263
      ...
    # Subtest: should not have any errors when: Video tag in figure-inline tag
    ok 28 - should not have any errors when: Video tag in figure-inline tag
      ---
      duration_ms: 0.076698
      ...
    # Subtest: should not have any errors when: Do not segment content inside block templates
    ok 29 - should not have any errors when: Do not segment content inside block templates
      ---
      duration_ms: 0.078233
      ...
    # Subtest: should not have any errors when: about attribute alone does not initiate a transclusion context
    ok 30 - should not have any errors when: about attribute alone does not initiate a transclusion context
      ---
      duration_ms: 0.085035
      ...
    # Subtest: should not have any errors when: Do not consider style tag with transclusion as block tag
    ok 31 - should not have any errors when: Do not consider style tag with transclusion as block tag
      ---
      duration_ms: 0.223064
      ...
    # Subtest: should not have any errors when: Sections with singe paragraph and a transclusion based reference at th end - T283513
    ok 32 - should not have any errors when: Sections with singe paragraph and a transclusion based reference at th end - T283513
      ---
      duration_ms: 0.188718
      ...
    # Subtest: should not have any errors when: Handle abbreviations such as Brown v. Board of education - T338689
    ok 33 - should not have any errors when: Handle abbreviations such as Brown v. Board of education - T338689
      ---
      duration_ms: 0.096988
      ...
    1..33
ok 24 - Segmentation tests for en
  ---
  duration_ms: 7.369053
  type: 'suite'
  ...
# Subtest: Segmentation tests for de
    # Subtest: should not have any errors when: Avoid segmenting inside a transclusion textblock
    ok 1 - should not have any errors when: Avoid segmenting inside a transclusion textblock
      ---
      duration_ms: 0.126388
      ...
    1..1
ok 25 - Segmentation tests for de
  ---
  duration_ms: 0.295698
  type: 'suite'
  ...
# Subtest: Segmentation tests for hi
    # Subtest: should not have any errors when: Hindi segmentation - basic test
    ok 1 - should not have any errors when: Hindi segmentation - basic test
      ---
      duration_ms: 0.139679
      ...
    1..1
ok 26 - Segmentation tests for hi
  ---
  duration_ms: 0.258384
  type: 'suite'
  ...
# Subtest: Segmentation tests for hy
    # Subtest: should not have any errors when: Armenian segmentation - basic test
    ok 1 - should not have any errors when: Armenian segmentation - basic test
      ---
      duration_ms: 0.122048
      ...
    1..1
ok 27 - Segmentation tests for hy
  ---
  duration_ms: 0.21363
  type: 'suite'
  ...
# Subtest: Segmentation tests for ja
    # Subtest: should not have any errors when: Japanese segmentation - basic test
    ok 1 - should not have any errors when: Japanese segmentation - basic test
      ---
      duration_ms: 0.090336
      ...
    1..1
ok 28 - Segmentation tests for ja
  ---
  duration_ms: 0.16138
  type: 'suite'
  ...
# Subtest: Segmentation tests for zh
    # Subtest: should not have any errors when: Chinese segmentation - basic test
    ok 1 - should not have any errors when: Chinese segmentation - basic test
      ---
      duration_ms: 0.096104
      ...
    1..1
ok 29 - Segmentation tests for zh
  ---
  duration_ms: 0.167958
  type: 'suite'
  ...
# Subtest: Segmentation tests for pa
    # Subtest: should not have any errors when: Punjabi segmentation - basic test
    ok 1 - should not have any errors when: Punjabi segmentation - basic test
      ---
      duration_ms: 2.902978
      ...
    1..1
ok 30 - Segmentation tests for pa
  ---
  duration_ms: 2.998725
  type: 'suite'
  ...
# Subtest: SectionSuggester tests
    # Subtest: should find present and missing sections
    ok 1 - should find present and missing sections
      ---
      duration_ms: 20.011264
      ...
    1..1
ok 31 - SectionSuggester tests
  ---
  duration_ms: 23.239286
  type: 'suite'
  ...
# Subtest: /src/repo/test/testutils.js
ok 23 - /src/repo/test/testutils.js
  ---
  duration_ms: 141.622207
  ...
# {"@timestamp":"2026-05-01T09:42:23.844Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:23.895Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:23.897Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:23.929Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Link Adaptation tests
    # Subtest: Basic test
    ok 1 - Basic test
      ---
      duration_ms: 169.777219
      ...
    # Subtest: Space in the title
    ok 2 - Space in the title
      ---
      duration_ms: 0.718959
      ...
    # Subtest: Relative URL
    ok 3 - Relative URL
      ---
      duration_ms: 0.431823
      ...
    # Subtest: Title with parenthesis
    ok 4 - Title with parenthesis
      ---
      duration_ms: 0.603363
      ...
    # Subtest: Target title does not exist
    ok 5 - Target title does not exist
      ---
      duration_ms: 0.49259
      ...
    # Subtest: Title with translation from Wikidata label
    ok 6 - Title with translation from Wikidata label
      ---
      duration_ms: 0.582805
      ...
    # Subtest: ISBN Link adaptation
    ok 7 - ISBN Link adaptation
      ---
      duration_ms: 0.538681
      ...
    1..7
ok 33 - Link Adaptation tests
  ---
  duration_ms: 284.212403
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:24.414Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.454Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.455Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.473Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.488Z","ecs.version":"8.10.0","log.level":"debug","message":"Not-adapting a reference node without data-mw.body.html: trncttm-2","service":"cxserver-dev"}
# Subtest: Reference adaptation
    # Subtest: Adapting a reference with plain text content
    ok 1 - Adapting a reference with plain text content
      ---
      duration_ms: 3.929719
      ...
    # Subtest: Adapting a reference with plain text content, sup tag
    ok 2 - Adapting a reference with plain text content, sup tag
      ---
      duration_ms: 0.414128
      ...
    # Subtest: Adapting a reference with html content, sup tag
    ok 3 - Adapting a reference with html content, sup tag
      ---
      duration_ms: 0.249269
      ...
    # Subtest: Not adapting a reference with no data-mw.body
    ok 4 - Not adapting a reference with no data-mw.body
      ---
      duration_ms: 0.543718
      ...
    # Subtest: Partially adapting a reference with named reference
    ok 5 - Partially adapting a reference with named reference
      ---
      duration_ms: 0.425102
      ...
# {"@timestamp":"2026-05-01T09:42:24.923Z","ecs.version":"8.10.0","log.level":"error","message":"Not-adapting a template node with non-JSON data-mw: CITEREFGazette57855","service":"cxserver-dev"}
    # Subtest: Mark the reference adaptation failed when the content defined in template not adapted
    ok 6 - Mark the reference adaptation failed when the content defined in template not adapted
      ---
      duration_ms: 383.800802
      ...
    # Subtest: Mark the reference adaptation failed when the content defined in template and it is unsupported by CXserver
    ok 7 - Mark the reference adaptation failed when the content defined in template and it is unsupported by CXserver
      ---
      duration_ms: 64.358615
      ...
    # Subtest: Partial reference adaptation, when mandatory params are not transferred successfully
    ok 8 - Partial reference adaptation, when mandatory params are not transferred successfully
      ---
      duration_ms: 165.207187
      ...
    1..8
ok 34 - Reference adaptation
  ---
  duration_ms: 703.38567
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:42:24.638Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.681Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.682Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.707Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Template adaptation
    # Subtest: Template with no equivalents
    ok 1 - Template with no equivalents
      ---
      duration_ms: 157.993252
      ...
    # Subtest: Babel template
    ok 2 - Babel template
      ---
      duration_ms: 85.647235
      ...
    # Subtest: Cite web template
    ok 3 - Cite web template
      ---
      duration_ms: 134.708453
      ...
    # Subtest: Multi-part template for columns
    ok 4 - Multi-part template for columns
      ---
      duration_ms: 98.235565
      ...
    # Subtest: Template with equivalents, but target template data missing, no params mapped
    ok 5 - Template with equivalents, but target template data missing, no params mapped
      ---
      duration_ms: 60.256199
      ...
    # Subtest: Equivalent template exist, templatedata exists only for source language. Use that as hint for extracting params from template source code in target language
    ok 6 - Equivalent template exist, templatedata exists only for source language. Use that as hint for extracting params from template source code in target language
      ---
      duration_ms: 94.593325
      ...
    # Subtest: Template with equivalents, all mandatory params mapped
    ok 7 - Template with equivalents, all mandatory params mapped
      ---
      duration_ms: 69.022398
      ...
    # Subtest: Images that are generated by templates
    ok 8 - Images that are generated by templates
      ---
      duration_ms: 11.533888
      ...
    1..8
ok 35 - Template adaptation
  ---
  duration_ms: 793.515578
  ...
# Subtest: /src/repo/test/utils/assert.js
ok 27 - /src/repo/test/utils/assert.js
  ---
  duration_ms: 1309.317484
  ...
1..36
# tests 192
# suites 33
# pass 192
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 17154.658598

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "istanbul-lib-processinfo": {
      "name": "istanbul-lib-processinfo",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "uuid"
      ],
      "effects": [
        "nyc"
      ],
      "range": "*",
      "nodes": [
        "node_modules/istanbul-lib-processinfo"
      ],
      "fixAvailable": {
        "name": "nyc",
        "version": "14.1.1",
        "isSemVerMajor": true
      }
    },
    "nyc": {
      "name": "nyc",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "istanbul-lib-processinfo"
      ],
      "effects": [],
      "range": ">=15.0.0-alpha.0",
      "nodes": [
        "node_modules/nyc"
      ],
      "fixAvailable": {
        "name": "nyc",
        "version": "14.1.1",
        "isSemVerMajor": true
      }
    },
    "swagger-router": {
      "name": "swagger-router",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "uuid"
      ],
      "effects": [],
      "range": ">=0.7.4",
      "nodes": [
        "node_modules/swagger-router"
      ],
      "fixAvailable": {
        "name": "swagger-router",
        "version": "0.7.3",
        "isSemVerMajor": true
      }
    },
    "uuid": {
      "name": "uuid",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1116970,
          "name": "uuid",
          "dependency": "uuid",
          "title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided",
          "url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq",
          "severity": "moderate",
          "cwe": [
            "CWE-787",
            "CWE-1285"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<14.0.0"
        }
      ],
      "effects": [
        "istanbul-lib-processinfo",
        "swagger-router"
      ],
      "range": "<14.0.0",
      "nodes": [
        "node_modules/swagger-router/node_modules/uuid",
        "node_modules/uuid"
      ],
      "fixAvailable": {
        "name": "swagger-router",
        "version": "0.7.3",
        "isSemVerMajor": true
      }
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 4,
      "high": 0,
      "critical": 0,
      "total": 4
    },
    "dependencies": {
      "prod": 268,
      "dev": 595,
      "optional": 52,
      "peer": 2,
      "peerOptional": 0,
      "total": 913
    }
  }
}

--- 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
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN   peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN   node_modules/@babel/eslint-parser
npm WARN     dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN   29 more (@eslint-community/eslint-utils, ...)
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN   eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN   node_modules/eslint-config-wikimedia
npm WARN 
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN   peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN   node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN     eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN     node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'cxserver@1.2.1',
npm WARN EBADENGINE   required: { node: '>=24' },
npm WARN EBADENGINE   current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---
{
  "added": 5,
  "removed": 0,
  "changed": 0,
  "audited": 914,
  "funding": 208,
  "audit": {
    "auditReportVersion": 2,
    "vulnerabilities": {
      "istanbul-lib-processinfo": {
        "name": "istanbul-lib-processinfo",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          "uuid"
        ],
        "effects": [
          "nyc"
        ],
        "range": "*",
        "nodes": [
          "node_modules/istanbul-lib-processinfo"
        ],
        "fixAvailable": {
          "name": "nyc",
          "version": "14.1.1",
          "isSemVerMajor": true
        }
      },
      "nyc": {
        "name": "nyc",
        "severity": "moderate",
        "isDirect": true,
        "via": [
          "istanbul-lib-processinfo"
        ],
        "effects": [],
        "range": ">=15.0.0-alpha.0",
        "nodes": [
          "node_modules/nyc"
        ],
        "fixAvailable": {
          "name": "nyc",
          "version": "14.1.1",
          "isSemVerMajor": true
        }
      },
      "swagger-router": {
        "name": "swagger-router",
        "severity": "moderate",
        "isDirect": true,
        "via": [
          "uuid"
        ],
        "effects": [],
        "range": ">=0.7.4",
        "nodes": [
          "node_modules/swagger-router"
        ],
        "fixAvailable": {
          "name": "swagger-router",
          "version": "0.7.3",
          "isSemVerMajor": true
        }
      },
      "uuid": {
        "name": "uuid",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          {
            "source": 1116970,
            "name": "uuid",
            "dependency": "uuid",
            "title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided",
            "url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq",
            "severity": "moderate",
            "cwe": [
              "CWE-787",
              "CWE-1285"
            ],
            "cvss": {
              "score": 0,
              "vectorString": null
            },
            "range": "<14.0.0"
          }
        ],
        "effects": [
          "istanbul-lib-processinfo",
          "swagger-router"
        ],
        "range": "<14.0.0",
        "nodes": [
          "node_modules/swagger-router/node_modules/uuid",
          "node_modules/uuid"
        ],
        "fixAvailable": {
          "name": "swagger-router",
          "version": "0.7.3",
          "isSemVerMajor": true
        }
      }
    },
    "metadata": {
      "vulnerabilities": {
        "info": 0,
        "low": 0,
        "moderate": 4,
        "high": 0,
        "critical": 0,
        "total": 4
      },
      "dependencies": {
        "prod": 268,
        "dev": 595,
        "optional": 52,
        "peer": 2,
        "peerOptional": 0,
        "total": 913
      }
    }
  }
}

--- end ---
{"added": 5, "removed": 0, "changed": 0, "audited": 914, "funding": 208, "audit": {"auditReportVersion": 2, "vulnerabilities": {"istanbul-lib-processinfo": {"name": "istanbul-lib-processinfo", "severity": "moderate", "isDirect": false, "via": ["uuid"], "effects": ["nyc"], "range": "*", "nodes": ["node_modules/istanbul-lib-processinfo"], "fixAvailable": {"name": "nyc", "version": "14.1.1", "isSemVerMajor": true}}, "nyc": {"name": "nyc", "severity": "moderate", "isDirect": true, "via": ["istanbul-lib-processinfo"], "effects": [], "range": ">=15.0.0-alpha.0", "nodes": ["node_modules/nyc"], "fixAvailable": {"name": "nyc", "version": "14.1.1", "isSemVerMajor": true}}, "swagger-router": {"name": "swagger-router", "severity": "moderate", "isDirect": true, "via": ["uuid"], "effects": [], "range": ">=0.7.4", "nodes": ["node_modules/swagger-router"], "fixAvailable": {"name": "swagger-router", "version": "0.7.3", "isSemVerMajor": true}}, "uuid": {"name": "uuid", "severity": "moderate", "isDirect": false, "via": [{"source": 1116970, "name": "uuid", "dependency": "uuid", "title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided", "url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq", "severity": "moderate", "cwe": ["CWE-787", "CWE-1285"], "cvss": {"score": 0, "vectorString": null}, "range": "<14.0.0"}], "effects": ["istanbul-lib-processinfo", "swagger-router"], "range": "<14.0.0", "nodes": ["node_modules/swagger-router/node_modules/uuid", "node_modules/uuid"], "fixAvailable": {"name": "swagger-router", "version": "0.7.3", "isSemVerMajor": true}}}, "metadata": {"vulnerabilities": {"info": 0, "low": 0, "moderate": 4, "high": 0, "critical": 0, "total": 4}, "dependencies": {"prod": 268, "dev": 595, "optional": 52, "peer": 2, "peerOptional": 0, "total": 913}}}}
$ /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
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN   peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN   node_modules/@babel/eslint-parser
npm WARN     dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN   29 more (@eslint-community/eslint-utils, ...)
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN   eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN   node_modules/eslint-config-wikimedia
npm WARN 
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN   peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN   node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN     eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN     node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'cxserver@1.2.1',
npm WARN EBADENGINE   required: { node: '>=24' },
npm WARN EBADENGINE   current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---

up to date, audited 909 packages in 3s

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

# npm audit report

uuid  <14.0.0
Severity: moderate
uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided - https://github.com/advisories/GHSA-w5hq-g745-h8pq
fix available via `npm audit fix --force`
Will install swagger-router@0.7.3, which is a breaking change
node_modules/swagger-router/node_modules/uuid
node_modules/uuid
  istanbul-lib-processinfo  *
  Depends on vulnerable versions of uuid
  node_modules/istanbul-lib-processinfo
    nyc  >=15.0.0-alpha.0
    Depends on vulnerable versions of istanbul-lib-processinfo
    node_modules/nyc
  swagger-router  >=0.7.4
  Depends on vulnerable versions of uuid
  node_modules/swagger-router

4 moderate severity vulnerabilities

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 ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN   peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN   node_modules/@babel/eslint-parser
npm WARN     dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN   29 more (@eslint-community/eslint-utils, ...)
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN   eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN   node_modules/eslint-config-wikimedia
npm WARN 
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN   peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN   node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN     eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN     node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'cxserver@1.2.1',
npm WARN EBADENGINE   required: { node: '>=24' },
npm WARN EBADENGINE   current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm WARN deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm WARN deprecated prebuild-install@7.1.3: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
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 eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.
--- stdout ---

added 908 packages, and audited 909 packages in 14s

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

4 moderate severity vulnerabilities

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

Run `npm audit` for details.

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

> cxserver@1.2.1 test
> npm run lint && npm run unittest


> cxserver@1.2.1 lint
> eslint .


/src/repo/app.js
   51:1   warning  The type 'Express' is undefined                                            jsdoc/no-undefined-types
   83:34  warning  Found non-literal argument to RegExp Constructor                           security/detect-non-literal-regexp
   89:25  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  264:9   warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  265:10  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/bin/segment.js
  17:33  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/Config.js
  42:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  64:38  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  97:29  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/adaptation/TemplateParameterMapper.js
  110:5  warning  Mixed spaces and tabs                         no-mixed-spaces-and-tabs
  110:7  warning  Expected no linebreak before this expression  implicit-arrow-linebreak
  113:4  warning  Mixed spaces and tabs                         no-mixed-spaces-and-tabs

/src/repo/lib/lineardoc/MwContextualizer.js
  143:35  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/lib/logging.js
  7:1  warning  The type 'winston.Logger' is undefined  jsdoc/no-undefined-types

/src/repo/lib/mw/MWPageLoader.js
  19:33  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/suggestion/SectionSuggester.js
  13:1  warning  Missing JSDoc @param "dbPool" type  jsdoc/require-param-type

/src/repo/lib/swagger-ui.js
  26:9  warning  Found readFile from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/lib/translationunits/MWCategory.js
  15:41  warning  Unsafe Regular Expression  security/detect-unsafe-regex

/src/repo/lib/translationunits/MWFile.js
  44:51  warning  Unsafe Regular Expression  security/detect-unsafe-regex

/src/repo/lib/translationunits/MWImage.js
  123:68  warning  Unsafe Regular Expression  security/detect-unsafe-regex

/src/repo/lib/util.js
  133:23  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/scripts/template-mapping.js
  108:7   warning  Found existsSync from package "fs" with non literal argument at index 0    security/detect-non-literal-fs-filename
  114:14  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/spec.yaml
  197:1  warning  This line has a length of 139. Maximum allowed is 100  max-len
  248:1  warning  This line has a length of 139. Maximum allowed is 100  max-len
  470:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  503:1  warning  This line has a length of 216. Maximum allowed is 100  max-len
  540:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  547:1  warning  This line has a length of 216. Maximum allowed is 100  max-len
  589:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  606:1  warning  This line has a length of 134. Maximum allowed is 100  max-len
  621:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  653:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  670:1  warning  This line has a length of 134. Maximum allowed is 100  max-len

/src/repo/test/adaptation/SectionTest.js
  31:20  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/features/app/spec.js
   21:16  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  168:10  warning  Found non-literal argument to RegExp Constructor                           security/detect-non-literal-regexp

/src/repo/test/lineardoc/LinearDoc.test.js
   28:22  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
   32:24  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
   36:26  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
   78:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  101:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  156:27  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  249:28  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/mw/MWPageLoaderTest.js
  37:27  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  46:5   warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/mw/SectionWrap.test.js
  17:33  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/segmentation/CXSegmenter.test.js
  28:19  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  34:3   warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/testutils.js
  22:5  warning  Found writeFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/translationunits/MWReference.test.js
  38:21  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename
  55:27  warning  Found readFileSync from package "fs" with non literal argument at index 0  security/detect-non-literal-fs-filename

/src/repo/test/utils/assert.js
  8:40  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

✖ 53 problems (0 errors, 53 warnings)


> cxserver@1.2.1 unittest
> NODE_ENV=test node --test

TAP version 13
# {"@timestamp":"2026-05-01T09:43:11.166Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.206Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.207Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.224Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.268Z","ecs.version":"8.10.0","log.level":"debug","message":"No title for the MWLink: {\\"name\\":\\"a\\",\\"attributes\\":{\\"rel\\":\\"mw:WikiLink\\",\\"href\\":\\"Oxygen\\",\\"id\\":\\"mwAA\\",\\"data-cx\\":\\"{\\\\\\"adapted\\\\\\":false}\\"},\\"isSelfClosing\\":false}","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.307Z","ecs.version":"8.10.0","log.level":"debug","message":"No title for the MWLink: {\\"name\\":\\"a\\",\\"attributes\\":{\\"rel\\":\\"mw:WikiLink\\",\\"href\\":\\"Atomic number\\",\\"id\\":\\"mwAB\\",\\"data-cx\\":\\"{\\\\\\"adapted\\\\\\":false}\\"},\\"isSelfClosing\\":false}","service":"cxserver-dev"}
# Subtest: Adaptation tests
    # Subtest: Link adaptation basic test
    ok 1 - Link adaptation basic test
      ---
      duration_ms: 320.102282
      ...
    # Subtest: Link adaptation - Full paragraph and relative links
    ok 2 - Link adaptation - Full paragraph and relative links
      ---
      duration_ms: 52.958164
      ...
    # Subtest: Image adaptation basic test
    ok 3 - Image adaptation basic test
      ---
      duration_ms: 122.409692
      ...
    # Subtest: Image adaptation - Inline image with span tag
    ok 4 - Image adaptation - Inline image with span tag
      ---
      duration_ms: 12.641026
      ...
    # Subtest: Image adaptation - Inline image with span tag
    ok 5 - Image adaptation - Inline image with span tag
      ---
      duration_ms: 12.593045
      ...
    # Subtest: Image adaptation - Source and target language directions differs
    ok 6 - Image adaptation - Source and target language directions differs
      ---
      duration_ms: 81.213612
      ...
    # Subtest: Image adaptation - Image is not in commons
    ok 7 - Image adaptation - Image is not in commons
      ---
      duration_ms: 33.051248
      ...
    # Subtest: Gallery adaptation
    ok 8 - Gallery adaptation
      ---
      duration_ms: 34.29466
      ...
    # Subtest: Reference adaptation test without a reference template
    ok 9 - Reference adaptation test without a reference template
      ---
      duration_ms: 28.489825
      ...
    # Subtest: Reference adaptation test where the content is reference and template at same time
    ok 10 - Reference adaptation test where the content is reference and template at same time
      ---
      duration_ms: 58.993234
      ...
    # Subtest: Reference adaptation test where source and target has no template data. Must use template mapping database
    ok 11 - Reference adaptation test where source and target has no template data. Must use template mapping database
      ---
      duration_ms: 112.947367
      ...
    # Subtest: Style tags holding template definition should not be ignored and used for template adaptation
    ok 12 - Style tags holding template definition should not be ignored and used for template adaptation
      ---
      duration_ms: 35.007194
      ...
    # Subtest: Audio adaptation
    ok 13 - Audio adaptation
      ---
      duration_ms: 35.97644
      ...
    # Subtest: Audio adaptation when audio is not in Commons
    ok 14 - Audio adaptation when audio is not in Commons
      ---
      duration_ms: 11.506014
      ...
    # Subtest: Video adaptation
    ok 15 - Video adaptation
      ---
      duration_ms: 10.601221
      ...
    # Subtest: Inline Video adaptation
    ok 16 - Inline Video adaptation
      ---
      duration_ms: 17.317457
      ...
    1..16
ok 1 - Adaptation tests
  ---
  duration_ms: 1092.083664
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:10.983Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.025Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.026Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.042Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Adaptation tests
    # Subtest: should adapt section when: section has lot of templates, but all are fragments of main template
    ok 1 - should adapt section when: section has lot of templates, but all are fragments of main template
      ---
      duration_ms: 603.075672
      ...
    1..1
ok 2 - Adaptation tests
  ---
  duration_ms: 681.703978
  type: 'suite'
  ...
# Subtest: Template parameter mapping test
    # Subtest: should not have any errors while mapping params
    ok 1 - should not have any errors while mapping params
      ---
      duration_ms: 3.313312
      ...
    1..1
ok 3 - Template parameter mapping test
  ---
  duration_ms: 5.148343
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:12.261Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:12.295Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:12.296Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:12.322Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: express app
    # Subtest: should get robots.txt
    ok 1 - should get robots.txt
      ---
      duration_ms: 27.87808
      ...
    # Subtest: should set CORS headers
    ok 2 - should set CORS headers
      ---
      duration_ms: 5.956314
      ...
    # Subtest: should set CSP headers
    ok 3 - should set CSP headers
      ---
      duration_ms: 4.438329
      ...
    1..3
ok 4 - express app
  ---
  duration_ms: 127.993835
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:13.874Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:13.914Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:13.915Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:13.938Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Swagger spec
    # Subtest: get the spec
    ok 1 - get the spec
      ---
      duration_ms: 36.884949
      ...
    # Subtest: should expose valid OpenAPI spec
    ok 2 - should expose valid OpenAPI spec
      ---
      duration_ms: 20.655719
      ...
    # Subtest: spec validation
    ok 3 - spec validation
      ---
      duration_ms: 1.234115
      ...
    # Subtest: routes
        # Subtest: robots.txt check
        ok 1 - robots.txt check
          ---
          duration_ms: 13.643165
          ...
        # Subtest: root with no query params
        ok 2 - root with no query params
          ---
          duration_ms: 4.524081
          ...
        # Subtest: spec from root
        ok 3 - spec from root
          ---
          duration_ms: 10.036845
          ...
        # Subtest: doc from root
        ok 4 - doc from root
          ---
          duration_ms: 3.896152
          ...
        # Subtest: root with wrong query param
        ok 5 - root with wrong query param
          ---
          duration_ms: 3.616671
          ...
# {"@timestamp":"2026-05-01T09:43:14.044Z","ecs.version":"8.10.0","http":{"request":{"id":"3949058f-116e-4119-8f31-ff8bdacffef8","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:43:14.317Z","ecs.version":"8.10.0","http":{"request":{"id":"3949058f-116e-4119-8f31-ff8bdacffef8","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
        # Subtest: Fetch enwiki protected page
        ok 6 - Fetch enwiki protected page
          ---
          duration_ms: 288.435357
          ...
# {"@timestamp":"2026-05-01T09:43:14.327Z","ecs.version":"8.10.0","http":{"request":{"id":"9a82ffc0-0bc9-46d0-bb3f-9ec2f027c779","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:43:14.490Z","ecs.version":"8.10.0","http":{"request":{"id":"9a82ffc0-0bc9-46d0-bb3f-9ec2f027c779","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
        # Subtest: Fetch protected page with multi-word title
        ok 7 - Fetch protected page with multi-word title
          ---
          duration_ms: 185.910056
          ...
# {"@timestamp":"2026-05-01T09:43:14.520Z","ecs.version":"8.10.0","http":{"request":{"id":"3cfea52c-a1c9-4e8b-9998-32e753373bc3","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# {"@timestamp":"2026-05-01T09:43:14.652Z","ecs.version":"8.10.0","http":{"request":{"id":"3cfea52c-a1c9-4e8b-9998-32e753373bc3","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
        # Subtest: Fetch enwiki protected page with revision
        ok 8 - Fetch enwiki protected page with revision
          ---
          duration_ms: 151.025373
          ...
        # Subtest: Machine translate an HTML fragment using TestClient.
        ok 9 - Machine translate an HTML fragment using TestClient.
          ---
          duration_ms: 200.852092
          ...
        # Subtest: Machine translate an HTML fragment using TestClient.
        ok 10 - Machine translate an HTML fragment using TestClient.
          ---
          duration_ms: 22.113105
          ...
        # Subtest: Get the tools between two language pairs
        ok 11 - Get the tools between two language pairs
          ---
          duration_ms: 3.542301
          ...
        # Subtest: Get all the language pairs
        ok 12 - Get all the language pairs
          ---
          duration_ms: 23.648224
          ...
        # Subtest: Get the MT tool between two language pairs
        ok 13 - Get the MT tool between two language pairs
          ---
          duration_ms: 21.005569
          ...
        # Subtest: Get the MT tool between two language pairs
        ok 14 - Get the MT tool between two language pairs
          ---
          duration_ms: 3.427232
          ...
# {"@timestamp":"2026-05-01T09:43:14.940Z","ecs.version":"8.10.0","http":{"request":{"id":"65fa7f3f-74c4-47b1-9653-0f0ef2bef97a","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:43:15.166Z","ecs.version":"8.10.0","http":{"request":{"id":"65fa7f3f-74c4-47b1-9653-0f0ef2bef97a","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
        # Subtest: Translate enwiki protected page
        ok 15 - Translate enwiki protected page
          ---
          duration_ms: 238.369478
          ...
# {"@timestamp":"2026-05-01T09:43:15.180Z","ecs.version":"8.10.0","http":{"request":{"id":"1897a990-883f-4955-b2a5-d0388c18c66b","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:43:15.306Z","ecs.version":"8.10.0","http":{"request":{"id":"1897a990-883f-4955-b2a5-d0388c18c66b","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
        # Subtest: Translate enwiki protected page with multi-word title
        ok 16 - Translate enwiki protected page with multi-word title
          ---
          duration_ms: 146.4453
          ...
# {"@timestamp":"2026-05-01T09:43:15.325Z","ecs.version":"8.10.0","http":{"request":{"id":"99f2035d-01fa-4180-b073-f4bf5ddc34e3","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# {"@timestamp":"2026-05-01T09:43:15.456Z","ecs.version":"8.10.0","http":{"request":{"id":"99f2035d-01fa-4180-b073-f4bf5ddc34e3","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
        # Subtest: Translate enwiki protected page with revision
        ok 17 - Translate enwiki protected page with revision
          ---
          duration_ms: 141.314842
          ...
        # Subtest: Machine translate an HTML fragment without provider, and an invalid language pair
        ok 18 - Machine translate an HTML fragment without provider, and an invalid language pair
          ---
          duration_ms: 9.947823
          ...
        # Subtest: Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.
        ok 19 - Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.
          ---
          duration_ms: 205.375953
          ...
        # Subtest: Return the target language link for the given source title and language pairs
        ok 20 - Return the target language link for the given source title and language pairs
          ---
          duration_ms: 170.026003
          ...
        # Subtest: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
        ok 21 - Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
          ---
          duration_ms: 18.282562
          ...
        # Subtest: Return the target language link for the given source title and language pairs
        ok 22 - Return the target language link for the given source title and language pairs
          ---
          duration_ms: 17.309207
          ...
        # Subtest: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
        ok 23 - Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
          ---
          duration_ms: 14.696614
          ...
# {"@timestamp":"2026-05-01T09:43:15.905Z","ecs.version":"8.10.0","http":{"request":{"id":"74f55bf1-88a5-4b38-8761-e7cfb7c617b2","method":"GET"}},"log.level":"debug","message":"Attempting Paneer in en","service":"cxserver-dev","url":{"path":"/v2/suggest/source/Paneer/ca?sourcelanguages=en"}}
        # Subtest: Suggest a source title to use for translation
        ok 24 - Suggest a source title to use for translation
          ---
          duration_ms: 72.983581
          ...
        # Subtest: Suggest target section titles for given source sections
        ok 25 - Suggest target section titles for given source sections
          ---
          duration_ms: 45.665244
          ...
        # Subtest: Suggest source sections to translate
        ok 26 - Suggest source sections to translate
          ---
          duration_ms: 153.894998
          ...
        # Subtest: Suggest source sections to translate for multiple titles
        ok 27 - Suggest source sections to translate for multiple titles
          ---
          duration_ms: 237.458335
          ...
        # Subtest: retrieve service info
        ok 28 - retrieve service info
          ---
          duration_ms: 2.658962
          ...
        # Subtest: retrieve service name
        ok 29 - retrieve service name
          ---
          duration_ms: 2.147046
          ...
        # Subtest: retrieve service version
        ok 30 - retrieve service version
          ---
          duration_ms: 6.354363
          ...
        # Subtest: redirect to the home page
        ok 31 - redirect to the home page
          ---
          duration_ms: 2.258099
          ...
        1..31
    ok 4 - routes
      ---
      duration_ms: 2424.217472
      type: 'suite'
      ...
    1..4
ok 5 - Swagger spec
  ---
  duration_ms: 2558.257344
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:14.231Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.278Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.280Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.300Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: service information
    # Subtest: should get the service name
    ok 1 - should get the service name
      ---
      duration_ms: 33.950369
      ...
    # Subtest: should get the service version
    ok 2 - should get the service version
      ---
      duration_ms: 6.595729
      ...
    # Subtest: should redirect to the service home page
    ok 3 - should redirect to the service home page
      ---
      duration_ms: 5.867637
      ...
    # Subtest: should get the service info
    ok 4 - should get the service info
      ---
      duration_ms: 4.543441
      ...
    1..4
ok 6 - service information
  ---
  duration_ms: 134.737766
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:14.113Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.147Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.149Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.182Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.209Z","ecs.version":"8.10.0","http":{"request":{"id":"60a7592e-e2f5-4988-b28f-a572c6b2e7f4","method":"GET"}},"log.level":"debug","message":"Getting page en:Oxygen","service":"cxserver-dev","url":{"path":"/v1/page/en/Oxygen"}}
# {"@timestamp":"2026-05-01T09:43:14.871Z","ecs.version":"8.10.0","http":{"request":{"id":"60a7592e-e2f5-4988-b28f-a572c6b2e7f4","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/Oxygen"}}
# Subtest: v1 api - page gets
    # Subtest: should get the whole page body
    ok 1 - should get the whole page body
      ---
      duration_ms: 749.606755
      ...
    # Subtest: should throw a 404 for a non-existent page
    ok 2 - should throw a 404 for a non-existent page
      ---
      duration_ms: 10.745014
      ...
    1..2
ok 7 - v1 api - page gets
  ---
  duration_ms: 845.520817
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:16.206Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:16.257Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:16.259Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:16.286Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:16.313Z","ecs.version":"8.10.0","http":{"request":{"id":"3b3d32f5-2e77-4a54-9cb0-7b3544182cf0","method":"GET"}},"log.level":"debug","message":"Getting page en:Pickling for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Pickling"}}
# {"@timestamp":"2026-05-01T09:43:16.856Z","ecs.version":"8.10.0","http":{"request":{"id":"3b3d32f5-2e77-4a54-9cb0-7b3544182cf0","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Pickling"}}
# Subtest: v2 api - page gets
    # Subtest: should get the whole page body
    ok 1 - should get the whole page body
      ---
      duration_ms: 589.149523
      ...
# {"@timestamp":"2026-05-01T09:43:16.885Z","ecs.version":"8.10.0","http":{"request":{"id":"7e37fca3-b8c5-4593-baf0-df2b63856057","method":"GET"}},"log.level":"debug","message":"Getting page en:Wikipedia_content_translation_system for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Wikipedia_content_translation_system"}}
    # Subtest: should throw a 404 for a non-existent page
    ok 2 - should throw a 404 for a non-existent page
      ---
      duration_ms: 78.265758
      ...
    1..2
ok 8 - v2 api - page gets
  ---
  duration_ms: 762.112291
  type: 'suite'
  ...
# Subtest: LinearDoc
    # Subtest: should be possible to linearise all kind of HTML inputs
    ok 1 - should be possible to linearise all kind of HTML inputs
      ---
      duration_ms: 37.887681
      ...
    # Subtest: should be possible to reconstruct the HTML from LinearDoc
    ok 2 - should be possible to reconstruct the HTML from LinearDoc
      ---
      duration_ms: 2.24283
      ...
    # Subtest: should be possible to reduce and expand a document
    ok 3 - should be possible to reduce and expand a document
      ---
      duration_ms: 5.694701
      ...
    # Subtest: test HTML compaction roundtrip with inline chunks
    ok 4 - test HTML compaction roundtrip with inline chunks
      ---
      duration_ms: 4.362816
      ...
    # Subtest: test HTML expand with external attributes inserted
    ok 5 - test HTML expand with external attributes inserted
      ---
      duration_ms: 0.723845
      ...
    # Subtest: test if the content is block level template
    ok 6 - test if the content is block level template
      ---
      duration_ms: 98.55765
      ...
    # Subtest: test HTML compaction roundtrip with inline style content
    ok 7 - test HTML compaction roundtrip with inline style content
      ---
      duration_ms: 1.996364
      ...
    # Subtest: test HTML compaction roundtrip with template with empty content
    ok 8 - test HTML compaction roundtrip with template with empty content
      ---
      duration_ms: 3.246923
      ...
    # Subtest: test getRootItem for ignoring blockspaces
    ok 9 - test getRootItem for ignoring blockspaces
      ---
      duration_ms: 0.807435
      ...
    # Subtest: test getRootItem for not ignoring non-whitespace content in textblock
    ok 10 - test getRootItem for not ignoring non-whitespace content in textblock
      ---
      duration_ms: 0.540174
      ...
    # Subtest: test getRootItem for ignoring whitespace content in textblock
    ok 11 - test getRootItem for ignoring whitespace content in textblock
      ---
      duration_ms: 0.529952
      ...
    1..11
ok 9 - LinearDoc
  ---
  duration_ms: 159.254892
  type: 'suite'
  ...
# Subtest: Apertium machine translation
    # Subtest: Test: All caps words
    ok 1 - Test: All caps words
      ---
      duration_ms: 243.484364
      ...
    # Subtest: Test: Title caps one-to-many
    ok 2 - Test: Title caps one-to-many
      ---
      duration_ms: 25.638732
      ...
    # Subtest: Test: Reordering with nested tags
    ok 3 - Test: Reordering with nested tags
      ---
      duration_ms: 38.91448
      ...
    # Subtest: Test: Many-to-one with nested tags
    ok 4 - Test: Many-to-one with nested tags
      ---
      duration_ms: 45.12346
      ...
    # Subtest: Test: Reordering at either ends of a tag
    ok 5 - Test: Reordering at either ends of a tag
      ---
      duration_ms: 25.913137
      ...
    # Subtest: Test: Identical tags separated by whitespace
    ok 6 - Test: Identical tags separated by whitespace
      ---
      duration_ms: 32.822137
      ...
    # Subtest: Test: Non-identical links separated by whitespace
    ok 7 - Test: Non-identical links separated by whitespace
      ---
      duration_ms: 25.856245
      ...
    # Subtest: Test: Find longest match among multiple matches
    ok 8 - Test: Find longest match among multiple matches
      ---
      duration_ms: 57.782219
      ...
    # Subtest: Test: Do not translate content inside the style tags
    ok 9 - Test: Do not translate content inside the style tags
      ---
      duration_ms: 67.464117
      ...
    1..9
ok 10 - Apertium machine translation
  ---
  duration_ms: 565.68264
  type: 'suite'
  ...
# Subtest: Elia machine translation
    # Subtest: Should fail because of wrong key 
    ok 1 - Should fail because of wrong key 
      ---
      duration_ms: 6.741771
      ...
    1..1
ok 11 - Elia machine translation
  ---
  duration_ms: 8.429059
  type: 'suite'
  ...
# Subtest: Google machine translation
    # Subtest: Should fail because of wrong key 
    ok 1 - Should fail because of wrong key 
      ---
      duration_ms: 12.36026
      ...
    1..1
ok 12 - Google machine translation
  ---
  duration_ms: 14.250183
  type: 'suite'
  ...
# Subtest: LingoCloud machine translation
    # Subtest: Should fail because of wrong key 
    ok 1 - Should fail because of wrong key 
      ---
      duration_ms: 7.185099
      ...
    1..1
ok 13 - LingoCloud machine translation
  ---
  duration_ms: 8.942631
  type: 'suite'
  ...
# Subtest: Machine translation with wrapped html result
    # Subtest: Should throw error
    ok 1 - Should throw error
      ---
      duration_ms: 12.175438
      ...
    1..1
ok 14 - Machine translation with wrapped html result
  ---
  duration_ms: 19.348526
  type: 'suite'
  ...
# Subtest: Machine translation result with extra spaces
    # Subtest: Should be cleaned up
    ok 1 - Should be cleaned up
      ---
      duration_ms: 169.960817
      ...
    1..1
ok 15 - Machine translation result with extra spaces
  ---
  duration_ms: 170.257698
  type: 'suite'
  ...
# Subtest: Subsequence match finding
    # Subtest: Should return correct range mapping
    ok 1 - Should return correct range mapping
      ---
      duration_ms: 2.895419
      ...
    1..1
ok 16 - Subsequence match finding
  ---
  duration_ms: 3.164481
  type: 'suite'
  ...
# Subtest: Template translation
    # Subtest: should not translate the fragement contents.
    ok 1 - should not translate the fragement contents.
      ---
      duration_ms: 162.587617
      ...
    1..1
ok 17 - Template translation
  ---
  duration_ms: 164.164973
  type: 'suite'
  ...
# Subtest: Config transform tests
    # Subtest: Simple cross product of languages
    ok 1 - Simple cross product of languages
      ---
      duration_ms: 2.522064
      ...
    # Subtest: Do not translate between two variants of English
    ok 2 - Do not translate between two variants of English
      ---
      duration_ms: 0.30369
      ...
    # Subtest: Exclude "notAsTarget" languages
    ok 3 - Exclude "notAsTarget" languages
      ---
      duration_ms: 0.19448
      ...
    # Subtest: Handle pairs in the configuration
    ok 4 - Handle pairs in the configuration
      ---
      duration_ms: 0.406894
      ...
    1..4
ok 18 - Config transform tests
  ---
  duration_ms: 5.341817
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:21.282Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.332Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.333Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.360Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: MWPageLoader tests
    # Subtest: Test: Add data-section-number attribute to every CX section
    ok 1 - Test: Add data-section-number attribute to every CX section
      ---
      duration_ms: 23.174851
      ...
    1..1
ok 19 - MWPageLoader tests
  ---
  duration_ms: 119.164421
  type: 'suite'
  ...
# Subtest: Section wrap tests
    # Subtest: should parse correctly when section has common pattern of elements
    ok 1 - should parse correctly when section has common pattern of elements
      ---
      duration_ms: 2.178895
      ...
    # Subtest: should extract correct number of categories when section has common pattern of elements
    ok 2 - should extract correct number of categories when section has common pattern of elements
      ---
      duration_ms: 1.282766
      ...
    # Subtest: should parse correctly when section has categories to be extracted
    ok 3 - should parse correctly when section has categories to be extracted
      ---
      duration_ms: 0.165579
      ...
    # Subtest: should extract correct number of categories when section has categories to be extracted
    ok 4 - should extract correct number of categories when section has categories to be extracted
      ---
      duration_ms: 0.151157
      ...
    # Subtest: should parse correctly when content has nested sections and tricky transclusion context
    ok 5 - should parse correctly when content has nested sections and tricky transclusion context
      ---
      duration_ms: 0.144244
      ...
    # Subtest: should extract correct number of categories when content has nested sections and tricky transclusion context
    ok 6 - should extract correct number of categories when content has nested sections and tricky transclusion context
      ---
      duration_ms: 0.144624
      ...
    # Subtest: should parse correctly when content has blank template and then an unrelated table
    ok 7 - should parse correctly when content has blank template and then an unrelated table
      ---
      duration_ms: 0.310476
      ...
    # Subtest: should extract correct number of categories when content has blank template and then an unrelated table
    ok 8 - should extract correct number of categories when content has blank template and then an unrelated table
      ---
      duration_ms: 0.161236
      ...
    # Subtest: should parse correctly when content is complete page content with html, head tags and body having two templates with fragments
    ok 9 - should parse correctly when content is complete page content with html, head tags and body having two templates with fragments
      ---
      duration_ms: 0.427975
      ...
    # Subtest: should extract correct number of categories when content is complete page content with html, head tags and body having two templates with fragments
    ok 10 - should extract correct number of categories when content is complete page content with html, head tags and body having two templates with fragments
      ---
      duration_ms: 0.348858
      ...
    # Subtest: should parse correctly when Content has self closing meta tag
    ok 11 - should parse correctly when Content has self closing meta tag
      ---
      duration_ms: 0.182198
      ...
    # Subtest: should extract correct number of categories when Content has self closing meta tag
    ok 12 - should extract correct number of categories when Content has self closing meta tag
      ---
      duration_ms: 0.17191
      ...
    # Subtest: should parse correctly when Content has template fragments and one fragment is a section candidate. Section has categories too
    ok 13 - should parse correctly when Content has template fragments and one fragment is a section candidate. Section has categories too
      ---
      duration_ms: 0.206786
      ...
    # Subtest: should extract correct number of categories when Content has template fragments and one fragment is a section candidate. Section has categories too
    ok 14 - should extract correct number of categories when Content has template fragments and one fragment is a section candidate. Section has categories too
      ---
      duration_ms: 0.137682
      ...
    # Subtest: should parse correctly when Content has transclusion and one of its fragment get removed since it is ignorable.
    ok 15 - should parse correctly when Content has transclusion and one of its fragment get removed since it is ignorable.
      ---
      duration_ms: 0.266765
      ...
    # Subtest: should extract correct number of categories when Content has transclusion and one of its fragment get removed since it is ignorable.
    ok 16 - should extract correct number of categories when Content has transclusion and one of its fragment get removed since it is ignorable.
      ---
      duration_ms: 0.130011
      ...
    # Subtest: should parse correctly when Content has transclusion and same element is removable templatestyle. So do not remove
    ok 17 - should parse correctly when Content has transclusion and same element is removable templatestyle. So do not remove
      ---
      duration_ms: 0.122431
      ...
    # Subtest: should extract correct number of categories when Content has transclusion and same element is removable templatestyle. So do not remove
    ok 18 - should extract correct number of categories when Content has transclusion and same element is removable templatestyle. So do not remove
      ---
      duration_ms: 0.343116
      ...
    1..18
ok 20 - Section wrap tests
  ---
  duration_ms: 9.865666
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:21.520Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.579Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.588Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.614Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Title pair tests
    # Subtest: should adapt the title when: Corresponding title exist in target language
    ok 1 - should adapt the title when: Corresponding title exist in target language
      ---
      duration_ms: 157.74141
      ...
    # Subtest: should adapt the title when: Corresponding title exist in target language
    ok 2 - should adapt the title when: Corresponding title exist in target language
      ---
      duration_ms: 0.658877
      ...
    # Subtest: should adapt the title when: Corresponding title exist in target language and given title need normalization
    ok 3 - should adapt the title when: Corresponding title exist in target language and given title need normalization
      ---
      duration_ms: 0.254332
      ...
    # Subtest: should adapt the title when: Corresponding title does not exist in target language and given title need normalization
    ok 4 - should adapt the title when: Corresponding title does not exist in target language and given title need normalization
      ---
      duration_ms: 0.230443
      ...
    # Subtest: should adapt the title when: Corresponding title exist in target language and given title need normalization, has parenthesis
    ok 5 - should adapt the title when: Corresponding title exist in target language and given title need normalization, has parenthesis
      ---
      duration_ms: 0.200256
      ...
    # Subtest: should adapt the title when: Source title is percentage encoded, but should not throw error, should return corresponding title
    ok 6 - should adapt the title when: Source title is percentage encoded, but should not throw error, should return corresponding title
      ---
      duration_ms: 0.689983
      ...
    # Subtest: should have the queue size 50
    ok 7 - should have the queue size 50
      ---
      duration_ms: 2.0558
      ...
    1..7
ok 21 - Title pair tests
  ---
  duration_ms: 250.184312
  ...
# Subtest: Section extractor tests
    # Subtest: should extract section titles correctly
    ok 1 - should extract section titles correctly
      ---
      duration_ms: 4.481718
      ...
    # Subtest: should extract section sizes correctly
    ok 2 - should extract section sizes correctly
      ---
      duration_ms: 83.892711
      ...
    # Subtest: should extract section titles correctly
    ok 3 - should extract section titles correctly
      ---
      duration_ms: 1.123293
      ...
    # Subtest: should extract section sizes correctly
    ok 4 - should extract section sizes correctly
      ---
      duration_ms: 31.412927
      ...
    1..4
ok 22 - Section extractor tests
  ---
  duration_ms: 123.2928
  type: 'suite'
  ...
# Subtest: Segmentation tests for am
    # Subtest: should not have any errors when: Amharic segmentation - basic test
    ok 1 - should not have any errors when: Amharic segmentation - basic test
      ---
      duration_ms: 1.364059
      ...
    1..1
ok 23 - Segmentation tests for am
  ---
  duration_ms: 3.076444
  type: 'suite'
  ...
# Subtest: Segmentation tests for en
    # Subtest: should not have any errors when: Simple paragraph test
    ok 1 - should not have any errors when: Simple paragraph test
      ---
      duration_ms: 0.5536
      ...
    # Subtest: should not have any errors when: Sentence ending with )
    ok 2 - should not have any errors when: Sentence ending with )
      ---
      duration_ms: 0.162626
      ...
    # Subtest: should not have any errors when: Exclamation, punctuation test
    ok 3 - should not have any errors when: Exclamation, punctuation test
      ---
      duration_ms: 0.142218
      ...
    # Subtest: should not have any errors when: Multiple sentences
    ok 4 - should not have any errors when: Multiple sentences
      ---
      duration_ms: 0.131005
      ...
    # Subtest: should not have any errors when: Multiple sections - div, h1, paragraph
    ok 5 - should not have any errors when: Multiple sections - div, h1, paragraph
      ---
      duration_ms: 0.140867
      ...
    # Subtest: should not have any errors when: Sentence starting with a link
    ok 6 - should not have any errors when: Sentence starting with a link
      ---
      duration_ms: 0.128166
      ...
    # Subtest: should not have any errors when: Sentence starting with a link and ending with a link
    ok 7 - should not have any errors when: Sentence starting with a link and ending with a link
      ---
      duration_ms: 0.228483
      ...
    # Subtest: should not have any errors when: Figure
    ok 8 - should not have any errors when: Figure
      ---
      duration_ms: 0.314178
      ...
    # Subtest: should not have any errors when: References can appear after period without space. Example: Hydrogen is a gas.[1] It is ...
    ok 9 - should not have any errors when: References can appear after period without space. Example: Hydrogen is a gas.[1] It is ...
      ---
      duration_ms: 0.182783
      ...
    # Subtest: should not have any errors when: References can appear after period without space, repeated. Example: Hydrogen is a gas.[1][2][3] It is ...
    ok 10 - should not have any errors when: References can appear after period without space, repeated. Example: Hydrogen is a gas.[1][2][3] It is ...
      ---
      duration_ms: 0.186984
      ...
    # Subtest: should not have any errors when: References can appear inside a sentence. Example: Hydrogen is a gas[1] and it is ...
    ok 11 - should not have any errors when: References can appear inside a sentence. Example: Hydrogen is a gas[1] and it is ...
      ---
      duration_ms: 0.307646
      ...
    # Subtest: should not have any errors when: References can appear inside a sentence. Example:Hydrogen's atomic number is one. Hydrogen is a gas[1] and it is ..... Test the flags are reset properly
    ok 12 - should not have any errors when: References can appear inside a sentence. Example:Hydrogen's atomic number is one. Hydrogen is a gas[1] and it is ..... Test the flags are reset properly
      ---
      duration_ms: 0.140006
      ...
    # Subtest: should not have any errors when: References can appear repeated inside a sentence. Example: Hydrogen is a gas[1][2][3] and it is ...
    ok 13 - should not have any errors when: References can appear repeated inside a sentence. Example: Hydrogen is a gas[1][2][3] and it is ...
      ---
      duration_ms: 0.259445
      ...
    # Subtest: should not have any errors when: References can appear after period and space. Example: Hydrogen is a gas. [1] It is ...
    ok 14 - should not have any errors when: References can appear after period and space. Example: Hydrogen is a gas. [1] It is ...
      ---
      duration_ms: 0.179164
      ...
    # Subtest: should not have any errors when: Paragraph from Debian article- repeating references
    ok 15 - should not have any errors when: Paragraph from Debian article- repeating references
      ---
      duration_ms: 0.144277
      ...
    # Subtest: should not have any errors when: References after closing bracket and period.
    ok 16 - should not have any errors when: References after closing bracket and period.
      ---
      duration_ms: 0.118121
      ...
    # Subtest: should not have any errors when: Three sentences in a single text node
    ok 17 - should not have any errors when: Three sentences in a single text node
      ---
      duration_ms: 0.297588
      ...
    # Subtest: should not have any errors when: Paragraph ending with reference and already having reference in between. The second reference should not be identified as repeating reference. If identified as repeating reference, 7 letters from last word will be missing.
    ok 18 - should not have any errors when: Paragraph ending with reference and already having reference in between. The second reference should not be identified as repeating reference. If identified as repeating reference, 7 letters from last word will be missing.
      ---
      duration_ms: 0.148807
      ...
    # Subtest: should not have any errors when: Sentences ending with abbreviations
    ok 19 - should not have any errors when: Sentences ending with abbreviations
      ---
      duration_ms: 0.102006
      ...
    # Subtest: should not have any errors when: link element inside span element
    ok 20 - should not have any errors when: link element inside span element
      ---
      duration_ms: 0.095156
      ...
    # Subtest: should not have any errors when: Do not break inside of links with abbreviations. Example: Carl E. Wieman. See https://phabricator.wikimedia.org/T99504
    ok 21 - should not have any errors when: Do not break inside of links with abbreviations. Example: Carl E. Wieman. See https://phabricator.wikimedia.org/T99504
      ---
      duration_ms: 0.093443
      ...
    # Subtest: should not have any errors when: A non-segmentable text chunk inside a textblock should not mark the whole text chunk non-segmentable
    ok 22 - should not have any errors when: A non-segmentable text chunk inside a textblock should not mark the whole text chunk non-segmentable
      ---
      duration_ms: 0.083945
      ...
    # Subtest: should not have any errors when: Figure-inline segmentation. Do not violate the MediaWiki DOM spec https://www.mediawiki.org/wiki/Specs/HTML\#Images
    ok 23 - should not have any errors when: Figure-inline segmentation. Do not violate the MediaWiki DOM spec https://www.mediawiki.org/wiki/Specs/HTML\#Images
      ---
      duration_ms: 0.079214
      ...
    # Subtest: should not have any errors when: Figure-inline inside a transclusions
    ok 24 - should not have any errors when: Figure-inline inside a transclusions
      ---
      duration_ms: 0.078708
      ...
    # Subtest: should not have any errors when: Video tag in figure tag
    ok 25 - should not have any errors when: Video tag in figure tag
      ---
      duration_ms: 0.081835
      ...
    # Subtest: should not have any errors when: Audio tag in figure tag
    ok 26 - should not have any errors when: Audio tag in figure tag
      ---
      duration_ms: 0.07778
      ...
    # Subtest: should not have any errors when: Audio tag in figure-inline tag
    ok 27 - should not have any errors when: Audio tag in figure-inline tag
      ---
      duration_ms: 0.079217
      ...
    # Subtest: should not have any errors when: Video tag in figure-inline tag
    ok 28 - should not have any errors when: Video tag in figure-inline tag
      ---
      duration_ms: 0.078728
      ...
    # Subtest: should not have any errors when: Do not segment content inside block templates
    ok 29 - should not have any errors when: Do not segment content inside block templates
      ---
      duration_ms: 0.080611
      ...
    # Subtest: should not have any errors when: about attribute alone does not initiate a transclusion context
    ok 30 - should not have any errors when: about attribute alone does not initiate a transclusion context
      ---
      duration_ms: 0.087484
      ...
    # Subtest: should not have any errors when: Do not consider style tag with transclusion as block tag
    ok 31 - should not have any errors when: Do not consider style tag with transclusion as block tag
      ---
      duration_ms: 0.199341
      ...
    # Subtest: should not have any errors when: Sections with singe paragraph and a transclusion based reference at th end - T283513
    ok 32 - should not have any errors when: Sections with singe paragraph and a transclusion based reference at th end - T283513
      ---
      duration_ms: 0.188024
      ...
    # Subtest: should not have any errors when: Handle abbreviations such as Brown v. Board of education - T338689
    ok 33 - should not have any errors when: Handle abbreviations such as Brown v. Board of education - T338689
      ---
      duration_ms: 0.139667
      ...
    1..33
ok 24 - Segmentation tests for en
  ---
  duration_ms: 6.92017
  type: 'suite'
  ...
# Subtest: Segmentation tests for de
    # Subtest: should not have any errors when: Avoid segmenting inside a transclusion textblock
    ok 1 - should not have any errors when: Avoid segmenting inside a transclusion textblock
      ---
      duration_ms: 0.130365
      ...
    1..1
ok 25 - Segmentation tests for de
  ---
  duration_ms: 0.301786
  type: 'suite'
  ...
# Subtest: Segmentation tests for hi
    # Subtest: should not have any errors when: Hindi segmentation - basic test
    ok 1 - should not have any errors when: Hindi segmentation - basic test
      ---
      duration_ms: 0.112459
      ...
    1..1
ok 26 - Segmentation tests for hi
  ---
  duration_ms: 0.198559
  type: 'suite'
  ...
# Subtest: Segmentation tests for hy
    # Subtest: should not have any errors when: Armenian segmentation - basic test
    ok 1 - should not have any errors when: Armenian segmentation - basic test
      ---
      duration_ms: 0.159218
      ...
    1..1
ok 27 - Segmentation tests for hy
  ---
  duration_ms: 0.248794
  type: 'suite'
  ...
# Subtest: Segmentation tests for ja
    # Subtest: should not have any errors when: Japanese segmentation - basic test
    ok 1 - should not have any errors when: Japanese segmentation - basic test
      ---
      duration_ms: 0.109806
      ...
    1..1
ok 28 - Segmentation tests for ja
  ---
  duration_ms: 0.193951
  type: 'suite'
  ...
# Subtest: Segmentation tests for zh
    # Subtest: should not have any errors when: Chinese segmentation - basic test
    ok 1 - should not have any errors when: Chinese segmentation - basic test
      ---
      duration_ms: 0.120532
      ...
    1..1
ok 29 - Segmentation tests for zh
  ---
  duration_ms: 0.200393
  type: 'suite'
  ...
# Subtest: Segmentation tests for pa
    # Subtest: should not have any errors when: Punjabi segmentation - basic test
    ok 1 - should not have any errors when: Punjabi segmentation - basic test
      ---
      duration_ms: 0.156684
      ...
    1..1
ok 30 - Segmentation tests for pa
  ---
  duration_ms: 0.241397
  type: 'suite'
  ...
# Subtest: SectionSuggester tests
    # Subtest: should find present and missing sections
    ok 1 - should find present and missing sections
      ---
      duration_ms: 22.345322
      ...
    1..1
ok 31 - SectionSuggester tests
  ---
  duration_ms: 24.42431
  type: 'suite'
  ...
# Subtest: /src/repo/test/testutils.js
ok 23 - /src/repo/test/testutils.js
  ---
  duration_ms: 173.315886
  ...
# {"@timestamp":"2026-05-01T09:43:24.451Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.512Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.513Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.529Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Link Adaptation tests
    # Subtest: Basic test
    ok 1 - Basic test
      ---
      duration_ms: 167.390806
      ...
    # Subtest: Space in the title
    ok 2 - Space in the title
      ---
      duration_ms: 1.655559
      ...
    # Subtest: Relative URL
    ok 3 - Relative URL
      ---
      duration_ms: 0.916309
      ...
    # Subtest: Title with parenthesis
    ok 4 - Title with parenthesis
      ---
      duration_ms: 1.09805
      ...
    # Subtest: Target title does not exist
    ok 5 - Target title does not exist
      ---
      duration_ms: 0.775195
      ...
    # Subtest: Title with translation from Wikidata label
    ok 6 - Title with translation from Wikidata label
      ---
      duration_ms: 1.209641
      ...
    # Subtest: ISBN Link adaptation
    ok 7 - ISBN Link adaptation
      ---
      duration_ms: 0.856749
      ...
    1..7
ok 33 - Link Adaptation tests
  ---
  duration_ms: 281.757843
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:24.483Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.521Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.523Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.547Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.563Z","ecs.version":"8.10.0","log.level":"debug","message":"Not-adapting a reference node without data-mw.body.html: trncttm-2","service":"cxserver-dev"}
# Subtest: Reference adaptation
    # Subtest: Adapting a reference with plain text content
    ok 1 - Adapting a reference with plain text content
      ---
      duration_ms: 3.76379
      ...
    # Subtest: Adapting a reference with plain text content, sup tag
    ok 2 - Adapting a reference with plain text content, sup tag
      ---
      duration_ms: 0.432672
      ...
    # Subtest: Adapting a reference with html content, sup tag
    ok 3 - Adapting a reference with html content, sup tag
      ---
      duration_ms: 0.250304
      ...
    # Subtest: Not adapting a reference with no data-mw.body
    ok 4 - Not adapting a reference with no data-mw.body
      ---
      duration_ms: 0.525715
      ...
    # Subtest: Partially adapting a reference with named reference
    ok 5 - Partially adapting a reference with named reference
      ---
      duration_ms: 0.428022
      ...
# {"@timestamp":"2026-05-01T09:43:24.987Z","ecs.version":"8.10.0","log.level":"error","message":"Not-adapting a template node with non-JSON data-mw: CITEREFGazette57855","service":"cxserver-dev"}
    # Subtest: Mark the reference adaptation failed when the content defined in template not adapted
    ok 6 - Mark the reference adaptation failed when the content defined in template not adapted
      ---
      duration_ms: 394.552868
      ...
    # Subtest: Mark the reference adaptation failed when the content defined in template and it is unsupported by CXserver
    ok 7 - Mark the reference adaptation failed when the content defined in template and it is unsupported by CXserver
      ---
      duration_ms: 61.316277
      ...
    # Subtest: Partial reference adaptation, when mandatory params are not transferred successfully
    ok 8 - Partial reference adaptation, when mandatory params are not transferred successfully
      ---
      duration_ms: 142.870596
      ...
    1..8
ok 34 - Reference adaptation
  ---
  duration_ms: 693.823181
  type: 'suite'
  ...
# {"@timestamp":"2026-05-01T09:43:25.182Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:25.220Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:25.221Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:25.242Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Template adaptation
    # Subtest: Template with no equivalents
    ok 1 - Template with no equivalents
      ---
      duration_ms: 144.478053
      ...
    # Subtest: Babel template
    ok 2 - Babel template
      ---
      duration_ms: 83.80104
      ...
    # Subtest: Cite web template
    ok 3 - Cite web template
      ---
      duration_ms: 147.578488
      ...
    # Subtest: Multi-part template for columns
    ok 4 - Multi-part template for columns
      ---
      duration_ms: 93.596665
      ...
    # Subtest: Template with equivalents, but target template data missing, no params mapped
    ok 5 - Template with equivalents, but target template data missing, no params mapped
      ---
      duration_ms: 69.422872
      ...
    # Subtest: Equivalent template exist, templatedata exists only for source language. Use that as hint for extracting params from template source code in target language
    ok 6 - Equivalent template exist, templatedata exists only for source language. Use that as hint for extracting params from template source code in target language
      ---
      duration_ms: 65.338738
      ...
    # Subtest: Template with equivalents, all mandatory params mapped
    ok 7 - Template with equivalents, all mandatory params mapped
      ---
      duration_ms: 81.662192
      ...
    # Subtest: Images that are generated by templates
    ok 8 - Images that are generated by templates
      ---
      duration_ms: 5.008036
      ...
    1..8
ok 35 - Template adaptation
  ---
  duration_ms: 755.224473
  ...
# Subtest: /src/repo/test/utils/assert.js
ok 27 - /src/repo/test/utils/assert.js
  ---
  duration_ms: 1168.385622
  ...
1..36
# tests 192
# suites 33
# pass 192
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 16973.687429

--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json

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

$ git add .
--- stdout ---

--- end ---
$ git commit -F /tmp/tmpxyt8v5iu
--- stdout ---
[master 1445c9b] build: Updating eslint-config-wikimedia to 0.32.3
 2 files changed, 339 insertions(+), 268 deletions(-)

--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 1445c9b1d85c3603ecc65373a967b439cc820bdc Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Fri, 1 May 2026 09:43:26 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.32.3

Change-Id: I2abb15ddbaa321fc49e934e8e81ea5b32ad1feea
---
 package-lock.json | 605 ++++++++++++++++++++++++++--------------------
 package.json      |   2 +-
 2 files changed, 339 insertions(+), 268 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 782fd3a..bc0b1d3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -45,7 +45,7 @@
 				"@eslint/js": "^9.34.0",
 				"argparse": "^2.0.1",
 				"async": "^3.2.3",
-				"eslint-config-wikimedia": "0.31.0",
+				"eslint-config-wikimedia": "0.32.3",
 				"eslint-plugin-import": "^2.31.0",
 				"globals": "^15.12.0",
 				"nodemon": "^3.0.1",
@@ -1833,35 +1833,28 @@
 			}
 		},
 		"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.76.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
+			"integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
 			"dev": true,
-			"license": "MIT",
 			"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.10.0"
 			},
 			"engines": {
-				"node": ">=16"
+				"node": ">=20.11.0"
 			}
 		},
-		"node_modules/@es-joy/jsdoccomment/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/@es-joy/resolve.exports": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+			"integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
+				"node": ">=10"
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
@@ -2201,11 +2194,10 @@
 			}
 		},
 		"node_modules/@mdn/browser-compat-data": {
-			"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,
-			"license": "CC0-1.0"
+			"version": "6.1.5",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-6.1.5.tgz",
+			"integrity": "sha512-PzdZZzRhcXvKB0begee28n5lvwAcinGKYuLZOVxHAZm+n7y01ddEGfdS1ZXRuVcV+ndG6mSEAE8vgudom5UjYg==",
+			"dev": true
 		},
 		"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
 			"version": "5.1.1-v1",
@@ -2364,6 +2356,18 @@
 			"hasInstallScript": true,
 			"license": "Apache-2.0"
 		},
+		"node_modules/@sindresorhus/base62": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+			"integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+			"dev": true,
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
 		"node_modules/@so-ric/colorspace": {
 			"version": "1.1.6",
 			"resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz",
@@ -2407,30 +2411,11 @@
 				"url": "https://opencollective.com/eslint"
 			}
 		},
-		"node_modules/@types/eslint": {
-			"version": "8.56.12",
-			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
-			"integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"@types/estree": "*",
-				"@types/json-schema": "*"
-			}
-		},
 		"node_modules/@types/estree": {
 			"version": "1.0.8",
 			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
 			"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
-			"dev": true,
-			"license": "MIT"
-		},
-		"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,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/@types/json5": {
 			"version": "0.0.29",
@@ -2443,8 +2428,7 @@
 			"version": "2.4.4",
 			"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
 			"integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/@types/triple-beam": {
 			"version": "1.3.5",
@@ -2460,17 +2444,16 @@
 			"optional": true
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"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",
+				"@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": "^7.0.0",
 				"natural-compare": "^1.4.0",
@@ -2484,22 +2467,21 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/parser": "^8.35.1",
+				"@typescript-eslint/parser": "^8.46.0",
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"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==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+			"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
 			"dev": true,
-			"license": "MIT",
 			"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"
+				"@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.9.0 || >=21.1.0"
@@ -2510,7 +2492,7 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
@@ -2518,22 +2500,20 @@
 			"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
 			"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">= 4"
 			}
 		},
 		"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==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+			"integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
 			"dev": true,
-			"license": "MIT",
 			"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",
+				"@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": {
@@ -2545,18 +2525,17 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/tsconfig-utils": "^8.35.1",
-				"@typescript-eslint/types": "^8.35.1",
+				"@typescript-eslint/tsconfig-utils": "^8.46.0",
+				"@typescript-eslint/types": "^8.46.0",
 				"debug": "^4.3.4"
 			},
 			"engines": {
@@ -2567,18 +2546,17 @@
 				"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/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==",
+			"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,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/types": "8.35.1",
-				"@typescript-eslint/visitor-keys": "8.35.1"
+				"@typescript-eslint/types": "8.46.0",
+				"@typescript-eslint/visitor-keys": "8.46.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2589,11 +2567,10 @@
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
@@ -2602,18 +2579,18 @@
 				"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": "8.35.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
-			"integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
+			"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,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/typescript-estree": "8.35.1",
-				"@typescript-eslint/utils": "8.35.1",
+				"@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": "^2.1.0"
 			},
@@ -2626,20 +2603,19 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"node_modules/@typescript-eslint/type-utils/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==",
+			"version": "8.46.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+			"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
 			"dev": true,
-			"license": "MIT",
 			"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"
+				"@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.9.0 || >=21.1.0"
@@ -2650,15 +2626,14 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0",
-				"typescript": ">=4.8.4 <5.9.0"
+				"typescript": ">=4.8.4 <6.0.0"
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
@@ -2668,16 +2643,15 @@
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"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",
+				"@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",
 				"fast-glob": "^3.3.2",
 				"is-glob": "^4.0.3",
@@ -2693,7 +2667,7 @@
 				"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/typescript-estree/node_modules/brace-expansion": {
@@ -2701,7 +2675,6 @@
 			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
 			"integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"balanced-match": "^1.0.0"
 			}
@@ -2711,7 +2684,6 @@
 			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
 			"integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
 			"dev": true,
-			"license": "ISC",
 			"dependencies": {
 				"brace-expansion": "^2.0.2"
 			},
@@ -2727,7 +2699,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
 			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -2942,13 +2913,12 @@
 			}
 		},
 		"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==",
+			"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,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/types": "8.35.1",
+				"@typescript-eslint/types": "8.46.0",
 				"eslint-visitor-keys": "^4.2.1"
 			},
 			"engines": {
@@ -2964,7 +2934,6 @@
 			"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,
-			"license": "Apache-2.0",
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
@@ -3199,7 +3168,6 @@
 			"resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
 			"integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=14"
 			}
@@ -3350,11 +3318,16 @@
 			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
 			"integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"@mdn/browser-compat-data": "^5.6.19"
 			}
 		},
+		"node_modules/ast-metadata-inferer/node_modules/@mdn/browser-compat-data": {
+			"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/async": {
 			"version": "3.2.6",
 			"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
@@ -3684,7 +3657,6 @@
 			"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
 			"integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=6"
 			},
@@ -3983,7 +3955,6 @@
 					"url": "https://github.com/sponsors/sibiraj-s"
 				}
 			],
-			"license": "MIT",
 			"engines": {
 				"node": ">=8"
 			}
@@ -3993,7 +3964,6 @@
 			"resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
 			"integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"escape-string-regexp": "^1.0.5"
 			},
@@ -4006,7 +3976,6 @@
 			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
 			"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=0.8.0"
 			}
@@ -4135,7 +4104,6 @@
 			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
 			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">= 12.0.0"
 			}
@@ -4691,7 +4659,6 @@
 			"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
 			"integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"is-arrayish": "^0.2.1"
 			}
@@ -4964,35 +4931,114 @@
 			}
 		},
 		"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.3",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.3.tgz",
+			"integrity": "sha512-Ekz2/ozpCCjQl3VbC6dW7ChqoW7FRilLDxmJ+FJOZhIxxzZSZR5QqQOAGWSZAlG1ONkZbYV/TPwGLWZcrNxyaA==",
 			"dev": true,
-			"license": "MIT",
 			"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.3.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.2",
+				"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": ">=20 <25"
+			}
+		},
+		"node_modules/eslint-config-wikimedia/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.1.2",
+				"@eslint-community/regexpp": "^4.12.1",
+				"eslint-compat-utils": "^0.6.3"
+			},
+			"engines": {
+				"node": "^14.18.0 || >=16.0.0"
+			},
+			"peerDependencies": {
+				"eslint": ">=8"
+			}
+		},
+		"node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-es-x/node_modules/eslint-compat-utils": {
+			"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"
 			},
 			"engines": {
-				"node": ">=18 <25"
+				"node": ">=12"
+			},
+			"peerDependencies": {
+				"eslint": ">=6.0.0"
+			}
+		},
+		"node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio": {
+			"version": "9.27.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.27.1.tgz",
+			"integrity": "sha512-p/e1nKlb4tGFHv06DJh8ChuoJnQJGrj2ed/RrFQrX3Q3Kx0+GcRYWjyWMhO4DIA1DjU+7JEr957IPanHmz7UHw==",
+			"dev": true,
+			"engines": {
+				"node": ">=18.20.0"
+			},
+			"peerDependencies": {
+				"eslint": "^9.39.2",
+				"globals": "^16.5.0",
+				"typescript-eslint": "^8.54.0"
+			},
+			"peerDependenciesMeta": {
+				"typescript-eslint": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/eslint-config-wikimedia/node_modules/globals": {
+			"version": "16.5.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+			"integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+			"dev": true,
+			"peer": true,
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/eslint-config-wikimedia/node_modules/semver": {
+			"version": "7.7.4",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+			"dev": true,
+			"bin": {
+				"semver": "bin/semver.js"
+			},
+			"engines": {
+				"node": ">=10"
 			}
 		},
 		"node_modules/eslint-import-resolver-node": {
@@ -5070,25 +5116,24 @@
 			}
 		},
 		"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==",
+			"version": "6.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.2.1.tgz",
+			"integrity": "sha512-gLKqUH+lQcCL+HzsROUjBDvakc5Zaga51Y4ZAkPCXc41pzKBfyluqTr2j8zOx8QQQb7zyglu1LVoL5aSNWf2SQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
-				"@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": "^6.1.1",
+				"ast-metadata-inferer": "^0.8.1",
+				"browserslist": "^4.25.2",
 				"find-up": "^5.0.0",
+				"globals": "^15.7.0",
 				"lodash.memoize": "^4.1.2",
-				"semver": "^7.5.4"
+				"semver": "^7.6.2"
 			},
 			"engines": {
-				"node": ">=14.x"
+				"node": ">=18.x"
 			},
 			"peerDependencies": {
-				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-compat/node_modules/semver": {
@@ -5096,7 +5141,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
 			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -5184,21 +5228,21 @@
 			}
 		},
 		"node_modules/eslint-plugin-jest": {
-			"version": "28.14.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz",
-			"integrity": "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==",
+			"version": "29.15.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz",
+			"integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0"
+				"@typescript-eslint/utils": "^8.0.0"
 			},
 			"engines": {
-				"node": "^16.10.0 || ^18.12.0 || >=20.0.0"
+				"node": "^20.12.0 || ^22.0.0 || >=24.0.0"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0",
-				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
-				"jest": "*"
+				"@typescript-eslint/eslint-plugin": "^8.0.0",
+				"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+				"jest": "*",
+				"typescript": ">=4.8.4 <7.0.0"
 			},
 			"peerDependenciesMeta": {
 				"@typescript-eslint/eslint-plugin": {
@@ -5206,28 +5250,35 @@
 				},
 				"jest": {
 					"optional": true
+				},
+				"typescript": {
+					"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==",
+			"version": "61.3.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.3.0.tgz",
+			"integrity": "sha512-E4m/5J5lrasd63Z74q4CCZ4PFnywnnrcvA7zZ98802NPhrZKKTp5NH+XAT+afcjXp2ps2/OQF5gPSWCT2XFCJg==",
 			"dev": true,
-			"license": "BSD-3-Clause",
 			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.43.0",
+				"@es-joy/jsdoccomment": "~0.76.0",
+				"@es-joy/resolve.exports": "1.2.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",
-				"spdx-expression-parse": "^4.0.0"
+				"espree": "^10.4.0",
+				"esquery": "^1.6.0",
+				"html-entities": "^2.6.0",
+				"object-deep-merge": "^2.0.0",
+				"parse-imports-exports": "^0.2.4",
+				"semver": "^7.7.3",
+				"spdx-expression-parse": "^4.0.0",
+				"to-valid-identifier": "^1.0.0"
 			},
 			"engines": {
-				"node": ">=18"
+				"node": ">=20.11.0"
 			},
 			"peerDependencies": {
 				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
@@ -5238,7 +5289,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
 			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -5292,11 +5342,10 @@
 			}
 		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.1.tgz",
-			"integrity": "sha512-C/OfySlkkjHJrZl1ieHlL8AyebgrppyX49DUYEVXk7n0qu7dD/vuOnzeQz28H2MkUVj3GnoFSUxqbczG6IUwwg==",
+			"version": "0.8.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
+			"integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"upath": "^2.0.1"
 			},
@@ -5419,29 +5468,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,
-			"license": "Apache-2.0",
 			"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,
-			"license": "MIT",
 			"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",
@@ -5449,7 +5502,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": {
@@ -5467,7 +5520,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
 			"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -5540,16 +5592,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/eslint-plugin-wdio": {
-			"version": "8.37.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.37.0.tgz",
-			"integrity": "sha512-X217zXxSqj1IPWu3bxN7D/xEUmNk7Jg5lBf2JwYH3mCogaqL2tnHZnwt0EQ5D9oEejfEl2+4zqHSzhXq1X7F2A==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": "^16.13 || >=18"
-			}
-		},
 		"node_modules/eslint-plugin-yml": {
 			"version": "1.19.1",
 			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.1.tgz",
@@ -6043,7 +6085,6 @@
 			"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
 			"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"@nodelib/fs.stat": "^2.0.2",
 				"@nodelib/fs.walk": "^1.2.3",
@@ -6060,7 +6101,6 @@
 			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 			"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 			"dev": true,
-			"license": "ISC",
 			"dependencies": {
 				"is-glob": "^4.0.1"
 			},
@@ -6777,8 +6817,7 @@
 			"version": "2.8.9",
 			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
 			"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-			"dev": true,
-			"license": "ISC"
+			"dev": true
 		},
 		"node_modules/html-encoding-sniffer": {
 			"version": "6.0.0",
@@ -6792,6 +6831,22 @@
 				"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
 			}
 		},
+		"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-escaper": {
 			"version": "2.0.2",
 			"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -7034,8 +7089,7 @@
 			"version": "0.2.1",
 			"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
 			"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/is-async-function": {
 			"version": "2.1.1",
@@ -7108,7 +7162,6 @@
 			"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
 			"integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"builtin-modules": "^3.3.0"
 			},
@@ -7657,13 +7710,12 @@
 			}
 		},
 		"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.10.0",
+			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz",
+			"integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
-				"node": ">=12.0.0"
+				"node": ">=20.0.0"
 			}
 		},
 		"node_modules/jsdom": {
@@ -7748,8 +7800,7 @@
 			"version": "2.3.1",
 			"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
 			"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/json-schema-traverse": {
 			"version": "0.4.1",
@@ -7867,8 +7918,7 @@
 			"version": "1.2.4",
 			"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
 			"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/locate-path": {
 			"version": "6.0.0",
@@ -7947,8 +7997,7 @@
 			"version": "4.1.2",
 			"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
 			"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
-			"dev": true,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/lodash.merge": {
 			"version": "4.6.2",
@@ -8080,7 +8129,6 @@
 			"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
 			"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">= 8"
 			}
@@ -8099,7 +8147,6 @@
 			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
 			"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"braces": "^3.0.3",
 				"picomatch": "^2.3.1"
@@ -8113,7 +8160,6 @@
 			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
 			"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=8.6"
 			},
@@ -8180,7 +8226,6 @@
 			"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
 			"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=4"
 			}
@@ -8654,7 +8699,6 @@
 			"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
 			"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
 			"dev": true,
-			"license": "BSD-2-Clause",
 			"dependencies": {
 				"hosted-git-info": "^2.1.4",
 				"resolve": "^1.10.0",
@@ -8667,7 +8711,6 @@
 			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 			"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 			"dev": true,
-			"license": "ISC",
 			"bin": {
 				"semver": "bin/semver"
 			}
@@ -8881,6 +8924,12 @@
 				"node": ">=6"
 			}
 		},
+		"node_modules/object-deep-merge": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+			"integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+			"dev": true
+		},
 		"node_modules/object-inspect": {
 			"version": "1.13.4",
 			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -9196,12 +9245,20 @@
 				"node": ">=6"
 			}
 		},
+		"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",
 			"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"@babel/code-frame": "^7.0.0",
 				"error-ex": "^1.3.1",
@@ -9215,6 +9272,12 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
+		"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": "8.0.0",
 			"resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz",
@@ -9400,7 +9463,6 @@
 			"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
 			"integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=4"
 			}
@@ -9643,7 +9705,6 @@
 			"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
 			"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"@types/normalize-package-data": "^2.4.0",
 				"normalize-package-data": "^2.5.0",
@@ -9659,7 +9720,6 @@
 			"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
 			"integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"find-up": "^4.1.0",
 				"read-pkg": "^5.2.0",
@@ -9677,7 +9737,6 @@
 			"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
 			"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"locate-path": "^5.0.0",
 				"path-exists": "^4.0.0"
@@ -9691,7 +9750,6 @@
 			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
 			"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"p-locate": "^4.1.0"
 			},
@@ -9704,7 +9762,6 @@
 			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
 			"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"p-try": "^2.0.0"
 			},
@@ -9720,7 +9777,6 @@
 			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
 			"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"p-limit": "^2.2.0"
 			},
@@ -9733,7 +9789,6 @@
 			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
 			"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
 			"dev": true,
-			"license": "(MIT OR CC0-1.0)",
 			"engines": {
 				"node": ">=8"
 			}
@@ -9833,7 +9888,6 @@
 			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
 			"integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
 			"dev": true,
-			"license": "MIT",
 			"bin": {
 				"regexp-tree": "bin/regexp-tree"
 			}
@@ -9902,7 +9956,6 @@
 			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz",
 			"integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==",
 			"dev": true,
-			"license": "BSD-2-Clause",
 			"dependencies": {
 				"jsesc": "~0.5.0"
 			},
@@ -9967,6 +10020,18 @@
 				"node": ">=0.10.5"
 			}
 		},
+		"node_modules/reserved-identifiers": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+			"integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+			"dev": true,
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
 		"node_modules/resolve": {
 			"version": "1.22.12",
 			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
@@ -10137,7 +10202,6 @@
 			"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz",
 			"integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"regexp-tree": "~0.1.1"
 			}
@@ -10659,7 +10723,6 @@
 			"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
 			"integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"dependencies": {
 				"spdx-expression-parse": "^3.0.0",
 				"spdx-license-ids": "^3.0.0"
@@ -10670,7 +10733,6 @@
 			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
 			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"spdx-exceptions": "^2.1.0",
 				"spdx-license-ids": "^3.0.0"
@@ -10680,15 +10742,13 @@
 			"version": "2.5.0",
 			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
 			"integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
-			"dev": true,
-			"license": "CC-BY-3.0"
+			"dev": true
 		},
 		"node_modules/spdx-expression-parse": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
 			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"spdx-exceptions": "^2.1.0",
 				"spdx-license-ids": "^3.0.0"
@@ -10698,8 +10758,7 @@
 			"version": "3.0.23",
 			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
 			"integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
-			"dev": true,
-			"license": "CC0-1.0"
+			"dev": true
 		},
 		"node_modules/sprintf-js": {
 			"version": "1.0.3",
@@ -10909,7 +10968,6 @@
 			"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
 			"integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"min-indent": "^1.0.0"
 			},
@@ -11249,6 +11307,22 @@
 				"node": ">=8.0"
 			}
 		},
+		"node_modules/to-valid-identifier": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+			"integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+			"dev": true,
+			"dependencies": {
+				"@sindresorhus/base62": "^1.0.0",
+				"reserved-identifiers": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=20"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
 		"node_modules/toidentifier": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -11634,7 +11708,6 @@
 			"resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
 			"integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=4",
 				"yarn": "*"
@@ -11711,7 +11784,6 @@
 			"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
 			"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"dependencies": {
 				"spdx-correct": "^3.0.0",
 				"spdx-expression-parse": "^3.0.0"
@@ -11722,7 +11794,6 @@
 			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
 			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"spdx-exceptions": "^2.1.0",
 				"spdx-license-ids": "^3.0.0"
diff --git a/package.json b/package.json
index 31cc9f6..055ce6c 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
 		"@eslint/js": "^9.34.0",
 		"argparse": "^2.0.1",
 		"async": "^3.2.3",
-		"eslint-config-wikimedia": "0.31.0",
+		"eslint-config-wikimedia": "0.32.3",
 		"eslint-plugin-import": "^2.31.0",
 		"globals": "^15.12.0",
 		"nodemon": "^3.0.1",
-- 
2.47.3


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