This run took 193 seconds.
From 54d15c29abebe0a50da83af150f1ad89c7f7be33 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Wed, 6 May 2026 13:18:24 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
composer:
* mediawiki/mediawiki-codesniffer: 50.0.0 → 51.0.0
npm:
* eslint-config-wikimedia: 0.32.3 → 0.32.4
Change-Id: I11238a572ffc5cb38befcfe521146af482ae54df
---
composer.json | 2 +-
package-lock.json | 813 ++++++++++--------
package.json | 2 +-
.../ConstraintsReportHandlerElement.js | 4 +-
.../inputs/EntityAutocompleteInputWidget.js | 1 -
5 files changed, 464 insertions(+), 358 deletions(-)
diff --git a/composer.json b/composer.json
index ecd62cc..640eefa 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,7 @@
"serialization/serialization": "~3.2|~4.0"
},
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "50.0.0",
+ "mediawiki/mediawiki-codesniffer": "51.0.0",
"mediawiki/mediawiki-phan-config": "0.20.0",
"mediawiki/minus-x": "2.0.1",
"php-parallel-lint/php-console-highlighter": "1.0.0",
diff --git a/package-lock.json b/package-lock.json
index f6b4664..7233ac9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"hasInstallScript": true,
"devDependencies": {
"dotenv": "8.0.0",
- "eslint-config-wikimedia": "0.32.3",
+ "eslint-config-wikimedia": "0.32.4",
"grunt": "1.6.2",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
@@ -462,19 +462,32 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
- "version": "0.76.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
- "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
+ "version": "0.86.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.86.0.tgz",
+ "integrity": "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw==",
"dev": true,
"dependencies": {
"@types/estree": "^1.0.8",
- "@typescript-eslint/types": "^8.46.0",
- "comment-parser": "1.4.1",
- "esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~6.10.0"
+ "@typescript-eslint/types": "^8.58.0",
+ "comment-parser": "1.4.6",
+ "esquery": "^1.7.0",
+ "jsdoc-type-pratt-parser": "~7.2.0"
},
"engines": {
- "node": ">=20.11.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@es-joy/jsdoccomment/node_modules/@typescript-eslint/types": {
+ "version": "8.59.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz",
+ "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@es-joy/resolve.exports": {
@@ -487,9 +500,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
- "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
@@ -692,9 +705,9 @@
}
},
"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==",
+ "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/@nodelib/fs.scandir": {
@@ -914,20 +927,19 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
- "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz",
+ "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==",
"dev": true,
"dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.46.0",
- "@typescript-eslint/type-utils": "8.46.0",
- "@typescript-eslint/utils": "8.46.0",
- "@typescript-eslint/visitor-keys": "8.46.0",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/type-utils": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -937,7 +949,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.46.0",
+ "@typescript-eslint/parser": "^8.54.0",
"eslint": "^8.57.0 || ^9.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
@@ -952,16 +964,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
- "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz",
+ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==",
"dev": true,
"dependencies": {
- "@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"
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -976,14 +988,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz",
+ "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==",
"dev": true,
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.46.0",
- "@typescript-eslint/types": "^8.46.0",
- "debug": "^4.3.4"
+ "@typescript-eslint/tsconfig-utils": "^8.54.0",
+ "@typescript-eslint/types": "^8.54.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -997,13 +1009,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
- "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz",
+ "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "8.46.0",
- "@typescript-eslint/visitor-keys": "8.46.0"
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1014,9 +1026,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz",
+ "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1030,16 +1042,16 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz",
+ "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==",
"dev": true,
"dependencies": {
- "@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"
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1054,9 +1066,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz",
+ "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1067,21 +1079,20 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz",
+ "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==",
"dev": true,
"dependencies": {
- "@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",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
+ "@typescript-eslint/project-service": "8.54.0",
+ "@typescript-eslint/tsconfig-utils": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1095,9 +1106,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
@@ -1119,15 +1130,15 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
- "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz",
+ "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==",
"dev": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.46.0",
- "@typescript-eslint/types": "8.46.0",
- "@typescript-eslint/typescript-estree": "8.46.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1142,12 +1153,12 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz",
+ "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/types": "8.54.0",
"eslint-visitor-keys": "^4.2.1"
},
"engines": {
@@ -1189,9 +1200,9 @@
"dev": true
},
"node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -1410,6 +1421,12 @@
"@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/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -1774,9 +1791,9 @@
}
},
"node_modules/comment-parser": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
- "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz",
+ "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==",
"dev": true,
"engines": {
"node": ">= 12.0.0"
@@ -2234,13 +2251,13 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.18.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
- "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz",
+ "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
+ "tapable": "^2.3.3"
},
"engines": {
"node": ">=10.13.0"
@@ -2457,46 +2474,47 @@
}
},
"node_modules/eslint-config-wikimedia": {
- "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==",
+ "version": "0.32.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.4.tgz",
+ "integrity": "sha512-zcHJYss2vo8HK5PzkFuaV9mzaSGRuhA+jFGoQ4rNIwWz0usZsuQ2LYpkKxrbCVX1CbV0PzG+jJ6p0cLI+G37JQ==",
"dev": true,
"dependencies": {
"@stylistic/eslint-plugin": "^3.1.0",
- "@typescript-eslint/eslint-plugin": "8.46.0",
- "@typescript-eslint/parser": "8.46.0",
+ "@typescript-eslint/eslint-plugin": "8.54.0",
+ "@typescript-eslint/parser": "8.54.0",
"browserslist-config-wikimedia": "^0.7.0",
- "eslint": "^8.57.0",
- "eslint-plugin-compat": "^6.0.2",
+ "eslint-plugin-compat": "^6.1.0",
"eslint-plugin-es-x": "^8.7.0",
- "eslint-plugin-jest": "^29.0.1",
- "eslint-plugin-jsdoc": "61.3.0",
+ "eslint-plugin-jest": "^29.12.2",
+ "eslint-plugin-jsdoc": "^62.9.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.8.2",
+ "eslint-plugin-mediawiki": "^0.8.3",
"eslint-plugin-mocha": "^10.5.0",
- "eslint-plugin-n": "^17.23.1",
- "eslint-plugin-no-jquery": "^3.1.1",
- "eslint-plugin-qunit": "^8.2.5",
- "eslint-plugin-security": "^3.0.1",
+ "eslint-plugin-n": "^17.24.0",
+ "eslint-plugin-no-jquery": "^4.0.0",
+ "eslint-plugin-qunit": "^8.2.6",
+ "eslint-plugin-security": "^4.0.0",
"eslint-plugin-unicorn": "^56.0.1",
"eslint-plugin-vue": "^9.33.0",
- "eslint-plugin-wdio": "^9.16.2",
+ "eslint-plugin-wdio": "9.23.0",
"eslint-plugin-yml": "^1.19.0"
},
"engines": {
"node": ">=20 <25"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0"
}
},
"node_modules/eslint-plugin-compat": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
- "integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
+ "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,
"dependencies": {
- "@mdn/browser-compat-data": "^5.5.35",
+ "@mdn/browser-compat-data": "^6.1.1",
"ast-metadata-inferer": "^0.8.1",
- "browserslist": "^4.24.2",
- "caniuse-lite": "^1.0.30001687",
+ "browserslist": "^4.25.2",
"find-up": "^5.0.0",
"globals": "^15.7.0",
"lodash.memoize": "^4.1.2",
@@ -2506,7 +2524,7 @@
"node": ">=18.x"
},
"peerDependencies": {
- "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.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/find-up": {
@@ -2604,9 +2622,9 @@
}
},
"node_modules/eslint-plugin-jest": {
- "version": "29.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
- "integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
+ "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,
"dependencies": {
"@typescript-eslint/utils": "^8.0.0"
@@ -2616,8 +2634,9 @@
},
"peerDependencies": {
"@typescript-eslint/eslint-plugin": "^8.0.0",
- "eslint": "^8.57.0 || ^9.0.0",
- "jest": "*"
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "jest": "*",
+ "typescript": ">=4.8.4 <7.0.0"
},
"peerDependenciesMeta": {
"@typescript-eslint/eslint-plugin": {
@@ -2625,61 +2644,64 @@
},
"jest": {
"optional": true
+ },
+ "typescript": {
+ "optional": true
}
}
},
"node_modules/eslint-plugin-jsdoc": {
- "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==",
+ "version": "62.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.9.0.tgz",
+ "integrity": "sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA==",
"dev": true,
"dependencies": {
- "@es-joy/jsdoccomment": "~0.76.0",
+ "@es-joy/jsdoccomment": "~0.86.0",
"@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
- "comment-parser": "1.4.1",
+ "comment-parser": "1.4.6",
"debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "espree": "^10.4.0",
- "esquery": "^1.6.0",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
"html-entities": "^2.6.0",
"object-deep-merge": "^2.0.0",
"parse-imports-exports": "^0.2.4",
- "semver": "^7.7.3",
+ "semver": "^7.7.4",
"spdx-expression-parse": "^4.0.0",
"to-valid-identifier": "^1.0.0"
},
"engines": {
- "node": ">=20.11.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
+ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
}
},
"node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-jsdoc/node_modules/espree": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
- "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
"dev": true,
"dependencies": {
- "acorn": "^8.15.0",
+ "acorn": "^8.16.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.1"
+ "eslint-visitor-keys": "^5.0.1"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
@@ -2699,9 +2721,9 @@
}
},
"node_modules/eslint-plugin-mediawiki": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
- "integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.3.tgz",
+ "integrity": "sha512-RQKZd40C1taMDk5N9+aFLEBGBB95RNG7Gc54EsJ8pHsJu8//nIdpxNFWPtQz6RNxz6pZUXBnMCxzkMOLM3Mm1w==",
"dev": true,
"dependencies": {
"upath": "^2.0.1"
@@ -2728,9 +2750,9 @@
}
},
"node_modules/eslint-plugin-n": {
- "version": "17.23.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
- "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+ "version": "17.24.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz",
+ "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.5.0",
@@ -2802,31 +2824,34 @@
}
},
"node_modules/eslint-plugin-no-jquery": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
- "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-4.0.0.tgz",
+ "integrity": "sha512-ZR631D3qIQfgjKOAcgvYa5cB8xdTvFXAD5MbK5x5WltLSwFxmGnoaTXNtnptFU7py07ALrIe5dZRYncu4RD/Ug==",
"dev": true,
"peerDependencies": {
- "eslint": ">=8.0.0"
+ "eslint": ">=8.0.0 <9.0.0"
}
},
"node_modules/eslint-plugin-qunit": {
- "version": "8.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
- "integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
+ "version": "8.2.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.6.tgz",
+ "integrity": "sha512-S1jC/DIW9J8VtNX4uG1vlf5FZVrfQFlcuiYmvTHR2IICUhubHqpWA5o+qS1tujh+81Gs39omKV2D4OXfbSJE5g==",
"dev": true,
"dependencies": {
- "eslint-utils": "^3.0.0",
+ "@eslint-community/eslint-utils": "^4.4.0",
"requireindex": "^1.2.0"
},
"engines": {
"node": "^16.0.0 || ^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=8.38.0"
}
},
"node_modules/eslint-plugin-security": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
- "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-4.0.0.tgz",
+ "integrity": "sha512-tfuQT8K/Li1ZxhFzyD8wPIKtlzZxqBcPr9q0jFMQ77wWAbKBVEhaMPVQRTMTvCMUDhwBe5vPVqQPwAGk/ASfxQ==",
"dev": true,
"dependencies": {
"safe-regex": "^2.1.1"
@@ -2927,9 +2952,9 @@
}
},
"node_modules/eslint-plugin-wdio": {
- "version": "9.16.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
- "integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
+ "version": "9.23.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.23.0.tgz",
+ "integrity": "sha512-8tcpupzp2Qmv+uSfhzeHi42LVA9PyjkpMBPclSIkPxBfXpj4fMrejwAHu1PROh1OmJN1VQcGQUTWvSzyRcV2vA==",
"dev": true,
"engines": {
"node": ">=18.20.0"
@@ -3126,9 +3151,9 @@
}
},
"node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
"dependencies": {
"estraverse": "^5.1.0"
@@ -3568,9 +3593,9 @@
}
},
"node_modules/get-tsconfig": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
- "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
+ "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
"dev": true,
"dependencies": {
"resolve-pkg-maps": "^1.0.0"
@@ -4572,9 +4597,9 @@
"dev": true
},
"node_modules/jsdoc-type-pratt-parser": {
- "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==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz",
+ "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==",
"dev": true,
"engines": {
"node": ">=20.0.0"
@@ -6261,9 +6286,9 @@
}
},
"node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "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"
@@ -7057,9 +7082,9 @@
}
},
"node_modules/tapable": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
- "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
"dev": true,
"engines": {
"node": ">=6"
@@ -7099,6 +7124,51 @@
"globrex": "^0.1.2"
}
},
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dev": true,
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/tmp": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
@@ -7174,9 +7244,9 @@
}
},
"node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
"dev": true,
"engines": {
"node": ">=18.12"
@@ -8050,16 +8120,24 @@
"dev": true
},
"@es-joy/jsdoccomment": {
- "version": "0.76.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
- "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
+ "version": "0.86.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.86.0.tgz",
+ "integrity": "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw==",
"dev": true,
"requires": {
"@types/estree": "^1.0.8",
- "@typescript-eslint/types": "^8.46.0",
- "comment-parser": "1.4.1",
- "esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~6.10.0"
+ "@typescript-eslint/types": "^8.58.0",
+ "comment-parser": "1.4.6",
+ "esquery": "^1.7.0",
+ "jsdoc-type-pratt-parser": "~7.2.0"
+ },
+ "dependencies": {
+ "@typescript-eslint/types": {
+ "version": "8.59.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz",
+ "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==",
+ "dev": true
+ }
}
},
"@es-joy/resolve.exports": {
@@ -8069,9 +8147,9 @@
"dev": true
},
"@eslint-community/eslint-utils": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
- "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^3.4.3"
@@ -8221,9 +8299,9 @@
}
},
"@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==",
+ "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
},
"@nodelib/fs.scandir": {
@@ -8390,20 +8468,19 @@
"dev": true
},
"@typescript-eslint/eslint-plugin": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
- "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz",
+ "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==",
"dev": true,
"requires": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.46.0",
- "@typescript-eslint/type-utils": "8.46.0",
- "@typescript-eslint/utils": "8.46.0",
- "@typescript-eslint/visitor-keys": "8.46.0",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/type-utils": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
+ "ts-api-utils": "^2.4.0"
},
"dependencies": {
"ignore": {
@@ -8415,87 +8492,86 @@
}
},
"@typescript-eslint/parser": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
- "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz",
+ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==",
"dev": true,
"requires": {
- "@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"
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3"
}
},
"@typescript-eslint/project-service": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz",
+ "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==",
"dev": true,
"requires": {
- "@typescript-eslint/tsconfig-utils": "^8.46.0",
- "@typescript-eslint/types": "^8.46.0",
- "debug": "^4.3.4"
+ "@typescript-eslint/tsconfig-utils": "^8.54.0",
+ "@typescript-eslint/types": "^8.54.0",
+ "debug": "^4.4.3"
}
},
"@typescript-eslint/scope-manager": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
- "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz",
+ "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.46.0",
- "@typescript-eslint/visitor-keys": "8.46.0"
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0"
}
},
"@typescript-eslint/tsconfig-utils": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz",
+ "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==",
"dev": true,
"requires": {}
},
"@typescript-eslint/type-utils": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz",
+ "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==",
"dev": true,
"requires": {
- "@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"
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
}
},
"@typescript-eslint/types": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz",
+ "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz",
+ "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==",
"dev": true,
"requires": {
- "@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",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
+ "@typescript-eslint/project-service": "8.54.0",
+ "@typescript-eslint/tsconfig-utils": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
},
"dependencies": {
"brace-expansion": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0"
@@ -8513,24 +8589,24 @@
}
},
"@typescript-eslint/utils": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
- "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz",
+ "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==",
"dev": true,
"requires": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.46.0",
- "@typescript-eslint/types": "8.46.0",
- "@typescript-eslint/typescript-estree": "8.46.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0"
}
},
"@typescript-eslint/visitor-keys": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz",
+ "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/types": "8.54.0",
"eslint-visitor-keys": "^4.2.1"
},
"dependencies": {
@@ -8561,9 +8637,9 @@
"dev": true
},
"acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true
},
"acorn-globals": {
@@ -8725,6 +8801,14 @@
"dev": true,
"requires": {
"@mdn/browser-compat-data": "^5.6.19"
+ },
+ "dependencies": {
+ "@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
+ }
}
},
"astral-regex": {
@@ -8986,9 +9070,9 @@
"dev": true
},
"comment-parser": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
- "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz",
+ "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==",
"dev": true
},
"commondir": {
@@ -9347,13 +9431,13 @@
}
},
"enhanced-resolve": {
- "version": "5.18.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
- "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz",
+ "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
+ "tapable": "^2.3.3"
}
},
"entities": {
@@ -9560,43 +9644,41 @@
}
},
"eslint-config-wikimedia": {
- "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==",
+ "version": "0.32.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.4.tgz",
+ "integrity": "sha512-zcHJYss2vo8HK5PzkFuaV9mzaSGRuhA+jFGoQ4rNIwWz0usZsuQ2LYpkKxrbCVX1CbV0PzG+jJ6p0cLI+G37JQ==",
"dev": true,
"requires": {
"@stylistic/eslint-plugin": "^3.1.0",
- "@typescript-eslint/eslint-plugin": "8.46.0",
- "@typescript-eslint/parser": "8.46.0",
+ "@typescript-eslint/eslint-plugin": "8.54.0",
+ "@typescript-eslint/parser": "8.54.0",
"browserslist-config-wikimedia": "^0.7.0",
- "eslint": "^8.57.0",
- "eslint-plugin-compat": "^6.0.2",
+ "eslint-plugin-compat": "^6.1.0",
"eslint-plugin-es-x": "^8.7.0",
- "eslint-plugin-jest": "^29.0.1",
- "eslint-plugin-jsdoc": "61.3.0",
+ "eslint-plugin-jest": "^29.12.2",
+ "eslint-plugin-jsdoc": "^62.9.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.8.2",
+ "eslint-plugin-mediawiki": "^0.8.3",
"eslint-plugin-mocha": "^10.5.0",
- "eslint-plugin-n": "^17.23.1",
- "eslint-plugin-no-jquery": "^3.1.1",
- "eslint-plugin-qunit": "^8.2.5",
- "eslint-plugin-security": "^3.0.1",
+ "eslint-plugin-n": "^17.24.0",
+ "eslint-plugin-no-jquery": "^4.0.0",
+ "eslint-plugin-qunit": "^8.2.6",
+ "eslint-plugin-security": "^4.0.0",
"eslint-plugin-unicorn": "^56.0.1",
"eslint-plugin-vue": "^9.33.0",
- "eslint-plugin-wdio": "^9.16.2",
+ "eslint-plugin-wdio": "9.23.0",
"eslint-plugin-yml": "^1.19.0"
}
},
"eslint-plugin-compat": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
- "integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
+ "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,
"requires": {
- "@mdn/browser-compat-data": "^5.5.35",
+ "@mdn/browser-compat-data": "^6.1.1",
"ast-metadata-inferer": "^0.8.1",
- "browserslist": "^4.24.2",
- "caniuse-lite": "^1.0.30001687",
+ "browserslist": "^4.25.2",
"find-up": "^5.0.0",
"globals": "^15.7.0",
"lodash.memoize": "^4.1.2",
@@ -9660,51 +9742,51 @@
}
},
"eslint-plugin-jest": {
- "version": "29.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
- "integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
+ "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,
"requires": {
"@typescript-eslint/utils": "^8.0.0"
}
},
"eslint-plugin-jsdoc": {
- "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==",
+ "version": "62.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.9.0.tgz",
+ "integrity": "sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA==",
"dev": true,
"requires": {
- "@es-joy/jsdoccomment": "~0.76.0",
+ "@es-joy/jsdoccomment": "~0.86.0",
"@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
- "comment-parser": "1.4.1",
+ "comment-parser": "1.4.6",
"debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "espree": "^10.4.0",
- "esquery": "^1.6.0",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
"html-entities": "^2.6.0",
"object-deep-merge": "^2.0.0",
"parse-imports-exports": "^0.2.4",
- "semver": "^7.7.3",
+ "semver": "^7.7.4",
"spdx-expression-parse": "^4.0.0",
"to-valid-identifier": "^1.0.0"
},
"dependencies": {
"eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true
},
"espree": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
- "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
"dev": true,
"requires": {
- "acorn": "^8.15.0",
+ "acorn": "^8.16.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.1"
+ "eslint-visitor-keys": "^5.0.1"
}
}
}
@@ -9720,9 +9802,9 @@
}
},
"eslint-plugin-mediawiki": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
- "integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.3.tgz",
+ "integrity": "sha512-RQKZd40C1taMDk5N9+aFLEBGBB95RNG7Gc54EsJ8pHsJu8//nIdpxNFWPtQz6RNxz6pZUXBnMCxzkMOLM3Mm1w==",
"dev": true,
"requires": {
"upath": "^2.0.1"
@@ -9740,9 +9822,9 @@
}
},
"eslint-plugin-n": {
- "version": "17.23.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
- "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+ "version": "17.24.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz",
+ "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.5.0",
@@ -9785,26 +9867,26 @@
}
},
"eslint-plugin-no-jquery": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
- "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-4.0.0.tgz",
+ "integrity": "sha512-ZR631D3qIQfgjKOAcgvYa5cB8xdTvFXAD5MbK5x5WltLSwFxmGnoaTXNtnptFU7py07ALrIe5dZRYncu4RD/Ug==",
"dev": true,
"requires": {}
},
"eslint-plugin-qunit": {
- "version": "8.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
- "integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
+ "version": "8.2.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.6.tgz",
+ "integrity": "sha512-S1jC/DIW9J8VtNX4uG1vlf5FZVrfQFlcuiYmvTHR2IICUhubHqpWA5o+qS1tujh+81Gs39omKV2D4OXfbSJE5g==",
"dev": true,
"requires": {
- "eslint-utils": "^3.0.0",
+ "@eslint-community/eslint-utils": "^4.4.0",
"requireindex": "^1.2.0"
}
},
"eslint-plugin-security": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
- "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-4.0.0.tgz",
+ "integrity": "sha512-tfuQT8K/Li1ZxhFzyD8wPIKtlzZxqBcPr9q0jFMQ77wWAbKBVEhaMPVQRTMTvCMUDhwBe5vPVqQPwAGk/ASfxQ==",
"dev": true,
"requires": {
"safe-regex": "^2.1.1"
@@ -9873,9 +9955,9 @@
}
},
"eslint-plugin-wdio": {
- "version": "9.16.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
- "integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
+ "version": "9.23.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.23.0.tgz",
+ "integrity": "sha512-8tcpupzp2Qmv+uSfhzeHi42LVA9PyjkpMBPclSIkPxBfXpj4fMrejwAHu1PROh1OmJN1VQcGQUTWvSzyRcV2vA==",
"dev": true
},
"eslint-plugin-yml": {
@@ -9951,9 +10033,9 @@
"dev": true
},
"esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
@@ -10276,9 +10358,9 @@
"dev": true
},
"get-tsconfig": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
- "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
+ "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
"dev": true,
"requires": {
"resolve-pkg-maps": "^1.0.0"
@@ -11040,9 +11122,9 @@
"dev": true
},
"jsdoc-type-pratt-parser": {
- "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==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz",
+ "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==",
"dev": true
},
"jsdom": {
@@ -12321,9 +12403,9 @@
}
},
"semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true
},
"set-blocking": {
@@ -12892,9 +12974,9 @@
}
},
"tapable": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
- "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
"dev": true
},
"test-exclude": {
@@ -12924,6 +13006,31 @@
"globrex": "^0.1.2"
}
},
+ "tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dev": true,
+ "requires": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "dependencies": {
+ "fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "requires": {}
+ },
+ "picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true
+ }
+ }
+ },
"tmp": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
@@ -12983,9 +13090,9 @@
}
},
"ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
"dev": true,
"requires": {}
},
diff --git a/package.json b/package.json
index d20288d..31269bc 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
},
"devDependencies": {
"dotenv": "8.0.0",
- "eslint-config-wikimedia": "0.32.3",
+ "eslint-config-wikimedia": "0.32.4",
"grunt": "1.6.2",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
diff --git a/resources/statements/ConstraintsReportHandlerElement.js b/resources/statements/ConstraintsReportHandlerElement.js
index 198d901..9f40757 100644
--- a/resources/statements/ConstraintsReportHandlerElement.js
+++ b/resources/statements/ConstraintsReportHandlerElement.js
@@ -119,10 +119,10 @@ ConstraintsReportHandlerElement.prototype.buildReportList = function ( reports )
* @see WikibaseQualityConstraints/modules/gadget.js::_createPopupWidget()
*/
ConstraintsReportHandlerElement.prototype.createPopupWidget = function ( $content, icon, titleMessageKey, classes ) {
- // eslint-disable-next-line mediawiki/class-doc
+
const widget = new OO.ui.PopupButtonWidget( {
icon: icon,
- // eslint-disable-next-line mediawiki/msg-doc
+
title: mw.msg( titleMessageKey ),
flags: '',
framed: false,
diff --git a/resources/statements/inputs/EntityAutocompleteInputWidget.js b/resources/statements/inputs/EntityAutocompleteInputWidget.js
index a2ec56e..fb58425 100644
--- a/resources/statements/inputs/EntityAutocompleteInputWidget.js
+++ b/resources/statements/inputs/EntityAutocompleteInputWidget.js
@@ -33,7 +33,6 @@ const EntityAutocompleteInputWidget = function MediaInfoStatementsEntityAutocomp
// select it anew
this.dataCache = {};
- // eslint-disable-next-line mediawiki/class-doc
EntityAutocompleteInputWidget.super.call( this, Object.assign( {}, config, {
// classes should *always* be added, because some essential functionality
// (e.g. CSS to turn red on invalid input) depends on these classes
--
2.47.3
$ date
--- stdout ---
Wed May 6 13:15:19 UTC 2026
--- end ---
$ git clone file:///srv/git/mediawiki-extensions-WikibaseMediaInfo.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 ---
aa3f3df2b3204ffb20b1078424eccffd543d8a76 refs/heads/master
--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {
"form-data": {
"name": "form-data",
"severity": "critical",
"isDirect": false,
"via": [
{
"source": 1109540,
"name": "form-data",
"dependency": "form-data",
"title": "form-data uses unsafe random function in form-data for choosing boundary",
"url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4",
"severity": "critical",
"cwe": [
"CWE-330"
],
"cvss": {
"score": 0,
"vectorString": null
},
"range": "<2.5.4"
}
],
"effects": [
"request"
],
"range": "<2.5.4",
"nodes": [
"node_modules/form-data"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"jpeg-js": {
"name": "jpeg-js",
"severity": "high",
"isDirect": true,
"via": [
{
"source": 1088964,
"name": "jpeg-js",
"dependency": "jpeg-js",
"title": "Infinite loop in jpeg-js",
"url": "https://github.com/advisories/GHSA-xvf7-4v9q-58w6",
"severity": "high",
"cwe": [
"CWE-835"
],
"cvss": {
"score": 7.5,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
},
"range": "<0.4.4"
},
{
"source": 1093580,
"name": "jpeg-js",
"dependency": "jpeg-js",
"title": "Uncontrolled resource consumption in jpeg-js",
"url": "https://github.com/advisories/GHSA-w7q9-p3jq-fmhm",
"severity": "moderate",
"cwe": [
"CWE-400"
],
"cvss": {
"score": 5.5,
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H"
},
"range": "<0.4.0"
}
],
"effects": [],
"range": "<=0.4.3",
"nodes": [
"node_modules/jpeg-js"
],
"fixAvailable": {
"name": "jpeg-js",
"version": "0.4.4",
"isSemVerMajor": true
}
},
"jquery": {
"name": "jquery",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1109145,
"name": "jquery",
"dependency": "jquery",
"title": "Potential XSS vulnerability in jQuery",
"url": "https://github.com/advisories/GHSA-jpcq-cgw6-v4j6",
"severity": "moderate",
"cwe": [
"CWE-79"
],
"cvss": {
"score": 6.9,
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N/E:H"
},
"range": ">=1.0.3 <3.5.0"
},
{
"source": 1116479,
"name": "jquery",
"dependency": "jquery",
"title": "Potential XSS vulnerability in jQuery",
"url": "https://github.com/advisories/GHSA-gxr4-xjj5-5px2",
"severity": "moderate",
"cwe": [
"CWE-79"
],
"cvss": {
"score": 6.9,
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N"
},
"range": ">=1.12.0 <3.5.0"
}
],
"effects": [
"oojs-ui"
],
"range": "<=3.4.1",
"nodes": [
"node_modules/oojs-ui/node_modules/jquery"
],
"fixAvailable": {
"name": "oojs-ui",
"version": "0.53.2",
"isSemVerMajor": true
}
},
"jsdom": {
"name": "jsdom",
"severity": "moderate",
"isDirect": true,
"via": [
"request",
"request-promise-native",
"tough-cookie"
],
"effects": [],
"range": "0.1.20 || 0.2.0 - 16.5.3",
"nodes": [
"node_modules/jsdom"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"mockery": {
"name": "mockery",
"severity": "critical",
"isDirect": true,
"via": [
{
"source": 1092753,
"name": "mockery",
"dependency": "mockery",
"title": "mockery is vulnerable to prototype pollution",
"url": "https://github.com/advisories/GHSA-gmwp-3pwc-3j3g",
"severity": "critical",
"cwe": [
"CWE-1321"
],
"cvss": {
"score": 9.8,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
},
"range": "<=2.1.0"
}
],
"effects": [],
"range": "*",
"nodes": [
"node_modules/mockery"
],
"fixAvailable": false
},
"oojs-ui": {
"name": "oojs-ui",
"severity": "moderate",
"isDirect": true,
"via": [
"jquery"
],
"effects": [],
"range": "0.11.0 - 0.38.1",
"nodes": [
"node_modules/oojs-ui"
],
"fixAvailable": {
"name": "oojs-ui",
"version": "0.53.2",
"isSemVerMajor": true
}
},
"qs": {
"name": "qs",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1113719,
"name": "qs",
"dependency": "qs",
"title": "qs's arrayLimit bypass in its bracket notation allows DoS via memory exhaustion",
"url": "https://github.com/advisories/GHSA-6rw7-vpxm-498p",
"severity": "moderate",
"cwe": [
"CWE-20"
],
"cvss": {
"score": 3.7,
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
},
"range": "<6.14.1"
}
],
"effects": [
"request"
],
"range": "<6.14.1",
"nodes": [
"node_modules/qs"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"request": {
"name": "request",
"severity": "critical",
"isDirect": false,
"via": [
{
"source": 1096727,
"name": "request",
"dependency": "request",
"title": "Server-Side Request Forgery in Request",
"url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
"severity": "moderate",
"cwe": [
"CWE-918"
],
"cvss": {
"score": 6.1,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
},
"range": "<=2.88.2"
},
"form-data",
"qs",
"tough-cookie"
],
"effects": [
"jsdom",
"request-promise-core",
"request-promise-native"
],
"range": "*",
"nodes": [
"node_modules/request"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"request-promise-core": {
"name": "request-promise-core",
"severity": "moderate",
"isDirect": false,
"via": [
"request"
],
"effects": [
"request-promise-native"
],
"range": "*",
"nodes": [
"node_modules/request-promise-core"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"request-promise-native": {
"name": "request-promise-native",
"severity": "moderate",
"isDirect": false,
"via": [
"request",
"request-promise-core",
"tough-cookie"
],
"effects": [
"jsdom"
],
"range": ">=1.0.0",
"nodes": [
"node_modules/request-promise-native"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"tmp": {
"name": "tmp",
"severity": "low",
"isDirect": true,
"via": [
{
"source": 1109537,
"name": "tmp",
"dependency": "tmp",
"title": "tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter",
"url": "https://github.com/advisories/GHSA-52f5-9888-hmc6",
"severity": "low",
"cwe": [
"CWE-59"
],
"cvss": {
"score": 2.5,
"vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"
},
"range": "<=0.2.3"
}
],
"effects": [],
"range": "<=0.2.3",
"nodes": [
"node_modules/tmp"
],
"fixAvailable": {
"name": "tmp",
"version": "0.2.5",
"isSemVerMajor": true
}
},
"tough-cookie": {
"name": "tough-cookie",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1097682,
"name": "tough-cookie",
"dependency": "tough-cookie",
"title": "tough-cookie Prototype Pollution vulnerability",
"url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3",
"severity": "moderate",
"cwe": [
"CWE-1321"
],
"cvss": {
"score": 6.5,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"
},
"range": "<4.1.3"
}
],
"effects": [
"jsdom",
"request",
"request-promise-native"
],
"range": "<4.1.3",
"nodes": [
"node_modules/tough-cookie"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 1,
"moderate": 7,
"high": 1,
"critical": 3,
"total": 12
},
"dependencies": {
"prod": 1,
"dev": 654,
"optional": 1,
"peer": 1,
"peerOptional": 0,
"total": 654
}
}
}
--- end ---
$ /usr/bin/composer install
--- stderr ---
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 38 installs, 0 updates, 0 removals
- Locking composer/pcre (3.3.2)
- Locking composer/semver (3.4.4)
- Locking composer/spdx-licenses (1.5.10)
- Locking composer/xdebug-handler (3.0.5)
- Locking danog/advanced-json-rpc (v3.2.3)
- Locking dealerdirect/phpcodesniffer-composer-installer (v1.2.1)
- Locking doctrine/deprecations (1.1.6)
- Locking mediawiki/mediawiki-codesniffer (v50.0.0)
- Locking mediawiki/mediawiki-phan-config (0.20.0)
- Locking mediawiki/minus-x (2.0.1)
- Locking mediawiki/phan-taint-check-plugin (9.1.0)
- Locking netresearch/jsonmapper (v5.0.1)
- Locking phan/phan (6.0.2)
- Locking phan/tolerant-php-parser (v0.2.0)
- Locking phan/var_representation_polyfill (0.1.4)
- Locking php-parallel-lint/php-console-color (v1.0.1)
- Locking php-parallel-lint/php-console-highlighter (v1.0.0)
- Locking php-parallel-lint/php-parallel-lint (v1.4.0)
- Locking phpcsstandards/phpcsextra (1.4.0)
- Locking phpcsstandards/phpcsutils (1.2.2)
- Locking phpdocumentor/reflection-common (2.2.0)
- Locking phpdocumentor/reflection-docblock (6.0.3)
- Locking phpdocumentor/type-resolver (2.0.0)
- Locking phpstan/phpdoc-parser (2.3.2)
- Locking psr/container (2.0.2)
- Locking psr/log (3.0.2)
- Locking sabre/event (6.1.0)
- Locking serialization/serialization (4.1.0)
- Locking squizlabs/php_codesniffer (3.13.5)
- Locking symfony/console (v8.0.9)
- Locking symfony/deprecation-contracts (v3.6.0)
- Locking symfony/polyfill-ctype (v1.37.0)
- Locking symfony/polyfill-intl-grapheme (v1.37.0)
- Locking symfony/polyfill-intl-normalizer (v1.37.0)
- Locking symfony/polyfill-mbstring (v1.37.0)
- Locking symfony/service-contracts (v3.6.1)
- Locking symfony/string (v8.0.8)
- Locking webmozart/assert (2.3.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 38 installs, 0 updates, 0 removals
0 [>---------------------------] 0 [->--------------------------]
- Installing squizlabs/php_codesniffer (3.13.5): Extracting archive
- Installing dealerdirect/phpcodesniffer-composer-installer (v1.2.1): Extracting archive
- Installing composer/pcre (3.3.2): Extracting archive
- Installing phpcsstandards/phpcsutils (1.2.2): Extracting archive
- Installing phpcsstandards/phpcsextra (1.4.0): Extracting archive
- Installing symfony/polyfill-mbstring (v1.37.0): Extracting archive
- Installing composer/spdx-licenses (1.5.10): Extracting archive
- Installing composer/semver (3.4.4): Extracting archive
- Installing mediawiki/mediawiki-codesniffer (v50.0.0): Extracting archive
- Installing symfony/polyfill-intl-normalizer (v1.37.0): Extracting archive
- Installing symfony/polyfill-intl-grapheme (v1.37.0): Extracting archive
- Installing symfony/polyfill-ctype (v1.37.0): Extracting archive
- Installing symfony/string (v8.0.8): Extracting archive
- Installing symfony/deprecation-contracts (v3.6.0): Extracting archive
- Installing psr/container (2.0.2): Extracting archive
- Installing symfony/service-contracts (v3.6.1): Extracting archive
- Installing symfony/console (v8.0.9): Extracting archive
- Installing sabre/event (6.1.0): Extracting archive
- Installing phan/var_representation_polyfill (0.1.4): Extracting archive
- Installing phan/tolerant-php-parser (v0.2.0): Extracting archive
- Installing netresearch/jsonmapper (v5.0.1): Extracting archive
- Installing webmozart/assert (2.3.0): Extracting archive
- Installing phpstan/phpdoc-parser (2.3.2): Extracting archive
- Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
- Installing doctrine/deprecations (1.1.6): Extracting archive
- Installing phpdocumentor/type-resolver (2.0.0): Extracting archive
- Installing phpdocumentor/reflection-docblock (6.0.3): Extracting archive
- Installing danog/advanced-json-rpc (v3.2.3): Extracting archive
- Installing psr/log (3.0.2): Extracting archive
- Installing composer/xdebug-handler (3.0.5): Extracting archive
- Installing phan/phan (6.0.2): Extracting archive
- Installing mediawiki/phan-taint-check-plugin (9.1.0): Extracting archive
- Installing mediawiki/mediawiki-phan-config (0.20.0): Extracting archive
- Installing mediawiki/minus-x (2.0.1): Extracting archive
- Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
- Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
- Installing php-parallel-lint/php-parallel-lint (v1.4.0): Extracting archive
- Installing serialization/serialization (4.1.0): Extracting archive
0/36 [>---------------------------] 0%
28/36 [=====================>------] 77%
36/36 [============================] 100%
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
16 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils
--- end ---
Upgrading n:eslint-config-wikimedia from 0.32.3 -> 0.32.4
$ /usr/bin/npm install
--- stderr ---
npm WARN deprecated request-promise-native@1.0.9: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
--- stdout ---
> wikibase-media-info@0.1.0 install
> rm -rf node_modules/mediawiki && git clone -q --depth=1 https://gerrit.wikimedia.org/r/mediawiki/core node_modules/mediawiki
added 659 packages, and audited 660 packages in 23s
115 packages are looking for funding
run `npm fund` for details
12 vulnerabilities (1 low, 7 moderate, 1 high, 3 critical)
To address all issues possible (including breaking changes), run:
npm audit fix --force
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.
--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json
--- end ---
$ /usr/bin/npm install grunt-eslint@24.3.0 --save-exact
--- stdout ---
removed 1 package, and audited 660 packages in 2s
115 packages are looking for funding
run `npm fund` for details
12 vulnerabilities (1 low, 7 moderate, 1 high, 3 critical)
To address all issues possible (including breaking changes), run:
npm audit fix --force
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.
--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json
--- end ---
$ ./node_modules/.bin/eslint . --fix
--- stderr ---
[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
--- stdout ---
/src/repo/resources/README/2.TemplatingFeatures.js
53:11 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/filepage/CaptionDataEditor.js
50:4 warning Prefer .then to .done no-jquery/no-done-fail
50:4 warning Prefer .then to .fail no-jquery/no-done-fail
98:17 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/filepage/CaptionsPanel.js
613:3 warning Prefer .then to .done no-jquery/no-done-fail
613:3 warning Prefer .then to .fail no-jquery/no-done-fail
687:34 warning Prefer .then to .done no-jquery/no-done-fail
687:34 warning Prefer .then to .fail no-jquery/no-done-fail
717:34 warning Prefer .then to .done no-jquery/no-done-fail
717:34 warning Prefer .then to .fail no-jquery/no-done-fail
/src/repo/resources/filepage/StatementPanel.js
26:1 warning The type 'dataLoadedReadOnly' is undefined jsdoc/no-undefined-types
240:1 warning The type 'widgetRemoved' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/AddPropertyWidget.js
53:23 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/ConstraintsReportHandlerElement.js
123:17 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/ItemWidget.js
135:24 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/SnakWidget.js
93:22 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/StatementWidget.js
186:1 warning The type 'change' is undefined jsdoc/no-undefined-types
675:2 warning Prefer .then to .done no-jquery/no-done-fail
/src/repo/resources/statements/inputs/QuantityInputWidget.js
90:27 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/tests/node-qunit/mediainfo/README/3.BestPractices.test.js
14:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/CaptionsPanel.test.js
44:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/LicenseDialogWidget.test.js
14:3 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/ProtectionMsgWidget.test.js
15:3 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/StatementPanel.test.js
42:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/AddPropertyWidget.test.js
16:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
21:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/ItemWidget.test.js
23:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/LinkNoticeWidget.test.js
27:3 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/SnakListWidget.test.js
21:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
91:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/SnakWidget.test.js
19:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
198:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
218:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/StatementWidget.test.js
30:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/EntityInputWidget.test.js
16:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/GlobeCoordinateInputWidget.test.js
26:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/MonolingualTextInputWidget.test.js
15:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/MultiTypeInputWrapperWidget.test.js
23:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
36:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
49:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
62:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
81:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
100:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
113:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
223:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
224:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
225:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
226:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
227:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
228:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
229:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
305:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
323:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
343:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/QuantityInputWidget.test.js
15:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/StringInputWidget.test.js
15:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/TimeInputWidget.test.js
27:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/support/helpers.js
26:9 warning Found non-literal argument in require security/detect-non-literal-require
39:19 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
40:10 warning Found non-literal argument in require security/detect-non-literal-require
54:21 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
305:38 warning Found non-literal argument in require security/detect-non-literal-require
325:21 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
✖ 63 problems (0 errors, 63 warnings)
--- end ---
$ ./node_modules/.bin/eslint . -f json
--- stderr ---
[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
--- stdout ---
[{"filePath":"/src/repo/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/.stylelintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/icons.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/.eslintshared.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/README/1.ExampleComponentWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/README/2.TemplatingFeatures.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":1,"message":"OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":53,"column":11,"nodeType":"NewExpression","messageId":"noLabel","endLine":53,"endColumn":70}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst ComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget;\n\n/**\n * This builds on the ExampleComponentWidget to show some of the\n * things that can be done with mustache+dom templates.\n *\n * Templates ending in `mustache+dom` extension will use the\n * `mustache+dom` template parser, which is basically standard\n * mustache templates (https://mustache.github.io/) with some\n * additions:\n * - the ability to parse OOUI widgets, jQuery nodes or HTMLElement\n * objects into the template\n * - the ability to parse functions as event handlers into the template\n *\n * @constructor\n * @param {Object} config\n */\nconst TemplatingFeatures = function TemplatingFeaturesConstructor( config ) {\n\tconfig = config || {};\n\n\tTemplatingFeatures.super.call( this, config );\n\n\tthis.state = Object.assign( {}, config, {\n\t\tediting: false,\n\t\tinput: new OO.ui.TextInputWidget( { classes: [ 'example-input' ] } )\n\t} );\n\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.readme',\n\t\t'templates/README/2.TemplatingFeatures.mustache+dom'\n\t);\n};\nOO.inheritClass( TemplatingFeatures, OO.ui.Widget );\nOO.mixinClass( TemplatingFeatures, ComponentWidget );\n\n/**\n * @inheritDoc\n */\nTemplatingFeatures.prototype.getTemplateData = function () {\n\treturn {\n\t\tediting: this.state.editing,\n\n\t\t// functions can be assigned to the template, and used as\n\t\t// callbacks to `on*` attributes\n\t\ttoggleEdit: this.toggleEdit.bind( this ),\n\n\t\t// OOUI elements (or jQuery/HTMLElement nodes) can also be\n\t\t// parsed into the template, just be sure to unescape them\n\t\t// (via triple brackets `{{{var}}}`)\n\t\tbutton: new OO.ui.ButtonWidget( { classes: [ 'example-button' ] } ),\n\t\t// there is a difference in how new elements (like the above\n\t\t// button that just got created anew) and existing elements\n\t\t// (like the below input, that is the same objects every\n\t\t// time we render) get treated:\n\t\t// - 'input' (the existing node) will always be preserved,\n\t\t// it'll be carried over for every rerender\n\t\t// - 'button' (the new node) will replace an existing node\n\t\t// (even if it does the exact same thing, like this same\n\t\t// button in a previous render)\n\t\t// this basically means that nodes whose state you'll want\n\t\t// to carry over to other parts of the code (e.g. fetch\n\t\t// their value) must not be recreated on rerenders, but\n\t\t// should be passed around (i.e. like `input` here)\n\t\t// nodes that are purely presentational, or trigger other\n\t\t// effects (e.g. event callbacks) can be new (i.e. 'button')\n\t\tinput: this.state.input\n\t};\n};\n\n/**\n * @param {Event} e\n * @return {jQuery.Promise<jQuery>}\n */\nTemplatingFeatures.prototype.toggleEdit = function ( e ) {\n\te.preventDefault();\n\treturn this.setState( { editing: !this.state.editing } );\n};\n\nmodule.exports = TemplatingFeatures;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/README/3.BestPractices.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/README/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/UlsWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/__namespace.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/base/ComponentWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'previousState' is defined but never used.","line":34,"column":55,"nodeType":"Identifier","messageId":"unusedVar","endLine":34,"endColumn":68,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":163,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":163,"endColumn":16,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"warn"},"fix":{"range":[5197,5215],"text":""},"desc":"Remove the console.warn()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/base/DOMLessGroupWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/base/FormatValueElement.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/base/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/datamodel/MediaInfo.js","messages":[],"suppressedMessages":[{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_id'.","line":42,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":42,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_statementGroupSet'.","line":43,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":43,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_fingerprint'.","line":44,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":44,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_statementGroupSet'.","line":58,"column":13,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":58,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_statementGroupSet'.","line":65,"column":13,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":65,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_fingerprint'.","line":65,"column":50,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":65,"endColumn":67,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_id'.","line":75,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":75,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_statementGroupSet'.","line":76,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":76,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_fingerprint'.","line":77,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":77,"endColumn":24,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/AnonWarning.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CancelPublishWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CaptionData.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CaptionDataEditor.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":1,"message":"Prefer .then to .done","line":50,"column":4,"nodeType":"CallExpression","endLine":69,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":1,"message":"Prefer .then to .fail","line":50,"column":4,"nodeType":"CallExpression","endLine":86,"endColumn":8},{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":1,"message":"OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":98,"column":17,"nodeType":"NewExpression","messageId":"noLabel","endLine":104,"endColumn":5}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst wbTermsLanguages = require( 'wikibase.mediainfo.statements' ).config.wbTermsLanguages;\nconst UlsWidget = require( 'wikibase.mediainfo.uls' );\n\n/**\n * A value object holding all relevant widgets for editing a single caption\n *\n * @constructor\n * @param {string} guid\n * @param {CaptionData} captionData\n * @param {Object} [config]\n * @param {number} [config.minCaptionLength]\n * @param {number} [config.maxCaptionLength]\n * @param {number} [config.warnWithinMaxCaptionLength]\n */\nconst CaptionDataEditor = function ( guid, captionData, config ) {\n\tconst self = this;\n\n\tconfig = config || {};\n\n\tOO.EventEmitter.call( this );\n\n\tthis.minCaptionLength = config.minCaptionLength || mw.config.get( 'wbmiMinCaptionLength' );\n\tthis.maxCaptionLength = config.maxCaptionLength || mw.config.get( 'wbmiMaxCaptionLength' );\n\tthis.warnWithinMaxCaptionLength = config.warnWithinMaxCaptionLength || 0;\n\n\tthis.languageSelector = new UlsWidget( {\n\t\tlanguages: wbTermsLanguages\n\t} );\n\tif ( captionData.languageCode !== '' ) {\n\t\tthis.languageSelector.setValue( captionData.languageCode );\n\t}\n\tthis.languageSelector.on( 'select', () => {\n\t\tself.emit( 'languageSelectorUpdated' );\n\t} );\n\n\tthis.textInput = new OO.ui.TextInputWidget( {\n\t\tvalidate: function ( value ) {\n\t\t\treturn ( self.minCaptionLength === undefined || value.length >= self.minCaptionLength ) &&\n\t\t\t\t( self.maxCaptionLength === undefined || value.length <= self.maxCaptionLength );\n\t\t},\n\t\tvalue: captionData.text,\n\t\tdir: captionData.direction,\n\t\tplaceholder: captionData.text === '' ? mw.msg( 'wikibasemediainfo-filepage-caption-empty' ) : '',\n\t\tclasses: [ 'wbmi-caption-textInput' ]\n\t} );\n\tthis.textInput\n\t\t.on( 'change', () => {\n\t\t\tself.textInput.getValidity()\n\t\t\t\t.done( () => {\n\t\t\t\t\tconst length = self.textInput.getValue().length;\n\t\t\t\t\tself.setInputError( '' );\n\n\t\t\t\t\tif ( self.maxCaptionLength !== undefined ) {\n\t\t\t\t\t\tconst lengthDiff = self.maxCaptionLength - length;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlengthDiff >= 0 &&\n\t\t\t\t\t\t\tlengthDiff < self.warnWithinMaxCaptionLength\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tself.setInputWarning( mw.msg(\n\t\t\t\t\t\t\t\t'wikibasemediainfo-filepage-caption-approaching-limit',\n\t\t\t\t\t\t\t\tlengthDiff\n\t\t\t\t\t\t\t) );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.setInputWarning( '' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.fail( () => {\n\t\t\t\t\tconst length = self.textInput.getValue().length;\n\n\t\t\t\t\tself.setInputWarning( '' );\n\n\t\t\t\t\tif ( self.minCaptionLength !== undefined && self.minCaptionLength - length > 0 ) {\n\t\t\t\t\t\tself.setInputError( mw.message(\n\t\t\t\t\t\t\t'wikibasemediainfo-filepage-caption-too-short',\n\t\t\t\t\t\t\tself.minCaptionLength - length\n\t\t\t\t\t\t).escaped() );\n\t\t\t\t\t} else if ( self.maxCaptionLength !== undefined && length - self.maxCaptionLength > 0 ) {\n\t\t\t\t\t\tself.setInputError( mw.message(\n\t\t\t\t\t\t\t'wikibasemediainfo-filepage-caption-too-long',\n\t\t\t\t\t\t\tlength - self.maxCaptionLength\n\t\t\t\t\t\t).escaped() );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.always( () => {\n\t\t\t\t\tself.emit( 'textInputChanged' );\n\t\t\t\t} );\n\t\t} )\n\t\t.on( 'keypress', ( event ) => {\n\t\t\t// if the key pressed is the 'enter' key\n\t\t\tif ( event.keycode === 13 || event.which === 13 ) {\n\t\t\t\tself.emit( 'textInputSubmitted' );\n\t\t\t}\n\t\t} );\n\n\tthis.deleter = new OO.ui.ButtonWidget( {\n\t\ticon: 'trash',\n\t\tframed: false,\n\t\tflags: 'destructive',\n\t\tclasses: [ 'wbmi-caption-deleteButton' ],\n\t\tid: guid\n\t} );\n\tthis.deleter.on( 'click', () => {\n\t\tself.emit( 'captionDeleted', guid );\n\t} );\n\n\tthis.inputError = '';\n\tthis.inputWarning = '';\n};\n\nOO.mixinClass( CaptionDataEditor, OO.EventEmitter );\n\n/**\n * @return {UlsWidget}\n */\nCaptionDataEditor.prototype.getLanguageSelector = function () {\n\treturn this.languageSelector;\n};\n\n/**\n * @return {OO.ui.TextInputWidget}\n */\nCaptionDataEditor.prototype.getTextInput = function () {\n\treturn this.textInput;\n};\n\n/**\n * @return {OO.ui.ButtonWidget}\n */\nCaptionDataEditor.prototype.getDeleter = function () {\n\treturn this.deleter;\n};\n\n/**\n * @param {boolean} disabled\n */\nCaptionDataEditor.prototype.setDisabled = function ( disabled ) {\n\tthis.textInput.setDisabled( disabled );\n};\n\n/**\n * @param {string} text\n */\nCaptionDataEditor.prototype.setInputError = function ( text ) {\n\tthis.inputError = text;\n};\n\n/**\n * @param {string} text\n */\nCaptionDataEditor.prototype.setInputWarning = function ( text ) {\n\tthis.inputWarning = text;\n};\n\n/**\n * @return {string}\n */\nCaptionDataEditor.prototype.getInputError = function () {\n\treturn this.inputError;\n};\n\n/**\n * @return {string}\n */\nCaptionDataEditor.prototype.getInputWarning = function () {\n\treturn this.inputWarning;\n};\n\n/**\n * @return {string}\n */\nCaptionDataEditor.prototype.getLanguageCode = function () {\n\treturn this.languageSelector.getValue();\n};\n\n/**\n * @return {string}\n */\nCaptionDataEditor.prototype.getText = function () {\n\treturn this.textInput.getValue();\n};\n\nmodule.exports = CaptionDataEditor;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CaptionsEditActionsWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CaptionsPanel.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":1,"message":"Prefer .then to .done","line":613,"column":3,"nodeType":"CallExpression","endLine":624,"endColumn":7},{"ruleId":"no-jquery/no-done-fail","severity":1,"message":"Prefer .then to .fail","line":613,"column":3,"nodeType":"CallExpression","endLine":627,"endColumn":7},{"ruleId":"no-jquery/no-done-fail","severity":1,"message":"Prefer .then to .done","line":687,"column":34,"nodeType":"CallExpression","endLine":704,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":1,"message":"Prefer .then to .fail","line":687,"column":34,"nodeType":"CallExpression","endLine":709,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":1,"message":"Prefer .then to .done","line":717,"column":34,"nodeType":"CallExpression","endLine":733,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":1,"message":"Prefer .then to .fail","line":717,"column":34,"nodeType":"CallExpression","endLine":741,"endColumn":8}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst AnonWarning = require( './AnonWarning.js' ),\n\tCaptionData = require( './CaptionData.js' ),\n\tCaptionDataEditor = require( './CaptionDataEditor.js' ),\n\tCaptionsEditActionsWidget = require( './CaptionsEditActionsWidget.js' ),\n\tLicenseDialogWidget = require( './LicenseDialogWidget.js' ),\n\tComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\twbTermsLanguages = require( 'wikibase.mediainfo.statements' ).config.wbTermsLanguages;\n\n/**\n * Panel for displaying/editing structured data multi-lingual captions\n *\n * RULES FOR LANGUAGE ORDERING/DISPLAY\n *\n * Order\n * -----\n *\n * 1. Show a caption for the interface language of the page (whether or not it has a value)\n * 2. If there is no caption for the interface language, show the first caption in the fallback\n * chain that has a value (if any)\n * 3. If the logged-in user has Babel languages, and they haven’t already been shown, then show\n * captions for all of them next, whether or not they have values\n * 4. Show everything else with a value\n *\n * Display\n * -------\n *\n * 1, 2, 3 are always displayed\n * 4 are hidden/shown by the languagesViewWidget\n * ... or, in other words - the first caption is always shown, the first non-blank caption\n * is always shown, all user languages are always shown, and everything else may be hidden.\n *\n * @extends OO.ui.Element\n * @mixin OO.ui.mixin.PendingElement\n *\n * @constructor\n * @param {Object} [config]\n * @param {datamodel.MediaInfo} config.mediaInfo\n * @param {boolean} [config.canEdit] True if the captions should be editable on the page\n * @param {string[]} [config.userLanguages] The language the user has indicated that they use (via babel)\n * @param {string[]} [config.languageFallbackChain]\n * @param {number} [config.warnWithinMaxCaptionLength] Show a warning when the caption length is within X\n * characters of the max\n */\nconst CaptionsPanel = function ( config ) {\n\tconst self = this;\n\tconfig = config || {};\n\n\t// Parent constructor\n\tCaptionsPanel.super.call( this, config );\n\n\t// Mixin constructor\n\tOO.ui.mixin.PendingElement.call( this, config );\n\n\tthis.userLanguages = config.userLanguages || [];\n\tthis.languageFallbackChain = config.languageFallbackChain || [ 'en' ];\n\tthis.canEdit = ( typeof config.canEdit === 'undefined' ) ? true : config.canEdit;\n\tthis.warnWithinMaxCaptionLength = config.warnWithinMaxCaptionLength;\n\tthis.savedCaptionsData = this.captionsDataFromMediaInfoEntity( config.mediaInfo );\n\n\tthis.api = wikibase.api.getLocationAgnosticMwApi(\n\t\tmw.config.get(\n\t\t\t'wbmiRepoApiUrl',\n\t\t\tmw.config.get( 'wbRepoApiUrl' )\n\t\t)\n\t);\n\n\t// Create the various widgets\n\tthis.licenseDialogWidget = new LicenseDialogWidget();\n\tthis.editActionsWidget = new CaptionsEditActionsWidget();\n\tthis.editActionsWidget.connect( this, { add: 'addNewEmptyLanguageRow' } );\n\tthis.editActionsWidget.connect( this, { publish: 'sendData' } );\n\tthis.editActionsWidget.connect( this, { cancel: 'onCancel' } );\n\n\tthis.state = Object.assign(\n\t\t{},\n\t\tthis.getCaptionsState( this.savedCaptionsData ),\n\t\t{\n\t\t\tediting: false,\n\t\t\tdisabled: false,\n\t\t\tcaptionsDataEditors: {},\n\t\t\tdisplayAllLanguages: false\n\t\t}\n\t);\n\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.filePageDisplay',\n\t\t'templates/filepage/CaptionsPanel.mustache+dom'\n\t);\n\n\t// Set the target pending element to first child of $element, which is the first node of the\n\t// rendered template\n\tthis.renderPromise.then( () => {\n\t\tself.$pending = self.$element.children( ':first' );\n\t} );\n};\n\n/* Inheritance */\nOO.inheritClass( CaptionsPanel, OO.ui.Widget );\nOO.mixinClass( CaptionsPanel, ComponentWidget );\nOO.mixinClass( CaptionsPanel, OO.ui.mixin.PendingElement );\n\n/**\n * @param {datamodel.MediaInfo} mediaInfo\n * @return {Object} An object with langCodes as keys and CaptionData objects as values\n * @private\n */\nCaptionsPanel.prototype.captionsDataFromMediaInfoEntity = function ( mediaInfo ) {\n\tconst captionsData = {};\n\tif ( mediaInfo.labels !== undefined ) {\n\t\tObject.keys( mediaInfo.labels ).forEach( ( langCode ) => {\n\t\t\tcaptionsData[ langCode ] = new CaptionData(\n\t\t\t\tlangCode,\n\t\t\t\tmediaInfo.labels[ langCode ].value\n\t\t\t);\n\t\t} );\n\t}\n\treturn captionsData;\n};\n\n/**\n * @param {Object} captionsData An object with langCodes as keys and CaptionData objects as values\n * @return {{captionsData:Object, orderedLanguageCodes:Array}}\n */\nCaptionsPanel.prototype.getCaptionsState = function ( captionsData ) {\n\t// ensure we have the interface language\n\tcaptionsData = this.ensureCaptionDataArrayHasLanguage(\n\t\tcaptionsData,\n\t\tthis.languageFallbackChain[ 0 ]\n\t);\n\n\tif ( this.canEdit ) {\n\t\tcaptionsData = this.addCaptionsDataForUserLanguages( captionsData );\n\t}\n\n\treturn {\n\t\tcaptionsData: captionsData,\n\t\torderedLanguageCodes: this.getOrderedLangCodes( captionsData )\n\t};\n};\n\n/**\n * If the input object does not have a CaptionData object for the specified langCode, add a\n * blank one\n *\n * @param {Object} captionDataArray Object with langCodes as keys and CaptionData objects as values\n * @param {string} langCode\n * @return {Object} Object with langCodes as keys and CaptionData objects as values\n * @private\n */\nCaptionsPanel.prototype.ensureCaptionDataArrayHasLanguage = function (\n\tcaptionDataArray,\n\tlangCode\n) {\n\tif ( captionDataArray[ langCode ] === undefined ) {\n\t\tcaptionDataArray[ langCode ] = new CaptionData( langCode );\n\t}\n\treturn captionDataArray;\n};\n\n/**\n * If the input object does not have a CaptionData object for each user language,\n * add a blank one\n *\n * @param {Object} captionDataArray Object with langCodes as keys and CaptionData objects as values\n * @return {Object} Object with langCodes as keys and CaptionData objects as values\n * @private\n */\nCaptionsPanel.prototype.addCaptionsDataForUserLanguages = function ( captionDataArray ) {\n\tconst self = this;\n\t// Create CaptionData objects for user languages that we don't already have on the screen\n\tthis.userLanguages.forEach( ( langCode ) => {\n\t\tcaptionDataArray = self.ensureCaptionDataArrayHasLanguage( captionDataArray, langCode );\n\t} );\n\treturn captionDataArray;\n};\n\n/**\n * Returns a list of langCodes from captionDataArray, ordered based on the rules specified\n * in the class comments\n *\n * @param {Object} captionDataArray Object with langCodes as keys and CaptionData objects as values\n * @return {Array}\n * @private\n */\nCaptionsPanel.prototype.getOrderedLangCodes = function ( captionDataArray ) {\n\tconst captionLanguages = Object.keys( captionDataArray );\n\tconst rearrangedCaptionLanguages = [];\n\n\t// First language in fallback chain (i.e. the interface language) is always first\n\trearrangedCaptionLanguages.push( this.languageFallbackChain[ 0 ] );\n\n\t// If there is no data for the interface language, then the first language in the fallback\n\t// chain with a value goes next\n\tif (\n\t\ttypeof captionDataArray[ this.languageFallbackChain[ 0 ] ] !== CaptionData ||\n\t\tcaptionDataArray[ this.languageFallbackChain[ 0 ] ].text !== ''\n\t) {\n\t\tfor ( let i = 1; i < this.languageFallbackChain.length; i++ ) {\n\t\t\tif (\n\t\t\t\tcaptionDataArray[ this.languageFallbackChain[ i ] ] &&\n\t\t\t\tcaptionDataArray[ this.languageFallbackChain[ i ] ].text !== ''\n\t\t\t) {\n\t\t\t\trearrangedCaptionLanguages.push( this.languageFallbackChain[ i ] );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// User languages go next\n\tthis.userLanguages.forEach( ( langCode ) => {\n\t\tif ( !rearrangedCaptionLanguages.includes( langCode ) ) {\n\t\t\trearrangedCaptionLanguages.push( langCode );\n\t\t}\n\t} );\n\n\t// And finally all other languages\n\tcaptionLanguages.forEach( ( langCode ) => {\n\t\tif ( !rearrangedCaptionLanguages.includes( langCode ) ) {\n\t\t\trearrangedCaptionLanguages.push( langCode );\n\t\t}\n\t} );\n\n\treturn rearrangedCaptionLanguages;\n};\n\n/**\n * @return {Object|jQuery.Promise<Object>}\n */\nCaptionsPanel.prototype.getTemplateData = function () {\n\tif ( this.state.editing === true ) {\n\t\treturn this.getTemplateDataEditable();\n\t} else {\n\t\treturn this.getTemplateDataReadOnly();\n\t}\n};\n\n/**\n * @return {Object|jQuery.Promise<Object>}\n */\nCaptionsPanel.prototype.getTemplateDataEditable = function () {\n\tconst self = this;\n\tconst templateCaptions = [];\n\tconst data = {\n\t\tediting: true,\n\t\ttitle: mw.msg( 'wikibasemediainfo-entitytermsforlanguagelistview-caption' ),\n\t\teditActionsWidget: this.editActionsWidget\n\t};\n\n\tlet inputErrorFound = false;\n\n\tObject.keys( this.state.captionsDataEditors ).forEach( ( guid ) => {\n\t\tconst captionDataEditor = self.state.captionsDataEditors[ guid ];\n\n\t\ttemplateCaptions.push( {\n\t\t\tshow: true,\n\t\t\tempty: false,\n\t\t\ttextDirection: $.uls.data.getDir( captionDataEditor.getLanguageCode() ),\n\t\t\tlangCode: captionDataEditor.getLanguageCode(),\n\t\t\tlanguage: captionDataEditor.getLanguageSelector(),\n\t\t\tcaption: captionDataEditor.getTextInput(),\n\t\t\tdeleter: captionDataEditor.getDeleter(),\n\t\t\tinputError: captionDataEditor.getInputError(),\n\t\t\tinputWarning: captionDataEditor.getInputWarning()\n\t\t} );\n\n\t\tif ( captionDataEditor.getInputError() !== '' ) {\n\t\t\tinputErrorFound = true;\n\t\t}\n\t} );\n\tdata.captions = templateCaptions;\n\n\tif ( !this.hasChanges() ) {\n\t\tdata.editActionsWidget.disablePublish();\n\t} else {\n\t\tif ( inputErrorFound ) {\n\t\t\tdata.editActionsWidget.disablePublish();\n\t\t} else {\n\t\t\tdata.editActionsWidget.enablePublish();\n\t\t}\n\t}\n\n\treturn data;\n};\n\n/**\n * @return {Object|jQuery.Promise<Object>}\n */\nCaptionsPanel.prototype.getTemplateDataReadOnly = function () {\n\tconst self = this;\n\tconst templateCaptions = [];\n\tconst showCaptionFlags = this.getShowCaptionFlagsByLangCode();\n\n\t// basic template data\n\tconst data = {\n\t\tediting: false,\n\t\ttitle: mw.msg( 'wikibasemediainfo-entitytermsforlanguagelistview-caption' )\n\t};\n\n\t// the \"edit\" button\n\tif ( this.canEdit ) {\n\t\tdata.editToggle = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-edit' ),\n\t\t\tframed: false,\n\t\t\tflags: 'progressive',\n\t\t\ttitle: mw.msg( 'wikibasemediainfo-filepage-edit-captions' ),\n\t\t\tclasses: [ 'wbmi-entityview-editButton' ]\n\t\t} );\n\t\tdata.editToggle.connect( this, { click: [ 'makeEditable' ] } );\n\t} else {\n\t\tdata.editToggle = '';\n\t}\n\n\t// \"see X more languages\"/\"see fewer languages\" link\n\tif ( self.getHideableLanguageCount() > 0 ) {\n\t\tdata.languagesViewWidget = new OO.ui.ButtonWidget( {\n\t\t\ticon: this.state.displayAllLanguages ? 'collapse' : 'expand',\n\t\t\tflags: 'progressive',\n\t\t\tframed: false,\n\t\t\tlabel: this.state.displayAllLanguages ?\n\t\t\t\tmw.msg( 'wikibasemediainfo-filepage-fewer-languages' ) :\n\t\t\t\tmw.msg(\n\t\t\t\t\t'wikibasemediainfo-filepage-more-languages',\n\t\t\t\t\tmw.language.convertNumber( self.getHideableLanguageCount() )\n\t\t\t\t)\n\t\t} ).on(\n\t\t\t'click',\n\t\t\tthis.setState.bind( this, { displayAllLanguages: !this.state.displayAllLanguages } )\n\t\t);\n\t}\n\n\tlet count = 0;\n\t// captions data\n\tthis.state.orderedLanguageCodes.forEach( ( langCode ) => {\n\t\tconst captionData = self.state.captionsData[ langCode ];\n\t\tconst language = captionData.languageText;\n\t\tconst caption = captionData.text ?\n\t\t\tmw.html.escape( captionData.text ) :\n\t\t\tmw.message( 'wikibasemediainfo-filepage-caption-empty' ).escaped();\n\n\t\ttemplateCaptions.push( {\n\t\t\tshow: self.state.displayAllLanguages ? true : showCaptionFlags[ langCode ],\n\t\t\tindex: count,\n\t\t\ttextDirection: captionData.direction,\n\t\t\tlangCode: captionData.languageCode,\n\t\t\tlanguage: language,\n\t\t\tcaption: caption,\n\t\t\tempty: captionData.text === ''\n\t\t} );\n\t\tcount++;\n\n\t} );\n\tdata.captions = templateCaptions;\n\n\treturn data;\n};\n\n/**\n * Triggered when cancelling the edit mode.\n */\nCaptionsPanel.prototype.onCancel = function () {\n\tconst self = this;\n\n\tif ( this.hasChanges() ) {\n\t\tOO.ui.confirm(\n\t\t\tmw.msg( 'wikibasemediainfo-filepage-cancel-confirm' ),\n\t\t\t{\n\t\t\t\ttitle: mw.msg( 'wikibasemediainfo-filepage-cancel-confirm-title' ),\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\taction: 'accept',\n\t\t\t\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-cancel-confirm-accept' ),\n\t\t\t\t\t\tflags: [ 'primary', 'destructive' ]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\taction: 'reject',\n\t\t\t\t\t\tlabel: mw.msg( 'ooui-dialog-message-reject' ),\n\t\t\t\t\t\tflags: 'safe'\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t).then( ( confirmed ) => {\n\t\t\tif ( confirmed ) {\n\t\t\t\tself.restoreToSaved();\n\t\t\t}\n\t\t} );\n\t} else {\n\t\tthis.restoreToSaved();\n\t}\n};\n\n/**\n * Recreate this.state.captionsDataEditors with one element removed, and update\n * this.state.captionsData\n *\n * @param {string} guidToRemove\n */\nCaptionsPanel.prototype.onCaptionDeleted = function ( guidToRemove ) {\n\tconst modifiedCaptionsDataEditors = Object.assign( {}, this.state.captionsDataEditors );\n\tdelete modifiedCaptionsDataEditors[ guidToRemove ];\n\tthis.setState( {\n\t\tcaptionsDataEditors: modifiedCaptionsDataEditors\n\t} ).then( this.onDataChanged.bind( this ) );\n};\n\n/**\n * 1. Make sure each language can only be selected once\n * 2. Update the direction of textInputs based on selected languages\n * 3. Update this.state.captions from this.state.captionsDataEditors\n */\nCaptionsPanel.prototype.onDataChanged = function () {\n\tconst self = this, captionsData = {};\n\tthis.refreshLanguageSelectorsOptions();\n\tObject.keys( this.state.captionsDataEditors ).forEach( ( guid ) => {\n\t\tconst langSelector = self.state.captionsDataEditors[ guid ].languageSelector,\n\t\t\tlangCode = langSelector.getValue(),\n\t\t\ttextInput = self.state.captionsDataEditors[ guid ].textInput;\n\t\tif ( langCode ) {\n\t\t\ttextInput.setDir( $.uls.data.getDir( langCode ) );\n\t\t\tif ( textInput.getValue() ) {\n\t\t\t\tcaptionsData[ langCode ] = new CaptionData(\n\t\t\t\t\tlangCode,\n\t\t\t\t\ttextInput.getValue()\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} );\n\tthis.setState( this.getCaptionsState( captionsData ) );\n};\n\n/**\n * Restores to a read-only view with the saved captions data\n */\nCaptionsPanel.prototype.restoreToSaved = function () {\n\tconst restoredState = Object.assign( {}, this.getCaptionsState( this.savedCaptionsData ), {\n\t\tediting: false,\n\t\tdisabled: false\n\t} );\n\tthis.setState( restoredState );\n};\n\n/**\n * Gets all languages that we accept captions for EXCEPT languages in excludeLanguages\n *\n * @param {string[]} excludeLanguages Languages to exclude from the return array\n * @return {Object} Lang codes as keys, lang names in interface language as values\n * @private\n */\nCaptionsPanel.prototype.getAvailableLanguages = function ( excludeLanguages ) {\n\tconst languages = {};\n\tObject.assign( languages, wbTermsLanguages );\n\t( excludeLanguages || [] ).forEach( ( languageCode ) => {\n\t\tdelete languages[ languageCode ];\n\t} );\n\treturn languages;\n};\n\n/**\n * Make sure available languages in each language selector don't include languages that are\n * selected in another selector\n *\n * @private\n */\nCaptionsPanel.prototype.refreshLanguageSelectorsOptions = function () {\n\tconst self = this,\n\t\tcurrentlySelectedLanguages = [],\n\t\tcaptionsDataEditors = this.state.captionsDataEditors;\n\n\tObject.keys( captionsDataEditors ).forEach( ( guid ) => {\n\t\tcurrentlySelectedLanguages.push( captionsDataEditors[ guid ].languageSelector.getValue() );\n\t} );\n\tObject.keys( captionsDataEditors ).forEach( ( guid ) => {\n\t\tcaptionsDataEditors[ guid ].languageSelector.updateLanguages(\n\t\t\tself.getAvailableLanguages(\n\t\t\t\tcurrentlySelectedLanguages.filter( ( langCode ) => langCode !== captionsDataEditors[ guid ].languageSelector.getValue() )\n\t\t\t)\n\t\t);\n\t} );\n};\n\n/**\n * @return {boolean} True if any captions have been changed/added/deleted\n */\nCaptionsPanel.prototype.hasChanges = function () {\n\tconst self = this;\n\tconst nonEmptyCaptionsData = {};\n\tlet hasChanges;\n\thasChanges = Object.keys( this.state.captionsData ).some( ( langCode ) => {\n\t\tif ( self.state.captionsData[ langCode ].text !== '' ) {\n\t\t\tnonEmptyCaptionsData[ langCode ] = self.state.captionsData[ langCode ];\n\t\t\tif ( !self.savedCaptionsData[ langCode ] ) {\n\t\t\t\thasChanges = true;\n\t\t\t\treturn true;\n\t\t\t} else if (\n\t\t\t\tself.state.captionsData[ langCode ].text !== self.savedCaptionsData[ langCode ].text\n\t\t\t) {\n\t\t\t\thasChanges = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t} );\n\tif (\n\t\tObject.keys( nonEmptyCaptionsData ).length !==\n\t\tObject.keys( this.savedCaptionsData ).length\n\t) {\n\t\thasChanges = true;\n\t}\n\treturn hasChanges;\n};\n\n/**\n * Get a value object for sending data to the api\n *\n * @param {string} language Language code\n * @param {string} text Caption text\n * @return {{bot: number, action: string, id, value: *, language: *}} Value object\n * @private\n */\nCaptionsPanel.prototype.getWbSetLabelParams = function ( language, text ) {\n\tconst apiParams = {\n\t\t/*\n\t\t * Unconditionally set the bot parameter to match the UI behavior of core.\n\t\t * In normal page editing, if you have the \"bot\" user right and edit through the GUI\n\t\t * interface, your edit is marked as bot no matter what.\n\t\t * @see https://gerrit.wikimedia.org/r/71246\n\t\t * @see https://phabricator.wikimedia.org/T189477\n\t\t */\n\t\tbot: 1,\n\t\taction: 'wbsetlabel',\n\t\tid: mw.config.get( 'wbEntityId' ),\n\t\tvalue: text,\n\t\tlanguage: language,\n\t\treturnto: mw.config.get( 'wgPageName' )\n\t};\n\t// Don't send baserevid unless we already have saved captions (a quirk of the api)\n\tif ( Object.keys( this.savedCaptionsData ).length > 0 ) {\n\t\tapiParams.baserevid = mw.mediaInfo.structuredData.currentRevision;\n\t}\n\treturn apiParams;\n};\n\n/**\n * Returns an object containing of showCaption flags for each element of labelsData, indexed by\n * langCode. Flags are set to true if a caption *must always* be shown\n *\n * See class comments for rules on when to show/hide captions\n *\n * @return {Object}\n * Array of showCaption flags, indexed by langCode\n * @private\n */\nCaptionsPanel.prototype.getShowCaptionFlagsByLangCode = function () {\n\tconst self = this;\n\tlet firstCaptionIsBlank;\n\tconst indexedShowCaptionFlags = {};\n\n\tthis.state.orderedLanguageCodes.forEach( ( langCode, index ) => {\n\t\tconst captionData = self.state.captionsData[ langCode ];\n\t\tlet showCaption;\n\t\tif ( index === 0 ) {\n\t\t\tshowCaption = true;\n\t\t\tfirstCaptionIsBlank = ( captionData.text === '' );\n\t\t} else if (\n\t\t\tindex === 1 &&\n\t\t\tfirstCaptionIsBlank &&\n\t\t\tcaptionData.text !== ''\n\t\t) {\n\t\t\tshowCaption = true;\n\t\t} else {\n\t\t\tif ( !self.userLanguages.includes( langCode ) ) {\n\t\t\t\tshowCaption = false;\n\t\t\t} else {\n\t\t\t\tshowCaption = true;\n\t\t\t}\n\t\t}\n\t\tindexedShowCaptionFlags[ langCode ] = showCaption;\n\t} );\n\treturn indexedShowCaptionFlags;\n};\n\n/**\n * Returns the number of languages which may be hidden from the user\n *\n * See class comments for rules on when to show/hide captions\n *\n * @return {number}\n * @private\n */\nCaptionsPanel.prototype.getHideableLanguageCount = function () {\n\tconst showCaptionFlags = this.getShowCaptionFlagsByLangCode();\n\n\treturn Object.keys( showCaptionFlags ).filter(\n\t\t( langCode ) => showCaptionFlags[ langCode ] === false\n\t).length;\n};\n\nCaptionsPanel.prototype.makeEditable = function () {\n\tconst self = this;\n\n\t// Show IP address logging notice to anon users\n\tif ( mw.config.get( 'wbmiShowIPEditingWarning' ) && mw.user.isAnon() ) {\n\t\tAnonWarning.notifyOnce();\n\t}\n\n\t// show dialog informing user of licensing\n\tself.licenseDialogWidget.getConfirmationIfNecessary().then( () => {\n\t\tconst entityId = mw.config.get( 'wbEntityId' );\n\t\tself.pushPending();\n\t\t// refresh caption data from the api\n\t\tself.api\n\t\t\t.get( {\n\t\t\t\taction: 'wbgetentities',\n\t\t\t\tprops: 'info|labels',\n\t\t\t\tids: entityId\n\t\t\t} )\n\t\t\t.done( ( result ) => {\n\t\t\t\tmw.mediaInfo.structuredData.currentRevision = result.entities[ entityId ].lastrevid;\n\t\t\t\tself.savedCaptionsData = self.captionsDataFromMediaInfoEntity(\n\t\t\t\t\tresult.entities[ entityId ]\n\t\t\t\t);\n\t\t\t} )\n\t\t\t.fail( () => {\n\t\t\t\t// Ignore the failure and just make do with the data we already have saved\n\t\t\t} )\n\t\t\t.always( () => {\n\t\t\t\tconst captionsDataEditors = {},\n\t\t\t\t\tcaptionsState = self.getCaptionsState(\n\t\t\t\t\t\t// Copy by value so the saved data isn't modified\n\t\t\t\t\t\tObject.assign( {}, self.savedCaptionsData )\n\t\t\t\t\t);\n\n\t\t\t\tcaptionsState.orderedLanguageCodes.forEach( ( langCode ) => {\n\t\t\t\t\tconst guid = self.createGuid();\n\t\t\t\t\tcaptionsDataEditors[ guid ] = self.createCaptionDataEditor(\n\t\t\t\t\t\tguid,\n\t\t\t\t\t\tself.savedCaptionsData[ langCode ] || new CaptionData( langCode )\n\t\t\t\t\t);\n\t\t\t\t} );\n\n\t\t\t\tself.setState(\n\t\t\t\t\tObject.assign(\n\t\t\t\t\t\tcaptionsState,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcaptionsDataEditors: captionsDataEditors,\n\t\t\t\t\t\t\tediting: true\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t).then( () => {\n\t\t\t\t\tself.refreshLanguageSelectorsOptions();\n\t\t\t\t\tself.popPending();\n\t\t\t\t} );\n\t\t\t} );\n\t} );\n};\n\nCaptionsPanel.prototype.addNewEmptyLanguageRow = function () {\n\tconst guid = this.createGuid(),\n\t\tcaptionsDataEditors = Object.assign(\n\t\t\t{},\n\t\t\tthis.state.captionsDataEditors\n\t\t);\n\tcaptionsDataEditors[ guid ] = this.createCaptionDataEditor( guid, new CaptionData() );\n\tthis.setState( {\n\t\tcaptionsDataEditors: captionsDataEditors\n\t} ).then( this.refreshLanguageSelectorsOptions.bind( this ) );\n};\n\nCaptionsPanel.prototype.sendData = function () {\n\tconst self = this;\n\tconst captionsDataEditors = Object.assign( {}, this.state.captionsDataEditors );\n\tlet promise = $.Deferred().resolve().promise();\n\tconst tempuser = {};\n\n\tthis.setSending();\n\n\t// Send changed data\n\tObject.keys( captionsDataEditors ).forEach( ( guid ) => {\n\t\tconst captionDataEditor = captionsDataEditors[ guid ],\n\t\t\tlangCode = captionDataEditor.getLanguageCode(),\n\t\t\ttext = captionDataEditor.getText(),\n\t\t\tsavedData = self.savedCaptionsData[ langCode ];\n\n\t\tif ( text && langCode && ( !savedData || savedData.text !== text ) ) {\n\t\t\tpromise = promise.then( () => self.api.postWithToken(\n\t\t\t\t'csrf',\n\t\t\t\tself.getWbSetLabelParams( langCode, text )\n\t\t\t)\n\t\t\t\t.done( ( response ) => {\n\t\t\t\t\tmw.mediaInfo.structuredData.currentRevision = response.entity.lastrevid;\n\n\t\t\t\t\tself.savedCaptionsData[ langCode ] =\n\t\t\t\t\t\t\tnew CaptionData( langCode, text );\n\n\t\t\t\t\t// extract tempuser properties from response, if present\n\t\t\t\t\t// (this will only be present the first request)\n\t\t\t\t\tfor ( const property in response ) {\n\t\t\t\t\t\tif ( property.match( /^tempuser/ ) ) {\n\t\t\t\t\t\t\ttempuser[ property ] = response[ property ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.fail( ( errorCode, error ) => {\n\t\t\t\t\tconst apiError =\n\t\t\t\t\t\t\twikibase.api.RepoApiError.newFromApiResponse( error, 'save' );\n\t\t\t\t\tcaptionDataEditor.setInputError( apiError.detailedMessage );\n\t\t\t\t} ) );\n\t\t}\n\t} );\n\n\t// Delete removed data\n\tObject.keys( this.savedCaptionsData ).forEach( ( langCode ) => {\n\t\tconst captionsData = self.state.captionsData[ langCode ];\n\t\tif ( !captionsData || captionsData.text === '' ) {\n\t\t\tpromise = promise.then( () => self.api.postWithToken(\n\t\t\t\t'csrf',\n\t\t\t\tself.getWbSetLabelParams( langCode, '' )\n\t\t\t)\n\t\t\t\t.done( ( response ) => {\n\t\t\t\t\tmw.mediaInfo.structuredData.currentRevision = response.entity.lastrevid;\n\n\t\t\t\t\tdelete self.savedCaptionsData[ langCode ];\n\n\t\t\t\t\t// extract tempuser properties from response, if present\n\t\t\t\t\t// (this will only be present the first request)\n\t\t\t\t\tfor ( const property in response ) {\n\t\t\t\t\t\tif ( property.match( /^tempuser/ ) ) {\n\t\t\t\t\t\t\ttempuser[ property ] = response[ property ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.fail( ( errorCode, error ) => {\n\t\t\t\t\tconst apiError =\n\t\t\t\t\t\t\t\twikibase.api.RepoApiError.newFromApiResponse( error, 'save' ),\n\t\t\t\t\t\tguid = self.createGuid(),\n\t\t\t\t\t\tcaptionDataEditor = self.createCaptionDataEditor( guid, self.savedCaptionsData[ langCode ] );\n\t\t\t\t\tcaptionDataEditor.setInputError( apiError.detailedMessage );\n\t\t\t\t\tcaptionsDataEditors[ guid ] = captionDataEditor;\n\t\t\t\t} ) );\n\t\t}\n\t} );\n\n\tpromise.then( () => {\n\t\tself.setState(\n\t\t\tObject.assign(\n\t\t\t\t{},\n\t\t\t\tself.getCaptionsState( self.savedCaptionsData ),\n\t\t\t\t{\n\t\t\t\t\tediting: false,\n\t\t\t\t\tcaptionsDataEditors: {},\n\t\t\t\t\tdisplayAllLanguages: true\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t} ).catch( () => {\n\t\tself.setState( {\n\t\t\tediting: true,\n\t\t\tcaptionsDataEditors: captionsDataEditors\n\t\t} );\n\t} ).always( () => {\n\t\tif ( tempuser.tempuserredirect ) {\n\t\t\twindow.location.href = tempuser.tempuserredirect;\n\t\t} else if ( tempuser.tempusercreated ) {\n\t\t\tmw.tempUserCreated.showPopup();\n\t\t}\n\t\tself.setReady();\n\t} );\n};\n\n/**\n * @param {string} guid\n * @param {CaptionData} captionData\n * @return {CaptionDataEditor}\n */\nCaptionsPanel.prototype.createCaptionDataEditor = function ( guid, captionData ) {\n\tconst captionDataEditor = new CaptionDataEditor( guid, captionData, { warnWithinMaxCaptionLength: this.warnWithinMaxCaptionLength } );\n\tthis.enableCaptionDataEditor( captionDataEditor );\n\treturn captionDataEditor;\n};\n\n/**\n * @param {CaptionDataEditor} captionDataEditor\n */\nCaptionsPanel.prototype.enableCaptionDataEditor = function ( captionDataEditor ) {\n\tcaptionDataEditor.setDisabled( false );\n\n\tcaptionDataEditor.connect( this, { captionDeleted: 'onCaptionDeleted' } );\n\tcaptionDataEditor.connect( this, { languageSelectorUpdated: 'onDataChanged' } );\n\tcaptionDataEditor.connect( this, { textInputChanged: 'onDataChanged' } );\n\tcaptionDataEditor.connect( this, { textInputSubmitted: 'sendData' } );\n};\n\n/**\n * @param {CaptionDataEditor} captionDataEditor\n */\nCaptionsPanel.prototype.disableCaptionDataEditor = function ( captionDataEditor ) {\n\tcaptionDataEditor.setDisabled( true );\n\n\tcaptionDataEditor.disconnect( this, { captionDeleted: 'onCaptionDeleted' } );\n\tcaptionDataEditor.disconnect( this, { languageSelectorUpdated: 'onDataChanged' } );\n\tcaptionDataEditor.disconnect( this, { textInputChanged: 'onDataChanged' } );\n\tcaptionDataEditor.disconnect( this, { textInputSubmitted: 'sendData' } );\n};\n\n/**\n * Puts the panel into a 'sending' state without re-rendering\n */\nCaptionsPanel.prototype.setSending = function () {\n\tconst self = this;\n\tthis.editActionsWidget.setStateSending();\n\tObject.keys( this.state.captionsDataEditors ).forEach( ( guid ) => {\n\t\tself.disableCaptionDataEditor( self.state.captionsDataEditors[ guid ] );\n\t} );\n\tthis.pushPending();\n};\n\n/**\n * Puts the panel into a ready' state without re-rendering\n */\nCaptionsPanel.prototype.setReady = function () {\n\tconst self = this;\n\tthis.editActionsWidget.setStateReady();\n\tObject.keys( this.state.captionsDataEditors ).forEach( ( guid ) => {\n\t\tself.enableCaptionDataEditor( self.state.captionsDataEditors[ guid ] );\n\t} );\n\tthis.popPending();\n};\n\n/**\n * Create a GUID for keeping track of CaptionDataEditWidgets\n *\n * @see derived from https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript\n * @return {string}\n */\nCaptionsPanel.prototype.createGuid = function () {\n\treturn 'xxxxxxxx-xxxx-4xxx-8xxx-xxxxxxxxxxxx'.replace(\n\t\t/[x]/g, () => ( Math.random() * 16 ).toString( 16 ).slice( 0, 1 )\n\t);\n};\n\nCaptionsPanel.prototype.isEditable = function () {\n\treturn this.state.editable;\n};\n\nCaptionsPanel.prototype.isDisabled = function () {\n\treturn false;\n};\n\nmodule.exports = CaptionsPanel;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/LicenseDialogWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":13,"column":2,"nodeType":"CallExpression","endLine":13,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/ProtectionMsgWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/StatementPanel.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'dataLoadedReadOnly' is undefined.","line":26,"column":1,"nodeType":"Block","endLine":26,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'widgetRemoved' is undefined.","line":240,"column":1,"nodeType":"Block","endLine":240,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst AnonWarning = require( './AnonWarning.js' ),\n\tFormatValueElement = require( 'wikibase.mediainfo.base' ).FormatValueElement,\n\tLicenseDialogWidget = require( './LicenseDialogWidget.js' ),\n\tStatementWidget = require( 'wikibase.mediainfo.statements' ).StatementWidget,\n\tdataTypesMap = mw.config.get( 'wbDataTypes' );\n\n/**\n * Panel for displaying/editing structured data statements\n *\n * @extends OO.ui.Element\n * @mixin OO.ui.mixin.PendingElement\n *\n * @constructor\n * @param {Object} config Configuration options\n * @param {jQuery} config.$element Node to replace with statement panel\n * @param {string} config.entityId Entity ID (e.g. M123 id of the file you just uploaded)\n * @param {string} config.propertyId Property ID (e.g. P123 id of `depicts` property)\n * @param {string} config.propertyType Property datatype (e.g. 'wikibase-item', 'url', 'string', ...)\n * @param {string} config.showControls Whether or not to display editing controls\n * @param {Object} [config.helpUrls] An object with property id as members and help urls for\n * @param {Object} [config.disabled] True/false to indicate whether the statement is disabled/enabled\n * the property as values\n * e.g. { P1: \"https://commons.wikimedia.org/wiki/Special:MyLanguage/Commons:Depicts\" }\n * @fires dataLoadedReadOnly\n */\nconst StatementPanel = function StatementPanelConstructor( config ) {\n\t// Parent constructor\n\tStatementPanel.super.apply( this, arguments );\n\n\tthis.$element = config.$element;\n\tdelete config.$element;\n\tthis.config = config || {};\n\n\t// Mixin constructors\n\tOO.ui.mixin.PendingElement.call( this, this.config );\n\n\tif ( this.$element.attr( 'data-mw-formatvalue' ) ) {\n\t\tthis.populateFormatValueCache( JSON.parse( this.$element.attr( 'data-mw-formatvalue' ) || '{}' ) );\n\t}\n\n\tthis.licenseDialogWidget = new LicenseDialogWidget();\n\n\tthis.statementWidget = new StatementWidget( Object.assign( {\n\t\tshowControls: !this.disabled && this.config.showControls,\n\t\tvalueType: this.config.propertyType in dataTypesMap ? dataTypesMap[ this.config.propertyType ].dataValueType : undefined\n\t}, this.config ) );\n\tthis.statementWidget.setDisabled( this.disabled );\n\n\tthis.bindEventHandlers();\n\n\t// attach the widget to DOM, replacing the server-side rendered equivalent\n\tthis.$element.empty().append( this.statementWidget.$element );\n\n\tif ( !this.isSupportedType() ) {\n\t\tthis.$element.addClass( 'wbmi-entityview-statementsGroup-unsupported' );\n\t}\n\n\tthis.$pending = this.$element;\n};\n\n/* Inheritance */\nOO.inheritClass( StatementPanel, OO.ui.Widget );\nOO.mixinClass( StatementPanel, OO.ui.mixin.PendingElement );\n\nStatementPanel.prototype.bindEventHandlers = function () {\n\tthis.statementWidget.connect( this, { cancel: 'makeReadOnly' } );\n\tthis.statementWidget.connect( this, { publish: 'sendData' } );\n\tthis.statementWidget.connect( this, { edit: 'makeEditable' } ); // clicked 'edit'\n\tthis.statementWidget.connect( this, { change: 'makeEditable' } ); // changed otherwise (e.g. 'make prominent')\n\tthis.statementWidget.connect( this, { widgetRemoved: 'remove' } );\n};\n\n/**\n * @param {datamodel.StatementList} data\n * @return {jQuery.promise}\n */\nStatementPanel.prototype.setData = function ( data ) {\n\tthis.unbindEventHandlers();\n\n\t// don't subscribe to events until statementwidget has been populated with data\n\treturn this.statementWidget.resetData( data ).then( this.bindEventHandlers.bind( this ) );\n};\n\nStatementPanel.prototype.unbindEventHandlers = function () {\n\tthis.statementWidget.disconnect( this, { cancel: 'makeReadOnly' } );\n\tthis.statementWidget.disconnect( this, { publish: 'sendData' } );\n\tthis.statementWidget.disconnect( this, { edit: 'makeEditable' } );\n\tthis.statementWidget.disconnect( this, { change: 'makeEditable' } );\n\tthis.statementWidget.disconnect( this, { widgetRemoved: 'remove' } );\n};\n\n/**\n * Pre-populate the formatValue cache, which will save some\n * API calls if we end up wanting to format some of these...\n *\n * @param {Object} data\n */\nStatementPanel.prototype.populateFormatValueCache = function ( data ) {\n\tObject.keys( data ).forEach( ( dataValue ) => {\n\t\tObject.keys( data[ dataValue ] ).forEach( ( format ) => {\n\t\t\tObject.keys( data[ dataValue ][ format ] ).forEach( ( language ) => {\n\t\t\t\tconst properties = data[ dataValue ][ format ][ language ];\n\t\t\t\tObject.keys( properties ).forEach( ( propertyId ) => {\n\t\t\t\t\tconst json = JSON.parse( dataValue ),\n\t\t\t\t\t\tkey = FormatValueElement.getKey(\n\t\t\t\t\t\t\tdataValues.newDataValue( json.type, json.value ),\n\t\t\t\t\t\t\tformat,\n\t\t\t\t\t\t\tlanguage,\n\t\t\t\t\t\t\tpropertyId || undefined\n\t\t\t\t\t\t),\n\t\t\t\t\t\tresult = properties[ propertyId ];\n\t\t\t\t\tFormatValueElement.toCache( key, result );\n\t\t\t\t} );\n\t\t\t} );\n\t\t} );\n\t} );\n};\n\n/**\n * Check for changes to statement claims or number of statements\n *\n * @return {boolean}\n */\nStatementPanel.prototype.hasChanges = function () {\n\treturn this.statementWidget.hasChanges();\n};\n\n/**\n * @return {boolean}\n */\nStatementPanel.prototype.isEditable = function () {\n\treturn this.statementWidget.isEditing();\n};\n\n/**\n * @return {boolean}\n */\nStatementPanel.prototype.isSupportedType = function () {\n\tconst supportedTypes = mw.config.get( 'wbmiSupportedDataTypes' ) || [];\n\treturn supportedTypes.includes( this.config.propertyType );\n};\n\n/**\n * Toggle the panel into edit mode. This method is asynchronous.\n */\nStatementPanel.prototype.makeEditable = function () {\n\tconst self = this;\n\n\t// Show IP address logging notice to anon users\n\tif ( mw.config.get( 'wbmiShowIPEditingWarning' ) && mw.user.isAnon() ) {\n\t\tAnonWarning.notifyOnce();\n\t}\n\n\t// show dialog informing user of licensing & store the returned promise\n\t// in licenseAcceptance - submit won't be possible until dialog is closed\n\tthis.licenseDialogWidget.getConfirmationIfNecessary().then(\n\t\t() => {\n\t\t\tself.statementWidget.setEditing.bind( self.statementWidget, true );\n\n\t\t\tif ( !self.isSupportedType() ) {\n\t\t\t\tself.showUnsupportedPopup();\n\t\t\t}\n\t\t},\n\t\tthis.makeReadOnly.bind( this )\n\t);\n};\n\n/**\n * Toggle the panel into read mode. This method is asynchronous.\n */\nStatementPanel.prototype.makeReadOnly = function () {\n\tconst self = this;\n\tthis.statementWidget.disconnect( this, { change: 'makeEditable' } );\n\tthis.statementWidget.resetData().then( () => {\n\t\tself.statementWidget.connect( self, { change: 'makeEditable' } );\n\t\tself.emit( 'readOnly' );\n\t} );\n};\n\nStatementPanel.prototype.sendData = function () {\n\tconst self = this;\n\n\tthis.statementWidget.disconnect( this, { change: 'makeEditable' } );\n\tthis.pushPending();\n\n\tthis.statementWidget.submit( mw.mediaInfo.structuredData.currentRevision || undefined )\n\t\t.then( ( response ) => {\n\t\t\tmw.mediaInfo.structuredData.currentRevision = response.pageinfo.lastrevid;\n\t\t\tself.makeReadOnly();\n\n\t\t\t// if the statement widget is removed then also remove the panel\n\t\t\tif ( self.statementWidget.getData().length === 0 && !self.config.isDefaultProperty ) {\n\t\t\t\tself.remove();\n\t\t\t}\n\n\t\t\tif ( response.tempuserredirect ) {\n\t\t\t\twindow.location.href = response.tempuserredirect;\n\t\t\t} else if ( response.tempusercreated ) {\n\t\t\t\tmw.tempUserCreated.showPopup();\n\t\t\t}\n\t\t} ).catch( () => {\n\t\t\t// allow panel to be re-enabled to allow trying submission again\n\t\t\tself.statementWidget.setDisabled( false );\n\t\t} ).always( () => {\n\t\t\tself.statementWidget.connect( self, { change: 'makeEditable' } );\n\t\t\tself.popPending();\n\t\t} );\n};\n\nStatementPanel.prototype.showUnsupportedPopup = function () {\n\tconst popupMsg = mw.message(\n\t\t'wikibasemediainfo-statements-unsupported-property-type-content'\n\t).parse();\n\n\tconst $content = $( '<div>' ).append(\n\t\t$( '<h4>' ).html(\n\t\t\tmw.message( 'wikibasemediainfo-statements-unsupported-property-title' ).parse()\n\t\t),\n\t\t$( '<p>' ).html( popupMsg )\n\t);\n\n\tconst popup = new OO.ui.PopupWidget( {\n\t\t$floatableContainer: this.statementWidget.$element,\n\t\tposition: 'after',\n\t\tpadded: true,\n\t\tautoClose: true,\n\t\t$content: $content\n\t} );\n\n\tthis.$element.append( popup.$element );\n\tpopup.toggle( true );\n};\n\n/**\n * Notifies the top-level Filepage/UploadWizard JS of removal so that it can be\n * handled properly.\n *\n * @fires widgetRemoved\n */\nStatementPanel.prototype.remove = function () {\n\tthis.emit( 'widgetRemoved', this.config.propertyId );\n};\n\n/**\n * Handle the response from a wbcheckconstraints api call\n *\n * @param {Object} response\n */\nStatementPanel.prototype.handleConstraintsResponse = function ( response ) {\n\tthis.statementWidget.handleConstraintsResponse(\n\t\tthis.extractResultsForPropertyId( response )\n\t);\n};\n\n/**\n * Extract the constraint check results for a certain statement from the full API response.\n *\n * @param {Object} response The constraint check results\n * @return {Object|null} An object containing lists of constraint check results,\n * or null if the results could not be extracted.\n * @see WikibaseQualityConstraints/modules/gadget.js::_extractResultsForStatement()\n */\nStatementPanel.prototype.extractResultsForPropertyId = function ( response ) {\n\tconst propertyId = this.config.propertyId,\n\t\tentityId = mw.config.get( 'wbEntityId' ),\n\t\tentityData = response.wbcheckconstraints[ entityId ];\n\tif ( 'claims' in entityData ) {\n\t\t// API v2 format\n\t\treturn entityData.claims[ propertyId ];\n\t} else {\n\t\treturn null;\n\t}\n};\n\nStatementPanel.prototype.setDisabled = function ( disabled ) {\n\tthis.disabled = disabled;\n\n\tif ( this.statementWidget === undefined ) {\n\t\t// object may not yet have been constructed fully\n\t\t// (ooui calls this from constructor)\n\t\treturn;\n\t}\n\n\tthis.statementWidget.setDisabled( disabled );\n};\n\nmodule.exports = StatementPanel;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/init.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":51,"column":17,"nodeType":"CallExpression","endLine":51,"endColumn":50,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":52,"column":21,"nodeType":"CallExpression","endLine":52,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":201,"column":3,"nodeType":"CallExpression","endLine":201,"endColumn":64,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/getDeserializer.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/mediawiki.template.mustache+dom.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":65,"column":23,"nodeType":"CallExpression","endLine":65,"endColumn":71,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/polyfills/Array.prototype.find.js","messages":[],"suppressedMessages":[{"ruleId":"no-extend-native","severity":2,"message":"Array prototype is read only, properties should not be added.","line":5,"column":2,"nodeType":"CallExpression","messageId":"unexpected","endLine":47,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"eqeqeq","severity":2,"message":"Expected '===' and instead saw '=='.","line":8,"column":14,"nodeType":"BinaryExpression","messageId":"unexpected","endLine":8,"endColumn":16,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"unicorn/throw-new-error","severity":2,"message":"Use `new` when creating an error.","line":9,"column":11,"nodeType":"CallExpression","messageId":"throw-new-error","endLine":9,"endColumn":55,"fix":{"range":[275,275],"text":"new "},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":12,"column":4,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":12,"endColumn":27,"fix":{"range":[330,333],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":15,"column":4,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":15,"endColumn":29,"fix":{"range":[410,413],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-bitwise","severity":2,"message":"Unexpected use of '>>>'.","line":15,"column":14,"nodeType":"BinaryExpression","messageId":"unexpected","endLine":15,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"unicorn/throw-new-error","severity":2,"message":"Use `new` when creating an error.","line":19,"column":11,"nodeType":"CallExpression","messageId":"throw-new-error","endLine":19,"endColumn":54,"fix":{"range":[564,564],"text":"new "},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":23,"column":4,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":23,"endColumn":33,"fix":{"range":[695,698],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":26,"column":4,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":26,"endColumn":14,"fix":{"range":[750,753],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":34,"column":5,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":34,"endColumn":25,"fix":{"range":[1020,1023],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"space-in-parens","severity":2,"message":"There must be a space before this paren.","line":47,"column":3,"nodeType":"Program","messageId":"missingClosingSpace","endLine":47,"endColumn":4,"fix":{"range":[1256,1256],"text":" "},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"eol-last","severity":2,"message":"Newline required at end of file but not found.","line":48,"column":2,"nodeType":"Program","messageId":"missing","fix":{"range":[1260,1260],"text":"\n"},"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/polyfills/Array.prototype.findIndex.js","messages":[],"suppressedMessages":[{"ruleId":"no-extend-native","severity":2,"message":"Array prototype is read only, properties should not be added.","line":5,"column":2,"nodeType":"CallExpression","messageId":"unexpected","endLine":47,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"eqeqeq","severity":2,"message":"Expected '===' and instead saw '=='.","line":8,"column":14,"nodeType":"BinaryExpression","messageId":"unexpected","endLine":8,"endColumn":16,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":12,"column":4,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":12,"endColumn":27,"fix":{"range":[349,352],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":15,"column":4,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":15,"endColumn":29,"fix":{"range":[429,432],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-bitwise","severity":2,"message":"Unexpected use of '>>>'.","line":15,"column":14,"nodeType":"BinaryExpression","messageId":"unexpected","endLine":15,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":23,"column":4,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":23,"endColumn":33,"fix":{"range":[718,721],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":26,"column":4,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":26,"endColumn":14,"fix":{"range":[773,776],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":34,"column":5,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":34,"endColumn":25,"fix":{"range":[1038,1041],"text":"let"},"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"eol-last","severity":2,"message":"Newline required at end of file but not found.","line":48,"column":2,"nodeType":"Program","messageId":"missing","fix":{"range":[1260,1260],"text":"\n"},"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/serialization/MediaInfoDeserializer.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/AddPropertyWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":1,"message":"OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":53,"column":23,"nodeType":"NewExpression","messageId":"noLabel","endLine":59,"endColumn":5}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst ComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\tinputs = require( './inputs/index.js' );\n\n/**\n * @constructor\n * @param {Object} [config]\n * @param {Array} [config.propertyIds] An array of property ids of statements that exist on the page\n */\nconst AddPropertyWidget = function MediaInfoAddPropertyWidget( config ) {\n\tconfig = config || {};\n\tthis.state = {\n\t\tpropertyIds: config.propertyIds || [],\n\t\tediting: false\n\t};\n\n\tAddPropertyWidget.super.call( this, config );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/AddPropertyWidget.mustache+dom'\n\t);\n};\nOO.inheritClass( AddPropertyWidget, OO.ui.Widget );\nOO.mixinClass( AddPropertyWidget, ComponentWidget );\n\n/**\n * @inheritDoc\n */\nAddPropertyWidget.prototype.getTemplateData = function () {\n\tconst propertyInputWidget = new inputs.EntityInputWidget( {\n\t\tentityType: 'property',\n\t\tfilter: this.getFilters(),\n\t\tmaxSuggestions: 7,\n\t\tplaceholder: mw.msg( 'wikibasemediainfo-add-property' )\n\t} );\n\n\tpropertyInputWidget.connect( this, { add: 'onChoose' } );\n\tpropertyInputWidget.connect( this, { add: [ 'setEditing', false ] } );\n\tpropertyInputWidget.connect( this, { add: [ 'emit', 'choose' ] } );\n\n\tconst addPropertyButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 'wbmi-entityview-add-statement-property-button' ],\n\t\tframed: true,\n\t\ticon: 'add',\n\t\tflags: [ 'progressive' ],\n\t\tlabel: mw.msg( 'wikibasemediainfo-add-statement' )\n\t} );\n\n\taddPropertyButton.connect( this, { click: [ 'setEditing', !this.state.editing ] } );\n\n\tconst removeButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 'wbmi-item-remove' ],\n\t\ttitle: mw.msg( 'wikibasemediainfo-statements-item-remove' ),\n\t\tflags: 'destructive',\n\t\ticon: 'trash',\n\t\tframed: false\n\t} );\n\n\tremoveButton.connect( this, { click: [ 'setEditing', false ] } );\n\n\treturn {\n\t\tediting: this.state.editing,\n\t\taddPropertyButton: addPropertyButton,\n\t\tpropertyInputWidget: propertyInputWidget,\n\t\tremoveButton: removeButton\n\t};\n};\n\n/**\n * @return {Array}\n */\nAddPropertyWidget.prototype.getFilters = function () {\n\tconst supportedTypes = mw.config.get( 'wbmiSupportedDataTypes' ) || [],\n\t\tuniqueTypes = supportedTypes.filter( ( item, index, self ) => self.indexOf( item ) === index );\n\n\treturn [\n\t\t{ field: 'datatype', value: uniqueTypes.join( '|' ) },\n\t\t{ field: '!id', value: this.state.propertyIds.join( '|' ) }\n\t];\n};\n\n/**\n * @param {string} propertyId\n * @return {jQuery.Promise}\n */\nAddPropertyWidget.prototype.addPropertyId = function ( propertyId ) {\n\tif ( this.state.propertyIds.includes( propertyId ) ) {\n\t\treturn $.Deferred().resolve( this.$element ).promise();\n\t}\n\n\treturn this.setState( { propertyIds: this.state.propertyIds.concat( propertyId ) } );\n};\n\n/**\n * @param {boolean} editing\n * @return {jQuery.Promise} Resolves after rerender\n */\nAddPropertyWidget.prototype.setEditing = function ( editing ) {\n\treturn this.setState( { editing: editing } );\n};\n\n/**\n * @param {EntityInputWidget} input\n */\nAddPropertyWidget.prototype.onChoose = function ( input ) {\n\tthis.addPropertyId( input.getRawValue() );\n};\n\n/**\n * If a statement panel has been removed then the filters in the property input widget need to\n * be updated (properties with existing panels are filtered out of the input widget, and the\n * property id of the removed panel shouldn't be filtered out anymore)\n *\n * @param {number} panelPropertyId\n */\nAddPropertyWidget.prototype.onStatementPanelRemoved = function ( panelPropertyId ) {\n\tthis.setState( {\n\t\tpropertyIds: this.state.propertyIds.filter( ( propertyId ) => propertyId !== panelPropertyId )\n\t} );\n};\n\nmodule.exports = AddPropertyWidget;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/ConstraintsReportHandlerElement.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":1,"message":"OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":123,"column":17,"nodeType":"NewExpression","messageId":"noLabel","endLine":138,"endColumn":5}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst ConstraintsReportHandlerElement = function MediaInfoStatementsConstraintsReportHandlerElement() {};\nOO.initClass( ConstraintsReportHandlerElement );\n\n/**\n * Create a popup from an array of constraint check results\n *\n * @param {Array} resultArray An array of constraint check results.\n * @return {OO.ui.PopupButtonWidget|null}\n * @see WikibaseQualityConstraints/modules/gadget.js::__addResultsToSnak()\n */\nConstraintsReportHandlerElement.prototype.popupFromResults = function ( resultArray ) {\n\tconst reports = resultArray.map( this.buildReport.bind( this ) );\n\tconst list = this.buildReportList( reports );\n\tlet icon;\n\tlet titleMessageKey;\n\n\tif ( list !== null ) {\n\t\tswitch ( list.items[ 0 ].status ) {\n\t\t\tcase 'violation':\n\t\t\t\ticon = 'mandatory-constraint-violation';\n\t\t\t\ttitleMessageKey = 'wbqc-issues-long';\n\t\t\t\tbreak;\n\t\t\tcase 'warning':\n\t\t\t\ticon = 'non-mandatory-constraint-violation';\n\t\t\t\ttitleMessageKey = 'wbqc-potentialissues-long';\n\t\t\t\tbreak;\n\t\t\tcase 'suggestion':\n\t\t\t\ticon = 'suggestion-constraint-violation';\n\t\t\t\ttitleMessageKey = 'wbqc-suggestions-long';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unexpected status ' + list.items[ 0 ].status );\n\t\t}\n\n\t\treturn this.createPopupWidget(\n\t\t\tlist.$element,\n\t\t\ticon,\n\t\t\ttitleMessageKey,\n\t\t\t[ 'wbqc-constraint-warning' ]\n\t\t);\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/**\n * Build a ConstraintReportPanel for a single constraint parameter check result.\n *\n * @param {Object} result The constraint parameter check result.\n * @return {wikibase.quality.constraints.ui.ConstraintReportPanel}\n * @see WikibaseQualityConstraints/modules/gadget.js::_buildReport()\n */\nConstraintsReportHandlerElement.prototype.buildReport = function ( result ) {\n\tconst config = {\n\t\tstatus: result.status,\n\t\tconstraint: result.constraint,\n\t\tmessage: result[ 'message-html' ]\n\t};\n\treturn new wikibase.quality.constraints.ui.ConstraintReportPanel( config );\n};\n\n/**\n * Build a ConstraintReportList from an array of ConstraintReportPanels\n * but return it only if the list is nonempty and contains uncollapsed items.\n *\n * @param {wikibase.quality.constraints.ui.ConstraintReportPanel[]} reports\n * @return {wikibase.quality.constraints.ui.ConstraintReportList|null}\n * @see WikibaseQualityConstraints/modules/gadget.js::_buildReportList()\n */\nConstraintsReportHandlerElement.prototype.buildReportList = function ( reports ) {\n\tconst list = wikibase.quality.constraints.ui.ConstraintReportList.static.fromPanels(\n\t\treports,\n\t\t{\n\t\t\tstatuses: [\n\t\t\t\t{\n\t\t\t\t\tstatus: 'violation',\n\t\t\t\t\tlabel: mw.msg( 'wbqc-issues-short' )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tstatus: 'warning',\n\t\t\t\t\tlabel: mw.msg( 'wbqc-potentialissues-short' )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tstatus: 'suggestion',\n\t\t\t\t\tlabel: mw.msg( 'wbqc-suggestions-short' )\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tstatus: 'bad-parameters',\n\t\t\t\t\tlabel: mw.msg( 'wbqc-parameterissues-short' ),\n\t\t\t\t\tsubheading: mw.msg( 'wbqc-parameterissues-long' ),\n\t\t\t\t\tcollapsed: true\n\t\t\t\t}\n\t\t\t],\n\t\t\texpanded: false // expanded: true does not work within a popup\n\t\t}\n\t);\n\tif (\n\t\t// list isn't empty...\n\t\tlist.items.length > 0 &&\n\t\t// ...and doesn't only contain collapsed items either\n\t\tlist.items[ 0 ].status !== 'bad-parameters'\n\t) {\n\t\treturn list;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/**\n * Create a popup button\n *\n * @param {jQuery} $content Content to be shown in the popup.\n * @param {string} icon Identifier for an icon as provided by OOUI.\n * @param {string} titleMessageKey The message key of the title attribute of the button.\n * @param {string[]} [classes] Optional list of classes added to the button element\n * @return {OO.ui.PopupButtonWidget}\n * @see WikibaseQualityConstraints/modules/gadget.js::_createPopupWidget()\n */\nConstraintsReportHandlerElement.prototype.createPopupWidget = function ( $content, icon, titleMessageKey, classes ) {\n\n\tconst widget = new OO.ui.PopupButtonWidget( {\n\t\ticon: icon,\n\n\t\ttitle: mw.msg( titleMessageKey ),\n\t\tflags: '',\n\t\tframed: false,\n\t\tclasses: [ 'wbqc-reports-button', 'wikibase-snakview-indicator' ].concat( classes || [] ),\n\t\tpopup: {\n\t\t\t$content: $content,\n\t\t\twidth: 400,\n\t\t\tpadded: true,\n\t\t\thead: true,\n\t\t\tlabel: $content.find( '.wbqc-reports:first-child > .oo-ui-labelElement-label *' ).detach()\n\t\t},\n\t\t$overlay: true\n\t} );\n\twidget.popup.$element.css( 'z-index', 2 );\n\n\treturn widget;\n};\n\nmodule.exports = ConstraintsReportHandlerElement;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/ItemWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":1,"message":"OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":135,"column":24,"nodeType":"NewExpression","messageId":"noLabel","endLine":141,"endColumn":6}],"suppressedMessages":[{"ruleId":"no-undef","severity":2,"message":"'L' is not defined.","line":218,"column":5,"nodeType":"Identifier","messageId":"undef","endLine":218,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":452,"column":18,"nodeType":"CallExpression","endLine":452,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/**\n * @constructor\n * @param {Object} config Configuration options\n * @param {string} config.entityId Entity ID (e.g. M123)\n * @param {string} config.propertyId Property ID (e.g. P123 id of `depicts` property)\n * @param {string} [config.guid] GUID of existing statement, or null for new\n * @param {number} [config.rank] One of datamodel.Statement.RANK.*\n * @param {string} [config.snakType] value, somevalue, or novalue\n * @param {dataValues.DataValue} [config.dataValue] Relevant DataValue object, or null for valueless\n * @param {string} [config.editing] True for edit mode, False for read mode\n */\nconst SnakListWidget = require( './SnakListWidget.js' ),\n\tConstraintsReportHandlerElement = require( './ConstraintsReportHandlerElement.js' ),\n\tComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\tDOMLessGroupWidget = require( 'wikibase.mediainfo.base' ).DOMLessGroupWidget,\n\tFormatValueElement = require( 'wikibase.mediainfo.base' ).FormatValueElement,\n\tGlobeCoordinateInputWidget = require( './inputs/GlobeCoordinateInputWidget.js' ),\n\tdatamodel = require( 'wikibase.datamodel' ),\n\tvalueTypes = {\n\t\tVALUE: datamodel.PropertyValueSnak.TYPE,\n\t\tSOMEVALUE: datamodel.PropertySomeValueSnak.TYPE,\n\t\tNOVALUE: datamodel.PropertyNoValueSnak.TYPE\n\t};\n\nlet kartoBox,\n\tkartoEditing;\n\n/**\n * Enum for data types that have special display requirements.\n */\nconst DATA_TYPES = {\n\tGLOBECOORDINATE: 'globecoordinate'\n\t// NOTE: when the need arises to put more datatype-specific logic\n\t// in here, consider refactoring this similar to the input fields\n};\n\n/**\n * @param {Object} config Configuration options\n */\nconst ItemWidget = function MediaInfoStatementsItemWidget( config ) {\n\tthis.config = Object.assign( { editing: false }, config );\n\n\tthis.guidGenerator = new wikibase.utilities.ClaimGuidGenerator( config.entityId );\n\n\tthis.qualifiers = this.createSnaklistWidget( {\n\t\taddText: mw.msg( 'wikibasemediainfo-statements-item-add-qualifier' )\n\t} );\n\n\t// set these first - the parent constructor could call other methods\n\t// (e.g. setDisabled) which may cause a re-render, and will need\n\t// some of these...\n\tthis.state = {\n\t\tediting: this.config.editing,\n\t\tpropertyId: this.config.propertyId,\n\t\tguid: this.config.guid || this.guidGenerator.newGuid(),\n\t\trank: this.config.rank || datamodel.Statement.RANK.NORMAL,\n\t\tsnakType: this.config.snakType || valueTypes.NOVALUE,\n\t\tdataValue: this.config.dataValue || null,\n\t\treferences: [],\n\t\treferenceHashes: [],\n\t\tkartographer: false,\n\t\tconstraintsReport: null\n\t};\n\n\t// Coordinate values are displayed with an additional element, an interactive map;\n\t// Determine if we are dealing with one and initialize the map UI here if so.\n\t// Attempt to load Kartographer dependencies if we are dealing with coordinates\n\tthis.$map = $( '<div>' ).addClass( 'wbmi-item__map' );\n\tthis.map = undefined;\n\tthis.initializeMap();\n\n\tItemWidget.super.call( this, Object.assign( {}, config ) );\n\tDOMLessGroupWidget.call( this, Object.assign( {}, config ) );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/ItemWidget.mustache+dom'\n\t);\n\tFormatValueElement.call( this, Object.assign( {}, config ) );\n\tConstraintsReportHandlerElement.call( this, Object.assign( {}, config ) );\n};\n\nOO.inheritClass( ItemWidget, OO.ui.Widget );\nOO.mixinClass( ItemWidget, DOMLessGroupWidget );\nOO.mixinClass( ItemWidget, ComponentWidget );\nOO.mixinClass( ItemWidget, FormatValueElement );\nOO.mixinClass( ItemWidget, ConstraintsReportHandlerElement );\n\n/**\n * @inheritDoc\n */\nItemWidget.prototype.getTemplateData = function () {\n\tconst self = this;\n\tconst errors = this.getErrors();\n\tconst errorMessages = ( errors.length > 0 ) ?\n\t\terrors.map( ( error ) => new OO.ui.MessageWidget( {\n\t\t\ttype: 'error',\n\t\t\tlabel: error,\n\t\t\tclasses: [ 'wbmi-statement-error-msg--inline' ]\n\t\t} ) ) : null;\n\n\t// Get the formatted label text for the value if necessary,\n\t// or else use a dummy promise\n\t// Determine if we are dealing with a globecoordinate value, which has\n\t// special display needs\n\tlet labelPromise;\n\tif ( this.state.dataValue ) {\n\t\tlabelPromise = this.formatValue( this.state.dataValue, 'text/html', null, this.state.propertyId );\n\t} else {\n\t\tlabelPromise = $.Deferred().resolve(\n\t\t\tmw.message(\n\t\t\t\tthis.state.snakType === valueTypes.SOMEVALUE ?\n\t\t\t\t\t'wikibasemediainfo-filepage-statement-some-value' :\n\t\t\t\t\t'wikibasemediainfo-filepage-statement-no-value'\n\t\t\t).parse()\n\t\t).promise();\n\t}\n\n\treturn labelPromise.then( ( label ) => {\n\t\tconst id = self.dataValue ? self.dataValue.toJSON().id : '';\n\t\tconst prominent = self.state.rank === datamodel.Statement.RANK.PREFERRED;\n\t\tconst dataValueType = self.state.dataValue ? self.state.dataValue.getType() : undefined;\n\n\t\tconst formatResponse = function ( html ) {\n\t\t\treturn $( '<div>' )\n\t\t\t\t.append( html )\n\t\t\t\t.find( 'a' )\n\t\t\t\t.attr( 'target', '_blank' )\n\t\t\t\t.end()\n\t\t\t\t.html();\n\t\t};\n\n\t\tconst removeButton = new OO.ui.ButtonWidget( {\n\t\t\tclasses: [ 'wbmi-item-remove' ],\n\t\t\ttitle: mw.msg( 'wikibasemediainfo-statements-item-remove' ),\n\t\t\tflags: 'destructive',\n\t\t\ticon: 'trash',\n\t\t\tframed: false\n\t\t} );\n\t\tremoveButton.connect( self, { click: [ 'emit', 'delete' ] } );\n\n\t\tconst addReferenceButton = new OO.ui.ButtonWidget( {\n\t\t\tclasses: [ 'wbmi-snaklist-add-snak' ],\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-statements-item-add-reference' ),\n\t\t\tflags: 'progressive',\n\t\t\tframed: false\n\t\t} );\n\t\taddReferenceButton.on( 'click', () => {\n\t\t\tconst widget = self.createReferenceWidget();\n\t\t\t// initialize with an empty snak input\n\t\t\twidget.addWidget();\n\t\t\tself.setState( {\n\t\t\t\treferences: self.state.references.concat( widget ),\n\t\t\t\treferenceHashes: self.state.referenceHashes.concat( null )\n\t\t\t} );\n\t\t} );\n\n\t\treturn {\n\t\t\terrors: errorMessages,\n\t\t\tediting: self.state.editing,\n\t\t\tqualifiersTitle: mw.msg( 'wikibasemediainfo-statements-item-qualifiers' ),\n\t\t\tqualifiers: self.qualifiers,\n\t\t\treferencesTitle: mw.msg( 'wikibasemediainfo-statements-item-references' ),\n\t\t\treferenceTitle: mw.msg( 'wikibasemediainfo-statements-item-reference' ),\n\t\t\taddReferenceButton: addReferenceButton,\n\t\t\treferences: self.state.references,\n\t\t\tlabel: formatResponse( label ),\n\t\t\tid: id.replace( /^.+:/, '' ),\n\t\t\tdisabled: self.isDisabled(),\n\t\t\tprominent: prominent,\n\t\t\tprominenceMessage: prominent ?\n\t\t\t\tmw.msg( 'wikibasemediainfo-statements-item-is-prominent' ) :\n\t\t\t\tmw.msg( 'wikibasemediainfo-statements-item-mark-as-prominent' ),\n\t\t\tprominenceToggleHandler: self.toggleItemProminence.bind( self ),\n\t\t\tremoveButton: removeButton,\n\t\t\tisGlobecoordinate: dataValueType === DATA_TYPES.GLOBECOORDINATE,\n\t\t\tkartographer: self.state.kartographer,\n\t\t\tmap: self.$map,\n\t\t\tconstraintsReport: self.state.constraintsReport &&\n\t\t\t\tself.popupFromResults( self.state.constraintsReport )\n\t\t};\n\t} );\n};\n\nItemWidget.prototype.render = function () {\n\tconst self = this;\n\tlet promise = ComponentWidget.prototype.render.call( this );\n\n\tif (\n\t\tthis.map &&\n\t\tthis.state.dataValue &&\n\t\tthis.state.dataValue.getType() === DATA_TYPES.GLOBECOORDINATE\n\t) {\n\t\tpromise = promise.then( ( $element ) => {\n\t\t\tconst data = self.state.dataValue.getValue(),\n\t\t\t\tlayer = kartoEditing.getKartographerLayer( self.map );\n\n\t\t\t// we've just rerendered & DOM might look different then it did\n\t\t\t// before, when the map size was initially calculated\n\t\t\tself.map.invalidateSize();\n\n\t\t\tlayer.setGeoJSON( {\n\t\t\t\ttype: 'Feature',\n\t\t\t\tproperties: {},\n\t\t\t\tgeometry: {\n\t\t\t\t\ttype: 'Point',\n\t\t\t\t\tcoordinates: [\n\t\t\t\t\t\tdata.getLongitude(),\n\t\t\t\t\t\tdata.getLatitude()\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t/* eslint-disable no-undef */\n\t\t\tself.map.setView(\n\t\t\t\tL.latLng( data.getLatitude(), data.getLongitude() ),\n\t\t\t\tGlobeCoordinateInputWidget.precisionToZoom( data.getPrecision(), data.getLatitude() )\n\t\t\t);\n\t\t\t/* eslint-enable no-undef */\n\n\t\t\treturn $element;\n\t\t} );\n\t}\n\n\treturn promise;\n};\n\n/**\n * @param {Object} event\n * @return {jQuery.Promise}\n */\nItemWidget.prototype.toggleItemProminence = function ( event ) {\n\tevent.preventDefault();\n\n\tif ( this.isDisabled() ) {\n\t\treturn $.Deferred().resolve( this.$element ).promise();\n\t}\n\n\treturn this.setState( {\n\t\trank: this.state.rank === datamodel.Statement.RANK.PREFERRED ?\n\t\t\tdatamodel.Statement.RANK.NORMAL :\n\t\t\tdatamodel.Statement.RANK.PREFERRED\n\t} ).then( this.emit.bind( this, 'change' ) );\n};\n\n/**\n * @param {boolean} editing\n * @return {jQuery.Promise}\n */\nItemWidget.prototype.setEditing = function ( editing ) {\n\tconst self = this;\n\n\treturn $.Deferred().resolve().promise()\n\t\t.then( this.qualifiers.setEditing.bind( this.qualifiers, editing ) )\n\t\t.then( () => {\n\t\t\tconst promises = self.state.references.map( ( reference ) => reference.setEditing( editing ) );\n\t\t\treturn $.when.apply( $, promises );\n\t\t} )\n\t\t.then( this.setState.bind( this, { editing: editing } ) );\n};\n\n/**\n * @return {datamodel.Statement}\n */\nItemWidget.prototype.getData = function () {\n\tconst self = this;\n\tlet snak;\n\n\tswitch ( this.state.snakType ) {\n\t\tcase valueTypes.SOMEVALUE:\n\t\t\tsnak = new datamodel.PropertySomeValueSnak( this.state.propertyId );\n\t\t\tbreak;\n\t\tcase valueTypes.NOVALUE:\n\t\t\tsnak = new datamodel.PropertyNoValueSnak( this.state.propertyId );\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tsnak = this.state.dataValue ?\n\t\t\t\tnew datamodel.PropertyValueSnak( this.state.propertyId, this.state.dataValue, null ) :\n\t\t\t\tnew datamodel.PropertyNoValueSnak( this.state.propertyId );\n\t\t\tbreak;\n\t}\n\n\treturn new datamodel.Statement(\n\t\tnew datamodel.Claim(\n\t\t\tsnak,\n\t\t\tthis.qualifiers.getData(),\n\t\t\tthis.state.guid\n\t\t),\n\t\tnew datamodel.ReferenceList(\n\t\t\tthis.state.references\n\t\t\t\t.map( ( reference, i ) => new datamodel.Reference(\n\t\t\t\t\treference.getData(),\n\t\t\t\t\tself.state.referenceHashes[ i ]\n\t\t\t\t) )\n\t\t\t\t.filter( ( reference ) => reference.getSnaks().length > 0 )\n\t\t),\n\t\tthis.state.rank\n\t);\n};\n\n/**\n * @param {Object} config\n * @return {SnakListWidget}\n */\nItemWidget.prototype.createSnaklistWidget = function ( config ) {\n\tconst widget = new SnakListWidget( Object.assign( { editing: this.config.editing }, config ) );\n\twidget.connect( this, { remove: [ 'emit', 'change' ] } );\n\twidget.connect( this, { change: [ 'emit', 'change' ] } );\n\treturn widget;\n};\n\n/**\n * @param {Object} [config]\n * @return {SnakListWidget}\n */\nItemWidget.prototype.createReferenceWidget = function ( config ) {\n\tconst self = this;\n\tconfig = config || {};\n\n\tconst widget = this.createSnaklistWidget( Object.assign( config, {\n\t\tediting: this.state.editing,\n\t\taddText: mw.msg( 'wikibasemediainfo-statements-item-add-reference-snak' )\n\t} ) );\n\n\t// if a reference snaklist widget is emptied, remove it entirely\n\twidget.on( 'empty', () => {\n\t\tconst newReferences = [],\n\t\t\tnewReferenceHashes = [];\n\n\t\tself.state.references.forEach( ( reference, i ) => {\n\t\t\tif ( widget !== reference ) {\n\t\t\t\tnewReferences.push( reference );\n\t\t\t\tnewReferenceHashes.push( self.state.referenceHashes[ i ] );\n\t\t\t}\n\t\t} );\n\n\t\tself.setState( {\n\t\t\treferences: newReferences,\n\t\t\treferenceHashes: newReferenceHashes\n\t\t} );\n\t} );\n\n\treturn widget;\n};\n\n/**\n * @param {datamodel.Statement} data\n * @return {jQuery.Deferred}\n */\nItemWidget.prototype.setData = function ( data ) {\n\tconst newReferenceHashes = [];\n\tconst newReferenceWidgets = [];\n\tconst newReferenceWidgetPromises = [];\n\n\t// Bail early and discard existing data if data argument is not a snak\n\tif ( !( data instanceof datamodel.Statement ) ) {\n\t\tthrow new Error( 'Invalid statement' );\n\t}\n\n\t// Store the attributes we need to reference frequently for later use\n\tconst claim = data.getClaim();\n\tconst mainSnak = claim.getMainSnak();\n\tconst qualifiers = claim.getQualifiers();\n\tconst referencesArray = data.getReferences().toArray();\n\tconst type = mainSnak.getType();\n\n\t// if amount of widgets stayed the same or increased, events will be\n\t// emitted once those widgets receive new data (in case it changed);\n\t// this may not be the case if we only had removals, so we need to\n\t// manually emit a change event for those changes\n\tif ( this.state.references.length > referencesArray.length ) {\n\t\tthis.emit( 'change' );\n\t}\n\n\tconst referencesHashes = referencesArray.map( ( reference ) => reference.getHash() );\n\n\tfor ( let i = 0; i < referencesArray.length; i++ ) {\n\t\tif ( referencesHashes.includes( this.state.referenceHashes[ i ] ) ) {\n\t\t\t// salvage existing widgets that are also in the newly received data,\n\t\t\tnewReferenceWidgets[ i ] = this.state.references[ i ];\n\t\t} else {\n\t\t\t// or create new ones for data that doesn't match any existing snak\n\t\t\tnewReferenceWidgets[ i ] = this.createReferenceWidget();\n\t\t}\n\n\t\tnewReferenceHashes[ i ] = referencesArray[ i ].getHash();\n\n\t\t// now fill those new reference widgets with their relevant new data\n\t\tnewReferenceWidgetPromises[ i ] = newReferenceWidgets[ i ].setData( referencesArray[ i ].getSnaks() );\n\t}\n\n\treturn $.when.apply( $, newReferenceWidgetPromises )\n\t\t.then( this.qualifiers.setData.bind( this.qualifiers, qualifiers ) )\n\t\t.then( this.setState.bind( this, {\n\t\t\tpropertyId: mainSnak.getPropertyId(),\n\t\t\tguid: claim.getGuid() || this.guidGenerator.newGuid(),\n\t\t\trank: data.getRank(),\n\t\t\tsnakType: type,\n\t\t\tdataValue: type === valueTypes.VALUE ? mainSnak.getValue() : null,\n\t\t\treferences: newReferenceWidgets,\n\t\t\treferenceHashes: newReferenceHashes,\n\t\t\t// if new data was passed in, error is no longer valid\n\t\t\terrors: data.equals( this.getData() ) ? this.getErrors() : []\n\t\t} ) )\n\t\t.then( this.initializeMap.bind( this ) );\n};\n\n/**\n * @return {jQuery.Promise}\n */\nItemWidget.prototype.initializeMap = function () {\n\tconst self = this;\n\n\tif (\n\t\t// map already initialized previously\n\t\tthis.map ||\n\t\t// not a geocoordinate datavalue = no map needed\n\t\t!this.state.dataValue ||\n\t\tthis.state.dataValue.getType() !== DATA_TYPES.GLOBECOORDINATE\n\t) {\n\t\treturn this.setState( {} );\n\t}\n\n\treturn mw.loader.using( [ 'ext.kartographer.box', 'ext.kartographer.editing' ] )\n\t\t.then( ( require ) => {\n\t\t\tkartoBox = require( 'ext.kartographer.box' );\n\t\t\tkartoEditing = require( 'ext.kartographer.editing' );\n\n\t\t\t// Unlike in the GlobeCoordinateInputWidget, the ItemWidget's map does not\n\t\t\t// enforce maxBounds. This is because Wikidata allows users to input\n\t\t\t// coordinates like 40N, 250E; if a user has entered such a value manually,\n\t\t\t// let's do our best to display it. Leaflet will just wrap around the\n\t\t\t// virtual \"globe\" to display the marker.\n\t\t\tself.map = kartoBox.map( {\n\t\t\t\tcontainer: self.$map[ 0 ],\n\t\t\t\tcenter: [ 20, 0 ],\n\t\t\t\tzoom: 2,\n\t\t\t\tallowFullScreen: false,\n\t\t\t\tminZoom: 1\n\t\t\t} );\n\n\t\t\t// Because maps within ItemWidgets need to be immediately visible in \"read\n\t\t\t// mode\", we need a MutationObserver which can watch for when the structured\n\t\t\t// data tab (which is hidden by default) becomes visible so that the map can\n\t\t\t// be forced to recalculate its size. Leaflet cannot correctly determine\n\t\t\t// the size of the map when it is initialized on a hidden element (like\n\t\t\t// the children of a non-visible tab), so we must do it again when the map\n\t\t\t// becomes visible.\n\t\t\t// eslint-disable-next-line no-jquery/no-global-selector\n\t\t\tconst sdTab = $( '.wbmi-structured-data-header' ).closest( '.wbmi-tab' )[ 0 ];\n\t\t\tnew MutationObserver( () => {\n\t\t\t\tif ( self.$map.parents( 'body' ).length > 0 ) {\n\t\t\t\t\tself.map.invalidateSize();\n\t\t\t\t}\n\t\t\t} ).observe( sdTab, {\n\t\t\t\tattributes: true,\n\t\t\t\tattributeFilter: [ 'aria-hidden' ]\n\t\t\t} );\n\n\t\t\treturn self.setState( { kartographer: true } );\n\t\t} );\n};\n\n/**\n * Handle the part of the response from a wbcheckconstraints api call that is relevant to this\n * ItemWidget's property id & extract the constraint check results from the part of API\n * response that is relevant to this StatementWidget's propertyId\n *\n * @see WikibaseQualityConstraints/modules/gadget.js::_extractResultsForStatement()\n * @param {Object|null} results\n * @return {jQuery.Promise}\n */\nItemWidget.prototype.setConstraintsReport = function ( results ) {\n\tconst self = this,\n\t\tpromises = [];\n\n\tpromises.push( this.setState( { constraintsReport: results && results.mainsnak.results } ) );\n\tpromises.push( this.qualifiers.setConstraintsReport( results.qualifiers || {} ) );\n\t( results.references || [] ).forEach( ( snakListResult ) => {\n\t\tconst i = self.state.referenceHashes.indexOf( snakListResult.hash );\n\t\tif ( i >= 0 ) {\n\t\t\tpromises.push( self.state.references[ i ].setConstraintsReport( snakListResult.snaks ) );\n\t\t}\n\t} );\n\n\t// return promise that doesn't resolve until all constraints reports have been rendered\n\treturn $.when.apply( $, promises );\n};\n\nmodule.exports = ItemWidget;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/LinkNoticeWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/SnakListWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/SnakWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":1,"message":"OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":93,"column":22,"nodeType":"NewExpression","messageId":"noLabel","endLine":97,"endColumn":6}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst ConstraintsReportHandlerElement = require( './ConstraintsReportHandlerElement.js' ),\n\tComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\tFormatValueElement = require( 'wikibase.mediainfo.base' ).FormatValueElement,\n\tinputs = require( './inputs/index.js' ),\n\tserialization = require( 'wikibase.serialization' ),\n\tdatamodel = require( 'wikibase.datamodel' ),\n\tvalueTypes = {\n\t\tVALUE: datamodel.PropertyValueSnak.TYPE,\n\t\tSOMEVALUE: datamodel.PropertySomeValueSnak.TYPE,\n\t\tNOVALUE: datamodel.PropertyNoValueSnak.TYPE\n\t};\n\n/**\n * This widget represents a single snak (property-value pair).\n * These widgets handle both the \"read\" and \"edit\" UI modes. Actual management\n * of UI state and the showing/hiding of widgets is handled at the level of the\n * ItemWidget.\n *\n * This widget listens for events from its children and updates its\n * data in response to user actions. Data can also be set programatically by\n * calling the setData() method.\n *\n * @constructor\n * @param {Object} config\n * @param {Object} [config.data] Initial data\n * @param {boolean} [config.editing] Edit state of the widget when created;\n * defaults to false.\n */\nconst SnakWidget = function ( config ) {\n\tconfig = config || {};\n\tthis.state = {\n\t\tdata: config.data,\n\t\tediting: !!config.editing,\n\t\tconstraintsReport: null\n\t};\n\n\tthis.dataTypeMap = mw.config.get( 'wbDataTypes', {} );\n\tthis.propertyTypes = mw.config.get( 'wbmiPropertyTypes' );\n\n\t// sub-widgets\n\tthis.propertyInput = new inputs.EntityInputWidget( {\n\t\tisQualifier: true,\n\t\tclasses: [ 'wbmi-snak-property' ],\n\t\tentityType: 'property',\n\t\tfilter: this.getFilters(),\n\t\tplaceholder: mw.msg( 'wikibasemediainfo-property-placeholder' )\n\t} );\n\n\tthis.valueInput = new inputs.MultiTypeInputWrapperWidget( {\n\t\tclasses: [ 'wbmi-snak-value-input' ],\n\t\tisQualifier: true\n\t} );\n\n\tthis.valueInput.setDisabled( true );\n\n\t// event listeners\n\tthis.propertyInput.connect( this, { add: 'onChooseProperty' } );\n\tthis.propertyInput.connect( this, { add: 'onChange' } );\n\tthis.valueInput.connect( this, { change: 'onChange' } );\n\n\tSnakWidget.super.call( this, config );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/SnakWidget.mustache+dom'\n\t);\n\tFormatValueElement.call( this, Object.assign( {}, config ) );\n\tConstraintsReportHandlerElement.call( this, Object.assign( {}, config ) );\n};\nOO.inheritClass( SnakWidget, OO.ui.Widget );\nOO.mixinClass( SnakWidget, ComponentWidget );\nOO.mixinClass( SnakWidget, FormatValueElement );\nOO.mixinClass( SnakWidget, ConstraintsReportHandlerElement );\n\n/**\n * @inheritDoc\n */\nSnakWidget.prototype.getTemplateData = function () {\n\tconst self = this;\n\n\treturn this.asyncFormatForDisplay().then( ( propertyHtml, valueHtml ) => {\n\t\tconst formatResponse = function ( html ) {\n\t\t\treturn $( '<div>' )\n\t\t\t\t.append( html )\n\t\t\t\t.find( 'a' )\n\t\t\t\t.attr( 'target', '_blank' )\n\t\t\t\t.end()\n\t\t\t\t.html();\n\t\t};\n\n\t\tconst removeIcon = new OO.ui.ButtonWidget( {\n\t\t\tclasses: [ 'wbmi-snak-remove' ],\n\t\t\tframed: false,\n\t\t\ticon: 'close'\n\t\t} );\n\t\tremoveIcon.connect( self, { click: [ 'emit', 'delete' ] } );\n\n\t\treturn {\n\t\t\tediting: self.state.editing,\n\t\t\tpropertyInput: self.propertyInput,\n\t\t\tvalueInput: self.valueInput,\n\t\t\tremoveIcon: removeIcon,\n\t\t\tproperty: formatResponse( propertyHtml ),\n\t\t\tvalue: formatResponse( valueHtml ),\n\t\t\tseparator: mw.msg( 'colon-separator' ),\n\t\t\tconstraintsReport: self.state.constraintsReport &&\n\t\t\t\tself.popupFromResults( self.state.constraintsReport )\n\t\t};\n\t} );\n};\n\n/**\n * @param {Object|null} results\n * @return {jQuery.Promise}\n */\nSnakWidget.prototype.setConstraintsReport = function ( results ) {\n\treturn this.setState( { constraintsReport: results && results.results } );\n};\n\n/**\n * @chainable\n * @return {SnakWidget} widget\n */\nSnakWidget.prototype.focus = function () {\n\tthis.propertyInput.focus();\n\treturn this;\n};\n\n/**\n * Set the read/edit state to the desired value and re-render the widget from\n * its template.\n *\n * @param {boolean} editing\n * @return {jQuery.Promise} Resolves after rerender\n */\nSnakWidget.prototype.setEditing = function ( editing ) {\n\treturn this.setState( { editing: editing } );\n};\n\n/**\n * Sets the child widgets' data and updates label elements asynchronously.\n *\n * @param {datamodel.Snak} data\n * @return {jQuery.Promise}\n */\nSnakWidget.prototype.setData = function ( data ) {\n\tconst self = this;\n\tconst snakType = data.getType();\n\tconst propertyId = data.getPropertyId();\n\n\t// Bail early and discard existing data if data argument is not a snak\n\tif ( !( data instanceof datamodel.Snak ) ) {\n\t\tthrow new Error( 'Invalid snak' );\n\t}\n\n\tconst dataValue = snakType === valueTypes.VALUE ? data.getValue() : null;\n\tlet dataType = dataValue ? dataValue.getType() : undefined;\n\tif ( !dataType && this.propertyTypes[ propertyId ] in this.dataTypeMap ) {\n\t\tdataType = this.dataTypeMap[ this.propertyTypes[ propertyId ] ].dataValueType || undefined;\n\t}\n\n\treturn $.when(\n\t\tthis.propertyInput.setData( new datamodel.EntityId( propertyId ) ),\n\t\t// 3 things need to happen to the input wrapper, in order:\n\t\t// 1. Set the data type, which will inform which type of input is\n\t\t// created\n\t\t// 2. Run the input wrapper's setData method, which creates the input\n\t\t// and sends it a value if it exists\n\t\t// 3. Set the snak type so we can alter the input UI to show somevalue\n\t\t// or novalue if applicable\n\t\tthis.valueInput.setDataType( dataType )\n\t\t\t.then( this.valueInput.setData.bind( this.valueInput, dataValue ) )\n\t\t\t.then( this.valueInput.setSnakType.bind( this.valueInput, snakType ) )\n\t).then( () => {\n\t\tif ( snakType === valueTypes.VALUE ) {\n\t\t\tself.valueInput.setDisabled( false );\n\t\t}\n\t\t// we want to keep a copy of the data to be able to check\n\t\t// whether there have been changes to the input, but we'll\n\t\t// serialize/deserialze in order to have a clone (in case\n\t\t// this reference gets modified elsewhere)\n\t\treturn self.setState( { data: self.cloneSnak( data ) } );\n\t} );\n};\n\n/**\n * Extracts data from child widgets for use elsewhere.\n *\n * @return {datamodel.Snak} data\n */\nSnakWidget.prototype.getData = function () {\n\tconst property = this.propertyInput.getData();\n\tconst propertyId = property.toJSON().id;\n\tconst dataValue = this.valueInput.getData();\n\tconst snakType = this.valueInput.getSnakType();\n\tlet snak;\n\n\tswitch ( snakType ) {\n\t\tcase valueTypes.SOMEVALUE:\n\t\t\tsnak = new datamodel.PropertySomeValueSnak( propertyId );\n\t\t\tbreak;\n\t\tcase valueTypes.NOVALUE:\n\t\t\tsnak = new datamodel.PropertyNoValueSnak( propertyId );\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tsnak = dataValue ?\n\t\t\t\tnew datamodel.PropertyValueSnak( propertyId, dataValue, null ) :\n\t\t\t\tnew datamodel.PropertyNoValueSnak( propertyId );\n\t}\n\n\t// if snak hasn't changed since `this.setData`,\n\t// return the original data (which includes `hash`)\n\treturn this.state.data && this.state.data.equals( snak ) ? this.state.data : snak;\n};\n\n/**\n * @param {EntityInputWidget} input\n * @param {Object} data\n */\nSnakWidget.prototype.onChooseProperty = function ( input, data ) {\n\tthis.propertyTypes[ data.id ] = data.datatype;\n\tthis.valueInput.setInputType( this.dataTypeMap[ data.datatype ].dataValueType );\n\tthis.valueInput.setDisabled( false );\n};\n\nSnakWidget.prototype.onChange = function () {\n\t// abort in-flight API requests - there's no point in continuing\n\t// to fetch the text-to-render when we've already changed it...\n\tif ( this.formatDisplayPromise ) {\n\t\tthis.formatDisplayPromise.abort();\n\t}\n\n\tthis.emit( 'change' );\n};\n\n/**\n * Ergonomic wrapper around formatValue() to make it easier to deal with\n * properties.\n *\n * @param {string} propId\n * @param {string} [format] e.g. text/plain or text/html\n * @param {string} [language]\n * @return {jQuery.Promise} promise\n */\nSnakWidget.prototype.formatProperty = function ( propId, format, language ) {\n\treturn this.formatValue( new datamodel.EntityId( propId ), format, language );\n};\n\n/**\n * Asynchronously update the label elements with data from the API.\n *\n * @return {jQuery.Promise}\n */\nSnakWidget.prototype.asyncFormatForDisplay = function () {\n\tconst message = this.valueInput.getSnakType() === valueTypes.SOMEVALUE ?\n\t\tmw.message( 'wikibasemediainfo-filepage-statement-some-value' ).parse() :\n\t\tmw.message( 'wikibasemediainfo-filepage-statement-no-value' ).parse();\n\n\ttry {\n\t\tconst propertyId = this.propertyInput.getData().toJSON().id;\n\t\tconst dataValue = this.valueInput.getData();\n\t\tconst valuePromise = dataValue ?\n\t\t\tthis.formatValue( dataValue, 'text/html', null, propertyId ) :\n\t\t\t$.Deferred().resolve( message ).promise( { abort: function () {} } );\n\n\t\tconst promises = [\n\t\t\tthis.formatProperty( propertyId, 'text/html' ),\n\t\t\tvaluePromise\n\t\t];\n\n\t\tthis.formatDisplayPromise = $.when.apply( $, promises ).promise( {\n\t\t\tabort: function () {\n\t\t\t\tpromises.forEach( ( promise ) => {\n\t\t\t\t\tpromise.abort();\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\treturn this.formatDisplayPromise;\n\t} catch ( e ) {\n\t\t// nothing to render if data is invalid...\n\t\treturn $.Deferred().resolve( '', '' ).promise();\n\t}\n};\n\n/**\n * @private\n * @param {datamodel.Snak} data\n * @return {datamodel.Snak}\n */\nSnakWidget.prototype.cloneSnak = function ( data ) {\n\tconst serializer = new serialization.SnakSerializer(),\n\t\tdeserializer = new serialization.SnakDeserializer();\n\n\treturn deserializer.deserialize( serializer.serialize( data ) );\n};\n\n/**\n * @return {Object[]} filters\n */\nSnakWidget.prototype.getFilters = function () {\n\tconst supportedTypes = mw.config.get( 'wbmiSupportedDataTypes' ) || [],\n\t\tuniqueTypes = supportedTypes.filter( ( item, index, self ) => self.indexOf( item ) === index );\n\n\treturn [\n\t\t{ field: 'datatype', value: uniqueTypes.join( '|' ) }\n\t];\n};\n\nmodule.exports = SnakWidget;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/StatementWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'change' is undefined.","line":186,"column":1,"nodeType":"Block","endLine":186,"endColumn":1},{"ruleId":"no-jquery/no-done-fail","severity":1,"message":"Prefer .then to .done","line":675,"column":2,"nodeType":"CallExpression","endLine":696,"endColumn":5}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst dataTypesMap = mw.config.get( 'wbDataTypes' ),\n\tItemWidget = require( './ItemWidget.js' ),\n\tinputs = require( './inputs/index.js' ),\n\tFormatValueElement = require( 'wikibase.mediainfo.base' ).FormatValueElement,\n\tComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\tDOMLessGroupWidget = require( 'wikibase.mediainfo.base' ).DOMLessGroupWidget,\n\tdatamodel = require( 'wikibase.datamodel' ),\n\tserialization = require( 'wikibase.serialization' );\n\n/**\n * @constructor\n * @param {Object} config Configuration options\n * @param {string} config.entityId Entity ID (e.g. M123 id of the file you just uploaded)\n * @param {string} config.propertyId Property ID (e.g. P123 id of `depicts` property)\n * @param {string} config.valueType Datavalue type (e.g. 'wikibase-entityid', 'string', ...)\n * @param {Object} [config.data] Initial data\n * @param {string} [config.title]\n * @param {string} [config.editing] True for edit mode, False for read mode\n * @param {boolean} [config.isDefaultProperty] True if the widget is shown even if there are\n * no values for the property\n * @param {Object} [config.helpUrls] An object with property id as members and help urls for\n * the property as values\n * e.g. { P1: \"https://commons.wikimedia.org/wiki/Special:MyLanguage/Commons:Depicts\" }\n * @param {boolean} [config.showControls] Whether or not to display editing controls (default to false)\n * @param {string} [config.summary] Summary for edits\n * @param {string[]} [config.tags] Change tags to apply to edits\n */\nconst StatementWidget = function ( config ) {\n\tlet valueType = config.valueType;\n\n\tif ( !valueType && config.propertyType && config.propertyType in dataTypesMap ) {\n\t\t// backward compatibility from before we were using value type...\n\t\tvalueType = dataTypesMap[ config.propertyType ].dataValueType;\n\t}\n\n\tconfig.showControls = !!config.showControls;\n\tconfig.helpUrls = config.helpUrls || {};\n\tconfig.isDefaultProperty = !!config.isDefaultProperty;\n\tthis.config = config;\n\n\tthis.state = {\n\t\tentityId: config.entityId,\n\t\tpropertyId: config.propertyId,\n\t\tvalueType: valueType,\n\t\tinitialData: new datamodel.StatementList(),\n\t\ttitle: config.title || ( mw.config.get( 'wbmiPropertyTitles' ) || {} )[ config.propertyId ] || '',\n\t\tediting: config.editing || false\n\t};\n\n\tthis.input = new inputs.MultiTypeInputWrapperWidget( {\n\t\tisQualifier: false,\n\t\ttype: valueType,\n\t\tclasses: [ 'wbmi-statement-input' ],\n\t\tdisabled: this.disabled\n\t} );\n\n\tthis.publishButton = new OO.ui.ButtonInputWidget( {\n\t\ttype: 'submit',\n\t\tuseInputTag: true,\n\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-publish' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tdisabled: true\n\t} );\n\n\tStatementWidget.super.call( this, config );\n\tDOMLessGroupWidget.call( this );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/StatementWidget.mustache+dom'\n\t);\n\n\tthis.input.connect( this, { add: 'addItemFromInput' } );\n\tthis.publishButton.connect( this, { click: [ 'emit', 'publish' ] } );\n\tthis.connect( this, { change: 'updatePublishButtonState' } );\n\n\tif ( config.data ) {\n\t\tthis.resetData( config.data );\n\t}\n};\n\nOO.inheritClass( StatementWidget, OO.ui.Widget );\nOO.mixinClass( StatementWidget, DOMLessGroupWidget );\nOO.mixinClass( StatementWidget, ComponentWidget );\nOO.mixinClass( StatementWidget, FormatValueElement );\n\n/**\n * @inheritDoc\n */\nStatementWidget.prototype.getTemplateData = function () {\n\tconst self = this,\n\t\tdataValue = new datamodel.EntityId( this.state.propertyId ),\n\t\terrors = this.getErrors(),\n\t\terrorMessages = ( errors.length > 0 ) ?\n\t\t\terrors.map( ( error ) => new OO.ui.MessageWidget( {\n\t\t\t\ttype: 'error',\n\t\t\t\tlabel: error,\n\t\t\t\tclasses: [ 'wbmi-statement-error-msg' ]\n\t\t\t} ) ) : null;\n\n\t// fetch property value & url\n\treturn this.formatValue( dataValue, 'text/html' ).then( ( html ) => {\n\t\tconst formatResponse = function ( response ) {\n\t\t\treturn $( '<div>' )\n\t\t\t\t.append( response )\n\t\t\t\t.find( 'a' )\n\t\t\t\t.attr( 'target', '_blank' )\n\t\t\t\t.end()\n\t\t\t\t.html();\n\t\t};\n\n\t\tconst editButton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-edit' ),\n\t\t\tframed: false,\n\t\t\tflags: 'progressive',\n\t\t\ttitle: mw.msg( 'wikibasemediainfo-filepage-edit-depicts' ),\n\t\t\tclasses: [ 'wbmi-entityview-editButton' ],\n\t\t\tdisabled: self.isDisabled() || self.isEditing()\n\t\t} );\n\n\t\tconst cancelButton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-cancel' ),\n\t\t\tframed: false\n\t\t} );\n\n\t\tconst removeButton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-statements-remove' ),\n\t\t\tframed: false,\n\t\t\tflags: 'destructive',\n\t\t\tclasses: [ 'wbmi-statement-remove' ]\n\t\t} );\n\n\t\tconst learnMoreLink = self.config.helpUrls[ self.state.propertyId ];\n\t\tconst learnMoreButton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-statements-learn-more' ),\n\t\t\tframed: false,\n\t\t\tflags: 'progressive',\n\t\t\tclasses: [ 'wbmi-statement-learn-more' ]\n\t\t} );\n\n\t\teditButton.connect( self, { click: [ 'emit', 'edit' ] } );\n\t\teditButton.connect( self, { click: [ 'setEditing', true ] } );\n\t\tcancelButton.connect( self, { click: 'showCancelConfirmationDialog' } );\n\t\tremoveButton.connect( self, { click: 'showRemoveConfirmationDialog' } );\n\t\tlearnMoreButton.connect( self, {\n\t\t\tclick: window.open.bind( window, learnMoreLink, '_blank' )\n\t\t} );\n\n\t\treturn {\n\t\t\ttitle: self.state.title,\n\t\t\tid: self.state.propertyId,\n\t\t\tlabel: formatResponse( html ),\n\t\t\tisDefaultProperty: self.config.isDefaultProperty,\n\t\t\tshowControls: self.config.showControls,\n\t\t\tdisabled: self.isDisabled(),\n\t\t\tediting: self.isEditing(),\n\t\t\titems: self.getItems(),\n\t\t\tinput: self.input,\n\t\t\tpublishButton: self.publishButton,\n\t\t\teditButton: editButton,\n\t\t\tcancelButton: cancelButton,\n\t\t\tremoveAll: removeButton,\n\t\t\tlearnMoreLink: learnMoreLink,\n\t\t\tlearnMoreButton: learnMoreButton,\n\t\t\terrors: errorMessages\n\t\t};\n\t} );\n};\n\n/**\n * @return {boolean}\n */\nStatementWidget.prototype.hasChanges = function () {\n\tconst changes = this.getChanges(),\n\t\tremovals = this.getRemovals();\n\n\treturn changes.length > 0 || removals.length > 0;\n};\n\n/**\n * Receives a DataValue from the input widget and uses it to create a\n * new ItemWidget, add it to the list, and set the widget into edit mode.\n *\n * @fires change\n */\nStatementWidget.prototype.addItemFromInput = function () {\n\tconst self = this;\n\n\tthis.input.parseValue( this.state.propertyId ).then(\n\t\t() => {\n\t\t\tconst dataValue = self.input.getData(),\n\t\t\t\twidget = self.createItem( self.input.getSnakType(), dataValue );\n\n\t\t\tself.addItems( [ widget ] );\n\n\t\t\t// we just added a new item - let's switch all of them into editing mode\n\t\t\tself.setEditing( true );\n\n\t\t\t// clear the autocomplete input field to select entities to add\n\t\t\tself.emit( 'manual-add', widget );\n\t\t\tself.emit( 'change', widget );\n\n\t\t\tself.input.clear();\n\t\t\tself.input.setErrors( [] );\n\t\t},\n\t\t( errorCode, error ) => {\n\t\t\tconst apiError = wikibase.api.RepoApiError.newFromApiResponse( error, 'save' ),\n\t\t\t\terrorMessage = new OO.ui.HtmlSnippet( apiError.detailedMessage );\n\t\t\tself.input.setErrors( [ errorMessage ] );\n\t\t}\n\t);\n};\n\n/**\n * @param {string} snakType value, somevalue, or novalue\n * @param {dataValues.DataValue} dataValue\n * @return {ItemWidget}\n */\nStatementWidget.prototype.createItem = function ( snakType, dataValue ) {\n\tconst widget = new ItemWidget( {\n\t\tdisabled: this.isDisabled(),\n\t\tediting: this.state.editing,\n\t\tentityId: this.state.entityId,\n\t\tpropertyId: this.state.propertyId,\n\t\trank: datamodel.Statement.RANK.NORMAL,\n\t\tsnakType: snakType,\n\t\tdataValue: dataValue\n\t} );\n\n\twidget.connect( this, { delete: [ 'removeItems', [ widget ] ] } );\n\twidget.connect( this, { delete: [ 'emit', 'change' ] } );\n\twidget.connect( this, { change: [ 'setEditing', true ] } );\n\twidget.connect( this, { change: [ 'emit', 'change' ] } );\n\n\treturn widget;\n};\n\n/**\n * @return {datamodel.StatementList}\n */\nStatementWidget.prototype.getData = function () {\n\treturn new datamodel.StatementList( this.getItems().map( ( item ) => item.getData() ) );\n};\n\n/**\n * Update DOM with latest data, sorted by prominence\n *\n * @param {datamodel.StatementList} data\n * @return {jQuery.Promise}\n */\nStatementWidget.prototype.setData = function ( data ) {\n\tconst self = this;\n\tconst existing = [];\n\tconst promises = [];\n\n\t// Bail early and discard existing data if data argument is not a statement list\n\tif ( !( data instanceof datamodel.StatementList ) ) {\n\t\tthrow new Error( 'Invalid statement list' );\n\t}\n\n\t// clear out input field\n\tthis.input.clear();\n\n\tconst sortedData = data.toArray().sort( ( statement1, statement2 ) => statement2.getRank() - statement1.getRank() );\n\n\t// get rid of existing widgets that are no longer present in the\n\t// new set of data we've been fed\n\tthis.removeItems( this.getItems().filter(\n\t\t// we could pretty much just do `!data.hasItem( item.getData() )`,\n\t\t// but that one does not compare GUIDs, so if there are multiple\n\t\t// similar claims, but with a similar GUID, it'll consider them\n\t\t// all the same\n\t\t( item ) => !data.toArray().some(\n\t\t\t( statement ) => statement.equals( item.getData() ) && statement.getClaim().getGuid() === item.getData().getClaim().getGuid()\n\t\t)\n\t) );\n\n\t// figure out which items have an existing widget already\n\t// we're doing this outside of the creation below, because\n\t// setData is async, and new objects may not immediately\n\t// have their data set\n\tsortedData.forEach( ( statement, i ) => {\n\t\texisting[ i ] = self.findItemFromData( statement );\n\t} );\n\n\tsortedData.forEach( ( statement, i ) => {\n\t\tconst mainSnak = statement.getClaim().getMainSnak();\n\t\tlet widget = existing[ i ];\n\t\tconst type = mainSnak.getType();\n\n\t\tif ( mainSnak.getPropertyId() !== self.state.propertyId ) {\n\t\t\tthrow new Error( 'Invalid statement: property ID mismatch' );\n\t\t}\n\n\t\tif ( !( mainSnak instanceof datamodel.Snak ) ) {\n\t\t\t// ignore value-less snak\n\t\t\tdata.removeItem( statement );\n\t\t\treturn;\n\t\t}\n\n\t\tconst value = type === 'value' ? mainSnak.getValue() : null;\n\n\t\tif ( self.state.valueType && value && value.getType() !== self.state.valueType ) {\n\t\t\tthrow new Error( 'Invalid statement: value type mismatch' );\n\t\t}\n\n\t\tif ( widget !== null ) {\n\t\t\tself.moveItem( widget, i );\n\t\t} else {\n\t\t\twidget = self.createItem( type, value );\n\t\t\tself.insertItem( widget, i );\n\t\t}\n\n\t\tpromises.push( widget.setData( statement ) );\n\t} );\n\n\treturn $.when.apply( $, promises ).then( () => self.$element );\n};\n\n/**\n * @return {jQuery.Deferred}\n */\nStatementWidget.prototype.updatePublishButtonState = function () {\n\tif ( this.publishButton && this.items ) {\n\t\tthis.publishButton.setDisabled( this.isDisabled() || !this.hasChanges() );\n\t}\n\n\treturn $.Deferred().resolve( this.$element ).promise();\n};\n\n/**\n * @param {boolean} editing\n * @return {jQuery.Deferred}\n */\nStatementWidget.prototype.setEditing = function ( editing ) {\n\tconst self = this,\n\t\tpromises = [];\n\n\tthis.getItems().forEach( ( item ) => {\n\t\ttry {\n\t\t\tpromises.push( item.setEditing( editing ) );\n\t\t} catch ( e ) {\n\t\t\t// when switching modes, make sure to remove invalid (incomplete) items\n\t\t\tself.removeItems( [ item ] );\n\t\t}\n\t} );\n\n\treturn $.when( promises )\n\t\t.then( this.setState.bind( this, { editing: editing } ) )\n\t\t.then( this.updatePublishButtonState.bind( this ) );\n};\n\n/**\n * @return {boolean}\n */\nStatementWidget.prototype.isEditing = function () {\n\treturn this.state.editing;\n};\n\n/**\n * @inheritDoc\n */\nStatementWidget.prototype.setDisabled = function ( disabled ) {\n\tComponentWidget.prototype.setDisabled.call( this, disabled );\n\n\t// update disabled state for the relevant child objects, if they\n\t// exist (they might not yet, since this method also gets called\n\t// while we're still constructing `this` object)\n\tif ( this.input ) {\n\t\tthis.input.setDisabled( disabled );\n\t}\n\n\tthis.updatePublishButtonState();\n\treturn this;\n};\n\n/**\n * @return {datamodel.Statement[]}\n */\nStatementWidget.prototype.getChanges = function () {\n\tconst currentStatements = this.getData().toArray(),\n\t\tpreviousStatements = this.state.initialData.toArray().reduce( ( result, statement ) => {\n\t\t\tresult[ statement.getClaim().getGuid() ] = statement;\n\t\t\treturn result;\n\t\t}, {} );\n\n\treturn currentStatements.filter( ( statement ) => !( statement.getClaim().getGuid() in previousStatements ) ||\n\t\t\t!statement.equals( previousStatements[ statement.getClaim().getGuid() ] ) );\n};\n\n/**\n * @return {datamodel.Statement[]}\n */\nStatementWidget.prototype.getRemovals = function () {\n\tconst data = this.getData(),\n\t\tcurrentStatements = data.toArray().reduce( ( result, statement ) => {\n\t\t\tresult[ statement.getClaim().getGuid() ] = statement;\n\t\t\treturn result;\n\t\t}, {} );\n\n\treturn this.state.initialData.toArray().filter( ( statement ) => !( statement.getClaim().getGuid() in currentStatements ) );\n};\n\n/**\n * Set data to a specific state (or reset it to last state, if data argument\n * is not provided)\n *\n * This is different from `setData` in that this one will also modify the\n * known state, which is then used to compare for changes.\n * The data that is set via `resetData` is the default state; data set via\n * `setData` is working state, and any changes between that state and the\n * default state, can then be submitted via `submit`.\n *\n * @param {datamodel.StatementList} [data]\n * @return {jQuery.Promise}\n */\nStatementWidget.prototype.resetData = function ( data ) {\n\tconst self = this;\n\n\tdata = this.cloneData( data === undefined ? this.state.initialData : data );\n\n\treturn this.setData( data )\n\t\t// use the `.getData()` result instead of `data` because that'll\n\t\t// already include valid GUIDs, whereas `data` might not\n\t\t.then( () => self.setState( { initialData: self.getData() } ) )\n\t\t.then( this.setEditing.bind( this, false ) );\n};\n\n/**\n * @param {number} [baseRevId]\n * @return {jQuery.Promise}\n */\nStatementWidget.prototype.submit = function ( baseRevId ) {\n\tconst self = this;\n\tconst api = wikibase.api.getLocationAgnosticMwApi(\n\t\tmw.config.get( 'wbmiRepoApiUrl', mw.config.get( 'wbRepoApiUrl' ) )\n\t);\n\tconst data = this.getData();\n\tconst statementsByGuid = {};\n\tconst serializer = new serialization.StatementSerializer();\n\tlet promise = $.Deferred().resolve( { pageinfo: { lastrevid: baseRevId } } ).promise();\n\tconst changedStatements = this.getChanges();\n\tconst removedStatements = this.getRemovals();\n\tlet hasFailures = false;\n\tconst errors = [];\n\tconst disabled = this.isDisabled();\n\tconst tempuser = {};\n\n\tthis.setEditing( false )\n\t\t.then( self.setErrors.bind( self, [] ) );\n\tthis.setDisabled( true );\n\n\tdata.toArray().forEach( ( statement ) => {\n\t\tstatementsByGuid[ statement.getClaim().getGuid() ] = statement;\n\t} );\n\n\tchangedStatements.forEach( ( statement ) => {\n\t\tpromise = promise.then( ( ( innerStatement, prevResponse ) => api.postWithEditToken( {\n\t\t\taction: 'wbsetclaim',\n\t\t\tformat: 'json',\n\t\t\tclaim: JSON.stringify( serializer.serialize( innerStatement ) ),\n\t\t\t// fetch the previous response's rev id and feed it to the next\n\t\t\tbaserevid: prevResponse.pageinfo ? ( prevResponse.pageinfo.lastrevid || undefined ) : undefined,\n\t\t\tbot: 1,\n\t\t\tsummary: self.config.summary || undefined,\n\t\t\ttags: self.config.tags || undefined,\n\t\t\tassertuser: mw.user.isNamed() ? mw.user.getName() : undefined,\n\t\t\terrorformat: 'html',\n\t\t\terrorlang: mw.config.get( 'wgUserLanguage' ),\n\t\t\terrorsuselocal: true,\n\t\t\treturnto: mw.config.get( 'wgPageName' ),\n\t\t\treturntoanchor: '#' + statement.getClaim().getMainSnak().getPropertyId()\n\t\t} ).then(\n\t\t\t( response ) => {\n\t\t\t\tconst guid = response.claim.id;\n\t\t\t\tconst originalStatement = statementsByGuid[ guid ];\n\t\t\t\tconst deserializer = new serialization.StatementDeserializer();\n\t\t\t\tif ( response.claim.qualifiers !== undefined ) {\n\t\t\t\t\t// Capture hashes for new qualifiers by replacing the original\n\t\t\t\t\t// statement with a new statement created from the response\n\t\t\t\t\tconst responseStatement = deserializer.deserialize( response.claim );\n\t\t\t\t\tif ( data.hasItem( originalStatement ) ) {\n\t\t\t\t\t\tdata.removeItem( originalStatement );\n\t\t\t\t\t\t// also remove the item from the StatementWidget itself,\n\t\t\t\t\t\t// or the data will be recreated in this.resetData()\n\t\t\t\t\t\tself.removeItems( [ self.findItemFromData( originalStatement ) ] );\n\t\t\t\t\t}\n\t\t\t\t\tdata.addItem( responseStatement );\n\t\t\t\t}\n\n\t\t\t\t// extract tempuser properties from response, if present\n\t\t\t\t// (this will only be present the first request)\n\t\t\t\tfor ( const property in response ) {\n\t\t\t\t\tif ( property.match( /^tempuser/ ) ) {\n\t\t\t\t\t\ttempuser[ property ] = response[ property ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// make sure to attach known tempuser data to any follow-up\n\t\t\t\t// response, so it ends up propagating until the last response,\n\t\t\t\t// and can be handled once all changes have been submitted\n\t\t\t\tif ( Object.keys( tempuser ).length > 0 ) {\n\t\t\t\t\tObject.assign( response, tempuser );\n\t\t\t\t}\n\n\t\t\t\treturn response;\n\t\t\t}\n\t\t).catch(\n\t\t\t( errorCode, error ) => {\n\t\t\t\tconst apiError = wikibase.api.RepoApiError.newFromApiResponse( error, 'save' ),\n\t\t\t\t\terrorMessage = new OO.ui.HtmlSnippet( apiError.detailedMessage ),\n\t\t\t\t\tguid = statement.getClaim().getGuid(),\n\t\t\t\t\tinitialStatement = self.state.initialData.toArray().filter( ( filterStatement ) => filterStatement.getClaim().getGuid() === guid )[ 0 ];\n\n\t\t\t\t// TODO: show item-specific errors within item UI by using\n\t\t\t\t// the item's setErrors method.\n\t\t\t\t// TODO: flag the offending input so we can make it clear to\n\t\t\t\t// the user which top-level statement or qualifier needs to\n\t\t\t\t// be fixed.\n\t\t\t\thasFailures = true;\n\t\t\t\terrors.push( errorMessage );\n\n\t\t\t\t// replace statement with what we previously had, since we failed\n\t\t\t\t// to submit the changes...\n\t\t\t\tdata.removeItem( statement );\n\t\t\t\tif ( initialStatement ) {\n\t\t\t\t\tdata.addItem( initialStatement );\n\t\t\t\t}\n\n\t\t\t\treturn prevResponse;\n\t\t\t}\n\t\t) ).bind( null, statement ) );\n\t} );\n\n\t// Delete removed items\n\tif ( removedStatements.length > 0 ) {\n\t\tpromise = promise.then( ( prevResponse ) => api.postWithEditToken( {\n\t\t\taction: 'wbremoveclaims',\n\t\t\tformat: 'json',\n\t\t\tclaim: removedStatements.map( ( statement ) => statement.getClaim().getGuid() ).join( '|' ),\n\t\t\t// fetch the previous response's rev id and feed it to the next\n\t\t\tbaserevid: prevResponse.pageinfo ? ( prevResponse.pageinfo.lastrevid || undefined ) : undefined,\n\t\t\tbot: 1,\n\t\t\tsummary: self.config.summary || undefined,\n\t\t\ttags: self.config.tags || undefined,\n\t\t\tassertuser: mw.user.isNamed() ? mw.user.getName() : undefined,\n\t\t\treturnto: mw.config.get( 'wgPageName' ),\n\t\t\treturntoanchor: '#' + removedStatements[ 0 ].getClaim().getMainSnak().getPropertyId()\n\t\t} ).then( ( response ) => {\n\t\t\t// extract tempuser properties from response, if present\n\t\t\t// (this will only be present the first request)\n\t\t\tfor ( const property in response ) {\n\t\t\t\tif ( property.match( /^tempuser/ ) ) {\n\t\t\t\t\ttempuser[ property ] = response[ property ];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// make sure to attach known tempuser data to any follow-up\n\t\t\t// response, so it ends up propagating until the last response,\n\t\t\t// and can be handled once all changes have been submitted\n\t\t\tif ( Object.keys( tempuser ).length > 0 ) {\n\t\t\t\tObject.assign( response, tempuser );\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} ).catch( ( errorCode, error ) => {\n\t\t\tconst apiError = wikibase.api.RepoApiError.newFromApiResponse( error, 'save' );\n\n\t\t\thasFailures = true;\n\t\t\terrors.push( apiError.detailedMessage );\n\n\t\t\t// restore statements that failed to delete\n\t\t\tconst promises = removedStatements.map( ( statement ) => {\n\t\t\t\tconst mainSnak = statement.getClaim().getMainSnak(),\n\t\t\t\t\tsnakType = mainSnak.getType(),\n\t\t\t\t\tvalue = snakType === 'value' ? mainSnak.getValue() : null,\n\t\t\t\t\titem = self.createItem( snakType, value );\n\n\t\t\t\tself.addItems( [ item ] );\n\n\t\t\t\tdata.addItem( statement );\n\t\t\t\treturn item.setData( statement );\n\t\t\t} );\n\n\t\t\t// keep the update chain moving...\n\t\t\treturn $.when.apply( $, promises ).then( () => prevResponse );\n\t\t} ) );\n\t}\n\n\t// store data after we've submitted all changes, so that we'll reset to the\n\t// actual most recent correct state\n\tpromise = promise.then( ( response ) => {\n\t\tconst deferred = $.Deferred();\n\n\t\t// reset to original, pre-submit, disabled state\n\t\tself.setDisabled( disabled );\n\n\t\tif ( hasFailures ) {\n\t\t\t// if we've had failures, put the widget back in edit mode, show\n\t\t\t// error(s), and reject this promise, so callers will know something\n\t\t\t// went wrong.\n\t\t\tself.setEditing( true )\n\t\t\t\t.then( self.setState.bind( self, { initialData: data } ) )\n\t\t\t\t.then( self.setErrors.bind( self, errors ) )\n\t\t\t\t.then( deferred.reject );\n\t\t} else {\n\t\t\t// reset data to what we've just submitted to the API (items that failed\n\t\t\t// to submit have been reset to their previous state in `data`)\n\t\t\tself.resetData( data )\n\t\t\t\t.then( deferred.resolve.bind( deferred, response ) );\n\t\t}\n\n\t\treturn deferred.promise();\n\t} );\n\n\treturn promise;\n};\n\n/**\n * @private\n * @param {datamodel.StatementList} data\n * @return {datamodel.StatementList}\n */\nStatementWidget.prototype.cloneData = function ( data ) {\n\tconst serializer = new serialization.StatementListSerializer(),\n\t\tdeserializer = new serialization.StatementListDeserializer();\n\n\treturn deserializer.deserialize( serializer.serialize( data ) );\n};\n\n/**\n * Display the confirmation dialog to the user when they click the \"Cancel\"\n * button for a given block of statements.\n */\nStatementWidget.prototype.showCancelConfirmationDialog = function () {\n\tconst self = this;\n\n\tif ( this.hasChanges() ) {\n\t\tOO.ui.confirm(\n\t\t\tmw.msg( 'wikibasemediainfo-filepage-cancel-confirm' ),\n\t\t\t{\n\t\t\t\ttitle: mw.msg( 'wikibasemediainfo-filepage-cancel-confirm-title' ),\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\taction: 'accept',\n\t\t\t\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-cancel-confirm-accept' ),\n\t\t\t\t\t\tflags: [ 'primary', 'destructive' ]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\taction: 'reject',\n\t\t\t\t\t\tlabel: mw.msg( 'ooui-dialog-message-reject' ),\n\t\t\t\t\t\tflags: 'safe'\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t).then( ( confirmed ) => {\n\t\t\tif ( confirmed ) {\n\t\t\t\tself.setErrors( [] )\n\t\t\t\t\t.then( self.emit.bind( self, 'cancel' ) );\n\t\t\t}\n\t\t} );\n\t} else {\n\t\tself.setErrors( [] )\n\t\t\t.then( self.emit.bind( self, 'cancel' ) );\n\t}\n};\n\n/**\n * Display the confirmation dialog to the user when they click the \"Remove\n * All\" button for a given block of statements.\n */\nStatementWidget.prototype.showRemoveConfirmationDialog = function () {\n\tconst self = this;\n\n\tOO.ui.confirm(\n\t\tmw.msg( 'wikibasemediainfo-remove-all-statements-confirm' ),\n\t\t{\n\t\t\ttitle: mw.msg( 'wikibasemediainfo-remove-all-statements-confirm-title' ),\n\t\t\tactions: [ {\n\t\t\t\taction: 'accept',\n\t\t\t\tlabel: mw.msg( 'wikibasemediainfo-remove-all-statements-confirm-accept' ),\n\t\t\t\tflags: [ 'primary', 'destructive' ]\n\t\t\t}, {\n\t\t\t\taction: 'reject',\n\t\t\t\tlabel: mw.msg( 'ooui-dialog-message-reject' ),\n\t\t\t\tflags: 'safe'\n\t\t\t} ]\n\t\t}\n\t).done( ( confirmed ) => {\n\t\tif ( confirmed ) {\n\t\t\tself.clearItems();\n\t\t\tself.submit().then( () => {\n\t\t\t\tself.emit( 'widgetRemoved', self.state.propertyId );\n\t\t\t} );\n\t\t}\n\t} );\n};\n\n/**\n * Handle the part of the response from a wbcheckconstraints api call that is relevant to this\n * StatementWidget's property id\n *\n * @param {Object} responseForPropertyId\n */\nStatementWidget.prototype.handleConstraintsResponse = function ( responseForPropertyId ) {\n\tif ( responseForPropertyId === null ) {\n\t\treturn;\n\t}\n\tthis.getItems().forEach( ( itemWidget ) => {\n\t\ttry {\n\t\t\t// find the constraint report for this GUID\n\t\t\tconst guid = itemWidget.getData().getClaim().getGuid();\n\t\t\tconst result = responseForPropertyId.filter( ( responseForStatement ) => responseForStatement.id === guid )[ 0 ] || null;\n\t\t\titemWidget.setConstraintsReport( result );\n\t\t} catch ( e ) {\n\t\t\titemWidget.setConstraintsReport( null );\n\t\t}\n\t} );\n};\n\nmodule.exports = StatementWidget;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/config/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/config/wbMonolingualTextLanguages.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/config/wbTermsLanguages.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/AbstractInputWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'config' is defined but never used.","line":9,"column":78,"nodeType":"Identifier","messageId":"unusedVar","endLine":9,"endColumn":84,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is defined but never used.","line":66,"column":52,"nodeType":"Identifier","messageId":"unusedVar","endLine":66,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/EntityAutocompleteInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/EntityInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/GlobeCoordinateInputWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-undef","severity":2,"message":"'L' is not defined.","line":375,"column":5,"nodeType":"Identifier","messageId":"undef","endLine":375,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/MonolingualTextInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/MultiTypeInputWrapperWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/QuantityInputWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":1,"message":"OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":90,"column":27,"nodeType":"NewExpression","messageId":"noLabel","endLine":94,"endColumn":5}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst ComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\tEntityAutocompleteInputWidget = require( './EntityAutocompleteInputWidget.js' ),\n\tAbstractInputWidget = require( './AbstractInputWidget.js' );\n\n/**\n * @param {Object} config Configuration options\n * @param {boolean} [config.isQualifier]\n */\nconst QuantityInputWidget = function MediaInfoStatementsQuantityInputWidget( config ) {\n\tconfig = config || {};\n\n\tthis.state = {\n\t\tamount: false,\n\t\tunit: '1',\n\t\tshowUnitInput: false,\n\t\tisQualifier: !!config.isQualifier,\n\t\tisActive: false\n\t};\n\n\tthis.input = new OO.ui.TextInputWidget( {\n\t\ttype: 'text',\n\t\tclasses: [ 'wbmi-input-widget__input' ],\n\t\tisRequired: true\n\t} );\n\n\tthis.unit = new EntityAutocompleteInputWidget( {\n\t\tclasses: [ 'wbmi-input-widget__input', 'wbmi-input-widget--unit' ],\n\t\tplaceholder: mw.msg( 'wikibasemediainfo-quantity-unit-placeholder' ),\n\t\ticon: 'search',\n\t\tlabel: mw.msg( 'wikibasemediainfo-quantity-unit-label' )\n\t} );\n\n\tthis.bindEventHandlers();\n\n\tQuantityInputWidget.super.call( this );\n\tAbstractInputWidget.call( this, config );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/inputs/QuantityInputWidget.mustache+dom'\n\t);\n};\nOO.inheritClass( QuantityInputWidget, OO.ui.Widget );\nOO.mixinClass( QuantityInputWidget, AbstractInputWidget );\nOO.mixinClass( QuantityInputWidget, ComponentWidget );\n\nQuantityInputWidget.prototype.bindEventHandlers = function () {\n\tthis.debouncedOnChange = OO.ui.debounce( this.onChange.bind( this ), 200 );\n\tthis.onFocusHandler = this.onFocus.bind( this );\n\n\tthis.input.connect( this, { enter: 'onEnter' } );\n\tthis.input.$input.on( 'focus', this.onFocusHandler );\n\tthis.input.connect( this, { change: this.debouncedOnChange } );\n\n\tthis.unit.connect( this, { change: 'onChangeUnit' } );\n\tthis.unit.connect( this, { add: 'onSelectUnit' } );\n};\n\nQuantityInputWidget.prototype.unbindEventHandlers = function () {\n\tthis.input.disconnect( this, { enter: 'onEnter' } );\n\tthis.input.$input.off( 'focus', this.onFocusHandler );\n\tthis.input.disconnect( this, { change: this.debouncedOnChange } );\n\n\tthis.unit.disconnect( this, { change: 'onChangeUnit' } );\n\tthis.unit.disconnect( this, { add: 'onSelectUnit' } );\n};\n\n/**\n * @inheritDoc\n */\nQuantityInputWidget.prototype.getTemplateData = function () {\n\tconst submitButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 'wbmi-input-widget__button', 'wbmi-input-widget--submit' ],\n\t\tlabel: mw.msg( 'wikibasemediainfo-quantity-input-button-text' ),\n\t\tflags: [ 'progressive' ],\n\t\tdisabled: !this.hasValidInput()\n\t} );\n\tsubmitButton.connect( this, { click: 'onEnter' } );\n\n\tconst addUnitButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 'wbmi-input-widget__button', 'wbmi-input-widget--add-unit' ],\n\t\tlabel: mw.msg( 'wikibasemediainfo-quantity-unit-button-text' ),\n\t\ticon: 'add',\n\t\tflags: [ 'progressive' ]\n\t} );\n\taddUnitButton.connect( this, { click: [ 'setState', { showUnitInput: true } ] } );\n\n\tconst removeUnitButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 'wbmi-input-widget__button', 'wbmi-input-widget--remove-unit' ],\n\t\ticon: 'trash',\n\t\tflags: [ 'destructive' ]\n\t} );\n\tremoveUnitButton.connect( this, { click: 'onRemoveUnit' } );\n\n\t// if a unit has been selected, disable the input field & remove search icon\n\tthis.unit.setDisabled( this.state.unit !== '1' );\n\tthis.unit.setIcon( this.state.unit === '1' ? 'search' : undefined );\n\n\treturn {\n\t\tisQualifier: this.state.isQualifier,\n\t\tisActive: this.state.isActive,\n\t\tinput: this.input,\n\t\tshowUnitInput: this.state.unit !== '1' || this.state.showUnitInput,\n\t\tunit: this.state.unit,\n\t\thasUnit: this.state.unit !== '1',\n\t\tunitInput: this.unit,\n\t\tsubmitButton: submitButton,\n\t\taddUnitButton: addUnitButton,\n\t\tremoveUnitButton: removeUnitButton\n\t};\n};\n\nQuantityInputWidget.prototype.onEnter = function () {\n\tif ( this.hasValidInput() ) {\n\t\tthis.emit( 'add', this );\n\t}\n};\n\nQuantityInputWidget.prototype.onFocus = function () {\n\tthis.setState( { isActive: true } );\n};\n\nQuantityInputWidget.prototype.onChange = function ( value ) {\n\tconst self = this;\n\n\tif ( this.parseValuePromise ) {\n\t\t// abort existing API calls if input has changed\n\t\tthis.parseValuePromise.abort();\n\t}\n\n\tif ( value === '' ) {\n\t\tthis.setState( { amount: false, isActive: false } ).then( this.emit.bind( this, 'change', this ) );\n\t\treturn;\n\t}\n\n\tthis.parseValuePromise = this.parseValue( undefined, 'quantity' );\n\tthis.parseValuePromise\n\t\t.then( ( dataValue ) => {\n\t\t\tconst json = dataValue.toJSON();\n\n\t\t\treturn self.setState( {\n\t\t\t\tamount: json.amount,\n\t\t\t\tisActive: true\n\t\t\t} ).then( self.input.setValidityFlag.bind( self.input, true ) );\n\t\t} )\n\t\t.catch( () => self.setState( { amount: false, isActive: true } )\n\t\t\t.then( self.input.setValidityFlag.bind( self.input, false ) ) )\n\t\t.always( this.emit.bind( this, 'change', this ) );\n};\n\n/**\n * OnChangeUnit is triggered as users type, and `text` is the text in\n * the input field. Any textual change will be treated as \"no unit\",\n * until an actual value gets selected (see `onSelectUnit`)\n */\nQuantityInputWidget.prototype.onChangeUnit = function () {\n\tthis.input.setLabel( '' );\n\n\tthis.setState( { unit: '1' } )\n\t\t.then( this.emit.bind( this, 'change', this ) );\n};\n\n/**\n * onSelectUnit is triggered when users select a valid input type from\n * the autocomplete. Any entity is allowed.\n *\n * @param {Object} data\n */\nQuantityInputWidget.prototype.onSelectUnit = function ( data ) {\n\tthis.input.setLabel( data.label );\n\n\tthis.setState( {\n\t\tunit: data.concepturi,\n\t\tisActive: false\n\t} ).then( this.emit.bind( this, 'change', this ) );\n};\n\nQuantityInputWidget.prototype.onRemoveUnit = function () {\n\tthis.input.setLabel( '' );\n\tthis.unit.setData( undefined );\n\n\tthis.setState( {\n\t\tisActive: false,\n\t\tshowUnitInput: false,\n\t\tunit: '1'\n\t} ).then( this.emit.bind( this, 'change', this ) );\n};\n\n/**\n * @inheritDoc\n */\nQuantityInputWidget.prototype.getRawValue = function () {\n\treturn this.input.getValue();\n};\n\n/**\n * @inheritDoc\n */\nQuantityInputWidget.prototype.getRawValueOptions = function () {\n\treturn { unit: this.state.unit };\n};\n\n/**\n * @inheritDoc\n */\nQuantityInputWidget.prototype.getData = function () {\n\tif ( this.state.amount === false ) {\n\t\tthrow new Error( 'No valid amount' );\n\t}\n\n\treturn dataValues.newDataValue( 'quantity', {\n\t\tamount: this.state.amount,\n\t\tunit: this.state.unit\n\t} );\n};\n\n/**\n * @return {boolean}\n */\nQuantityInputWidget.prototype.hasValidInput = function () {\n\ttry {\n\t\tthis.getData();\n\t\treturn true;\n\t} catch ( e ) {\n\t\treturn false;\n\t}\n};\n\n/**\n * @inheritDoc\n */\nQuantityInputWidget.prototype.setData = function ( data ) {\n\tconst self = this,\n\t\tjson = data.toJSON();\n\n\tlet existing;\n\n\ttry {\n\t\texisting = self.getData();\n\t} catch ( e ) {\n\t\t// no existing data, that's alright...\n\t}\n\n\tthis.unbindEventHandlers();\n\n\t// replace leading '+' unit - that's only needed for internal storage,\n\t// but obvious for human input\n\tthis.input.setValue( json.amount.replace( /^\\+/, '' ) );\n\n\t// remove base uri for display - it's also only needed for storage\n\treturn this.unit.setData( json.unit === '1' ? '' : json.unit.replace( /^.*(Q[0-9]+)$/, '$1' ) )\n\t\t.then( this.bindEventHandlers.bind( this ) )\n\t\t.then( this.setState.bind( this, {\n\t\t\t// this input is a little annoying: it will not emit an\n\t\t\t// 'add' event (which contains the concepturi) on `setData`;\n\t\t\t// only a 'change' event: that will then invalidate the unit,\n\t\t\t// so we'll make sure to override that again...\n\t\t\tamount: json.amount,\n\t\t\tunit: json.unit,\n\t\t\tisActive: false,\n\t\t\tshowUnitInput: json.unit !== '1'\n\t\t} ) )\n\t\t.then( () => {\n\t\t\t// update input field label to reflect unit text\n\t\t\tself.input.setLabel( self.unit.getValue() );\n\n\t\t\tif ( !data.equals( existing ) ) {\n\t\t\t\tself.emit( 'change', self );\n\t\t\t}\n\t\t\treturn self.$element;\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nQuantityInputWidget.prototype.clear = function () {\n\tthis.unbindEventHandlers();\n\n\tthis.input.setValue( '' );\n\tthis.input.setLabel( '' );\n\tthis.unit.setData( undefined );\n\n\tthis.bindEventHandlers();\n\n\treturn this.setState( {\n\t\tamount: false,\n\t\tunit: '1',\n\t\tisActive: false,\n\t\tshowUnitInput: false\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nQuantityInputWidget.prototype.focus = function () {\n\tthis.input.focus();\n};\n\n/**\n * @inheritdoc\n */\nQuantityInputWidget.prototype.setDisabled = function ( disabled ) {\n\tthis.input.setDisabled( disabled );\n\tthis.unit.setDisabled( disabled );\n\tComponentWidget.prototype.setDisabled.call( this, disabled );\n};\n\n/**\n * @inheritDoc\n */\nQuantityInputWidget.prototype.flagAsInvalid = function () {\n\tthis.input.setValidityFlag( false );\n};\n\nmodule.exports = QuantityInputWidget;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/StringInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/TimeInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/UnsupportedInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/README/1.ExampleComponentWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/README/2.TemplatingFeatures.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/README/3.BestPractices.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":14,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":14,"endColumn":33}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\thooks = require( '../../support/hooks.js' );\n\nQUnit.module( 'BestPractices', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tBestPractices = require( '../../../../resources/README/3.BestPractices.js' ),\n\t\t\twidget = new BestPractices(),\n\t\t\tdata = { some: 'some', relevant: 1, data: { test: 'example' } };\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( JSON.stringify( widget.getData() ), JSON.stringify( data ) );\n\t\t\tdone();\n\t\t} );\n\t} );\n} );\n\nQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\tconst done = assert.async(),\n\t\tBestPractices = require( '../../../../resources/README/3.BestPractices.js' ),\n\t\twidget = new BestPractices(),\n\t\tdata = { some: 'some', relevant: 1, data: { test: 'example' } },\n\t\tnewData = { some: 'other', relevant: 0, data: { test: 'example' } },\n\t\tonChange = sinon.stub();\n\n\twidget.setData( data )\n\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t.then( () => {\n\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\tdone();\n\t\t} );\n} );\n\nQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\tconst done = assert.async(),\n\t\tBestPractices = require( '../../../../resources/README/3.BestPractices.js' ),\n\t\twidget = new BestPractices(),\n\t\tdata = { some: 'some', relevant: 1, data: { test: 'example' } },\n\t\tsameData = { some: 'some', relevant: 1, data: { test: 'example' } },\n\t\tonChange = sinon.stub();\n\n\twidget.setData( data )\n\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t.then( () => {\n\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\tdone();\n\t\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/base/ComponentWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/base/DOMLessGroupWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/filepage/CaptionsPanel.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":44,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":44,"endColumn":21}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'cp' is assigned a value but never used.","line":42,"column":5,"nodeType":"Identifier","messageId":"unusedVar","endLine":42,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../resources/filepage/CaptionsPanel.js',\n\thelpers = require( '../../support/helpers.js' ),\n\thooks = require( '../../support/hooks.js' );\nlet sandbox,\n\tdom,\n\tmediaInfoEntity;\n\nQUnit.module( 'CaptionsPanel', {}, () => {\n\t// CaptionsPanel on page where statements are already present\n\tQUnit.module( 'When pre-existing statements are present on page', Object.assign( {}, hooks.mediainfo, {\n\t\tbeforeEach: function () {\n\t\t\tsandbox = sinon.createSandbox();\n\n\t\t\thooks.mediainfo.beforeEach();\n\t\t\tmediaInfoEntity = helpers.readJSON(\n\t\t\t\t__dirname + '/../../support/fixtures/data/mediaInfoEntity.json'\n\t\t\t);\n\n\t\t\t// pre-construct DOM for jQuery to initialize with\n\t\t\tdom = helpers.generateTemplate( 'captionspanel.mst', 'mediaInfoEntity.json' );\n\t\t\tglobal.window = dom.window;\n\t\t\tglobal.window.scrollTo = function () { /* noop */ };\n\t\t},\n\t\tafterEach: function () {\n\t\t\thooks.mediainfo.afterEach();\n\t\t\tsandbox.restore();\n\t\t}\n\t} ), () => {\n\t\tQUnit.test( 'initialization works without errors', ( assert ) => {\n\t\t\tconst CaptionsPanel = require( pathToWidget ),\n\t\t\t\tconfig = {\n\t\t\t\t\twarnWithinMaxCaptionLength: 20,\n\t\t\t\t\tuserLanguages: [ 'en' ],\n\t\t\t\t\tlanguageFallbackChain: [ 'en' ],\n\t\t\t\t\tmediaInfo: mediaInfoEntity,\n\t\t\t\t\tcanEdit: true\n\t\t\t\t},\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tcp = new CaptionsPanel( config );\n\n\t\t\tassert.ok( true );\n\t\t} );\n\n\t\tQUnit.test( 'user languages are added to DOM', ( assert ) => {\n\t\t\tconst CaptionsPanel = require( pathToWidget ),\n\t\t\t\tuserLanguages = [ 'en', 'ga', 'de' ],\n\t\t\t\tconfig = {\n\t\t\t\t\twarnWithinMaxCaptionLength: 20,\n\t\t\t\t\tuserLanguages: userLanguages,\n\t\t\t\t\tlanguageFallbackChain: [ 'en' ],\n\t\t\t\t\tmediaInfo: mediaInfoEntity,\n\t\t\t\t\tcanEdit: true\n\t\t\t\t},\n\t\t\t\tcp = new CaptionsPanel( config ),\n\t\t\t\tdone = assert.async();\n\n\t\t\t// There should be a new caption row for every user language that doesn't already\n\t\t\t// exist in the caption data\n\t\t\tconst captionLanguages = Object.keys( mediaInfoEntity.labels );\n\t\t\tuserLanguages.forEach( ( langCode ) => {\n\t\t\t\tif ( !captionLanguages.includes( langCode ) ) {\n\t\t\t\t\tcaptionLanguages.push( langCode );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tcp.renderPromise.then( () => {\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcp.$element.find( '.wbmi-entityview-caption' ).length,\n\t\t\t\t\tcaptionLanguages.length\n\t\t\t\t);\n\t\t\t\tdone();\n\t\t\t} );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/filepage/LicenseDialogWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":14,"column":3,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":14,"endColumn":20}],"suppressedMessages":[{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":13,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":13,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\thelpers = require( '../../support/helpers.js' ),\n\thooks = require( '../../support/hooks.js' ),\n\tpathToWidget = '../../../../resources/filepage/LicenseDialogWidget.js';\nlet LicenseDialogWidget;\n\nQUnit.module( 'LicenseDialogWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'constructor', ( assert ) => {\n\t\tLicenseDialogWidget = require( pathToWidget );\n\t\t/* eslint-disable-next-line no-new */\n\t\tnew LicenseDialogWidget();\n\t\tassert.ok( true );\n\t} );\n\n\tQUnit.module( 'User is not logged in and has not accepted license', {\n\t\tbeforeEach: function () {\n\t\t\tglobal.mw.user = helpers.createMediaWikiUser();\n\t\t}\n\t}, () => {\n\t\tQUnit.test( 'getLicenseConfirmation returns zero', ( assert ) => {\n\t\t\tLicenseDialogWidget = require( pathToWidget );\n\t\t\tconst dialog = new LicenseDialogWidget();\n\t\t\tassert.strictEqual( dialog.getLicenseConfirmation(), 0 );\n\t\t} );\n\n\t\tQUnit.test( 'storeLicenseConfirmation sets value of the appropriate key to 1', ( assert ) => {\n\t\t\tLicenseDialogWidget = require( pathToWidget );\n\t\t\tconst dialog = new LicenseDialogWidget();\n\t\t\tdialog.storeLicenseConfirmation();\n\t\t\tassert.strictEqual( global.mw.storage.set.calledWith( dialog.prefKey, 1 ), true );\n\t\t} );\n\t} );\n\n\tQUnit.module( 'User is logged in and has not accepted license', {\n\t\tbeforeEach: function () {\n\t\t\tglobal.mw.user = helpers.createMediaWikiUser( true );\n\t\t\tglobal.mw.Api = function () {};\n\t\t\tglobal.mw.Api.prototype = {\n\t\t\t\tsaveOption: sinon.stub()\n\t\t\t};\n\t\t}\n\t}, () => {\n\t\tQUnit.test( 'getLicenseConfirmation returns zero', ( assert ) => {\n\t\t\t// fake out user pref value: license not yet accepted\n\t\t\tglobal.mw.user.options.get.returns( 0 );\n\n\t\t\tLicenseDialogWidget = require( pathToWidget );\n\t\t\tconst dialog = new LicenseDialogWidget();\n\t\t\tassert.strictEqual( dialog.getLicenseConfirmation(), 0 );\n\t\t} );\n\n\t\tQUnit.test( 'storeLicenseConfirmation saves to user preferences', ( assert ) => {\n\t\t\tLicenseDialogWidget = require( pathToWidget );\n\t\t\tconst dialog = new LicenseDialogWidget();\n\t\t\tdialog.storeLicenseConfirmation();\n\t\t\tassert.strictEqual( mw.Api.prototype.saveOption.calledWith( dialog.prefKey, 1 ), true );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/filepage/ProtectionMsgWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":15,"column":3,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":15,"endColumn":20}],"suppressedMessages":[{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":14,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":14,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/* eslint-disable no-new */\n\nconst hooks = require( '../../support/hooks.js' ),\n\tpathToWidget = '../../../../resources/filepage/ProtectionMsgWidget.js',\n\tmsg = '<p>This page is protected</p>';\nlet ProtectionMsgWidget,\n\twidget;\n\nQUnit.module( 'ProtectionMsgWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'constructor', ( assert ) => {\n\t\tProtectionMsgWidget = require( pathToWidget );\n\t\tnew ProtectionMsgWidget();\n\t\tassert.ok( true );\n\t} );\n\n\tQUnit.module( 'Page is not protected', {\n\t\tbeforeEach: function () {\n\t\t\tglobal.mw.config.get.withArgs( 'wbmiProtectionMsg' ).returns( null );\n\t\t}\n\t}, () => {\n\t\tQUnit.test( 'Protection message widget does not display', ( assert ) => {\n\t\t\tProtectionMsgWidget = require( pathToWidget );\n\t\t\twidget = new ProtectionMsgWidget();\n\n\t\t\tassert.strictEqual( widget.shouldDisplay(), false );\n\t\t} );\n\t} );\n\n\tQUnit.module( 'Page is protected', {\n\t\tbeforeEach: function () {\n\t\t\tglobal.mw.config.get.withArgs( 'wbmiProtectionMsg' ).returns( msg );\n\t\t},\n\t\tafterEach: function () {\n\t\t\tglobal.mw.config.get.withArgs( 'wbmiProtectionMsg' ).returns( null );\n\t\t}\n\t}, () => {\n\t\tQUnit.test( 'Protection message widget displays', ( assert ) => {\n\t\t\tProtectionMsgWidget = require( pathToWidget );\n\t\t\twidget = new ProtectionMsgWidget();\n\n\t\t\tassert.strictEqual( widget.shouldDisplay(), true );\n\t\t\tassert.strictEqual( widget.message, msg );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/filepage/StatementPanel.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":42,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":42,"endColumn":21}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":32,"column":16,"nodeType":"CallExpression","endLine":32,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":40,"column":4,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":40,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":48,"column":16,"nodeType":"CallExpression","endLine":48,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":69,"column":17,"nodeType":"CallExpression","endLine":69,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/* eslint-disable no-jquery/no-global-selector */\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../resources/filepage/StatementPanel.js',\n\thelpers = require( '../../support/helpers.js' ),\n\thooks = require( '../../support/hooks.js' );\nlet sandbox,\n\tdom;\n\nQUnit.module( 'StatementPanel', {}, () => {\n\t// Scenario 1. StatementsPanel on page where no statements are present\n\tQUnit.module( 'When no pre-existing statements are present on page', Object.assign( {}, hooks.mediainfo, {\n\t\tbeforeEach: function () {\n\t\t\tsandbox = sinon.createSandbox();\n\n\t\t\t// pre-construct DOM for jQuery to initialize with\n\t\t\tdom = helpers.generateTemplate( 'statementpanel.mst', 'paneldata-empty.json' );\n\t\t\tglobal.window = dom.window;\n\n\t\t\thooks.mediainfo.beforeEach();\n\t\t},\n\t\tafterEach: function () {\n\t\t\thooks.mediainfo.afterEach();\n\t\t\tsandbox.restore();\n\t\t}\n\t} ), () => {\n\t\tQUnit.test( 'constructor', ( assert ) => {\n\t\t\tconst StatementPanel = require( pathToWidget ),\n\t\t\t\tconfig = {\n\t\t\t\t\t$element: $( '.wbmi-entityview-statementsGroup' ),\n\t\t\t\t\tpropertyId: 'P1',\n\t\t\t\t\tpropertyType: 'wikibase-item',\n\t\t\t\t\tentityId: 'M1',\n\t\t\t\t\tproperties: { P1: 'wikibase-item' }\n\t\t\t\t};\n\n\t\t\t// eslint-disable-next-line no-new\n\t\t\tnew StatementPanel( config );\n\n\t\t\tassert.ok( true );\n\t\t} );\n\n\t\tQUnit.test( 'isEditable() is false by default', ( assert ) => {\n\t\t\tconst StatementPanel = require( pathToWidget ),\n\t\t\t\tconfig = {\n\t\t\t\t\t$element: $( '.wbmi-entityview-statementsGroup' ),\n\t\t\t\t\tpropertyId: 'P1',\n\t\t\t\t\tpropertyType: 'wikibase-item',\n\t\t\t\t\tentityId: 'M1',\n\t\t\t\t\tproperties: { P1: 'wikibase-item' }\n\t\t\t\t},\n\t\t\t\tsp = new StatementPanel( config );\n\n\t\t\tassert.strictEqual( sp.isEditable(), false );\n\t\t} );\n\n\t\t// Scenario 1.1: Anon user\n\t\tQUnit.module( 'User is not logged in and has not accepted license', {\n\t\t\tbeforeEach: function () {\n\t\t\t\tglobal.mw.user = helpers.createMediaWikiUser();\n\t\t\t}\n\t\t}, () => {\n\t\t\t// Async test\n\t\t\tQUnit.test( 'LicenseDialogWidget is displayed when user attempts to edit', ( assert ) => {\n\t\t\t\tconst StatementPanel = require( pathToWidget ),\n\t\t\t\t\tconfig = {\n\t\t\t\t\t\t$element: $( '.wbmi-entityview-statementsGroup' ),\n\t\t\t\t\t\tpropertyId: 'P1',\n\t\t\t\t\t\tpropertyType: 'wikibase-item',\n\t\t\t\t\t\tentityId: 'M1',\n\t\t\t\t\t\tproperties: { P1: 'wikibase-item' }\n\t\t\t\t\t},\n\t\t\t\t\tsp = new StatementPanel( config ),\n\t\t\t\t\tdone = assert.async();\n\n\t\t\t\tconst spy = sinon.spy( sp.licenseDialogWidget, 'openDialog' );\n\t\t\t\tsp.makeEditable();\n\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tassert.strictEqual( spy.called, true );\n\t\t\t\t\tdone();\n\t\t\t\t}, 100 );\n\t\t\t} );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/mediainfo.template.mustache+dom.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/AddPropertyWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":16,"column":5,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":16,"endColumn":37},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":21,"column":5,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":21,"endColumn":37}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst pathToWidget = '../../../../resources/statements/AddPropertyWidget.js',\n\thooks = require( '../../support/hooks.js' );\n\nQUnit.module( 'AddPropertyWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'Adding property ids changes the filters', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tAddPropertyWidget = require( pathToWidget ),\n\t\t\twidget = new AddPropertyWidget();\n\n\t\tassert.strictEqual( widget.getFilters()[ 1 ].value, '' );\n\n\t\twidget.addPropertyId( 'Q1' )\n\t\t\t.then( () => {\n\t\t\t\tassert.ok( widget.getFilters() );\n\t\t\t\tassert.strictEqual( widget.getFilters()[ 1 ].value, 'Q1' );\n\t\t\t} )\n\t\t\t.then( widget.addPropertyId.bind( widget, 'Q2' ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.ok( widget.getFilters() );\n\t\t\t\tassert.strictEqual( widget.getFilters()[ 1 ].value, 'Q1|Q2' );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Property input widget & remove are only visible in edit mode', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tAddPropertyWidget = require( pathToWidget ),\n\t\t\twidget = new AddPropertyWidget();\n\n\t\t// wait for initial render to complete\n\t\twidget.render()\n\t\t\t.then( ( $element ) => {\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-entityview-add-statement-property' ).length, 0 );\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-item-remove' ).length, 0 );\n\n\t\t\t\t// 'add property' button is there right away\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-entityview-add-statement-property-button' ).length, 1 );\n\t\t\t} )\n\t\t\t.then( widget.setEditing.bind( widget, true ) )\n\t\t\t.then( ( $element ) => {\n\t\t\t\t// statement input & remove buttons have appeared\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-entityview-add-statement-property-input' ).length, 1 );\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-item-remove' ).length, 1 );\n\n\t\t\t\t// 'add property' button is still there\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-entityview-add-statement-property-button' ).length, 1 );\n\t\t\t} )\n\t\t\t.then( widget.setEditing.bind( widget, false ) )\n\t\t\t.then( ( $element ) => {\n\t\t\t\t// statement input & remove buttons are gone\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-entityview-add-statement-property' ).length, 0 );\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-item-remove' ).length, 0 );\n\n\t\t\t\t// 'add property' button is still there\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-entityview-add-statement-property-button' ).length, 1 );\n\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/ItemWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":23,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":23,"endColumn":33}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../resources/statements/ItemWidget.js',\n\thooks = require( '../../support/hooks.js' );\n\nQUnit.module( 'ItemWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tItemWidget = require( pathToWidget ),\n\t\t\twidget = new ItemWidget( { propertyId: 'P1' } ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tItemWidget = require( pathToWidget ),\n\t\t\twidget = new ItemWidget( { propertyId: 'P1' } ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t),\n\t\t\t\t\tnew datamodel.SnakList( [\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P2',\n\t\t\t\t\t\t\tnew dataValues.StringValue( 'This is a string 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\tnewData = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t),\n\t\t\t\t\tnew datamodel.SnakList( [\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P2',\n\t\t\t\t\t\t\tnew dataValues.StringValue( 'This is a different string 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\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tItemWidget = require( pathToWidget ),\n\t\t\twidget = new ItemWidget( { propertyId: 'P1' } ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t),\n\t\t\t\t\tnew datamodel.SnakList( [\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P2',\n\t\t\t\t\t\t\tnew dataValues.StringValue( 'This is a string 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\tsameData = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t),\n\t\t\t\t\tnew datamodel.SnakList( [\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P2',\n\t\t\t\t\t\t\tnew dataValues.StringValue( 'This is a string 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\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget updates snak widgets with new data', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tItemWidget = require( pathToWidget ),\n\t\t\twidget = new ItemWidget( { propertyId: 'P1' } ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tnoQualifiers = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t),\n\t\t\toneQualifier = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t),\n\t\t\t\t\tnew datamodel.SnakList( [\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P2',\n\t\t\t\t\t\t\tnew dataValues.StringValue( 'This is a string 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\ttwoQualifiers = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t),\n\t\t\t\t\tnew datamodel.SnakList( [\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P2',\n\t\t\t\t\t\t\tnew dataValues.StringValue( 'This is a string value' )\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P3',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q4' )\n\t\t\t\t\t\t)\n\t\t\t\t\t] )\n\t\t\t\t)\n\t\t\t);\n\n\t\twidget.setData( oneQualifier )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( oneQualifier.equals( widget.getData() ), true );\n\t\t\t} )\n\t\t\t.then( widget.setData.bind( widget, twoQualifiers ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( twoQualifiers.equals( widget.getData() ), true );\n\t\t\t} )\n\t\t\t.then( widget.setData.bind( widget, oneQualifier ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( oneQualifier.equals( widget.getData() ), true );\n\t\t\t} )\n\t\t\t.then( widget.setData.bind( widget, noQualifiers ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( noQualifiers.equals( widget.getData() ), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Test enabling edit state', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tItemWidget = require( pathToWidget ),\n\t\t\twidget = new ItemWidget( { propertyId: 'P1' } ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.setEditing.bind( widget, true ) )\n\t\t\t.then( ( $element ) => {\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-item-read' ).length, 0 );\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-item-edit' ).length, 1 );\n\n\t\t\t\t// buttons to add snaklists (qualifiers & references) or remove item are available in edit mode\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-snaklist-add-snak' ).length, 2 );\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-item-remove' ).length, 1 );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Test disabling edit state', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tItemWidget = require( pathToWidget ),\n\t\t\twidget = new ItemWidget( { propertyId: 'P1' } ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.setEditing.bind( widget, false ) )\n\t\t\t.then( ( $element ) => {\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-item-read' ).length, 1 );\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-item-edit' ).length, 0 );\n\n\t\t\t\t// buttons to add snak or remove item are not available in read mode\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-snaklist-add-snak' ).length, 0 );\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-item-remove' ).length, 0 );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Toggling item prominence changes item rank', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tItemWidget = require( pathToWidget ),\n\t\t\twidget = new ItemWidget( { propertyId: 'P1' } ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t'P1',\n\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\n\t\twidget.setData( data )\n\t\t\t.then( () => {\n\t\t\t\t// default rank: normal\n\t\t\t\tassert.strictEqual( widget.getData().getRank(), datamodel.Statement.RANK.NORMAL );\n\t\t\t} )\n\t\t\t.then( widget.toggleItemProminence.bind( widget, { preventDefault: sinon.stub() } ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( widget.getData().getRank(), datamodel.Statement.RANK.PREFERRED );\n\t\t\t} )\n\t\t\t.then( widget.toggleItemProminence.bind( widget, { preventDefault: sinon.stub() } ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( widget.getData().getRank(), datamodel.Statement.RANK.NORMAL );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip with somevalue snak', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tItemWidget = require( pathToWidget ),\n\t\t\twidget = new ItemWidget( { propertyId: 'P1' } ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertySomeValueSnak( 'P1' )\n\t\t\t\t)\n\t\t\t);\n\n\t\twidget.setData( data )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\t\tassert.strictEqual( widget.state.snakType, data.getClaim().getMainSnak().getType() );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip with novalue snak', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tItemWidget = require( pathToWidget ),\n\t\t\twidget = new ItemWidget( { propertyId: 'P1' } ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.Statement(\n\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\tnew datamodel.PropertyNoValueSnak( 'P1' )\n\t\t\t\t)\n\t\t\t);\n\n\t\twidget.setData( data )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\t\tassert.strictEqual( widget.state.snakType, data.getClaim().getMainSnak().getType() );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/LinkNoticeWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":27,"column":3,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":27,"endColumn":20}],"suppressedMessages":[{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":26,"column":3,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":26,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../resources/statements/LinkNoticeWidget.js',\n\thelpers = require( '../../support/helpers.js' ),\n\thooks = require( '../../support/hooks.js' ),\n\tprefKey = 'wbmi-wikidata-link-notice-dismissed';\n\nQUnit.module( 'LinkNoticeWidget', Object.assign( {}, hooks.mediainfo, {\n\tbeforeEach: function () {\n\t\thooks.mediainfo.beforeEach();\n\n\t\t// pretend config conditions for showing notice are met\n\t\tglobal.mw.message = sinon.stub().returns( {\n\t\t\texists: sinon.stub().withArgs( 'wikibasemediainfo-statements-link-notice-text' ).returns( true ),\n\t\t\ttext: sinon.stub().withArgs( 'wikibasemediainfo-statements-link-notice-text' ).returns( 'Stub text' )\n\t\t} );\n\t}\n} ), () => {\n\tQUnit.test( 'constructor', ( assert ) => {\n\t\tconst LinkNoticeWidget = require( pathToWidget );\n\n\t\tglobal.mw.user = helpers.createMediaWikiUser( false );\n\n\t\t/* eslint-disable-next-line no-new */\n\t\tnew LinkNoticeWidget();\n\t\tassert.ok( true );\n\t} );\n\n\tQUnit.module( 'User is not logged in.', {\n\t\tbeforeEach: function () {\n\t\t\tglobal.mw.user = helpers.createMediaWikiUser( false );\n\n\t\t\tglobal.mw.storage.get.returns( 0 );\n\t\t}\n\t}, () => {\n\t\tQUnit.test( 'Widget should be visible if not previously dismissed', ( assert ) => {\n\t\t\tconst LinkNoticeWidget = require( pathToWidget ),\n\t\t\t\twidget = new LinkNoticeWidget();\n\t\t\tassert.strictEqual( widget.isDismissed(), false );\n\t\t} );\n\n\t\tQUnit.test( 'Widget should not be visible if previously dismissed', ( assert ) => {\n\t\t\tconst LinkNoticeWidget = require( pathToWidget );\n\n\t\t\t// Fake out previous dismissal in localstorage\n\t\t\tglobal.mw.storage.get.returns( 1 );\n\n\t\t\tconst widget = new LinkNoticeWidget();\n\n\t\t\tassert.strictEqual( widget.isDismissed(), true );\n\t\t} );\n\n\t\tQUnit.test( 'dismiss method should store data in local storage for anon users', ( assert ) => {\n\t\t\tconst done = assert.async(),\n\t\t\t\tLinkNoticeWidget = require( pathToWidget ),\n\t\t\t\twidget = new LinkNoticeWidget();\n\n\t\t\twidget.dismiss().then( () => {\n\t\t\t\tassert.strictEqual( global.mw.storage.set.calledWith( prefKey, 1 ), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t\t} );\n\n\t\tQUnit.test( 'dismiss method should dismiss the widget', ( assert ) => {\n\t\t\tconst done = assert.async(),\n\t\t\t\tLinkNoticeWidget = require( pathToWidget ),\n\t\t\t\twidget = new LinkNoticeWidget();\n\n\t\t\t// wait for initial render to complete\n\t\t\twidget.render().then( ( $element ) => {\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-link-notice' ).length, 1 );\n\t\t\t\twidget.dismiss().then( ( $innerElement ) => {\n\t\t\t\t\tassert.strictEqual( $innerElement.find( '.wbmi-link-notice' ).length, 0 );\n\t\t\t\t\tdone();\n\t\t\t\t} );\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tQUnit.module( 'User is logged-in', {\n\t\tbeforeEach: function () {\n\t\t\tglobal.mw.user = helpers.createMediaWikiUser( true );\n\t\t\tglobal.mw.Api = function () {};\n\t\t\tglobal.mw.Api.prototype = {\n\t\t\t\tsaveOption: sinon.stub()\n\t\t\t};\n\t\t}\n\t}, () => {\n\t\tQUnit.test( 'Widget should be visible if not previously dismissed', ( assert ) => {\n\t\t\tconst LinkNoticeWidget = require( pathToWidget ),\n\t\t\t\twidget = new LinkNoticeWidget();\n\t\t\tassert.strictEqual( widget.isDismissed(), false );\n\t\t} );\n\n\t\tQUnit.test( 'Widget should not be visible if previously dismissed', ( assert ) => {\n\t\t\tconst LinkNoticeWidget = require( pathToWidget );\n\n\t\t\t// Fake out previous dismissal in user prefs\n\t\t\tglobal.mw.user.options.get.returns( 1 );\n\n\t\t\tconst widget = new LinkNoticeWidget();\n\t\t\tassert.strictEqual( widget.isDismissed(), true );\n\t\t} );\n\n\t\tQUnit.test( 'dismiss method should store data in user preferences for logged in users', ( assert ) => {\n\t\t\tconst done = assert.async(),\n\t\t\t\tLinkNoticeWidget = require( pathToWidget ),\n\t\t\t\twidget = new LinkNoticeWidget();\n\n\t\t\twidget.dismiss().then( () => {\n\t\t\t\tassert.strictEqual( global.mw.user.options.set.calledWith( prefKey, 1 ), true );\n\t\t\t\tassert.strictEqual( global.mw.Api.prototype.saveOption.calledWith( prefKey, 1 ), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/SnakListWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":21,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":21,"endColumn":33},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":91,"column":5,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":91,"endColumn":44}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../resources/statements/SnakListWidget.js',\n\thooks = require( '../../support/hooks.js' );\n\nQUnit.module( 'SnakListWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tSnakListWidget = require( pathToWidget ),\n\t\t\twidget = new SnakListWidget(),\n\t\t\tdata = new datamodel.SnakList( [\n\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t'P1',\n\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t)\n\t\t\t] );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakListWidget = require( pathToWidget ),\n\t\t\twidget = new SnakListWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.SnakList( [\n\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t'P1',\n\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t)\n\t\t\t] ),\n\t\t\tnewData = new datamodel.SnakList( [\n\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t'P1',\n\t\t\t\t\tnew datamodel.EntityId( 'Q2' )\n\t\t\t\t)\n\t\t\t] ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakListWidget = require( pathToWidget ),\n\t\t\twidget = new SnakListWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.SnakList( [\n\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t'P1',\n\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t)\n\t\t\t] ),\n\t\t\tsameData = new datamodel.SnakList( [\n\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t'P1',\n\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t)\n\t\t\t] ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'createWidget() returns a new SnakWidget', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakListWidget = require( pathToWidget ),\n\t\t\tSnakWidget = require( '../../../../resources/statements/SnakWidget.js' ),\n\t\t\twidget = new SnakListWidget();\n\n\t\twidget.createWidget()\n\t\t\t.then( ( snak ) => {\n\t\t\t\tassert.ok( snak instanceof SnakWidget );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'createWidget sets SnakWidget data when snak is provided', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakListWidget = require( pathToWidget ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\twidget = new SnakListWidget();\n\n\t\tconst data = new datamodel.PropertyValueSnak(\n\t\t\t'P1',\n\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t);\n\n\t\twidget.createWidget( data )\n\t\t\t.then( ( snak ) => {\n\t\t\t\tassert.strictEqual( data.equals( snak.getData() ), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'addWidget creates a new SnakWidget every time it is called', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakListWidget = require( pathToWidget ),\n\t\t\twidget = new SnakListWidget(),\n\t\t\tspy = sinon.spy( widget, 'createWidget' ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.SnakList( [\n\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t'P1',\n\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t)\n\t\t\t] );\n\n\t\twidget.setData( data );\n\t\twidget.render().then( () => {\n\t\t\tassert.strictEqual( spy.callCount, 0 );\n\n\t\t\twidget.addWidget();\n\t\t\tassert.strictEqual( spy.callCount, 1 );\n\n\t\t\twidget.addWidget();\n\t\t\tassert.strictEqual( spy.callCount, 2 );\n\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip with somevalue snak', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakListWidget = require( pathToWidget ),\n\t\t\twidget = new SnakListWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.SnakList( [\n\t\t\t\tnew datamodel.PropertySomeValueSnak( 'P1' )\n\t\t\t] );\n\n\t\twidget.setData( data )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip with novalue snak', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakListWidget = require( pathToWidget ),\n\t\t\twidget = new SnakListWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.SnakList( [\n\t\t\t\tnew datamodel.PropertyNoValueSnak( 'P1' )\n\t\t\t] );\n\n\t\twidget.setData( data )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/SnakWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":19,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":19,"endColumn":33},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":198,"column":5,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":198,"endColumn":34},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":218,"column":5,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":218,"endColumn":34}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../resources/statements/SnakWidget.js',\n\thooks = require( '../../support/hooks.js' );\n\nQUnit.module( 'SnakWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tSnakWidget = require( pathToWidget ),\n\t\t\twidget = new SnakWidget(),\n\t\t\tdata = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t);\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakWidget = require( pathToWidget ),\n\t\t\twidget = new SnakWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t),\n\t\t\tnewData = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q2' )\n\t\t\t),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakWidget = require( pathToWidget ),\n\t\t\twidget = new SnakWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t),\n\t\t\tsameData = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'setData() sets property ID in the PropertyInput widget', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakWidget = require( pathToWidget ),\n\t\t\twidget = new SnakWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t);\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.strictEqual( widget.propertyInput.getData().toJSON().id, data.getPropertyId() );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'setData() sets value data in the valueInput widget', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakWidget = require( pathToWidget ),\n\t\t\twidget = new SnakWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t);\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.strictEqual( widget.valueInput.getData().equals( data.getValue() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Property labels are available after API calls complete', ( assert ) => {\n\t\tconst SnakWidget = require( pathToWidget ),\n\t\t\twidget = new SnakWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t),\n\t\t\tpropertyLabel = 'some property',\n\t\t\tvalueLabel = 'some value',\n\t\t\tformatPropertyStub = sinon.stub( widget.propertyInput.input, 'formatValue' ),\n\t\t\tformatValueStub = sinon.stub( widget, 'formatValue' ),\n\t\t\tdone = assert.async();\n\n\t\tformatPropertyStub.returns( $.Deferred().resolve( propertyLabel ).promise( { abort: function () {} } ) );\n\t\tformatValueStub.returns( $.Deferred().resolve( valueLabel ).promise( { abort: function () {} } ) );\n\t\twidget.setData( data );\n\n\t\tsetTimeout( () => {\n\t\t\tassert.strictEqual( formatPropertyStub.called, true );\n\t\t\tassert.strictEqual( widget.propertyInput.input.getValue(), propertyLabel );\n\t\t\tdone();\n\t\t}, 200 );\n\t} );\n\n\tQUnit.test( 'Test enabling edit state', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakWidget = require( pathToWidget ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\twidget = new SnakWidget( { editing: false } ),\n\t\t\tformatPropertyStub = sinon.stub( widget, 'formatProperty' ),\n\t\t\tformatValueStub = sinon.stub( widget, 'formatValue' ),\n\t\t\tdata = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t);\n\n\t\tformatPropertyStub.returns( $.Deferred().resolve( 'some property' ).promise( { abort: function () {} } ) );\n\t\tformatValueStub.returns( $.Deferred().resolve( 'some value' ).promise( { abort: function () {} } ) );\n\t\twidget.setData( data );\n\n\t\t// wait for initial render to complete\n\t\twidget.render().then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-snak-value' ).length, 1 );\n\n\t\t\twidget.setEditing( true ).then( ( $innerElement ) => {\n\t\t\t\tassert.strictEqual( $innerElement.find( '.wbmi-snak-value' ).length, 0 );\n\t\t\t\tdone();\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Test disabling edit state', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tSnakWidget = require( pathToWidget ),\n\t\t\twidget = new SnakWidget( { editing: true } ),\n\t\t\tformatPropertyStub = sinon.stub( widget, 'formatProperty' ),\n\t\t\tformatValueStub = sinon.stub( widget, 'formatValue' ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.PropertyValueSnak(\n\t\t\t\t'P1',\n\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t);\n\n\t\tformatPropertyStub.returns( $.Deferred().resolve( 'some property' ).promise( { abort: function () {} } ) );\n\t\tformatValueStub.returns( $.Deferred().resolve( 'some value' ).promise( { abort: function () {} } ) );\n\t\twidget.setData( data );\n\n\t\t// wait for initial render to complete\n\t\twidget.render().then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-snak-value' ).length, 0 );\n\n\t\t\twidget.setEditing( false ).then( ( $innerElement ) => {\n\t\t\t\tassert.strictEqual( $innerElement.find( '.wbmi-snak-value' ).length, 1 );\n\t\t\t\tdone();\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip with somevalue snak', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tSnakWidget = require( pathToWidget ),\n\t\t\twidget = new SnakWidget(),\n\t\t\tdata = new datamodel.PropertySomeValueSnak( 'P1' );\n\n\t\twidget.setData( data )\n\t\t\t// setData sets the snak type on the input wrapper widget. That\n\t\t\t// should trigger the snak type widget's onChange method, but it\n\t\t\t// doesn't seem to do that in this testing environment.\n\t\t\t// Instead, let's run it directly.\n\t\t\t.then( widget.valueInput.onSnakTypeChange.bind( widget.valueInput, data.getType() ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.ok( widget.getData() );\n\t\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip with novalue snak', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tSnakWidget = require( pathToWidget ),\n\t\t\twidget = new SnakWidget(),\n\t\t\tdata = new datamodel.PropertyNoValueSnak( 'P1' );\n\n\t\twidget.setData( data )\n\t\t\t// setData sets the snak type on the input wrapper widget. That\n\t\t\t// should trigger the snak type widget's onChange method, but it\n\t\t\t// doesn't seem to do that in this testing environment.\n\t\t\t// Instead, let's run it directly.\n\t\t\t.then( widget.valueInput.onSnakTypeChange.bind( widget.valueInput, data.getType() ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.ok( widget.getData() );\n\t\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/StatementWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":30,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":30,"endColumn":33}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../resources/statements/StatementWidget.js',\n\thooks = require( '../../support/hooks.js' );\n\nQUnit.module( 'StatementWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStatementWidget = require( pathToWidget ),\n\t\t\twidget = new StatementWidget( {\n\t\t\t\t$element: $( '<div>' ),\n\t\t\t\tpropertyId: 'P1',\n\t\t\t\tvalueType: 'wikibase-entityid',\n\t\t\t\tentityId: 'M1'\n\t\t\t} ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t] );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStatementWidget = require( pathToWidget ),\n\t\t\twidget = new StatementWidget( {\n\t\t\t\t$element: $( '<div>' ),\n\t\t\t\tpropertyId: 'P1',\n\t\t\t\tvalueType: 'wikibase-entityid',\n\t\t\t\tentityId: 'M1'\n\t\t\t} ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\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\tnewData = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q2' )\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\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStatementWidget = require( pathToWidget ),\n\t\t\twidget = new StatementWidget( {\n\t\t\t\t$element: $( '<div>' ),\n\t\t\t\tpropertyId: 'P1',\n\t\t\t\tvalueType: 'wikibase-entityid',\n\t\t\t\tentityId: 'M1'\n\t\t\t} ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t'guid'\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t] ),\n\t\t\tsameData = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t'guid'\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t] ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Test detection of changes', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStatementWidget = require( pathToWidget ),\n\t\t\twidget = new StatementWidget( {\n\t\t\t\t$element: $( '<div>' ),\n\t\t\t\tpropertyId: 'P1',\n\t\t\t\tvalueType: 'wikibase-entityid',\n\t\t\t\tentityId: 'M1'\n\t\t\t} ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t'guid-1'\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q2' )\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t'guid-2'\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t] ),\n\t\t\tchangedData = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t'guid-1'\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q3' )\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t'guid-2'\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t] ),\n\t\t\tremovedData = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t'guid-1'\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t] );\n\n\t\twidget.resetData( data )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( widget.hasChanges(), false );\n\t\t\t\tassert.strictEqual( widget.getChanges().length, 0 );\n\t\t\t\tassert.strictEqual( widget.getRemovals().length, 0 );\n\t\t\t} )\n\t\t\t.then( widget.setData.bind( widget, changedData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( widget.hasChanges(), true );\n\t\t\t\tassert.strictEqual( widget.getChanges().length, 1 );\n\t\t\t\tassert.strictEqual( widget.getRemovals().length, 0 );\n\t\t\t} )\n\t\t\t.then( widget.setData.bind( widget, removedData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( widget.hasChanges(), true );\n\t\t\t\tassert.strictEqual( widget.getChanges().length, 0 );\n\t\t\t\tassert.strictEqual( widget.getRemovals().length, 1 );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Test enabling edit state', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStatementWidget = require( pathToWidget ),\n\t\t\twidget = new StatementWidget( {\n\t\t\t\t$element: $( '<div>' ),\n\t\t\t\tpropertyId: 'P1',\n\t\t\t\tvalueType: 'wikibase-entityid',\n\t\t\t\tentityId: 'M1',\n\t\t\t\tshowControls: true\n\t\t\t} ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t] );\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.setEditing.bind( widget, true ) )\n\t\t\t.then( ( $element ) => {\n\t\t\t\t// missing in edit mode: edit button; present: footer\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-entityview-editButton' ).length, 0 );\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-statement-footer' ).length, 1 );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Test disabling edit state', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStatementWidget = require( pathToWidget ),\n\t\t\twidget = new StatementWidget( {\n\t\t\t\t$element: $( '<div>' ),\n\t\t\t\tpropertyId: 'P1',\n\t\t\t\tvalueType: 'wikibase-entityid',\n\t\t\t\tentityId: 'M1',\n\t\t\t\tshowControls: true\n\t\t\t} ),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.StatementList( [\n\t\t\t\tnew datamodel.Statement(\n\t\t\t\t\tnew datamodel.Claim(\n\t\t\t\t\t\tnew datamodel.PropertyValueSnak(\n\t\t\t\t\t\t\t'P1',\n\t\t\t\t\t\t\tnew datamodel.EntityId( 'Q1' )\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t] );\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.setEditing.bind( widget, false ) )\n\t\t\t.then( ( $element ) => {\n\t\t\t\t// missing in read mode: footer; present: edit button\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-entityview-editButton' ).length, 1 );\n\t\t\t\tassert.strictEqual( $element.find( '.wbmi-statement-footer' ).length, 0 );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget can handle multiple errors', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStatementWidget = require( pathToWidget ),\n\t\t\twidget = new StatementWidget( {\n\t\t\t\t$element: $( '<div>' ),\n\t\t\t\tpropertyId: 'P1',\n\t\t\t\tpropertyType: 'wikibase-item',\n\t\t\t\tentityId: 'M1',\n\t\t\t\tshowControls: true\n\t\t\t} );\n\n\t\twidget.setErrors( [ 'Error 1', 'Error 2' ] )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( widget.$element.find( '.wbmi-statement-error-msg' ).length, 2 );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/inputs/EntityInputWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":16,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":16,"endColumn":33}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../../resources/statements/inputs/EntityInputWidget.js',\n\thooks = require( '../../../support/hooks.js' );\n\nQUnit.module( 'EntityInputWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tEntityInputWidget = require( pathToWidget ),\n\t\t\twidget = new EntityInputWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.EntityId( 'Q1' );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tEntityInputWidget = require( pathToWidget ),\n\t\t\twidget = new EntityInputWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.EntityId( 'Q1' ),\n\t\t\tnewData = new datamodel.EntityId( 'Q2' ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tEntityInputWidget = require( pathToWidget ),\n\t\t\twidget = new EntityInputWidget(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tdata = new datamodel.EntityId( 'Q1' ),\n\t\t\tsameData = new datamodel.EntityId( 'Q1' ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/inputs/GlobeCoordinateInputWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":26,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":26,"endColumn":33}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../../resources/statements/inputs/GlobeCoordinateInputWidget.js',\n\thooks = require( '../../../support/hooks.js' ),\n\tfakeCoordinates = require( '../../../support/fixtures/data/coordinateData.js' );\n\nQUnit.module( 'GlobeCoordinateInputWidget', hooks.kartographer, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tGlobeCoordinateInputWidget = require( pathToWidget ),\n\t\t\twidget = new GlobeCoordinateInputWidget(),\n\t\t\tapiStub = global.wikibase.api.getLocationAgnosticMwApi(),\n\t\t\tdata = dataValues.GlobeCoordinateValue.newFromJSON( {\n\t\t\t\tlatitude: 0,\n\t\t\t\tlongitude: 0,\n\t\t\t\tprecision: 1\n\t\t\t} );\n\n\t\t// Fake the parsevalue API response\n\t\tapiStub.get.returns(\n\t\t\t$.Deferred().resolve( fakeCoordinates.first ).promise()\n\t\t);\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tGlobeCoordinateInputWidget = require( pathToWidget ),\n\t\t\twidget = new GlobeCoordinateInputWidget(),\n\t\t\tapiStub = global.wikibase.api.getLocationAgnosticMwApi(),\n\t\t\tdata = dataValues.GlobeCoordinateValue.newFromJSON( {\n\t\t\t\tlatitude: 0,\n\t\t\t\tlongitude: 0,\n\t\t\t\tprecision: 1\n\t\t\t} ),\n\t\t\tnewData = dataValues.GlobeCoordinateValue.newFromJSON( {\n\t\t\t\tlatitude: 1,\n\t\t\t\tlongitude: 0,\n\t\t\t\tprecision: 1\n\t\t\t} ),\n\t\t\tonChange = sinon.stub();\n\n\t\t// Fake the parsevalue API response\n\t\tapiStub.get.onFirstCall().returns(\n\t\t\t$.Deferred().resolve( fakeCoordinates.first ).promise()\n\t\t);\n\n\t\tapiStub.get.onSecondCall().returns(\n\t\t\t$.Deferred().resolve( fakeCoordinates.second ).promise()\n\t\t);\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tGlobeCoordinateInputWidget = require( pathToWidget ),\n\t\t\twidget = new GlobeCoordinateInputWidget(),\n\t\t\tapiStub = global.wikibase.api.getLocationAgnosticMwApi(),\n\t\t\tdata = dataValues.GlobeCoordinateValue.newFromJSON( {\n\t\t\t\tlatitude: 0,\n\t\t\t\tlongitude: 0,\n\t\t\t\tprecision: 1\n\t\t\t} ),\n\t\t\tsameData = dataValues.GlobeCoordinateValue.newFromJSON( {\n\t\t\t\tlatitude: 0,\n\t\t\t\tlongitude: 0,\n\t\t\t\tprecision: 1\n\t\t\t} ),\n\t\t\tonChange = sinon.stub();\n\n\t\t// Fake the parsevalue API response\n\t\tapiStub.get.returns(\n\t\t\t$.Deferred().resolve( fakeCoordinates.first ).promise()\n\t\t);\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/inputs/MonolingualTextInputWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":15,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":15,"endColumn":33}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../../resources/statements/inputs/MonolingualTextInputWidget.js',\n\thooks = require( '../../../support/hooks.js' );\n\nQUnit.module( 'MonolingualText', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMonolingualTextInputWidget = require( pathToWidget ),\n\t\t\twidget = new MonolingualTextInputWidget(),\n\t\t\tdata = dataValues.MonolingualTextValue.newFromJSON( { language: 'en', text: 'this is a test' } );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMonolingualTextInputWidget = require( pathToWidget ),\n\t\t\twidget = new MonolingualTextInputWidget(),\n\t\t\tdata = dataValues.MonolingualTextValue.newFromJSON( { language: 'en', text: 'this is a test' } ),\n\t\t\tnewData = dataValues.MonolingualTextValue.newFromJSON( { language: 'nl', text: 'dit is een test' } ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMonolingualTextInputWidget = require( pathToWidget ),\n\t\t\twidget = new MonolingualTextInputWidget(),\n\t\t\tdata = dataValues.MonolingualTextValue.newFromJSON( { language: 'en', text: 'this is a test' } ),\n\t\t\tsameData = dataValues.MonolingualTextValue.newFromJSON( { language: 'en', text: 'this is a test' } ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget has no button in qualifier mode', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMonolingualTextInputWidget = require( pathToWidget ),\n\t\t\twidget = new MonolingualTextInputWidget( { isQualifier: true } ),\n\t\t\tdata = dataValues.MonolingualTextValue.newFromJSON( { language: 'en', text: 'this is a test' } );\n\n\t\twidget.setData( data ).then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget__button' ).length, 0 );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget has button in statement mode', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMonolingualTextInputWidget = require( pathToWidget ),\n\t\t\twidget = new MonolingualTextInputWidget( { isQualifier: false } ),\n\t\t\tdata = dataValues.MonolingualTextValue.newFromJSON( { language: 'en', text: 'this is a test' } );\n\n\t\twidget.setData( data ).then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget__button' ).length, 1 );\n\t\t\tdone();\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/inputs/MultiTypeInputWrapperWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":23,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":23,"endColumn":33},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":36,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":36,"endColumn":33},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":49,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":49,"endColumn":33},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":62,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":62,"endColumn":33},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":81,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":81,"endColumn":33},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":100,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":100,"endColumn":33},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":113,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":113,"endColumn":33},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":223,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":223,"endColumn":70},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":224,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":224,"endColumn":70},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":225,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":225,"endColumn":88},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":226,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":226,"endColumn":74},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":227,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":227,"endColumn":66},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":228,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":228,"endColumn":88},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":229,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":229,"endColumn":80},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":305,"column":5,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":305,"endColumn":65},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":323,"column":5,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":323,"endColumn":65},{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":343,"column":5,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":343,"endColumn":65}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":17,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../../resources/statements/inputs/MultiTypeInputWrapperWidget.js',\n\tpathToEntityInputWidget = '../../../../../resources/statements/inputs/EntityInputWidget.js',\n\tpathToStringInputWidget = '../../../../../resources/statements/inputs/StringInputWidget',\n\tpathToMonolingualTextInputWidget = '../../../../../resources/statements/inputs/MonolingualTextInputWidget.js',\n\tpathToQuantityInputWidget = '../../../../../resources/statements/inputs/QuantityInputWidget.js',\n\tpathToTimeInputWidget = '../../../../../resources/statements/inputs/TimeInputWidget.js',\n\tpathToGlobeCoordinateInputWidget = '../../../../../resources/statements/inputs/GlobeCoordinateInputWidget.js',\n\tpathToUnsupportedInputWidget = '../../../../../resources/statements/inputs/UnsupportedInputWidget.js',\n\thooks = require( '../../../support/hooks.js' );\n\nQUnit.module( 'MultiTypeInputWrapperWidget', hooks.kartographer, () => {\n\tQUnit.test( 'Valid data roundtrip (wikibase-entityid)', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tdatamodel = require( 'wikibase.datamodel' ),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new datamodel.EntityId( 'Q1' );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip (string)', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.StringValue( 'this is a test' );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip (monolingualtext)', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.MonolingualTextValue( 'en', 'this is a test' );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip (quantity)', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.QuantityValue( new dataValues.DecimalValue( 5 ), '1' );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip (time)', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.TimeValue( '+2019-01-24T00:00:00Z', {\n\t\t\t\ttimezone: 0,\n\t\t\t\tbefore: 0,\n\t\t\t\tafter: 0,\n\t\t\t\tprecision: 10,\n\t\t\t\tcalendarmodel: 'http://www.wikidata.org/entity/Q1985786'\n\t\t\t} );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip (globecoordinate)', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.GlobeCoordinateValue(\n\t\t\t\tnew globeCoordinate.GlobeCoordinate( {\n\t\t\t\t\tlatitude: 0,\n\t\t\t\t\tlongitude: 0,\n\t\t\t\t\tprecision: 1\n\t\t\t\t} )\n\t\t\t);\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Valid data roundtrip (unsupported)', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.UnknownValue( 'an unknown value' );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.StringValue( 'this is a test' ),\n\t\t\tnewData = new dataValues.StringValue( 'this is a change' ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.StringValue( 'this is a test' ),\n\t\t\tsameData = new dataValues.StringValue( 'this is a test' ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Changing to same input type leaves existing value unaltered', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.StringValue( 'this is a test' );\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.setInputType.bind( widget, 'string' ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Changing to other input type (and back) wipes out existing data', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = new dataValues.StringValue( 'this is a test' );\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.setInputType.bind( widget, 'quantity' ) )\n\t\t\t.then( widget.setInputType.bind( widget, 'string' ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( data.equals( widget.getData() ), false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget creates the correct input type', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\tEntityInputWidget = require( pathToEntityInputWidget ),\n\t\t\tStringInputWidget = require( pathToStringInputWidget ),\n\t\t\tMonolingualTextInputWidget = require( pathToMonolingualTextInputWidget ),\n\t\t\tQuantityInputWidget = require( pathToQuantityInputWidget ),\n\t\t\tTimeInputWidget = require( pathToTimeInputWidget ),\n\t\t\tGlobeCoordinateInputWidget = require( pathToGlobeCoordinateInputWidget ),\n\t\t\tUnsupportedInputWidget = require( pathToUnsupportedInputWidget ),\n\t\t\tentityWidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'wikibase-entityid'\n\t\t\t} ),\n\t\t\tstringWidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'string'\n\t\t\t} ),\n\t\t\tmonolingualTextWidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'monolingualtext'\n\t\t\t} ),\n\t\t\tquantityWidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'quantity'\n\t\t\t} ),\n\t\t\ttimeWidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'time'\n\t\t\t} ),\n\t\t\tglobeCoordinateWidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'globecoordinate'\n\t\t\t} ),\n\t\t\tunsupportedWidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'anotherthing'\n\t\t\t} );\n\n\t\t$.when(\n\t\t\tentityWidget.render(),\n\t\t\tstringWidget.render(),\n\t\t\tmonolingualTextWidget.render(),\n\t\t\tquantityWidget.render(),\n\t\t\ttimeWidget.render(),\n\t\t\tglobeCoordinateWidget.render(),\n\t\t\tunsupportedWidget.render()\n\t\t).then( () => {\n\t\t\tassert.ok( entityWidget.state.input instanceof EntityInputWidget );\n\t\t\tassert.ok( stringWidget.state.input instanceof StringInputWidget );\n\t\t\tassert.ok( monolingualTextWidget.state.input instanceof MonolingualTextInputWidget );\n\t\t\tassert.ok( quantityWidget.state.input instanceof QuantityInputWidget );\n\t\t\tassert.ok( timeWidget.state.input instanceof TimeInputWidget );\n\t\t\tassert.ok( globeCoordinateWidget.state.input instanceof GlobeCoordinateInputWidget );\n\t\t\tassert.ok( unsupportedWidget.state.input instanceof UnsupportedInputWidget );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'add event is fired when child input emits add', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'string'\n\t\t\t} ),\n\t\t\tcallStub = sinon.stub();\n\n\t\twidget.on( 'add', callStub );\n\n\t\twidget.render().then( () => {\n\t\t\t// trigger an 'add' event\n\t\t\twidget.state.input.emit( 'add' );\n\n\t\t\t// events are async, let's attach this check to the end of the call\n\t\t\t// stack to give the event handler time to run\n\t\t\tsetTimeout( () => {\n\t\t\t\tassert.strictEqual( callStub.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tQUnit.test( 'setErrors adds MessageWidget to UI and flags string input as invalid', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'string'\n\t\t\t} );\n\n\t\twidget.state.input.input.setValidityFlag = sinon.stub();\n\t\twidget.setErrors( [ 'Invalid string input' ] )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( widget.$element.find( '.wbmi-statement-error-msg' ).length, 1 );\n\t\t\t\tassert.strictEqual( widget.state.input.input.setValidityFlag.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\n\t} );\n\n\tQUnit.test( 'Widget can handle multiple errors', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget( {\n\t\t\t\ttype: 'string'\n\t\t\t} );\n\n\t\twidget.state.input.input.setValidityFlag = sinon.stub();\n\t\twidget.setErrors( [ 'Error 1', 'Error 2' ] )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( widget.$element.find( '.wbmi-statement-error-msg' ).length, 2 );\n\t\t\t\tassert.strictEqual( widget.state.input.input.setValidityFlag.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting snak type to somevalue changes input to disabled string input', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = null,\n\t\t\tStringInputWidget = require( pathToStringInputWidget );\n\n\t\twidget.setDataType( 'wikibase-entityid' )\n\t\t\t.then( widget.setData.bind( widget, data ) )\n\t\t\t.then( widget.setSnakType.bind( widget, 'somevalue' ) )\n\t\t\t// Since the above method isn't asynchronous but leads to an async\n\t\t\t// process, let's run an empty setState call before checking\n\t\t\t// the final result.\n\t\t\t.then( widget.setState.bind( widget, {} ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.ok( widget.state.input instanceof StringInputWidget );\n\t\t\t\tassert.strictEqual( widget.state.input.input.isDisabled(), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting snak type to novalue changes input to disabled string input', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = null,\n\t\t\tStringInputWidget = require( pathToStringInputWidget );\n\n\t\twidget.setDataType( 'wikibase-entityid' )\n\t\t\t.then( widget.setData.bind( widget, data ) )\n\t\t\t.then( widget.setSnakType.bind( widget, 'novalue' ) )\n\t\t\t.then( widget.setState.bind( widget, {} ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.ok( widget.state.input instanceof StringInputWidget );\n\t\t\t\tassert.strictEqual( widget.state.input.input.isDisabled(), true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting snak type to value changes input to original type', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget(),\n\t\t\tdata = null,\n\t\t\tEntityInputWidget = require( pathToEntityInputWidget );\n\n\t\twidget.setDataType( 'wikibase-entityid' )\n\t\t\t.then( widget.setData.bind( widget, data ) )\n\t\t\t.then( widget.setSnakType.bind( widget, 'novalue' ) )\n\t\t\t.then( widget.setState.bind( widget, {} ) )\n\t\t\t.then( widget.snakTypeWidget.setValue.bind( widget.snakTypeWidget, 'value' ) )\n\t\t\t.then( widget.setState.bind( widget, {} ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.ok( widget.state.input instanceof EntityInputWidget );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Datatype can be set explicitly', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tMultiTypeInputWrapperWidget = require( pathToWidget ),\n\t\t\twidget = new MultiTypeInputWrapperWidget();\n\n\t\twidget.setDataType( 'wikibase-entityid' )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( widget.state.type, 'wikibase-entityid' );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/inputs/QuantityInputWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":15,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":15,"endColumn":33}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../../resources/statements/inputs/QuantityInputWidget.js',\n\thooks = require( '../../../support/hooks.js' );\n\nQUnit.module( 'QuantityInputWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tQuantityInputWidget = require( pathToWidget ),\n\t\t\twidget = new QuantityInputWidget(),\n\t\t\tdata = dataValues.QuantityValue.newFromJSON( { amount: '+1', unit: '1' } );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tQuantityInputWidget = require( pathToWidget ),\n\t\t\twidget = new QuantityInputWidget(),\n\t\t\tdata = dataValues.QuantityValue.newFromJSON( { amount: '+1', unit: '1' } ),\n\t\t\tnewData = dataValues.QuantityValue.newFromJSON( { amount: '+2', unit: '1' } ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tQuantityInputWidget = require( pathToWidget ),\n\t\t\twidget = new QuantityInputWidget(),\n\t\t\tdata = dataValues.QuantityValue.newFromJSON( { amount: '+1', unit: '1' } ),\n\t\t\tsameData = dataValues.QuantityValue.newFromJSON( { amount: '+1', unit: '1' } ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget has no button in qualifier mode', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tQuantityInputWidget = require( pathToWidget ),\n\t\t\twidget = new QuantityInputWidget( { isQualifier: true } ),\n\t\t\tdata = dataValues.QuantityValue.newFromJSON( { amount: '+1', unit: '1' } );\n\n\t\twidget.setData( data ).then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--submit' ).length, 0 );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget has button in statement mode', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tQuantityInputWidget = require( pathToWidget ),\n\t\t\twidget = new QuantityInputWidget( { isQualifier: false } ),\n\t\t\tdata = dataValues.QuantityValue.newFromJSON( { amount: '+1', unit: '1' } );\n\n\t\twidget.setData( data ).then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--submit' ).length, 1 );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget displays no options by default', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tQuantityInputWidget = require( pathToWidget ),\n\t\t\twidget = new QuantityInputWidget();\n\n\t\twidget.render().then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--options.wbmi-input-widget__active' ).length, 0 );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget displays button to add unit when focused', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tQuantityInputWidget = require( pathToWidget ),\n\t\t\twidget = new QuantityInputWidget(),\n\t\t\tdata = dataValues.QuantityValue.newFromJSON( { amount: '+1', unit: '1' } );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\twidget.input.$input.trigger( 'focus' );\n\n\t\t\t// give handler for above event a change to run, and alter the state/rerender\n\t\t\tsetTimeout( () => {\n\t\t\t\twidget.render().then( ( $element ) => {\n\t\t\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--options.wbmi-input-widget__active' ).length, 1 );\n\t\t\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--unit' ).length, 0 );\n\t\t\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--add-unit' ).length, 1 );\n\t\t\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--remove-unit' ).length, 0 );\n\t\t\t\t\tdone();\n\t\t\t\t} );\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget displays custom unit when it has one', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tQuantityInputWidget = require( pathToWidget ),\n\t\t\twidget = new QuantityInputWidget(),\n\t\t\tdata = dataValues.QuantityValue.newFromJSON( {\n\t\t\t\tamount: '+1',\n\t\t\t\tunit: 'http://wikidata.wiki.local.wmftest.net:8080/entity/Q1'\n\t\t\t} );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\twidget.input.$input.trigger( 'focus' );\n\n\t\t\t// give handler for above event a change to run, and alter the state/rerender\n\t\t\tsetTimeout( () => {\n\t\t\t\twidget.render().then( ( $element ) => {\n\t\t\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--options.wbmi-input-widget__active' ).length, 1 );\n\t\t\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--unit' ).length, 1 );\n\t\t\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--add-unit' ).length, 0 );\n\t\t\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget--remove-unit' ).length, 1 );\n\t\t\t\t\tdone();\n\t\t\t\t} );\n\t\t\t} );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/inputs/StringInputWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":15,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":15,"endColumn":33}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../../resources/statements/inputs/StringInputWidget.js',\n\thooks = require( '../../../support/hooks.js' );\n\nQUnit.module( 'StringInputWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStringInputWidget = require( pathToWidget ),\n\t\t\twidget = new StringInputWidget(),\n\t\t\tdata = new dataValues.StringValue( 'this is a string' );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStringInputWidget = require( pathToWidget ),\n\t\t\twidget = new StringInputWidget(),\n\t\t\tdata = new dataValues.StringValue( 'this is a string' ),\n\t\t\tnewData = new dataValues.StringValue( 'this is another string' ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStringInputWidget = require( pathToWidget ),\n\t\t\twidget = new StringInputWidget(),\n\t\t\tdata = new dataValues.StringValue( 'this is a string' ),\n\t\t\tsameData = new dataValues.StringValue( 'this is a string' ),\n\t\t\tonChange = sinon.stub();\n\n\t\twidget.setData( data )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget has no button in qualifier mode', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStringInputWidget = require( pathToWidget ),\n\t\t\twidget = new StringInputWidget( { isQualifier: true } ),\n\t\t\tdata = new dataValues.StringValue( 'this is a string' );\n\n\t\twidget.setData( data ).then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget__button' ).length, 0 );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget has button in statement mode', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tStringInputWidget = require( pathToWidget ),\n\t\t\twidget = new StringInputWidget( { isQualifier: false } ),\n\t\t\tdata = new dataValues.StringValue( 'this is a string' );\n\n\t\twidget.setData( data ).then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget__button' ).length, 1 );\n\t\t\tdone();\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/mediainfo/statements/inputs/TimeInputWidget.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":1,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":27,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":27,"endColumn":33}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tpathToWidget = '../../../../../resources/statements/inputs/TimeInputWidget.js',\n\thooks = require( '../../../support/hooks.js' );\n\nQUnit.module( 'TimeInputWidget', hooks.mediainfo, () => {\n\tQUnit.test( 'Valid data roundtrip', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tTimeInputWidget = require( pathToWidget ),\n\t\t\twidget = new TimeInputWidget(),\n\t\t\tdata = dataValues.TimeValue.newFromJSON( {\n\t\t\t\ttime: '+2019-01-24T00:00:00Z',\n\t\t\t\ttimezone: 0,\n\t\t\t\tbefore: 0,\n\t\t\t\tafter: 0,\n\t\t\t\tprecision: 10,\n\t\t\t\tcalendarmodel: 'http://www.wikidata.org/entity/Q1985786'\n\t\t\t} ),\n\t\t\tparseValueStub = sinon.stub( widget, 'parseValue' ),\n\t\t\tformatValueStub = sinon.stub( widget, 'formatValue' );\n\n\t\tparseValueStub.onFirstCall().returns( $.Deferred().resolve( data ).promise( { abort: function () {} } ) );\n\t\tformatValueStub.withArgs( data ).returns( $.Deferred().resolve( '24 January 2019' ).promise( { abort: function () {} } ) );\n\n\t\twidget.setData( data ).then( () => {\n\t\t\tassert.ok( widget.getData() );\n\t\t\tassert.strictEqual( data.equals( widget.getData() ), true );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting other data triggers a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tTimeInputWidget = require( pathToWidget ),\n\t\t\twidget = new TimeInputWidget(),\n\t\t\tdata = dataValues.TimeValue.newFromJSON( {\n\t\t\t\ttime: '+2019-01-24T00:00:00Z',\n\t\t\t\ttimezone: 0,\n\t\t\t\tbefore: 0,\n\t\t\t\tafter: 0,\n\t\t\t\tprecision: 10,\n\t\t\t\tcalendarmodel: 'http://www.wikidata.org/entity/Q1985786'\n\t\t\t} ),\n\t\t\tnewData = dataValues.TimeValue.newFromJSON( {\n\t\t\t\ttime: '+2019-01-25T00:00:00Z',\n\t\t\t\ttimezone: 0,\n\t\t\t\tbefore: 0,\n\t\t\t\tafter: 0,\n\t\t\t\tprecision: 10,\n\t\t\t\tcalendarmodel: 'http://www.wikidata.org/entity/Q1985786'\n\t\t\t} ),\n\t\t\tparseValueStub = sinon.stub( widget, 'parseValue' ),\n\t\t\tformatValueStub = sinon.stub( widget, 'formatValue' ),\n\t\t\tonChange = sinon.stub();\n\n\t\tparseValueStub.onFirstCall().returns( $.Deferred().resolve( data ).promise( { abort: function () {} } ) );\n\t\tparseValueStub.onSecondCall().returns( $.Deferred().resolve( newData ).promise( { abort: function () {} } ) );\n\t\tformatValueStub.withArgs( data ).returns( $.Deferred().resolve( '24 January 2019' ).promise( { abort: function () {} } ) );\n\t\tformatValueStub.withArgs( newData ).returns( $.Deferred().resolve( '25 January 2019' ).promise( { abort: function () {} } ) );\n\n\t\twidget.setData( data )\n\t\t\t.then( () => {\n\t\t\t\tconst deferred = $.Deferred();\n\t\t\t\t// timeout because the onchange event is debounced for this duration...\n\t\t\t\tsetTimeout( deferred.resolve, 210 );\n\t\t\t\treturn deferred.promise();\n\t\t\t} )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, newData ) )\n\t\t\t.then( () => {\n\t\t\t\tconst deferred = $.Deferred();\n\t\t\t\t// timeout because the onchange event is debounced for this duration...\n\t\t\t\tsetTimeout( deferred.resolve, 210 );\n\t\t\t\treturn deferred.promise();\n\t\t\t} )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, true );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Setting same data does not trigger a change event', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tTimeInputWidget = require( pathToWidget ),\n\t\t\twidget = new TimeInputWidget(),\n\t\t\tdata = dataValues.TimeValue.newFromJSON( {\n\t\t\t\ttime: '+2019-01-24T00:00:00Z',\n\t\t\t\ttimezone: 0,\n\t\t\t\tbefore: 0,\n\t\t\t\tafter: 0,\n\t\t\t\tprecision: 10,\n\t\t\t\tcalendarmodel: 'http://www.wikidata.org/entity/Q1985786'\n\t\t\t} ),\n\t\t\tsameData = dataValues.TimeValue.newFromJSON( {\n\t\t\t\ttime: '+2019-01-24T00:00:00Z',\n\t\t\t\ttimezone: 0,\n\t\t\t\tbefore: 0,\n\t\t\t\tafter: 0,\n\t\t\t\tprecision: 10,\n\t\t\t\tcalendarmodel: 'http://www.wikidata.org/entity/Q1985786'\n\t\t\t} ),\n\t\t\tparseValueStub = sinon.stub( widget, 'parseValue' ),\n\t\t\tformatValueStub = sinon.stub( widget, 'formatValue' ),\n\t\t\tonChange = sinon.stub();\n\n\t\tparseValueStub.onFirstCall().returns( $.Deferred().resolve( data ).promise( { abort: function () {} } ) );\n\t\tparseValueStub.onSecondCall().returns( $.Deferred().resolve( sameData ).promise( { abort: function () {} } ) );\n\t\tformatValueStub.withArgs( data ).returns( $.Deferred().resolve( '24 January 2019' ).promise( { abort: function () {} } ) );\n\t\tformatValueStub.withArgs( sameData ).returns( $.Deferred().resolve( '24 January 2019' ).promise( { abort: function () {} } ) );\n\n\t\twidget.setData( data )\n\t\t\t.then( () => {\n\t\t\t\tconst deferred = $.Deferred();\n\t\t\t\t// timeout because the onchange event is debounced for this duration...\n\t\t\t\tsetTimeout( deferred.resolve, 210 );\n\t\t\t\treturn deferred.promise();\n\t\t\t} )\n\t\t\t.then( widget.on.bind( widget, 'change', onChange, [] ) )\n\t\t\t.then( widget.setData.bind( widget, sameData ) )\n\t\t\t.then( () => {\n\t\t\t\tconst deferred = $.Deferred();\n\t\t\t\t// timeout because the onchange event is debounced for this duration...\n\t\t\t\tsetTimeout( deferred.resolve, 210 );\n\t\t\t\treturn deferred.promise();\n\t\t\t} )\n\t\t\t.then( () => {\n\t\t\t\tassert.strictEqual( onChange.called, false );\n\t\t\t\tdone();\n\t\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget has no button in qualifier mode', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tTimeInputWidget = require( pathToWidget ),\n\t\t\twidget = new TimeInputWidget( { isQualifier: true } ),\n\t\t\tdata = dataValues.TimeValue.newFromJSON( {\n\t\t\t\ttime: '+2019-01-24T00:00:00Z',\n\t\t\t\ttimezone: 0,\n\t\t\t\tbefore: 0,\n\t\t\t\tafter: 0,\n\t\t\t\tprecision: 10,\n\t\t\t\tcalendarmodel: 'http://www.wikidata.org/entity/Q1985786'\n\t\t\t} );\n\n\t\twidget.setData( data ).then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget__button' ).length, 0 );\n\t\t\tdone();\n\t\t} );\n\t} );\n\n\tQUnit.test( 'Widget has button in statement mode', ( assert ) => {\n\t\tconst done = assert.async(),\n\t\t\tTimeInputWidget = require( pathToWidget ),\n\t\t\twidget = new TimeInputWidget( { isQualifier: false } ),\n\t\t\tdata = dataValues.TimeValue.newFromJSON( {\n\t\t\t\ttime: '+2019-01-24T00:00:00Z',\n\t\t\t\ttimezone: 0,\n\t\t\t\tbefore: 0,\n\t\t\t\tafter: 0,\n\t\t\t\tprecision: 10,\n\t\t\t\tcalendarmodel: 'http://www.wikidata.org/entity/Q1985786'\n\t\t\t} );\n\n\t\twidget.setData( data ).then( ( $element ) => {\n\t\t\tassert.strictEqual( $element.find( '.wbmi-input-widget__button' ).length, 1 );\n\t\t\tdone();\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/support/fixtures/data/coordinateData.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/support/fixtures/data/mediaInfoEntity.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/support/fixtures/data/paneldata-empty.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/support/fixtures/data/qualifierMenuOptionData.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/support/fixtures/data/wbDataTypes.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/support/fixtures/data/wbmiPropertyTypes.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/support/helpers.js","messages":[{"ruleId":"security/detect-non-literal-require","severity":1,"message":"Found non-literal argument in require","line":26,"column":9,"nodeType":"CallExpression","endLine":26,"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":39,"column":19,"nodeType":"CallExpression","endLine":39,"endColumn":97},{"ruleId":"security/detect-non-literal-require","severity":1,"message":"Found non-literal argument in require","line":40,"column":10,"nodeType":"CallExpression","endLine":40,"endColumn":52},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":54,"column":21,"nodeType":"CallExpression","endLine":54,"endColumn":58},{"ruleId":"security/detect-non-literal-require","severity":1,"message":"Found non-literal argument in require","line":305,"column":38,"nodeType":"CallExpression","endLine":305,"endColumn":108},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":325,"column":21,"nodeType":"CallExpression","endLine":325,"endColumn":102}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst sinon = require( 'sinon' ),\n\tjsdom = require( 'jsdom' ),\n\tfs = require( 'fs' ),\n\tpath = require( 'path' ),\n\tMustache = require( 'mustache' ),\n\tmockery = require( 'mockery' ),\n\tmockCache = {};\n\n/**\n * Allows requiring a module more than once.\n * Useful for e.g. wikibase files, which aren't really modules,\n * but code that is executed immediately, which we'll want to\n * run before every test.\n *\n * @param {string} module\n * @return {*}\n */\nfunction requireAgain( module ) {\n\ttry {\n\t\tdelete require.cache[ require.resolve( module ) ];\n\t} catch ( e ) {\n\t\t// couldn't resolve module, so there'll be no cache for sure\n\t}\n\treturn require( module );\n}\nmodule.exports.requireAgain = requireAgain;\n\n/**\n * Builds a template for use in testing when given a Mustache template and JSON\n * data to populate it. Paths should be relative to the \"support\" directory.\n *\n * @param {string} pathToTemplate\n * @param {string} pathToData\n * @return {jsdom.JSDOM} JSDOM object\n */\nmodule.exports.generateTemplate = function ( pathToTemplate, pathToData ) {\n\tconst template = fs.readFileSync( path.join( __dirname, 'templates', pathToTemplate ), 'utf8' ),\n\t\tdata = require( './fixtures/data/' + pathToData ),\n\t\thtml = Mustache.render( template, data ),\n\t\tdom = new jsdom.JSDOM( html );\n\n\treturn dom;\n};\n\n/**\n * Returns the contents of a json file as a js object\n *\n * @param {string} pathToFile\n * @return {Object}\n */\nmodule.exports.readJSON = function ( pathToFile ) {\n\treturn JSON.parse( fs.readFileSync( pathToFile, 'utf8' ) );\n};\n\n/**\n * Stubs out a basic \"mw\" object for use in testing. Only stubs out\n * properties/methods that need to be called in the test suite; expect more\n * additions over time as the suite grows.\n *\n * @return {Object} mw\n */\nmodule.exports.createMediaWikiEnv = function () {\n\treturn {\n\t\tmediaInfo: {\n\t\t\tstructuredData: {}\n\t\t},\n\n\t\tconfig: {\n\t\t\tget: sinon.stub(),\n\t\t\tset: sinon.stub()\n\t\t},\n\n\t\tnotify: sinon.stub(),\n\n\t\tstorage: {\n\t\t\tget: sinon.stub(),\n\t\t\tset: sinon.stub()\n\t\t},\n\n\t\tcookie: {\n\t\t\tget: sinon.stub(),\n\t\t\tset: sinon.stub()\n\t\t},\n\n\t\tmessage: sinon.stub().returns( {\n\t\t\tescaped: sinon.stub(),\n\t\t\texists: sinon.stub(),\n\t\t\ttext: sinon.stub(),\n\t\t\tparams: sinon.stub().returnsThis(),\n\t\t\tparse: sinon.stub(),\n\t\t\tparseDom: sinon.stub()\n\t\t} ),\n\n\t\tmsg: sinon.stub(),\n\n\t\ttemplate: {\n\t\t\tget: sinon.stub().returns( {\n\t\t\t\trender: sinon.stub()\n\t\t\t} )\n\t\t},\n\n\t\tlanguage: {\n\t\t\tconvertNumber: sinon.stub()\n\t\t},\n\n\t\tloader: {\n\t\t\tusing: sinon.stub().resolves( sinon.stub() )\n\t\t},\n\n\t\ttemplates: new Map(),\n\n\t\tTitle: sinon.stub().returns( {\n\t\t\tgetNameText: sinon.stub(),\n\t\t\tgetNamespaceId: sinon.stub()\n\t\t} ),\n\n\t\thtml: {\n\t\t\tescape: sinon.stub()\n\t\t}\n\t};\n};\n\n/**\n * Stubs out and/or loads a basic \"globeCoordinate\" object for use in testing.\n *\n * @return {Object}\n */\nmodule.exports.createGlobeCoordinateEnv = function () {\n\tconst oldglobeCoordinate = global.globeCoordinate,\n\t\toldJQuery = global.jQuery,\n\t\told$ = global.$;\n\n\t// `require` caches the exports and reuses them the next require\n\t// the files required below have no exports, though - they just\n\t// execute and are assigned as properties of an object\n\t// `requireAgain` would make sure they keep doing that over and\n\t// over, but then they'll end up creating the same functions/objects\n\t// more than once, but different instances...\n\t// other modules, with actual exports, that use these functions\n\t// might encounter side-effects though, because the instances of\n\t// those objects are different when loaded at different times,\n\t// so to be safe, we'll try to emulate regular `require` behavior\n\t// by running these files once, grabbing the result, caching it,\n\t// and re-using the result from cache\n\tif ( mockCache.globeCoordinate ) {\n\t\treturn mockCache.globeCoordinate;\n\t}\n\n\t// wikibase-data-values needs jquery...\n\tglobal.jQuery = global.$ = requireAgain( 'jquery' );\n\n\tglobal.globeCoordinate = requireAgain( 'wikibase-data-values/lib/globeCoordinate/globeCoordinate.js' ).globeCoordinate;\n\trequireAgain( 'wikibase-data-values/lib/globeCoordinate/globeCoordinate.GlobeCoordinate.js' );\n\n\tmockCache.globeCoordinate = global.globeCoordinate;\n\tglobal.globeCoordinate = oldglobeCoordinate;\n\n\t// restore global scope before returning\n\tglobal.jQuery = oldJQuery;\n\tglobal.$ = old$;\n\n\treturn mockCache.globeCoordinate;\n};\n\n/**\n * Stubs out and/or loads a basic \"dataValues\" object for use in testing.\n *\n * @return {Object}\n */\nmodule.exports.createDataValuesEnv = function () {\n\tconst oldDataValues = global.dataValues,\n\t\toldUtil = global.util,\n\t\toldJQuery = global.jQuery,\n\t\told$ = global.$;\n\n\t// `require` caches the exports and reuses them the next require\n\t// the files required below have no exports, though - they just\n\t// execute and are assigned as properties of an object\n\t// `requireAgain` would make sure they keep doing that over and\n\t// over, but then they'll end up creating the same functions/objects\n\t// more than once, but different instances...\n\t// other modules, with actual exports, that use these functions\n\t// might encounter side-effects though, because the instances of\n\t// those objects are different when loaded at different times,\n\t// so to be safe, we'll try to emulate regular `require` behavior\n\t// by running these files once, grabbing the result, caching it,\n\t// and re-using the result from cache\n\tif ( mockCache.dataValues ) {\n\t\treturn mockCache.dataValues;\n\t}\n\n\t// wikibase-data-values needs jquery...\n\tglobal.jQuery = global.$ = requireAgain( 'jquery' );\n\n\tglobal.dataValues = requireAgain( 'wikibase-data-values/src/dataValues.js' ).dataValues;\n\tglobal.util = {};\n\n\trequireAgain( 'wikibase-data-values/lib/util/util.inherit.js' );\n\trequireAgain( 'wikibase-data-values/src/DataValue.js' );\n\trequireAgain( 'wikibase-data-values/src/values/StringValue.js' );\n\trequireAgain( 'wikibase-data-values/src/values/DecimalValue.js' );\n\trequireAgain( 'wikibase-data-values/src/values/MonolingualTextValue.js' );\n\trequireAgain( 'wikibase-data-values/src/values/QuantityValue.js' );\n\trequireAgain( 'wikibase-data-values/src/values/TimeValue.js' );\n\trequireAgain( 'wikibase-data-values/src/values/GlobeCoordinateValue.js' );\n\trequireAgain( 'wikibase-data-values/src/values/UnknownValue.js' );\n\n\tmockCache.dataValues = global.dataValues;\n\n\t// restore global scope before returning\n\tglobal.dataValues = oldDataValues;\n\tglobal.util = oldUtil;\n\tglobal.jQuery = oldJQuery;\n\tglobal.$ = old$;\n\n\treturn mockCache.dataValues;\n};\n\n/**\n * Stubs out and/or loads a basic \"wikibase\" object for use in testing.\n *\n * @return {Object}\n */\nmodule.exports.createWikibaseEnv = function () {\n\treturn {\n\t\tapi: {\n\t\t\tgetLocationAgnosticMwApi: sinon.stub().returns( {\n\t\t\t\tget: sinon.stub().returns( $.Deferred().resolve( {} ).promise( { abort: function () {} } ) ),\n\t\t\t\tpost: sinon.stub().returns( $.Deferred().resolve( {} ).promise( { abort: function () {} } ) )\n\t\t\t} )\n\t\t},\n\t\tutilities: {\n\t\t\tClaimGuidGenerator: sinon.stub().returns( { newGuid: function () {\n\t\t\t\treturn Math.random().toString( 36 ).slice( 2 );\n\t\t\t} } )\n\t\t}\n\t};\n};\n\n/**\n * Loads a \"wikibase.datamodel\" object for use in testing.\n */\nmodule.exports.registerWbDataModel = function () {\n\tglobal.dataValues = this.createDataValuesEnv();\n\tglobal.util = {};\n\n\trequireAgain( 'wikibase-data-values/lib/util/util.inherit.js' );\n\n\tmockery.registerSubstitute( 'wikibase.datamodel', 'wikibase-data-model/src/index.js' );\n};\n\nmodule.exports.registerWbSerialization = function () {\n\tglobal.util = {};\n\n\trequireAgain( 'wikibase-data-values/lib/util/util.inherit.js' );\n\n\tmockery.registerSubstitute( 'wikibase.serialization', 'wikibase-serialization/src/index.js' );\n};\n\n/**\n * Stubs out a basic stand-in for the mw.user object.\n *\n * @param {boolean} loggedIn Whether to simulate a logged-in user\n * @return {Object} user\n */\nmodule.exports.createMediaWikiUser = function ( loggedIn ) {\n\tconst user = {\n\t\tisAnon: sinon.stub(),\n\t\toptions: {\n\t\t\tget: sinon.stub(),\n\t\t\tset: sinon.stub()\n\t\t}\n\t};\n\n\tif ( loggedIn ) {\n\t\tuser.isAnon.returns( false );\n\t} else {\n\t\tuser.isAnon.returns( true );\n\t}\n\n\treturn user;\n};\n\nmodule.exports.requireULS = function () {\n\trequireAgain( 'jquery.uls/src/jquery.uls.data.js' );\n\trequireAgain( 'jquery.uls/src/jquery.uls.data.utils.js' );\n\trequireAgain( 'jquery.uls/src/jquery.uls.core.js' );\n\trequireAgain( 'jquery.uls/src/jquery.uls.lcd.js' );\n\trequireAgain( 'jquery.uls/src/jquery.uls.languagefilter.js' );\n};\n\nmodule.exports.registerModules = function () {\n\tconst extensionJson = this.readJSON( path.join( __dirname, '..', '..', '..', 'extension.json' ) ),\n\t\tmodules = extensionJson.ResourceModules;\n\n\tObject.keys( modules ).forEach( ( moduleName ) => {\n\t\tconst packageFiles = modules[ moduleName ].packageFiles;\n\t\tif ( !packageFiles ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tmockery.registerMock( moduleName, require( path.join( __dirname, '..', '..', '..', packageFiles[ 0 ] ) ) );\n\t\t} catch ( e ) {\n\t\t\t// failed to include, but that could be ok, it might just expect immediate\n\t\t\t// execution in the browser - we'll have to deal with this module not\n\t\t\t// being available for JS tests\n\t\t}\n\t} );\n};\n\nmodule.exports.registerTemplates = function () {\n\tconst extensionJson = this.readJSON( path.join( __dirname, '..', '..', '..', 'extension.json' ) ),\n\t\tmodules = extensionJson.ResourceModules;\n\n\tObject.keys( modules ).forEach( ( moduleName ) => {\n\t\tconst templates = modules[ moduleName ].templates;\n\t\tif ( !templates ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttemplates.forEach( ( templateName ) => {\n\t\t\tconst template = fs.readFileSync( path.join( __dirname, '..', '..', '..', templateName ), 'utf8' );\n\t\t\tglobal.mw.template.add( moduleName, templateName, template );\n\t\t} );\n\t} );\n};\n\nmodule.exports.deregisterModules = function () {\n\tconst extensionJson = this.readJSON( path.join( __dirname, '..', '..', '..', 'extension.json' ) ),\n\t\tmodules = extensionJson.ResourceModules;\n\n\tObject.keys( modules ).forEach( ( moduleName ) => {\n\t\tmockery.deregisterMock( moduleName );\n\t} );\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/node-qunit/support/hooks.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/phpunit/data/entities/M1.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/phpunit/data/entities_search/cat.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/phpunit/data/entities_search/cat_titleMatch.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/phpunit/data/entities_search/dog.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]
--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated request-promise-native@1.0.9: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
--- stdout ---
> wikibase-media-info@0.1.0 install
> rm -rf node_modules/mediawiki && git clone -q --depth=1 https://gerrit.wikimedia.org/r/mediawiki/core node_modules/mediawiki
added 659 packages, and audited 660 packages in 20s
115 packages are looking for funding
run `npm fund` for details
12 vulnerabilities (1 low, 7 moderate, 1 high, 3 critical)
To address all issues possible (including breaking changes), run:
npm audit fix --force
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.
--- end ---
$ /usr/bin/npm test
--- stderr ---
[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
jQuery.Deferred exception: navigator is not defined ReferenceError: navigator is not defined
at OO.ui.WindowManager.togglePreventIosScrolling (/src/repo/node_modules/oojs-ui/dist/oojs-ui.js:24215:37)
at /src/repo/node_modules/oojs-ui/dist/oojs-ui.js:23931:15
at mightThrow (/src/repo/node_modules/jquery/dist/jquery.js:3489:29)
at Window.process (/src/repo/node_modules/jquery/dist/jquery.js:3557:12)
at Timeout.callback [as _onTimeout] (/src/repo/node_modules/jsdom/lib/jsdom/browser/Window.js:665:19)
at listOnTimeout (node:internal/timers:581:17)
at process.processTimers (node:internal/timers:519:7) undefined
--- stdout ---
> wikibase-media-info@0.1.0 test
> grunt test && npm run test:unit
Running "eslint:all" (eslint) task
/src/repo/resources/README/2.TemplatingFeatures.js
53:11 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/filepage/CaptionDataEditor.js
50:4 warning Prefer .then to .done no-jquery/no-done-fail
50:4 warning Prefer .then to .fail no-jquery/no-done-fail
98:17 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/filepage/CaptionsPanel.js
613:3 warning Prefer .then to .done no-jquery/no-done-fail
613:3 warning Prefer .then to .fail no-jquery/no-done-fail
687:34 warning Prefer .then to .done no-jquery/no-done-fail
687:34 warning Prefer .then to .fail no-jquery/no-done-fail
717:34 warning Prefer .then to .done no-jquery/no-done-fail
717:34 warning Prefer .then to .fail no-jquery/no-done-fail
/src/repo/resources/filepage/StatementPanel.js
26:1 warning The type 'dataLoadedReadOnly' is undefined jsdoc/no-undefined-types
240:1 warning The type 'widgetRemoved' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/AddPropertyWidget.js
53:23 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/ConstraintsReportHandlerElement.js
123:17 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/ItemWidget.js
135:24 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/SnakWidget.js
93:22 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/StatementWidget.js
186:1 warning The type 'change' is undefined jsdoc/no-undefined-types
675:2 warning Prefer .then to .done no-jquery/no-done-fail
/src/repo/resources/statements/inputs/QuantityInputWidget.js
90:27 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/tests/node-qunit/mediainfo/README/3.BestPractices.test.js
14:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/CaptionsPanel.test.js
44:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/LicenseDialogWidget.test.js
14:3 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/ProtectionMsgWidget.test.js
15:3 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/StatementPanel.test.js
42:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/AddPropertyWidget.test.js
16:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
21:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/ItemWidget.test.js
23:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/LinkNoticeWidget.test.js
27:3 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/SnakListWidget.test.js
21:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
91:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/SnakWidget.test.js
19:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
198:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
218:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/StatementWidget.test.js
30:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/EntityInputWidget.test.js
16:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/GlobeCoordinateInputWidget.test.js
26:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/MonolingualTextInputWidget.test.js
15:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/MultiTypeInputWrapperWidget.test.js
23:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
36:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
49:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
62:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
81:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
100:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
113:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
223:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
224:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
225:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
226:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
227:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
228:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
229:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
305:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
323:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
343:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/QuantityInputWidget.test.js
15:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/StringInputWidget.test.js
15:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/TimeInputWidget.test.js
27:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/support/helpers.js
26:9 warning Found non-literal argument in require security/detect-non-literal-require
39:19 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
40:10 warning Found non-literal argument in require security/detect-non-literal-require
54:21 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
305:38 warning Found non-literal argument in require security/detect-non-literal-require
325:21 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
✖ 63 problems (0 errors, 63 warnings)
Running "banana:WikibaseMediaInfo" (banana) task
>> 1 message directory checked.
Running "stylelint:all" (stylelint) task
>> Linted 19 files without errors
Done.
> wikibase-media-info@0.1.0 test:unit
> qunit "tests/node-qunit/**/*.test.js"
TAP version 13
ok 1 ExampleComponentWidget > Edit mode enabled
ok 2 ExampleComponentWidget > Edit mode disabled
ok 3 TemplatingFeatures > Toggle edit mode
ok 4 BestPractices > Valid data roundtrip
ok 5 Setting other data triggers a change event
ok 6 Setting same data does not trigger a change event
ok 7 ComponentWidget > Widget renders with default state
ok 8 ComponentWidget > Widget rerenders with new state
ok 9 ComponentWidget > Widget renders with changed template data
ok 10 ComponentWidget > Widget renders with async changed template data
ok 11 ComponentWidget > Widget will not rerender on state change if stopped
ok 12 ComponentWidget > Widget will only rerender once when multiple state changes happen during previous render
ok 13 DOMLessGroupWidget > Test item is added to group
ok 14 DOMLessGroupWidget > Test item DOM is not changed after inserting into group
ok 15 CaptionsPanel > When pre-existing statements are present on page > initialization works without errors
ok 16 CaptionsPanel > When pre-existing statements are present on page > user languages are added to DOM
ok 17 LicenseDialogWidget > constructor
ok 18 LicenseDialogWidget > User is not logged in and has not accepted license > getLicenseConfirmation returns zero
ok 19 LicenseDialogWidget > User is not logged in and has not accepted license > storeLicenseConfirmation sets value of the appropriate key to 1
ok 20 LicenseDialogWidget > User is logged in and has not accepted license > getLicenseConfirmation returns zero
ok 21 LicenseDialogWidget > User is logged in and has not accepted license > storeLicenseConfirmation saves to user preferences
ok 22 ProtectionMsgWidget > constructor
ok 23 ProtectionMsgWidget > Page is not protected > Protection message widget does not display
ok 24 ProtectionMsgWidget > Page is protected > Protection message widget displays
ok 25 StatementPanel > When no pre-existing statements are present on page > constructor
ok 26 StatementPanel > When no pre-existing statements are present on page > isEditable() is false by default
ok 27 StatementPanel > When no pre-existing statements are present on page > User is not logged in and has not accepted license > LicenseDialogWidget is displayed when user attempts to edit
ok 28 mediainfo.template.mustache+dom > Render mustache templates
ok 29 mediainfo.template.mustache+dom > Mustache templates with HTMLElement > Nodes are parsed into template
ok 30 mediainfo.template.mustache+dom > Mustache templates with HTMLElement > Events triggered from template-based HTML propagate to original element handlers
ok 31 mediainfo.template.mustache+dom > Mustache templates with HTMLElement > Changes to node later on propagate into DOM rendered by template
ok 32 mediainfo.template.mustache+dom > Mustache templates with jQuery nodes > Nodes are parsed into template
ok 33 mediainfo.template.mustache+dom > Mustache templates with jQuery nodes > Events triggered from template-based HTML propagate to original element handlers
ok 34 mediainfo.template.mustache+dom > Mustache templates with jQuery nodes > Changes to node later on propagate into DOM rendered by template
ok 35 mediainfo.template.mustache+dom > Mustache templates with OOUI widgets > Nodes are parsed into template
ok 36 mediainfo.template.mustache+dom > Mustache templates with OOUI widgets > Events triggered from template-based HTML propagate to original element handlers
ok 37 mediainfo.template.mustache+dom > Mustache templates with OOUI widgets > Changes to node later on propagate into DOM rendered by template
ok 38 AddPropertyWidget > Adding property ids changes the filters
ok 39 AddPropertyWidget > Property input widget & remove are only visible in edit mode
ok 40 ItemWidget > Valid data roundtrip
ok 41 ItemWidget > Setting other data triggers a change event
ok 42 ItemWidget > Setting same data does not trigger a change event
ok 43 ItemWidget > Widget updates snak widgets with new data
ok 44 ItemWidget > Test enabling edit state
ok 45 ItemWidget > Test disabling edit state
ok 46 ItemWidget > Toggling item prominence changes item rank
ok 47 ItemWidget > Valid data roundtrip with somevalue snak
ok 48 ItemWidget > Valid data roundtrip with novalue snak
ok 49 LinkNoticeWidget > constructor
ok 50 LinkNoticeWidget > User is not logged in. > Widget should be visible if not previously dismissed
ok 51 LinkNoticeWidget > User is not logged in. > Widget should not be visible if previously dismissed
ok 52 LinkNoticeWidget > User is not logged in. > dismiss method should store data in local storage for anon users
ok 53 LinkNoticeWidget > User is not logged in. > dismiss method should dismiss the widget
ok 54 LinkNoticeWidget > User is logged-in > Widget should be visible if not previously dismissed
ok 55 LinkNoticeWidget > User is logged-in > Widget should not be visible if previously dismissed
ok 56 LinkNoticeWidget > User is logged-in > dismiss method should store data in user preferences for logged in users
ok 57 SnakListWidget > Valid data roundtrip
ok 58 SnakListWidget > Setting other data triggers a change event
ok 59 SnakListWidget > Setting same data does not trigger a change event
ok 60 SnakListWidget > createWidget() returns a new SnakWidget
ok 61 SnakListWidget > createWidget sets SnakWidget data when snak is provided
ok 62 SnakListWidget > addWidget creates a new SnakWidget every time it is called
ok 63 SnakListWidget > Valid data roundtrip with somevalue snak
ok 64 SnakListWidget > Valid data roundtrip with novalue snak
ok 65 SnakWidget > Valid data roundtrip
ok 66 SnakWidget > Setting other data triggers a change event
ok 67 SnakWidget > Setting same data does not trigger a change event
ok 68 SnakWidget > setData() sets property ID in the PropertyInput widget
ok 69 SnakWidget > setData() sets value data in the valueInput widget
ok 70 SnakWidget > Property labels are available after API calls complete
ok 71 SnakWidget > Test enabling edit state
ok 72 SnakWidget > Test disabling edit state
ok 73 SnakWidget > Valid data roundtrip with somevalue snak
ok 74 SnakWidget > Valid data roundtrip with novalue snak
ok 75 StatementWidget > Valid data roundtrip
ok 76 StatementWidget > Setting other data triggers a change event
ok 77 StatementWidget > Setting same data does not trigger a change event
ok 78 StatementWidget > Test detection of changes
ok 79 StatementWidget > Test enabling edit state
ok 80 StatementWidget > Test disabling edit state
ok 81 StatementWidget > Widget can handle multiple errors
ok 82 EntityInputWidget > Valid data roundtrip
ok 83 EntityInputWidget > Setting other data triggers a change event
ok 84 EntityInputWidget > Setting same data does not trigger a change event
ok 85 GlobeCoordinateInputWidget > Valid data roundtrip
ok 86 GlobeCoordinateInputWidget > Setting other data triggers a change event
ok 87 GlobeCoordinateInputWidget > Setting same data does not trigger a change event
ok 88 MonolingualText > Valid data roundtrip
ok 89 MonolingualText > Setting other data triggers a change event
ok 90 MonolingualText > Setting same data does not trigger a change event
ok 91 MonolingualText > Widget has no button in qualifier mode
ok 92 MonolingualText > Widget has button in statement mode
ok 93 MultiTypeInputWrapperWidget > Valid data roundtrip (wikibase-entityid)
ok 94 MultiTypeInputWrapperWidget > Valid data roundtrip (string)
ok 95 MultiTypeInputWrapperWidget > Valid data roundtrip (monolingualtext)
ok 96 MultiTypeInputWrapperWidget > Valid data roundtrip (quantity)
ok 97 MultiTypeInputWrapperWidget > Valid data roundtrip (time)
ok 98 MultiTypeInputWrapperWidget > Valid data roundtrip (globecoordinate)
ok 99 MultiTypeInputWrapperWidget > Valid data roundtrip (unsupported)
ok 100 MultiTypeInputWrapperWidget > Setting other data triggers a change event
ok 101 MultiTypeInputWrapperWidget > Setting same data does not trigger a change event
ok 102 MultiTypeInputWrapperWidget > Changing to same input type leaves existing value unaltered
ok 103 MultiTypeInputWrapperWidget > Changing to other input type (and back) wipes out existing data
ok 104 MultiTypeInputWrapperWidget > Widget creates the correct input type
ok 105 MultiTypeInputWrapperWidget > add event is fired when child input emits add
ok 106 MultiTypeInputWrapperWidget > setErrors adds MessageWidget to UI and flags string input as invalid
ok 107 MultiTypeInputWrapperWidget > Widget can handle multiple errors
ok 108 MultiTypeInputWrapperWidget > Setting snak type to somevalue changes input to disabled string input
ok 109 MultiTypeInputWrapperWidget > Setting snak type to novalue changes input to disabled string input
ok 110 MultiTypeInputWrapperWidget > Setting snak type to value changes input to original type
ok 111 MultiTypeInputWrapperWidget > Datatype can be set explicitly
ok 112 QuantityInputWidget > Valid data roundtrip
ok 113 QuantityInputWidget > Setting other data triggers a change event
ok 114 QuantityInputWidget > Setting same data does not trigger a change event
ok 115 QuantityInputWidget > Widget has no button in qualifier mode
ok 116 QuantityInputWidget > Widget has button in statement mode
ok 117 QuantityInputWidget > Widget displays no options by default
ok 118 QuantityInputWidget > Widget displays button to add unit when focused
ok 119 QuantityInputWidget > Widget displays custom unit when it has one
ok 120 StringInputWidget > Valid data roundtrip
ok 121 StringInputWidget > Setting other data triggers a change event
ok 122 StringInputWidget > Setting same data does not trigger a change event
ok 123 StringInputWidget > Widget has no button in qualifier mode
ok 124 StringInputWidget > Widget has button in statement mode
ok 125 TimeInputWidget > Valid data roundtrip
ok 126 TimeInputWidget > Setting other data triggers a change event
ok 127 TimeInputWidget > Setting same data does not trigger a change event
ok 128 TimeInputWidget > Widget has no button in qualifier mode
ok 129 TimeInputWidget > Widget has button in statement mode
1..129
# pass 129
# skip 0
# todo 0
# fail 0
--- end ---
Upgrading c:mediawiki/mediawiki-codesniffer from 50.0.0 -> 51.0.0
$ /usr/bin/composer update
--- stderr ---
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 3 updates, 0 removals
- Upgrading composer/spdx-licenses (1.5.10 => 1.6.0)
- Upgrading mediawiki/mediawiki-codesniffer (v50.0.0 => v51.0.0)
- Upgrading phpcsstandards/phpcsextra (1.4.0 => 1.5.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 3 updates, 0 removals
0 [>---------------------------] 0 [->--------------------------]
- Upgrading phpcsstandards/phpcsextra (1.4.0 => 1.5.0): Extracting archive
- Upgrading composer/spdx-licenses (1.5.10 => 1.6.0): Extracting archive
- Upgrading mediawiki/mediawiki-codesniffer (v50.0.0 => v51.0.0): Extracting archive
0/3 [>---------------------------] 0%
3/3 [============================] 100%
Generating autoload files
16 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
--- stdout ---
--- end ---
$ vendor/bin/phpcs --report=json
--- stdout ---
{"totals":{"errors":0,"warnings":0,"fixable":0},"files":{"\/src\/repo\/src\/DataAccess\/Scribunto\/WikibaseMediaInfoEntityLibrary.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/ASTQueryBuilder\/FieldQueryBuilderInterface.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/MediaInfoServicesHooks.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Services\/MediaInfoEntityQuery.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/MustacheDomTemplateParser.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/ChangeOp\/Deserialization\/MediaInfoChangeOpDeserializer.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaInfoFieldDefinitions.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchRescoreProfiles.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/DataModel\/MediaInfoId.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/WBMIHooksHelper.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Services\/MediaInfoIdLookup.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/View\/MediaInfoView.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/DataAccess\/Store\/FilePageRedirectHandlingRevisionLookup.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/MediaInfoWikibaseHooks.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchMemoryEntitiesFetcher.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchQueryBuilder.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/DataAccess\/Scribunto\/WikibaseMediaInfoLibrary.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/DataModel\/Services\/Diff\/MediaInfoPatcher.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Services\/MediaInfoByLinkedTitleLookup.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Services\/MediaInfoServiceWiring.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/DataAccess\/Store\/EntityIdFixingRevisionLookup.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MatchExplorerQuery.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/DataModel\/Serialization\/MediaInfoDeserializer.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Services\/MediaInfoServices.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/DataModel\/Services\/Diff\/MediaInfoDiffer.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/ASTQueryBuilder\/WikibaseEntitiesHandler.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/MediaInfoDataForSearchIndex.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Content\/MissingMediaInfoHandler.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Diff\/BasicMediaInfoDiffVisualizer.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchCachingEntitiesFetcher.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/ASTQueryBuilder\/WordsQueryNodeHandler.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/DataAccess\/Scribunto\/WikibaseMediaInfoEntityLibraryStandaloneTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/DataAccess\/Scribunto\/WikibaseMediaInfoEntityLibrarySandboxTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/ASTQueryBuilder\/FieldIterator.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/ASTQueryBuilder\/ParsedNodeHandlerInterface.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Search\/MediaSearchEntitiesFetcherTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Search\/MediaSearchCachingEntitiesFetcherTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/DataModel\/Serialization\/MediaInfoSerializer.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Rdf\/MediaInfoSpecificComponentsRdfBuilder.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchEntitiesFetcher.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Services\/MediaInfoPrefetchingTermLookup.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchASTEntitiesExtractor.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchRescoreFunctionChains.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/ASTQueryBuilder\/PhraseQueryNodeHandler.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/.phan\/config.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Services\/FilePageLookup.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/MediaInfoWikibaseHookRunner.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/DataAccess\/Scribunto\/WikibaseMediaInfoEntityLibraryTestBase.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Services\/MediaInfoServicesTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/DataModel\/MediaInfo.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/ScribuntoHooks.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/integration\/WatchlistTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Search\/MediaSearchQueryBuilderTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/composer\/DataModel\/Services\/Diff\/MediaInfoPatcherTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Services\/MediaInfoIdLookupTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Search\/MediaSearchMemoryEntitiesFetcherTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/integration\/WBMIApiTestCase.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/composer\/DataModel\/MediaInfoIdTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchProfiles.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Content\/MediaInfoHandler.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/View\/MediaInfoEntityTermsView.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/View\/MediaInfoViewTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/composer\/DataModel\/Serialization\/MediaInfoSerializerTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Content\/MediaInfoContent.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/EntityTypesTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/DataAccess\/Store\/EntityIdFixingRevisionLookupTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchASTClassifier.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/ChangeOp\/Deserialization\/MediaInfoChangeOpDeserializerTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/DataAccess\/Store\/FilePageRedirectHandlingRevisionLookupTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/MediaInfoWikibaseHooksTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/Feature\/CustomMatchFeature.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/composer\/DataModel\/Services\/Diff\/MediaInfoDifferTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/composer\/DataModel\/Serialization\/MediaInfoDeserializerTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/integration\/StatementsTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Search\/MediaSearchASTQueryBuilderTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/View\/MediaInfoEntityStatementsViewTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Content\/MediaInfoHandlerTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Rdf\/FileMock.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/unit\/MediaInfoDataForSearchIndexTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/integration\/MultiLingualCaptionsTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Search\/MediaInfoFieldDefinitionsTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Rdf\/MediaInfoRdfBuilderTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Content\/MediaInfoContentTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Rdf\/MediaInfoSpecificComponentsRdfBuilderTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Services\/FilePageLookupTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Search\/MediaSearchASTQueryBuilder.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Search\/Feature\/CustomMatchFeatureTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/View\/MediaInfoEntityStatementsView.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Services\/MediaInfoPrefetchingTermLookupTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/Rdf\/MediaInfoRdfBuilder.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Search\/MediaSearchASTEntitiesExtractorTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/View\/MediaInfoEntityTermsViewTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/WikibaseMediaInfo.entitytypes.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/MediaInfoHooksTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/mediawiki\/Content\/MissingMediaInfoHandlerTest.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/src\/MediaInfoHooks.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/tests\/phpunit\/composer\/DataModel\/MediaInfoTest.php":{"errors":0,"warnings":0,"messages":[]}}}
--- end ---
$ /usr/bin/composer install
--- stderr ---
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Nothing to install, update or remove
Generating autoload files
16 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
--- end ---
$ /usr/bin/composer test
--- stderr ---
> phpcs -sp --cache
> parallel-lint . --exclude vendor --exclude node_modules
> minus-x check .
--- stdout ---
................................................. 49 / 49 (100%)
Time: 400ms; Memory: 10MB
PHP 8.4.18 | 10 parallel jobs
............................................................ 60/97 ( 61%)
..................................... 97/97 (100%)
Checked 97 files in 0.4 seconds
No syntax error found
MinusX
======
Processing /src/repo...
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.........................
All good!
--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {
"form-data": {
"name": "form-data",
"severity": "critical",
"isDirect": false,
"via": [
{
"source": 1109540,
"name": "form-data",
"dependency": "form-data",
"title": "form-data uses unsafe random function in form-data for choosing boundary",
"url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4",
"severity": "critical",
"cwe": [
"CWE-330"
],
"cvss": {
"score": 0,
"vectorString": null
},
"range": "<2.5.4"
}
],
"effects": [
"request"
],
"range": "<2.5.4",
"nodes": [
"node_modules/form-data"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"jpeg-js": {
"name": "jpeg-js",
"severity": "high",
"isDirect": true,
"via": [
{
"source": 1088964,
"name": "jpeg-js",
"dependency": "jpeg-js",
"title": "Infinite loop in jpeg-js",
"url": "https://github.com/advisories/GHSA-xvf7-4v9q-58w6",
"severity": "high",
"cwe": [
"CWE-835"
],
"cvss": {
"score": 7.5,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
},
"range": "<0.4.4"
},
{
"source": 1093580,
"name": "jpeg-js",
"dependency": "jpeg-js",
"title": "Uncontrolled resource consumption in jpeg-js",
"url": "https://github.com/advisories/GHSA-w7q9-p3jq-fmhm",
"severity": "moderate",
"cwe": [
"CWE-400"
],
"cvss": {
"score": 5.5,
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H"
},
"range": "<0.4.0"
}
],
"effects": [],
"range": "<=0.4.3",
"nodes": [
"node_modules/jpeg-js"
],
"fixAvailable": {
"name": "jpeg-js",
"version": "0.4.4",
"isSemVerMajor": true
}
},
"jquery": {
"name": "jquery",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1109145,
"name": "jquery",
"dependency": "jquery",
"title": "Potential XSS vulnerability in jQuery",
"url": "https://github.com/advisories/GHSA-jpcq-cgw6-v4j6",
"severity": "moderate",
"cwe": [
"CWE-79"
],
"cvss": {
"score": 6.9,
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N/E:H"
},
"range": ">=1.0.3 <3.5.0"
},
{
"source": 1116479,
"name": "jquery",
"dependency": "jquery",
"title": "Potential XSS vulnerability in jQuery",
"url": "https://github.com/advisories/GHSA-gxr4-xjj5-5px2",
"severity": "moderate",
"cwe": [
"CWE-79"
],
"cvss": {
"score": 6.9,
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N"
},
"range": ">=1.12.0 <3.5.0"
}
],
"effects": [
"oojs-ui"
],
"range": "<=3.4.1",
"nodes": [
"node_modules/oojs-ui/node_modules/jquery"
],
"fixAvailable": {
"name": "oojs-ui",
"version": "0.53.2",
"isSemVerMajor": true
}
},
"jsdom": {
"name": "jsdom",
"severity": "moderate",
"isDirect": true,
"via": [
"request",
"request-promise-native",
"tough-cookie"
],
"effects": [],
"range": "0.1.20 || 0.2.0 - 16.5.3",
"nodes": [
"node_modules/jsdom"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"mockery": {
"name": "mockery",
"severity": "critical",
"isDirect": true,
"via": [
{
"source": 1092753,
"name": "mockery",
"dependency": "mockery",
"title": "mockery is vulnerable to prototype pollution",
"url": "https://github.com/advisories/GHSA-gmwp-3pwc-3j3g",
"severity": "critical",
"cwe": [
"CWE-1321"
],
"cvss": {
"score": 9.8,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
},
"range": "<=2.1.0"
}
],
"effects": [],
"range": "*",
"nodes": [
"node_modules/mockery"
],
"fixAvailable": false
},
"oojs-ui": {
"name": "oojs-ui",
"severity": "moderate",
"isDirect": true,
"via": [
"jquery"
],
"effects": [],
"range": "0.11.0 - 0.38.1",
"nodes": [
"node_modules/oojs-ui"
],
"fixAvailable": {
"name": "oojs-ui",
"version": "0.53.2",
"isSemVerMajor": true
}
},
"qs": {
"name": "qs",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1113719,
"name": "qs",
"dependency": "qs",
"title": "qs's arrayLimit bypass in its bracket notation allows DoS via memory exhaustion",
"url": "https://github.com/advisories/GHSA-6rw7-vpxm-498p",
"severity": "moderate",
"cwe": [
"CWE-20"
],
"cvss": {
"score": 3.7,
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
},
"range": "<6.14.1"
}
],
"effects": [
"request"
],
"range": "<6.14.1",
"nodes": [
"node_modules/qs"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"request": {
"name": "request",
"severity": "critical",
"isDirect": false,
"via": [
{
"source": 1096727,
"name": "request",
"dependency": "request",
"title": "Server-Side Request Forgery in Request",
"url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
"severity": "moderate",
"cwe": [
"CWE-918"
],
"cvss": {
"score": 6.1,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
},
"range": "<=2.88.2"
},
"form-data",
"qs",
"tough-cookie"
],
"effects": [
"jsdom",
"request-promise-core",
"request-promise-native"
],
"range": "*",
"nodes": [
"node_modules/request"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"request-promise-core": {
"name": "request-promise-core",
"severity": "moderate",
"isDirect": false,
"via": [
"request"
],
"effects": [
"request-promise-native"
],
"range": "*",
"nodes": [
"node_modules/request-promise-core"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"request-promise-native": {
"name": "request-promise-native",
"severity": "moderate",
"isDirect": false,
"via": [
"request",
"request-promise-core",
"tough-cookie"
],
"effects": [
"jsdom"
],
"range": ">=1.0.0",
"nodes": [
"node_modules/request-promise-native"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"tmp": {
"name": "tmp",
"severity": "low",
"isDirect": true,
"via": [
{
"source": 1109537,
"name": "tmp",
"dependency": "tmp",
"title": "tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter",
"url": "https://github.com/advisories/GHSA-52f5-9888-hmc6",
"severity": "low",
"cwe": [
"CWE-59"
],
"cvss": {
"score": 2.5,
"vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"
},
"range": "<=0.2.3"
}
],
"effects": [],
"range": "<=0.2.3",
"nodes": [
"node_modules/tmp"
],
"fixAvailable": {
"name": "tmp",
"version": "0.2.5",
"isSemVerMajor": true
}
},
"tough-cookie": {
"name": "tough-cookie",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1097682,
"name": "tough-cookie",
"dependency": "tough-cookie",
"title": "tough-cookie Prototype Pollution vulnerability",
"url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3",
"severity": "moderate",
"cwe": [
"CWE-1321"
],
"cvss": {
"score": 6.5,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"
},
"range": "<4.1.3"
}
],
"effects": [
"jsdom",
"request",
"request-promise-native"
],
"range": "<4.1.3",
"nodes": [
"node_modules/tough-cookie"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 1,
"moderate": 7,
"high": 1,
"critical": 3,
"total": 12
},
"dependencies": {
"prod": 1,
"dev": 659,
"optional": 1,
"peer": 1,
"peerOptional": 0,
"total": 659
}
}
}
--- end ---
Attempting to npm audit fix
$ /usr/bin/npm audit fix --dry-run --only=dev --json
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
--- stdout ---
{
"added": 0,
"removed": 1,
"changed": 0,
"audited": 660,
"funding": 115,
"audit": {
"auditReportVersion": 2,
"vulnerabilities": {
"form-data": {
"name": "form-data",
"severity": "critical",
"isDirect": false,
"via": [
{
"source": 1109540,
"name": "form-data",
"dependency": "form-data",
"title": "form-data uses unsafe random function in form-data for choosing boundary",
"url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4",
"severity": "critical",
"cwe": [
"CWE-330"
],
"cvss": {
"score": 0,
"vectorString": null
},
"range": "<2.5.4"
}
],
"effects": [
"request"
],
"range": "<2.5.4",
"nodes": [
"node_modules/form-data"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"jpeg-js": {
"name": "jpeg-js",
"severity": "high",
"isDirect": true,
"via": [
{
"source": 1088964,
"name": "jpeg-js",
"dependency": "jpeg-js",
"title": "Infinite loop in jpeg-js",
"url": "https://github.com/advisories/GHSA-xvf7-4v9q-58w6",
"severity": "high",
"cwe": [
"CWE-835"
],
"cvss": {
"score": 7.5,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
},
"range": "<0.4.4"
},
{
"source": 1093580,
"name": "jpeg-js",
"dependency": "jpeg-js",
"title": "Uncontrolled resource consumption in jpeg-js",
"url": "https://github.com/advisories/GHSA-w7q9-p3jq-fmhm",
"severity": "moderate",
"cwe": [
"CWE-400"
],
"cvss": {
"score": 5.5,
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H"
},
"range": "<0.4.0"
}
],
"effects": [],
"range": "<=0.4.3",
"nodes": [
"node_modules/jpeg-js"
],
"fixAvailable": {
"name": "jpeg-js",
"version": "0.4.4",
"isSemVerMajor": true
}
},
"jquery": {
"name": "jquery",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1109145,
"name": "jquery",
"dependency": "jquery",
"title": "Potential XSS vulnerability in jQuery",
"url": "https://github.com/advisories/GHSA-jpcq-cgw6-v4j6",
"severity": "moderate",
"cwe": [
"CWE-79"
],
"cvss": {
"score": 6.9,
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N/E:H"
},
"range": ">=1.0.3 <3.5.0"
},
{
"source": 1116479,
"name": "jquery",
"dependency": "jquery",
"title": "Potential XSS vulnerability in jQuery",
"url": "https://github.com/advisories/GHSA-gxr4-xjj5-5px2",
"severity": "moderate",
"cwe": [
"CWE-79"
],
"cvss": {
"score": 6.9,
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N"
},
"range": ">=1.12.0 <3.5.0"
}
],
"effects": [
"oojs-ui"
],
"range": "<=3.4.1",
"nodes": [
"node_modules/oojs-ui/node_modules/jquery"
],
"fixAvailable": {
"name": "oojs-ui",
"version": "0.53.2",
"isSemVerMajor": true
}
},
"jsdom": {
"name": "jsdom",
"severity": "moderate",
"isDirect": true,
"via": [
"request",
"request-promise-native",
"tough-cookie"
],
"effects": [],
"range": "0.1.20 || 0.2.0 - 16.5.3",
"nodes": [
"node_modules/jsdom"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"mockery": {
"name": "mockery",
"severity": "critical",
"isDirect": true,
"via": [
{
"source": 1092753,
"name": "mockery",
"dependency": "mockery",
"title": "mockery is vulnerable to prototype pollution",
"url": "https://github.com/advisories/GHSA-gmwp-3pwc-3j3g",
"severity": "critical",
"cwe": [
"CWE-1321"
],
"cvss": {
"score": 9.8,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
},
"range": "<=2.1.0"
}
],
"effects": [],
"range": "*",
"nodes": [
"node_modules/mockery"
],
"fixAvailable": false
},
"oojs-ui": {
"name": "oojs-ui",
"severity": "moderate",
"isDirect": true,
"via": [
"jquery"
],
"effects": [],
"range": "0.11.0 - 0.38.1",
"nodes": [
"node_modules/oojs-ui"
],
"fixAvailable": {
"name": "oojs-ui",
"version": "0.53.2",
"isSemVerMajor": true
}
},
"qs": {
"name": "qs",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1113719,
"name": "qs",
"dependency": "qs",
"title": "qs's arrayLimit bypass in its bracket notation allows DoS via memory exhaustion",
"url": "https://github.com/advisories/GHSA-6rw7-vpxm-498p",
"severity": "moderate",
"cwe": [
"CWE-20"
],
"cvss": {
"score": 3.7,
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
},
"range": "<6.14.1"
}
],
"effects": [
"request"
],
"range": "<6.14.1",
"nodes": [
"node_modules/qs"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"request": {
"name": "request",
"severity": "critical",
"isDirect": false,
"via": [
{
"source": 1096727,
"name": "request",
"dependency": "request",
"title": "Server-Side Request Forgery in Request",
"url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
"severity": "moderate",
"cwe": [
"CWE-918"
],
"cvss": {
"score": 6.1,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
},
"range": "<=2.88.2"
},
"form-data",
"qs",
"tough-cookie"
],
"effects": [
"jsdom",
"request-promise-core",
"request-promise-native"
],
"range": "*",
"nodes": [
"node_modules/request"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"request-promise-core": {
"name": "request-promise-core",
"severity": "moderate",
"isDirect": false,
"via": [
"request"
],
"effects": [
"request-promise-native"
],
"range": "*",
"nodes": [
"node_modules/request-promise-core"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"request-promise-native": {
"name": "request-promise-native",
"severity": "moderate",
"isDirect": false,
"via": [
"request",
"request-promise-core",
"tough-cookie"
],
"effects": [
"jsdom"
],
"range": ">=1.0.0",
"nodes": [
"node_modules/request-promise-native"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
},
"tmp": {
"name": "tmp",
"severity": "low",
"isDirect": true,
"via": [
{
"source": 1109537,
"name": "tmp",
"dependency": "tmp",
"title": "tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter",
"url": "https://github.com/advisories/GHSA-52f5-9888-hmc6",
"severity": "low",
"cwe": [
"CWE-59"
],
"cvss": {
"score": 2.5,
"vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"
},
"range": "<=0.2.3"
}
],
"effects": [],
"range": "<=0.2.3",
"nodes": [
"node_modules/tmp"
],
"fixAvailable": {
"name": "tmp",
"version": "0.2.5",
"isSemVerMajor": true
}
},
"tough-cookie": {
"name": "tough-cookie",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1097682,
"name": "tough-cookie",
"dependency": "tough-cookie",
"title": "tough-cookie Prototype Pollution vulnerability",
"url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3",
"severity": "moderate",
"cwe": [
"CWE-1321"
],
"cvss": {
"score": 6.5,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"
},
"range": "<4.1.3"
}
],
"effects": [
"jsdom",
"request",
"request-promise-native"
],
"range": "<4.1.3",
"nodes": [
"node_modules/tough-cookie"
],
"fixAvailable": {
"name": "jsdom",
"version": "29.1.1",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 1,
"moderate": 7,
"high": 1,
"critical": 3,
"total": 12
},
"dependencies": {
"prod": 1,
"dev": 659,
"optional": 1,
"peer": 1,
"peerOptional": 0,
"total": 659
}
}
}
}
--- end ---
{"added": 0, "removed": 1, "changed": 0, "audited": 660, "funding": 115, "audit": {"auditReportVersion": 2, "vulnerabilities": {"form-data": {"name": "form-data", "severity": "critical", "isDirect": false, "via": [{"source": 1109540, "name": "form-data", "dependency": "form-data", "title": "form-data uses unsafe random function in form-data for choosing boundary", "url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4", "severity": "critical", "cwe": ["CWE-330"], "cvss": {"score": 0, "vectorString": null}, "range": "<2.5.4"}], "effects": ["request"], "range": "<2.5.4", "nodes": ["node_modules/form-data"], "fixAvailable": {"name": "jsdom", "version": "29.1.1", "isSemVerMajor": true}}, "jpeg-js": {"name": "jpeg-js", "severity": "high", "isDirect": true, "via": [{"source": 1088964, "name": "jpeg-js", "dependency": "jpeg-js", "title": "Infinite loop in jpeg-js", "url": "https://github.com/advisories/GHSA-xvf7-4v9q-58w6", "severity": "high", "cwe": ["CWE-835"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<0.4.4"}, {"source": 1093580, "name": "jpeg-js", "dependency": "jpeg-js", "title": "Uncontrolled resource consumption in jpeg-js", "url": "https://github.com/advisories/GHSA-w7q9-p3jq-fmhm", "severity": "moderate", "cwe": ["CWE-400"], "cvss": {"score": 5.5, "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H"}, "range": "<0.4.0"}], "effects": [], "range": "<=0.4.3", "nodes": ["node_modules/jpeg-js"], "fixAvailable": {"name": "jpeg-js", "version": "0.4.4", "isSemVerMajor": true}}, "jquery": {"name": "jquery", "severity": "moderate", "isDirect": false, "via": [{"source": 1109145, "name": "jquery", "dependency": "jquery", "title": "Potential XSS vulnerability in jQuery", "url": "https://github.com/advisories/GHSA-jpcq-cgw6-v4j6", "severity": "moderate", "cwe": ["CWE-79"], "cvss": {"score": 6.9, "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N/E:H"}, "range": ">=1.0.3 <3.5.0"}, {"source": 1116479, "name": "jquery", "dependency": "jquery", "title": "Potential XSS vulnerability in jQuery", "url": "https://github.com/advisories/GHSA-gxr4-xjj5-5px2", "severity": "moderate", "cwe": ["CWE-79"], "cvss": {"score": 6.9, "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N"}, "range": ">=1.12.0 <3.5.0"}], "effects": ["oojs-ui"], "range": "<=3.4.1", "nodes": ["node_modules/oojs-ui/node_modules/jquery"], "fixAvailable": {"name": "oojs-ui", "version": "0.53.2", "isSemVerMajor": true}}, "jsdom": {"name": "jsdom", "severity": "moderate", "isDirect": true, "via": ["request", "request-promise-native", "tough-cookie"], "effects": [], "range": "0.1.20 || 0.2.0 - 16.5.3", "nodes": ["node_modules/jsdom"], "fixAvailable": {"name": "jsdom", "version": "29.1.1", "isSemVerMajor": true}}, "mockery": {"name": "mockery", "severity": "critical", "isDirect": true, "via": [{"source": 1092753, "name": "mockery", "dependency": "mockery", "title": "mockery is vulnerable to prototype pollution", "url": "https://github.com/advisories/GHSA-gmwp-3pwc-3j3g", "severity": "critical", "cwe": ["CWE-1321"], "cvss": {"score": 9.8, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"}, "range": "<=2.1.0"}], "effects": [], "range": "*", "nodes": ["node_modules/mockery"], "fixAvailable": false}, "oojs-ui": {"name": "oojs-ui", "severity": "moderate", "isDirect": true, "via": ["jquery"], "effects": [], "range": "0.11.0 - 0.38.1", "nodes": ["node_modules/oojs-ui"], "fixAvailable": {"name": "oojs-ui", "version": "0.53.2", "isSemVerMajor": true}}, "qs": {"name": "qs", "severity": "moderate", "isDirect": false, "via": [{"source": 1113719, "name": "qs", "dependency": "qs", "title": "qs's arrayLimit bypass in its bracket notation allows DoS via memory exhaustion", "url": "https://github.com/advisories/GHSA-6rw7-vpxm-498p", "severity": "moderate", "cwe": ["CWE-20"], "cvss": {"score": 3.7, "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": "<6.14.1"}], "effects": ["request"], "range": "<6.14.1", "nodes": ["node_modules/qs"], "fixAvailable": {"name": "jsdom", "version": "29.1.1", "isSemVerMajor": true}}, "request": {"name": "request", "severity": "critical", "isDirect": false, "via": [{"source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": ["CWE-918"], "cvss": {"score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"}, "range": "<=2.88.2"}, "form-data", "qs", "tough-cookie"], "effects": ["jsdom", "request-promise-core", "request-promise-native"], "range": "*", "nodes": ["node_modules/request"], "fixAvailable": {"name": "jsdom", "version": "29.1.1", "isSemVerMajor": true}}, "request-promise-core": {"name": "request-promise-core", "severity": "moderate", "isDirect": false, "via": ["request"], "effects": ["request-promise-native"], "range": "*", "nodes": ["node_modules/request-promise-core"], "fixAvailable": {"name": "jsdom", "version": "29.1.1", "isSemVerMajor": true}}, "request-promise-native": {"name": "request-promise-native", "severity": "moderate", "isDirect": false, "via": ["request", "request-promise-core", "tough-cookie"], "effects": ["jsdom"], "range": ">=1.0.0", "nodes": ["node_modules/request-promise-native"], "fixAvailable": {"name": "jsdom", "version": "29.1.1", "isSemVerMajor": true}}, "tmp": {"name": "tmp", "severity": "low", "isDirect": true, "via": [{"source": 1109537, "name": "tmp", "dependency": "tmp", "title": "tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter", "url": "https://github.com/advisories/GHSA-52f5-9888-hmc6", "severity": "low", "cwe": ["CWE-59"], "cvss": {"score": 2.5, "vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"}, "range": "<=0.2.3"}], "effects": [], "range": "<=0.2.3", "nodes": ["node_modules/tmp"], "fixAvailable": {"name": "tmp", "version": "0.2.5", "isSemVerMajor": true}}, "tough-cookie": {"name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [{"source": 1097682, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": ["CWE-1321"], "cvss": {"score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"}, "range": "<4.1.3"}], "effects": ["jsdom", "request", "request-promise-native"], "range": "<4.1.3", "nodes": ["node_modules/tough-cookie"], "fixAvailable": {"name": "jsdom", "version": "29.1.1", "isSemVerMajor": true}}}, "metadata": {"vulnerabilities": {"info": 0, "low": 1, "moderate": 7, "high": 1, "critical": 3, "total": 12}, "dependencies": {"prod": 1, "dev": 659, "optional": 1, "peer": 1, "peerOptional": 0, "total": 659}}}}
$ /usr/bin/npm audit fix --only=dev
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
--- stdout ---
removed 1 package, and audited 660 packages in 3s
115 packages are looking for funding
run `npm fund` for details
# npm audit report
form-data <2.5.4
Severity: critical
form-data uses unsafe random function in form-data for choosing boundary - https://github.com/advisories/GHSA-fjxv-7rqg-78g4
fix available via `npm audit fix --force`
Will install jsdom@29.1.1, which is a breaking change
node_modules/form-data
request *
Depends on vulnerable versions of form-data
Depends on vulnerable versions of qs
Depends on vulnerable versions of tough-cookie
node_modules/request
jsdom 0.1.20 || 0.2.0 - 16.5.3
Depends on vulnerable versions of request
Depends on vulnerable versions of request-promise-native
Depends on vulnerable versions of tough-cookie
node_modules/jsdom
request-promise-core *
Depends on vulnerable versions of request
node_modules/request-promise-core
request-promise-native >=1.0.0
Depends on vulnerable versions of request
Depends on vulnerable versions of request-promise-core
Depends on vulnerable versions of tough-cookie
node_modules/request-promise-native
jpeg-js <=0.4.3
Severity: high
Infinite loop in jpeg-js - https://github.com/advisories/GHSA-xvf7-4v9q-58w6
Uncontrolled resource consumption in jpeg-js - https://github.com/advisories/GHSA-w7q9-p3jq-fmhm
fix available via `npm audit fix --force`
Will install jpeg-js@0.4.4, which is a breaking change
node_modules/jpeg-js
jquery <=3.4.1
Severity: moderate
Potential XSS vulnerability in jQuery - https://github.com/advisories/GHSA-jpcq-cgw6-v4j6
Potential XSS vulnerability in jQuery - https://github.com/advisories/GHSA-gxr4-xjj5-5px2
fix available via `npm audit fix --force`
Will install oojs-ui@0.53.2, which is a breaking change
node_modules/oojs-ui/node_modules/jquery
oojs-ui 0.11.0 - 0.38.1
Depends on vulnerable versions of jquery
node_modules/oojs-ui
mockery *
Severity: critical
mockery is vulnerable to prototype pollution - https://github.com/advisories/GHSA-gmwp-3pwc-3j3g
No fix available
node_modules/mockery
qs <6.14.1
Severity: moderate
qs's arrayLimit bypass in its bracket notation allows DoS via memory exhaustion - https://github.com/advisories/GHSA-6rw7-vpxm-498p
fix available via `npm audit fix --force`
Will install jsdom@29.1.1, which is a breaking change
node_modules/qs
tmp <=0.2.3
tmp allows arbitrary temporary file / directory write via symbolic link `dir` parameter - https://github.com/advisories/GHSA-52f5-9888-hmc6
fix available via `npm audit fix --force`
Will install tmp@0.2.5, which is a breaking change
node_modules/tmp
tough-cookie <4.1.3
Severity: moderate
tough-cookie Prototype Pollution vulnerability - https://github.com/advisories/GHSA-72xf-g2v4-qvf3
fix available via `npm audit fix --force`
Will install jsdom@29.1.1, which is a breaking change
node_modules/tough-cookie
12 vulnerabilities (1 low, 7 moderate, 1 high, 3 critical)
To address all issues possible (including breaking changes), run:
npm audit fix --force
Some issues need review, and may require choosing
a different dependency.
--- end ---
Verifying that tests still pass
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated request-promise-native@1.0.9: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
--- stdout ---
> wikibase-media-info@0.1.0 install
> rm -rf node_modules/mediawiki && git clone -q --depth=1 https://gerrit.wikimedia.org/r/mediawiki/core node_modules/mediawiki
added 659 packages, and audited 660 packages in 21s
115 packages are looking for funding
run `npm fund` for details
12 vulnerabilities (1 low, 7 moderate, 1 high, 3 critical)
To address all issues possible (including breaking changes), run:
npm audit fix --force
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.
--- end ---
$ /usr/bin/npm test
--- stderr ---
[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
jQuery.Deferred exception: navigator is not defined ReferenceError: navigator is not defined
at OO.ui.WindowManager.togglePreventIosScrolling (/src/repo/node_modules/oojs-ui/dist/oojs-ui.js:24215:37)
at /src/repo/node_modules/oojs-ui/dist/oojs-ui.js:23931:15
at mightThrow (/src/repo/node_modules/jquery/dist/jquery.js:3489:29)
at Window.process (/src/repo/node_modules/jquery/dist/jquery.js:3557:12)
at Timeout.callback [as _onTimeout] (/src/repo/node_modules/jsdom/lib/jsdom/browser/Window.js:665:19)
at listOnTimeout (node:internal/timers:581:17)
at process.processTimers (node:internal/timers:519:7) undefined
--- stdout ---
> wikibase-media-info@0.1.0 test
> grunt test && npm run test:unit
Running "eslint:all" (eslint) task
/src/repo/resources/README/2.TemplatingFeatures.js
53:11 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/filepage/CaptionDataEditor.js
50:4 warning Prefer .then to .done no-jquery/no-done-fail
50:4 warning Prefer .then to .fail no-jquery/no-done-fail
98:17 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/filepage/CaptionsPanel.js
613:3 warning Prefer .then to .done no-jquery/no-done-fail
613:3 warning Prefer .then to .fail no-jquery/no-done-fail
687:34 warning Prefer .then to .done no-jquery/no-done-fail
687:34 warning Prefer .then to .fail no-jquery/no-done-fail
717:34 warning Prefer .then to .done no-jquery/no-done-fail
717:34 warning Prefer .then to .fail no-jquery/no-done-fail
/src/repo/resources/filepage/StatementPanel.js
26:1 warning The type 'dataLoadedReadOnly' is undefined jsdoc/no-undefined-types
240:1 warning The type 'widgetRemoved' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/AddPropertyWidget.js
53:23 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/ConstraintsReportHandlerElement.js
123:17 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/ItemWidget.js
135:24 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/SnakWidget.js
93:22 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/statements/StatementWidget.js
186:1 warning The type 'change' is undefined jsdoc/no-undefined-types
675:2 warning Prefer .then to .done no-jquery/no-done-fail
/src/repo/resources/statements/inputs/QuantityInputWidget.js
90:27 warning OOUI button has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/tests/node-qunit/mediainfo/README/3.BestPractices.test.js
14:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/CaptionsPanel.test.js
44:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/LicenseDialogWidget.test.js
14:3 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/ProtectionMsgWidget.test.js
15:3 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/filepage/StatementPanel.test.js
42:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/AddPropertyWidget.test.js
16:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
21:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/ItemWidget.test.js
23:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/LinkNoticeWidget.test.js
27:3 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/SnakListWidget.test.js
21:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
91:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/SnakWidget.test.js
19:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
198:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
218:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/StatementWidget.test.js
30:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/EntityInputWidget.test.js
16:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/GlobeCoordinateInputWidget.test.js
26:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/MonolingualTextInputWidget.test.js
15:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/MultiTypeInputWrapperWidget.test.js
23:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
36:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
49:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
62:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
81:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
100:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
113:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
223:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
224:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
225:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
226:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
227:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
228:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
229:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
305:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
323:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
343:5 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/QuantityInputWidget.test.js
15:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/StringInputWidget.test.js
15:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/mediainfo/statements/inputs/TimeInputWidget.test.js
27:4 warning Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual qunit/no-loose-assertions
/src/repo/tests/node-qunit/support/helpers.js
26:9 warning Found non-literal argument in require security/detect-non-literal-require
39:19 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
40:10 warning Found non-literal argument in require security/detect-non-literal-require
54:21 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
305:38 warning Found non-literal argument in require security/detect-non-literal-require
325:21 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
✖ 63 problems (0 errors, 63 warnings)
Running "banana:WikibaseMediaInfo" (banana) task
>> 1 message directory checked.
Running "stylelint:all" (stylelint) task
>> Linted 19 files without errors
Done.
> wikibase-media-info@0.1.0 test:unit
> qunit "tests/node-qunit/**/*.test.js"
TAP version 13
ok 1 ExampleComponentWidget > Edit mode enabled
ok 2 ExampleComponentWidget > Edit mode disabled
ok 3 TemplatingFeatures > Toggle edit mode
ok 4 BestPractices > Valid data roundtrip
ok 5 Setting other data triggers a change event
ok 6 Setting same data does not trigger a change event
ok 7 ComponentWidget > Widget renders with default state
ok 8 ComponentWidget > Widget rerenders with new state
ok 9 ComponentWidget > Widget renders with changed template data
ok 10 ComponentWidget > Widget renders with async changed template data
ok 11 ComponentWidget > Widget will not rerender on state change if stopped
ok 12 ComponentWidget > Widget will only rerender once when multiple state changes happen during previous render
ok 13 DOMLessGroupWidget > Test item is added to group
ok 14 DOMLessGroupWidget > Test item DOM is not changed after inserting into group
ok 15 CaptionsPanel > When pre-existing statements are present on page > initialization works without errors
ok 16 CaptionsPanel > When pre-existing statements are present on page > user languages are added to DOM
ok 17 LicenseDialogWidget > constructor
ok 18 LicenseDialogWidget > User is not logged in and has not accepted license > getLicenseConfirmation returns zero
ok 19 LicenseDialogWidget > User is not logged in and has not accepted license > storeLicenseConfirmation sets value of the appropriate key to 1
ok 20 LicenseDialogWidget > User is logged in and has not accepted license > getLicenseConfirmation returns zero
ok 21 LicenseDialogWidget > User is logged in and has not accepted license > storeLicenseConfirmation saves to user preferences
ok 22 ProtectionMsgWidget > constructor
ok 23 ProtectionMsgWidget > Page is not protected > Protection message widget does not display
ok 24 ProtectionMsgWidget > Page is protected > Protection message widget displays
ok 25 StatementPanel > When no pre-existing statements are present on page > constructor
ok 26 StatementPanel > When no pre-existing statements are present on page > isEditable() is false by default
ok 27 StatementPanel > When no pre-existing statements are present on page > User is not logged in and has not accepted license > LicenseDialogWidget is displayed when user attempts to edit
ok 28 mediainfo.template.mustache+dom > Render mustache templates
ok 29 mediainfo.template.mustache+dom > Mustache templates with HTMLElement > Nodes are parsed into template
ok 30 mediainfo.template.mustache+dom > Mustache templates with HTMLElement > Events triggered from template-based HTML propagate to original element handlers
ok 31 mediainfo.template.mustache+dom > Mustache templates with HTMLElement > Changes to node later on propagate into DOM rendered by template
ok 32 mediainfo.template.mustache+dom > Mustache templates with jQuery nodes > Nodes are parsed into template
ok 33 mediainfo.template.mustache+dom > Mustache templates with jQuery nodes > Events triggered from template-based HTML propagate to original element handlers
ok 34 mediainfo.template.mustache+dom > Mustache templates with jQuery nodes > Changes to node later on propagate into DOM rendered by template
ok 35 mediainfo.template.mustache+dom > Mustache templates with OOUI widgets > Nodes are parsed into template
ok 36 mediainfo.template.mustache+dom > Mustache templates with OOUI widgets > Events triggered from template-based HTML propagate to original element handlers
ok 37 mediainfo.template.mustache+dom > Mustache templates with OOUI widgets > Changes to node later on propagate into DOM rendered by template
ok 38 AddPropertyWidget > Adding property ids changes the filters
ok 39 AddPropertyWidget > Property input widget & remove are only visible in edit mode
ok 40 ItemWidget > Valid data roundtrip
ok 41 ItemWidget > Setting other data triggers a change event
ok 42 ItemWidget > Setting same data does not trigger a change event
ok 43 ItemWidget > Widget updates snak widgets with new data
ok 44 ItemWidget > Test enabling edit state
ok 45 ItemWidget > Test disabling edit state
ok 46 ItemWidget > Toggling item prominence changes item rank
ok 47 ItemWidget > Valid data roundtrip with somevalue snak
ok 48 ItemWidget > Valid data roundtrip with novalue snak
ok 49 LinkNoticeWidget > constructor
ok 50 LinkNoticeWidget > User is not logged in. > Widget should be visible if not previously dismissed
ok 51 LinkNoticeWidget > User is not logged in. > Widget should not be visible if previously dismissed
ok 52 LinkNoticeWidget > User is not logged in. > dismiss method should store data in local storage for anon users
ok 53 LinkNoticeWidget > User is not logged in. > dismiss method should dismiss the widget
ok 54 LinkNoticeWidget > User is logged-in > Widget should be visible if not previously dismissed
ok 55 LinkNoticeWidget > User is logged-in > Widget should not be visible if previously dismissed
ok 56 LinkNoticeWidget > User is logged-in > dismiss method should store data in user preferences for logged in users
ok 57 SnakListWidget > Valid data roundtrip
ok 58 SnakListWidget > Setting other data triggers a change event
ok 59 SnakListWidget > Setting same data does not trigger a change event
ok 60 SnakListWidget > createWidget() returns a new SnakWidget
ok 61 SnakListWidget > createWidget sets SnakWidget data when snak is provided
ok 62 SnakListWidget > addWidget creates a new SnakWidget every time it is called
ok 63 SnakListWidget > Valid data roundtrip with somevalue snak
ok 64 SnakListWidget > Valid data roundtrip with novalue snak
ok 65 SnakWidget > Valid data roundtrip
ok 66 SnakWidget > Setting other data triggers a change event
ok 67 SnakWidget > Setting same data does not trigger a change event
ok 68 SnakWidget > setData() sets property ID in the PropertyInput widget
ok 69 SnakWidget > setData() sets value data in the valueInput widget
ok 70 SnakWidget > Property labels are available after API calls complete
ok 71 SnakWidget > Test enabling edit state
ok 72 SnakWidget > Test disabling edit state
ok 73 SnakWidget > Valid data roundtrip with somevalue snak
ok 74 SnakWidget > Valid data roundtrip with novalue snak
ok 75 StatementWidget > Valid data roundtrip
ok 76 StatementWidget > Setting other data triggers a change event
ok 77 StatementWidget > Setting same data does not trigger a change event
ok 78 StatementWidget > Test detection of changes
ok 79 StatementWidget > Test enabling edit state
ok 80 StatementWidget > Test disabling edit state
ok 81 StatementWidget > Widget can handle multiple errors
ok 82 EntityInputWidget > Valid data roundtrip
ok 83 EntityInputWidget > Setting other data triggers a change event
ok 84 EntityInputWidget > Setting same data does not trigger a change event
ok 85 GlobeCoordinateInputWidget > Valid data roundtrip
ok 86 GlobeCoordinateInputWidget > Setting other data triggers a change event
ok 87 GlobeCoordinateInputWidget > Setting same data does not trigger a change event
ok 88 MonolingualText > Valid data roundtrip
ok 89 MonolingualText > Setting other data triggers a change event
ok 90 MonolingualText > Setting same data does not trigger a change event
ok 91 MonolingualText > Widget has no button in qualifier mode
ok 92 MonolingualText > Widget has button in statement mode
ok 93 MultiTypeInputWrapperWidget > Valid data roundtrip (wikibase-entityid)
ok 94 MultiTypeInputWrapperWidget > Valid data roundtrip (string)
ok 95 MultiTypeInputWrapperWidget > Valid data roundtrip (monolingualtext)
ok 96 MultiTypeInputWrapperWidget > Valid data roundtrip (quantity)
ok 97 MultiTypeInputWrapperWidget > Valid data roundtrip (time)
ok 98 MultiTypeInputWrapperWidget > Valid data roundtrip (globecoordinate)
ok 99 MultiTypeInputWrapperWidget > Valid data roundtrip (unsupported)
ok 100 MultiTypeInputWrapperWidget > Setting other data triggers a change event
ok 101 MultiTypeInputWrapperWidget > Setting same data does not trigger a change event
ok 102 MultiTypeInputWrapperWidget > Changing to same input type leaves existing value unaltered
ok 103 MultiTypeInputWrapperWidget > Changing to other input type (and back) wipes out existing data
ok 104 MultiTypeInputWrapperWidget > Widget creates the correct input type
ok 105 MultiTypeInputWrapperWidget > add event is fired when child input emits add
ok 106 MultiTypeInputWrapperWidget > setErrors adds MessageWidget to UI and flags string input as invalid
ok 107 MultiTypeInputWrapperWidget > Widget can handle multiple errors
ok 108 MultiTypeInputWrapperWidget > Setting snak type to somevalue changes input to disabled string input
ok 109 MultiTypeInputWrapperWidget > Setting snak type to novalue changes input to disabled string input
ok 110 MultiTypeInputWrapperWidget > Setting snak type to value changes input to original type
ok 111 MultiTypeInputWrapperWidget > Datatype can be set explicitly
ok 112 QuantityInputWidget > Valid data roundtrip
ok 113 QuantityInputWidget > Setting other data triggers a change event
ok 114 QuantityInputWidget > Setting same data does not trigger a change event
ok 115 QuantityInputWidget > Widget has no button in qualifier mode
ok 116 QuantityInputWidget > Widget has button in statement mode
ok 117 QuantityInputWidget > Widget displays no options by default
ok 118 QuantityInputWidget > Widget displays button to add unit when focused
ok 119 QuantityInputWidget > Widget displays custom unit when it has one
ok 120 StringInputWidget > Valid data roundtrip
ok 121 StringInputWidget > Setting other data triggers a change event
ok 122 StringInputWidget > Setting same data does not trigger a change event
ok 123 StringInputWidget > Widget has no button in qualifier mode
ok 124 StringInputWidget > Widget has button in statement mode
ok 125 TimeInputWidget > Valid data roundtrip
ok 126 TimeInputWidget > Setting other data triggers a change event
ok 127 TimeInputWidget > Setting same data does not trigger a change event
ok 128 TimeInputWidget > Widget has no button in qualifier mode
ok 129 TimeInputWidget > Widget has button in statement mode
1..129
# pass 129
# skip 0
# todo 0
# fail 0
--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json
--- end ---
build: Updating dependencies
composer:
* mediawiki/mediawiki-codesniffer: 50.0.0 → 51.0.0
npm:
* eslint-config-wikimedia: 0.32.3 → 0.32.4
$ git add .
--- stdout ---
--- end ---
$ git commit -F /tmp/tmpcl6v35z3
--- stdout ---
[master 54d15c2] build: Updating dependencies
5 files changed, 464 insertions(+), 358 deletions(-)
--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 54d15c29abebe0a50da83af150f1ad89c7f7be33 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Wed, 6 May 2026 13:18:24 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
composer:
* mediawiki/mediawiki-codesniffer: 50.0.0 → 51.0.0
npm:
* eslint-config-wikimedia: 0.32.3 → 0.32.4
Change-Id: I11238a572ffc5cb38befcfe521146af482ae54df
---
composer.json | 2 +-
package-lock.json | 813 ++++++++++--------
package.json | 2 +-
.../ConstraintsReportHandlerElement.js | 4 +-
.../inputs/EntityAutocompleteInputWidget.js | 1 -
5 files changed, 464 insertions(+), 358 deletions(-)
diff --git a/composer.json b/composer.json
index ecd62cc..640eefa 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,7 @@
"serialization/serialization": "~3.2|~4.0"
},
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "50.0.0",
+ "mediawiki/mediawiki-codesniffer": "51.0.0",
"mediawiki/mediawiki-phan-config": "0.20.0",
"mediawiki/minus-x": "2.0.1",
"php-parallel-lint/php-console-highlighter": "1.0.0",
diff --git a/package-lock.json b/package-lock.json
index f6b4664..7233ac9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"hasInstallScript": true,
"devDependencies": {
"dotenv": "8.0.0",
- "eslint-config-wikimedia": "0.32.3",
+ "eslint-config-wikimedia": "0.32.4",
"grunt": "1.6.2",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
@@ -462,19 +462,32 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
- "version": "0.76.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
- "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
+ "version": "0.86.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.86.0.tgz",
+ "integrity": "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw==",
"dev": true,
"dependencies": {
"@types/estree": "^1.0.8",
- "@typescript-eslint/types": "^8.46.0",
- "comment-parser": "1.4.1",
- "esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~6.10.0"
+ "@typescript-eslint/types": "^8.58.0",
+ "comment-parser": "1.4.6",
+ "esquery": "^1.7.0",
+ "jsdoc-type-pratt-parser": "~7.2.0"
},
"engines": {
- "node": ">=20.11.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@es-joy/jsdoccomment/node_modules/@typescript-eslint/types": {
+ "version": "8.59.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz",
+ "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@es-joy/resolve.exports": {
@@ -487,9 +500,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
- "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
@@ -692,9 +705,9 @@
}
},
"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==",
+ "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/@nodelib/fs.scandir": {
@@ -914,20 +927,19 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
- "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz",
+ "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==",
"dev": true,
"dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.46.0",
- "@typescript-eslint/type-utils": "8.46.0",
- "@typescript-eslint/utils": "8.46.0",
- "@typescript-eslint/visitor-keys": "8.46.0",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/type-utils": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -937,7 +949,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.46.0",
+ "@typescript-eslint/parser": "^8.54.0",
"eslint": "^8.57.0 || ^9.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
@@ -952,16 +964,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
- "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz",
+ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==",
"dev": true,
"dependencies": {
- "@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"
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -976,14 +988,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz",
+ "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==",
"dev": true,
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.46.0",
- "@typescript-eslint/types": "^8.46.0",
- "debug": "^4.3.4"
+ "@typescript-eslint/tsconfig-utils": "^8.54.0",
+ "@typescript-eslint/types": "^8.54.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -997,13 +1009,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
- "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz",
+ "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "8.46.0",
- "@typescript-eslint/visitor-keys": "8.46.0"
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1014,9 +1026,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz",
+ "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1030,16 +1042,16 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz",
+ "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==",
"dev": true,
"dependencies": {
- "@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"
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1054,9 +1066,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz",
+ "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1067,21 +1079,20 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz",
+ "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==",
"dev": true,
"dependencies": {
- "@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",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
+ "@typescript-eslint/project-service": "8.54.0",
+ "@typescript-eslint/tsconfig-utils": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1095,9 +1106,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
@@ -1119,15 +1130,15 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
- "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz",
+ "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==",
"dev": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.46.0",
- "@typescript-eslint/types": "8.46.0",
- "@typescript-eslint/typescript-estree": "8.46.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1142,12 +1153,12 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz",
+ "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/types": "8.54.0",
"eslint-visitor-keys": "^4.2.1"
},
"engines": {
@@ -1189,9 +1200,9 @@
"dev": true
},
"node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -1410,6 +1421,12 @@
"@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/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -1774,9 +1791,9 @@
}
},
"node_modules/comment-parser": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
- "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz",
+ "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==",
"dev": true,
"engines": {
"node": ">= 12.0.0"
@@ -2234,13 +2251,13 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.18.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
- "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz",
+ "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
+ "tapable": "^2.3.3"
},
"engines": {
"node": ">=10.13.0"
@@ -2457,46 +2474,47 @@
}
},
"node_modules/eslint-config-wikimedia": {
- "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==",
+ "version": "0.32.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.4.tgz",
+ "integrity": "sha512-zcHJYss2vo8HK5PzkFuaV9mzaSGRuhA+jFGoQ4rNIwWz0usZsuQ2LYpkKxrbCVX1CbV0PzG+jJ6p0cLI+G37JQ==",
"dev": true,
"dependencies": {
"@stylistic/eslint-plugin": "^3.1.0",
- "@typescript-eslint/eslint-plugin": "8.46.0",
- "@typescript-eslint/parser": "8.46.0",
+ "@typescript-eslint/eslint-plugin": "8.54.0",
+ "@typescript-eslint/parser": "8.54.0",
"browserslist-config-wikimedia": "^0.7.0",
- "eslint": "^8.57.0",
- "eslint-plugin-compat": "^6.0.2",
+ "eslint-plugin-compat": "^6.1.0",
"eslint-plugin-es-x": "^8.7.0",
- "eslint-plugin-jest": "^29.0.1",
- "eslint-plugin-jsdoc": "61.3.0",
+ "eslint-plugin-jest": "^29.12.2",
+ "eslint-plugin-jsdoc": "^62.9.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.8.2",
+ "eslint-plugin-mediawiki": "^0.8.3",
"eslint-plugin-mocha": "^10.5.0",
- "eslint-plugin-n": "^17.23.1",
- "eslint-plugin-no-jquery": "^3.1.1",
- "eslint-plugin-qunit": "^8.2.5",
- "eslint-plugin-security": "^3.0.1",
+ "eslint-plugin-n": "^17.24.0",
+ "eslint-plugin-no-jquery": "^4.0.0",
+ "eslint-plugin-qunit": "^8.2.6",
+ "eslint-plugin-security": "^4.0.0",
"eslint-plugin-unicorn": "^56.0.1",
"eslint-plugin-vue": "^9.33.0",
- "eslint-plugin-wdio": "^9.16.2",
+ "eslint-plugin-wdio": "9.23.0",
"eslint-plugin-yml": "^1.19.0"
},
"engines": {
"node": ">=20 <25"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0"
}
},
"node_modules/eslint-plugin-compat": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
- "integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
+ "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,
"dependencies": {
- "@mdn/browser-compat-data": "^5.5.35",
+ "@mdn/browser-compat-data": "^6.1.1",
"ast-metadata-inferer": "^0.8.1",
- "browserslist": "^4.24.2",
- "caniuse-lite": "^1.0.30001687",
+ "browserslist": "^4.25.2",
"find-up": "^5.0.0",
"globals": "^15.7.0",
"lodash.memoize": "^4.1.2",
@@ -2506,7 +2524,7 @@
"node": ">=18.x"
},
"peerDependencies": {
- "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.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/find-up": {
@@ -2604,9 +2622,9 @@
}
},
"node_modules/eslint-plugin-jest": {
- "version": "29.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
- "integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
+ "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,
"dependencies": {
"@typescript-eslint/utils": "^8.0.0"
@@ -2616,8 +2634,9 @@
},
"peerDependencies": {
"@typescript-eslint/eslint-plugin": "^8.0.0",
- "eslint": "^8.57.0 || ^9.0.0",
- "jest": "*"
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "jest": "*",
+ "typescript": ">=4.8.4 <7.0.0"
},
"peerDependenciesMeta": {
"@typescript-eslint/eslint-plugin": {
@@ -2625,61 +2644,64 @@
},
"jest": {
"optional": true
+ },
+ "typescript": {
+ "optional": true
}
}
},
"node_modules/eslint-plugin-jsdoc": {
- "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==",
+ "version": "62.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.9.0.tgz",
+ "integrity": "sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA==",
"dev": true,
"dependencies": {
- "@es-joy/jsdoccomment": "~0.76.0",
+ "@es-joy/jsdoccomment": "~0.86.0",
"@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
- "comment-parser": "1.4.1",
+ "comment-parser": "1.4.6",
"debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "espree": "^10.4.0",
- "esquery": "^1.6.0",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
"html-entities": "^2.6.0",
"object-deep-merge": "^2.0.0",
"parse-imports-exports": "^0.2.4",
- "semver": "^7.7.3",
+ "semver": "^7.7.4",
"spdx-expression-parse": "^4.0.0",
"to-valid-identifier": "^1.0.0"
},
"engines": {
- "node": ">=20.11.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
+ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
}
},
"node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-jsdoc/node_modules/espree": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
- "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
"dev": true,
"dependencies": {
- "acorn": "^8.15.0",
+ "acorn": "^8.16.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.1"
+ "eslint-visitor-keys": "^5.0.1"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
@@ -2699,9 +2721,9 @@
}
},
"node_modules/eslint-plugin-mediawiki": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
- "integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.3.tgz",
+ "integrity": "sha512-RQKZd40C1taMDk5N9+aFLEBGBB95RNG7Gc54EsJ8pHsJu8//nIdpxNFWPtQz6RNxz6pZUXBnMCxzkMOLM3Mm1w==",
"dev": true,
"dependencies": {
"upath": "^2.0.1"
@@ -2728,9 +2750,9 @@
}
},
"node_modules/eslint-plugin-n": {
- "version": "17.23.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
- "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+ "version": "17.24.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz",
+ "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.5.0",
@@ -2802,31 +2824,34 @@
}
},
"node_modules/eslint-plugin-no-jquery": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
- "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-4.0.0.tgz",
+ "integrity": "sha512-ZR631D3qIQfgjKOAcgvYa5cB8xdTvFXAD5MbK5x5WltLSwFxmGnoaTXNtnptFU7py07ALrIe5dZRYncu4RD/Ug==",
"dev": true,
"peerDependencies": {
- "eslint": ">=8.0.0"
+ "eslint": ">=8.0.0 <9.0.0"
}
},
"node_modules/eslint-plugin-qunit": {
- "version": "8.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
- "integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
+ "version": "8.2.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.6.tgz",
+ "integrity": "sha512-S1jC/DIW9J8VtNX4uG1vlf5FZVrfQFlcuiYmvTHR2IICUhubHqpWA5o+qS1tujh+81Gs39omKV2D4OXfbSJE5g==",
"dev": true,
"dependencies": {
- "eslint-utils": "^3.0.0",
+ "@eslint-community/eslint-utils": "^4.4.0",
"requireindex": "^1.2.0"
},
"engines": {
"node": "^16.0.0 || ^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=8.38.0"
}
},
"node_modules/eslint-plugin-security": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
- "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-4.0.0.tgz",
+ "integrity": "sha512-tfuQT8K/Li1ZxhFzyD8wPIKtlzZxqBcPr9q0jFMQ77wWAbKBVEhaMPVQRTMTvCMUDhwBe5vPVqQPwAGk/ASfxQ==",
"dev": true,
"dependencies": {
"safe-regex": "^2.1.1"
@@ -2927,9 +2952,9 @@
}
},
"node_modules/eslint-plugin-wdio": {
- "version": "9.16.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
- "integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
+ "version": "9.23.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.23.0.tgz",
+ "integrity": "sha512-8tcpupzp2Qmv+uSfhzeHi42LVA9PyjkpMBPclSIkPxBfXpj4fMrejwAHu1PROh1OmJN1VQcGQUTWvSzyRcV2vA==",
"dev": true,
"engines": {
"node": ">=18.20.0"
@@ -3126,9 +3151,9 @@
}
},
"node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
"dependencies": {
"estraverse": "^5.1.0"
@@ -3568,9 +3593,9 @@
}
},
"node_modules/get-tsconfig": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
- "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
+ "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
"dev": true,
"dependencies": {
"resolve-pkg-maps": "^1.0.0"
@@ -4572,9 +4597,9 @@
"dev": true
},
"node_modules/jsdoc-type-pratt-parser": {
- "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==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz",
+ "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==",
"dev": true,
"engines": {
"node": ">=20.0.0"
@@ -6261,9 +6286,9 @@
}
},
"node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "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"
@@ -7057,9 +7082,9 @@
}
},
"node_modules/tapable": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
- "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
"dev": true,
"engines": {
"node": ">=6"
@@ -7099,6 +7124,51 @@
"globrex": "^0.1.2"
}
},
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dev": true,
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/tmp": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
@@ -7174,9 +7244,9 @@
}
},
"node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
"dev": true,
"engines": {
"node": ">=18.12"
@@ -8050,16 +8120,24 @@
"dev": true
},
"@es-joy/jsdoccomment": {
- "version": "0.76.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
- "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
+ "version": "0.86.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.86.0.tgz",
+ "integrity": "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw==",
"dev": true,
"requires": {
"@types/estree": "^1.0.8",
- "@typescript-eslint/types": "^8.46.0",
- "comment-parser": "1.4.1",
- "esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~6.10.0"
+ "@typescript-eslint/types": "^8.58.0",
+ "comment-parser": "1.4.6",
+ "esquery": "^1.7.0",
+ "jsdoc-type-pratt-parser": "~7.2.0"
+ },
+ "dependencies": {
+ "@typescript-eslint/types": {
+ "version": "8.59.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz",
+ "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==",
+ "dev": true
+ }
}
},
"@es-joy/resolve.exports": {
@@ -8069,9 +8147,9 @@
"dev": true
},
"@eslint-community/eslint-utils": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
- "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^3.4.3"
@@ -8221,9 +8299,9 @@
}
},
"@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==",
+ "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
},
"@nodelib/fs.scandir": {
@@ -8390,20 +8468,19 @@
"dev": true
},
"@typescript-eslint/eslint-plugin": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
- "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz",
+ "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==",
"dev": true,
"requires": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.46.0",
- "@typescript-eslint/type-utils": "8.46.0",
- "@typescript-eslint/utils": "8.46.0",
- "@typescript-eslint/visitor-keys": "8.46.0",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/type-utils": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
+ "ts-api-utils": "^2.4.0"
},
"dependencies": {
"ignore": {
@@ -8415,87 +8492,86 @@
}
},
"@typescript-eslint/parser": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
- "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz",
+ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==",
"dev": true,
"requires": {
- "@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"
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3"
}
},
"@typescript-eslint/project-service": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz",
+ "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==",
"dev": true,
"requires": {
- "@typescript-eslint/tsconfig-utils": "^8.46.0",
- "@typescript-eslint/types": "^8.46.0",
- "debug": "^4.3.4"
+ "@typescript-eslint/tsconfig-utils": "^8.54.0",
+ "@typescript-eslint/types": "^8.54.0",
+ "debug": "^4.4.3"
}
},
"@typescript-eslint/scope-manager": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
- "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz",
+ "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.46.0",
- "@typescript-eslint/visitor-keys": "8.46.0"
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0"
}
},
"@typescript-eslint/tsconfig-utils": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz",
+ "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==",
"dev": true,
"requires": {}
},
"@typescript-eslint/type-utils": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz",
+ "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==",
"dev": true,
"requires": {
- "@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"
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
}
},
"@typescript-eslint/types": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz",
+ "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz",
+ "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==",
"dev": true,
"requires": {
- "@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",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
+ "@typescript-eslint/project-service": "8.54.0",
+ "@typescript-eslint/tsconfig-utils": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
},
"dependencies": {
"brace-expansion": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
- "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0"
@@ -8513,24 +8589,24 @@
}
},
"@typescript-eslint/utils": {
- "version": "8.46.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
- "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz",
+ "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==",
"dev": true,
"requires": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.46.0",
- "@typescript-eslint/types": "8.46.0",
- "@typescript-eslint/typescript-estree": "8.46.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0"
}
},
"@typescript-eslint/visitor-keys": {
- "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==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz",
+ "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/types": "8.54.0",
"eslint-visitor-keys": "^4.2.1"
},
"dependencies": {
@@ -8561,9 +8637,9 @@
"dev": true
},
"acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true
},
"acorn-globals": {
@@ -8725,6 +8801,14 @@
"dev": true,
"requires": {
"@mdn/browser-compat-data": "^5.6.19"
+ },
+ "dependencies": {
+ "@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
+ }
}
},
"astral-regex": {
@@ -8986,9 +9070,9 @@
"dev": true
},
"comment-parser": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
- "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz",
+ "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==",
"dev": true
},
"commondir": {
@@ -9347,13 +9431,13 @@
}
},
"enhanced-resolve": {
- "version": "5.18.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
- "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz",
+ "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
+ "tapable": "^2.3.3"
}
},
"entities": {
@@ -9560,43 +9644,41 @@
}
},
"eslint-config-wikimedia": {
- "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==",
+ "version": "0.32.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.4.tgz",
+ "integrity": "sha512-zcHJYss2vo8HK5PzkFuaV9mzaSGRuhA+jFGoQ4rNIwWz0usZsuQ2LYpkKxrbCVX1CbV0PzG+jJ6p0cLI+G37JQ==",
"dev": true,
"requires": {
"@stylistic/eslint-plugin": "^3.1.0",
- "@typescript-eslint/eslint-plugin": "8.46.0",
- "@typescript-eslint/parser": "8.46.0",
+ "@typescript-eslint/eslint-plugin": "8.54.0",
+ "@typescript-eslint/parser": "8.54.0",
"browserslist-config-wikimedia": "^0.7.0",
- "eslint": "^8.57.0",
- "eslint-plugin-compat": "^6.0.2",
+ "eslint-plugin-compat": "^6.1.0",
"eslint-plugin-es-x": "^8.7.0",
- "eslint-plugin-jest": "^29.0.1",
- "eslint-plugin-jsdoc": "61.3.0",
+ "eslint-plugin-jest": "^29.12.2",
+ "eslint-plugin-jsdoc": "^62.9.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.8.2",
+ "eslint-plugin-mediawiki": "^0.8.3",
"eslint-plugin-mocha": "^10.5.0",
- "eslint-plugin-n": "^17.23.1",
- "eslint-plugin-no-jquery": "^3.1.1",
- "eslint-plugin-qunit": "^8.2.5",
- "eslint-plugin-security": "^3.0.1",
+ "eslint-plugin-n": "^17.24.0",
+ "eslint-plugin-no-jquery": "^4.0.0",
+ "eslint-plugin-qunit": "^8.2.6",
+ "eslint-plugin-security": "^4.0.0",
"eslint-plugin-unicorn": "^56.0.1",
"eslint-plugin-vue": "^9.33.0",
- "eslint-plugin-wdio": "^9.16.2",
+ "eslint-plugin-wdio": "9.23.0",
"eslint-plugin-yml": "^1.19.0"
}
},
"eslint-plugin-compat": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
- "integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
+ "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,
"requires": {
- "@mdn/browser-compat-data": "^5.5.35",
+ "@mdn/browser-compat-data": "^6.1.1",
"ast-metadata-inferer": "^0.8.1",
- "browserslist": "^4.24.2",
- "caniuse-lite": "^1.0.30001687",
+ "browserslist": "^4.25.2",
"find-up": "^5.0.0",
"globals": "^15.7.0",
"lodash.memoize": "^4.1.2",
@@ -9660,51 +9742,51 @@
}
},
"eslint-plugin-jest": {
- "version": "29.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
- "integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
+ "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,
"requires": {
"@typescript-eslint/utils": "^8.0.0"
}
},
"eslint-plugin-jsdoc": {
- "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==",
+ "version": "62.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.9.0.tgz",
+ "integrity": "sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA==",
"dev": true,
"requires": {
- "@es-joy/jsdoccomment": "~0.76.0",
+ "@es-joy/jsdoccomment": "~0.86.0",
"@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
- "comment-parser": "1.4.1",
+ "comment-parser": "1.4.6",
"debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "espree": "^10.4.0",
- "esquery": "^1.6.0",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
"html-entities": "^2.6.0",
"object-deep-merge": "^2.0.0",
"parse-imports-exports": "^0.2.4",
- "semver": "^7.7.3",
+ "semver": "^7.7.4",
"spdx-expression-parse": "^4.0.0",
"to-valid-identifier": "^1.0.0"
},
"dependencies": {
"eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true
},
"espree": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
- "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
"dev": true,
"requires": {
- "acorn": "^8.15.0",
+ "acorn": "^8.16.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.1"
+ "eslint-visitor-keys": "^5.0.1"
}
}
}
@@ -9720,9 +9802,9 @@
}
},
"eslint-plugin-mediawiki": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
- "integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.3.tgz",
+ "integrity": "sha512-RQKZd40C1taMDk5N9+aFLEBGBB95RNG7Gc54EsJ8pHsJu8//nIdpxNFWPtQz6RNxz6pZUXBnMCxzkMOLM3Mm1w==",
"dev": true,
"requires": {
"upath": "^2.0.1"
@@ -9740,9 +9822,9 @@
}
},
"eslint-plugin-n": {
- "version": "17.23.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
- "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+ "version": "17.24.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz",
+ "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.5.0",
@@ -9785,26 +9867,26 @@
}
},
"eslint-plugin-no-jquery": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
- "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-4.0.0.tgz",
+ "integrity": "sha512-ZR631D3qIQfgjKOAcgvYa5cB8xdTvFXAD5MbK5x5WltLSwFxmGnoaTXNtnptFU7py07ALrIe5dZRYncu4RD/Ug==",
"dev": true,
"requires": {}
},
"eslint-plugin-qunit": {
- "version": "8.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
- "integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
+ "version": "8.2.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.6.tgz",
+ "integrity": "sha512-S1jC/DIW9J8VtNX4uG1vlf5FZVrfQFlcuiYmvTHR2IICUhubHqpWA5o+qS1tujh+81Gs39omKV2D4OXfbSJE5g==",
"dev": true,
"requires": {
- "eslint-utils": "^3.0.0",
+ "@eslint-community/eslint-utils": "^4.4.0",
"requireindex": "^1.2.0"
}
},
"eslint-plugin-security": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
- "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-4.0.0.tgz",
+ "integrity": "sha512-tfuQT8K/Li1ZxhFzyD8wPIKtlzZxqBcPr9q0jFMQ77wWAbKBVEhaMPVQRTMTvCMUDhwBe5vPVqQPwAGk/ASfxQ==",
"dev": true,
"requires": {
"safe-regex": "^2.1.1"
@@ -9873,9 +9955,9 @@
}
},
"eslint-plugin-wdio": {
- "version": "9.16.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
- "integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
+ "version": "9.23.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.23.0.tgz",
+ "integrity": "sha512-8tcpupzp2Qmv+uSfhzeHi42LVA9PyjkpMBPclSIkPxBfXpj4fMrejwAHu1PROh1OmJN1VQcGQUTWvSzyRcV2vA==",
"dev": true
},
"eslint-plugin-yml": {
@@ -9951,9 +10033,9 @@
"dev": true
},
"esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
@@ -10276,9 +10358,9 @@
"dev": true
},
"get-tsconfig": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
- "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
+ "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
"dev": true,
"requires": {
"resolve-pkg-maps": "^1.0.0"
@@ -11040,9 +11122,9 @@
"dev": true
},
"jsdoc-type-pratt-parser": {
- "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==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz",
+ "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==",
"dev": true
},
"jsdom": {
@@ -12321,9 +12403,9 @@
}
},
"semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true
},
"set-blocking": {
@@ -12892,9 +12974,9 @@
}
},
"tapable": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
- "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
"dev": true
},
"test-exclude": {
@@ -12924,6 +13006,31 @@
"globrex": "^0.1.2"
}
},
+ "tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dev": true,
+ "requires": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "dependencies": {
+ "fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "requires": {}
+ },
+ "picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true
+ }
+ }
+ },
"tmp": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
@@ -12983,9 +13090,9 @@
}
},
"ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
"dev": true,
"requires": {}
},
diff --git a/package.json b/package.json
index d20288d..31269bc 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
},
"devDependencies": {
"dotenv": "8.0.0",
- "eslint-config-wikimedia": "0.32.3",
+ "eslint-config-wikimedia": "0.32.4",
"grunt": "1.6.2",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
diff --git a/resources/statements/ConstraintsReportHandlerElement.js b/resources/statements/ConstraintsReportHandlerElement.js
index 198d901..9f40757 100644
--- a/resources/statements/ConstraintsReportHandlerElement.js
+++ b/resources/statements/ConstraintsReportHandlerElement.js
@@ -119,10 +119,10 @@ ConstraintsReportHandlerElement.prototype.buildReportList = function ( reports )
* @see WikibaseQualityConstraints/modules/gadget.js::_createPopupWidget()
*/
ConstraintsReportHandlerElement.prototype.createPopupWidget = function ( $content, icon, titleMessageKey, classes ) {
- // eslint-disable-next-line mediawiki/class-doc
+
const widget = new OO.ui.PopupButtonWidget( {
icon: icon,
- // eslint-disable-next-line mediawiki/msg-doc
+
title: mw.msg( titleMessageKey ),
flags: '',
framed: false,
diff --git a/resources/statements/inputs/EntityAutocompleteInputWidget.js b/resources/statements/inputs/EntityAutocompleteInputWidget.js
index a2ec56e..fb58425 100644
--- a/resources/statements/inputs/EntityAutocompleteInputWidget.js
+++ b/resources/statements/inputs/EntityAutocompleteInputWidget.js
@@ -33,7 +33,6 @@ const EntityAutocompleteInputWidget = function MediaInfoStatementsEntityAutocomp
// select it anew
this.dataCache = {};
- // eslint-disable-next-line mediawiki/class-doc
EntityAutocompleteInputWidget.super.call( this, Object.assign( {}, config, {
// classes should *always* be added, because some essential functionality
// (e.g. CSS to turn red on invalid input) depends on these classes
--
2.47.3
--- end ---