This run took 183 seconds.
From 02914a4cc9d0fc269dcd0fef01c9ee822c35b18f Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Sat, 15 Nov 2025 15:30:08 +0000
Subject: [PATCH] build: Updating npm dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* eslint-config-wikimedia: 0.31.0 → 0.32.1
The following rules are failing and were disabled:
* resources:
* mediawiki/no-unlabeled-buttonwidget
* nyc: 15.0.0 → 15.1.0
Change-Id: Ibb481fbe60549c8fc4037e6f98cc5c33d3263d90
---
package-lock.json | 2560 ++++++++++++++------------------------
package.json | 4 +-
resources/.eslintrc.json | 3 +-
3 files changed, 924 insertions(+), 1643 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 2c08d37..32f3412 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"hasInstallScript": true,
"devDependencies": {
"dotenv": "8.0.0",
- "eslint-config-wikimedia": "0.31.0",
+ "eslint-config-wikimedia": "0.32.1",
"grunt": "1.6.1",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
@@ -21,7 +21,7 @@
"jsdom": "14.0.0",
"mockery": "2.1.0",
"mustache": "3.0.1",
- "nyc": "15.0.0",
+ "nyc": "15.1.0",
"oojs": "3.0.0",
"oojs-ui": "0.36.3",
"qunit": "2.24.1",
@@ -462,20 +462,19 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
- "version": "0.43.1",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
- "integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
+ "version": "0.75.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
+ "integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
"dev": true,
"dependencies": {
- "@types/eslint": "^8.56.5",
- "@types/estree": "^1.0.5",
- "@typescript-eslint/types": "^7.2.0",
+ "@types/estree": "^1.0.8",
+ "@typescript-eslint/types": "^8.46.0",
"comment-parser": "1.4.1",
- "esquery": "^1.5.0",
- "jsdoc-type-pratt-parser": "~4.0.0"
+ "esquery": "^1.6.0",
+ "jsdoc-type-pratt-parser": "~6.9.1"
},
"engines": {
- "node": ">=16"
+ "node": ">=20.11.0"
}
},
"node_modules/@eslint-community/eslint-utils": {
@@ -497,9 +496,9 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
- "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -617,9 +616,9 @@
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true,
"dependencies": {
"argparse": "^1.0.7",
@@ -696,9 +695,9 @@
}
},
"node_modules/@mdn/browser-compat-data": {
- "version": "5.3.14",
- "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.3.14.tgz",
- "integrity": "sha512-Y9XQrphVcE6u9xMm+gIqN86opbU/5s2W1pdPyKRyFV5B7+2jWM2gLI5JpfhZncaoDKvhy6FYwK04aCz5UM/bTQ==",
+ "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/@nodelib/fs.scandir": {
@@ -791,113 +790,6 @@
"eslint": ">=8.40.0"
}
},
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
- "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/types": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
- "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
- "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/project-service": "8.38.0",
- "@typescript-eslint/tsconfig-utils": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
- "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/typescript-estree": "8.38.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
- "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.38.0",
- "eslint-visitor-keys": "^4.2.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
"node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
@@ -936,21 +828,6 @@
"node": ">=4.0"
}
},
- "node_modules/@stylistic/eslint-plugin/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@stylistic/eslint-plugin/node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
@@ -963,18 +840,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/@stylistic/eslint-plugin/node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
- }
- },
"node_modules/@stylistic/stylelint-config": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-2.0.0.tgz",
@@ -1021,39 +886,10 @@
"node": ">=0.10.0"
}
},
- "node_modules/@stylistic/stylelint-plugin/node_modules/postcss-selector-parser": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
- "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
- "dev": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@types/eslint": {
- "version": "8.56.10",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
- "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
- "dev": true,
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
"node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true
},
"node_modules/@types/minimatch": {
@@ -1069,93 +905,75 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
- "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+ "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/type-utils": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/type-utils": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "ignore": "^7.0.0",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^7.0.0",
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "@typescript-eslint/parser": "^8.46.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
- "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+ "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
- "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+ "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.38.0",
- "@typescript-eslint/types": "^8.38.0",
+ "@typescript-eslint/tsconfig-utils": "^8.46.0",
+ "@typescript-eslint/types": "^8.46.0",
"debug": "^4.3.4"
},
"engines": {
@@ -1166,46 +984,20 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
- "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
- "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+ "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
@@ -1213,9 +1005,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
- "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+ "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1225,45 +1017,40 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
- "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+ "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
"debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/types": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
- "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+ "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
"dev": true,
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
@@ -1271,44 +1058,31 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
- "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+ "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/project-service": "8.46.0",
+ "@typescript-eslint/tsconfig-utils": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4",
- "globby": "^11.1.0",
+ "fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
@@ -1336,68 +1110,55 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
- "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+ "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
"dev": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0"
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.56.0"
- }
- },
- "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
- "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+ "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "eslint-visitor-keys": "^3.4.3"
+ "@typescript-eslint/types": "8.46.0",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/@ungap/structured-clone": {
@@ -1632,12 +1393,12 @@
}
},
"node_modules/ast-metadata-inferer": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
- "integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
+ "integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
"dev": true,
"dependencies": {
- "@mdn/browser-compat-data": "^5.2.34"
+ "@mdn/browser-compat-data": "^5.6.19"
}
},
"node_modules/astral-regex": {
@@ -1688,6 +1449,15 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.28",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz",
+ "integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==",
+ "dev": true,
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -1732,9 +1502,9 @@
"dev": true
},
"node_modules/browserslist": {
- "version": "4.24.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
- "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "version": "4.28.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
+ "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
"dev": true,
"funding": [
{
@@ -1751,10 +1521,11 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001688",
- "electron-to-chromium": "^1.5.73",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
+ "baseline-browser-mapping": "^2.8.25",
+ "caniuse-lite": "^1.0.30001754",
+ "electron-to-chromium": "^1.5.249",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.1.4"
},
"bin": {
"browserslist": "cli.js"
@@ -1830,9 +1601,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001692",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
- "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+ "version": "1.0.30001754",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+ "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
"dev": true,
"funding": [
{
@@ -1872,9 +1643,9 @@
}
},
"node_modules/ci-info": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
- "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz",
+ "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==",
"dev": true,
"funding": [
{
@@ -1898,6 +1669,15 @@
"node": ">=4"
}
},
+ "node_modules/clean-regexp/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -2021,12 +1801,12 @@
"dev": true
},
"node_modules/core-js-compat": {
- "version": "3.37.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
- "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+ "version": "3.46.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz",
+ "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==",
"dev": true,
"dependencies": {
- "browserslist": "^4.23.0"
+ "browserslist": "^4.26.3"
},
"funding": {
"type": "opencollective",
@@ -2171,9 +1951,9 @@
}
},
"node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"dependencies": {
"ms": "^2.1.3"
@@ -2232,6 +2012,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "dev": true,
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -2406,9 +2195,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.80",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz",
- "integrity": "sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==",
+ "version": "1.5.253",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.253.tgz",
+ "integrity": "sha512-O0tpQ/35rrgdiGQ0/OFWhy1itmd9A6TY9uQzlqj3hKSu/aYpe7UIn5d7CU2N9myH6biZiWF3VMZVuup8pw5U9w==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -2427,9 +2216,9 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.17.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
- "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
+ "version": "5.18.3",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -2485,12 +2274,15 @@
}
},
"node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"engines": {
- "node": ">=0.8.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/escodegen": {
@@ -2632,9 +2424,9 @@
}
},
"node_modules/eslint-compat-utils": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
- "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+ "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
"dev": true,
"dependencies": {
"semver": "^7.5.4"
@@ -2647,323 +2439,56 @@
}
},
"node_modules/eslint-config-wikimedia": {
- "version": "0.31.0",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.31.0.tgz",
- "integrity": "sha512-Z/t/zGPdxs/ehxb0EM6THNWAzueT7GtuqzjUvmBpkxcTKzZPJEXWnnpswdj/hgv8Ce8PIeDp0zwQxR4e3c9CIw==",
+ "version": "0.32.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.1.tgz",
+ "integrity": "sha512-gPvhyVFNlpKFOcJfoVTNlzg3A0b6qjhAbjjBIJ9xp5m+om0oqix5gkqIIEav5BaGxdDxYNmrY4ge3DAPP3u/lg==",
"dev": true,
"dependencies": {
"@stylistic/eslint-plugin": "^3.1.0",
- "@typescript-eslint/eslint-plugin": "8.35.1",
- "@typescript-eslint/parser": "8.35.1",
+ "@typescript-eslint/eslint-plugin": "8.46.0",
+ "@typescript-eslint/parser": "8.46.0",
"browserslist-config-wikimedia": "^0.7.0",
"eslint": "^8.57.0",
- "eslint-plugin-compat": "^4.2.0",
- "eslint-plugin-es-x": "^7.6.0",
- "eslint-plugin-jest": "^28.5.0",
- "eslint-plugin-jsdoc": "48.2.5",
+ "eslint-plugin-compat": "^6.0.2",
+ "eslint-plugin-es-x": "^8.7.0",
+ "eslint-plugin-jest": "^29.0.1",
+ "eslint-plugin-jsdoc": "61.0.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.7.0",
- "eslint-plugin-mocha": "^10.4.3",
- "eslint-plugin-n": "^17.7.0",
+ "eslint-plugin-mediawiki": "^0.8.1",
+ "eslint-plugin-mocha": "^10.5.0",
+ "eslint-plugin-n": "^17.23.1",
"eslint-plugin-no-jquery": "^3.1.1",
- "eslint-plugin-qunit": "^8.1.1",
- "eslint-plugin-security": "^1.7.1",
- "eslint-plugin-unicorn": "^53.0.0",
- "eslint-plugin-vue": "^9.26.0",
- "eslint-plugin-wdio": "^8.24.12",
- "eslint-plugin-yml": "^1.14.0"
- },
- "engines": {
- "node": ">=18 <25"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
- "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
- "dev": true,
- "dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/type-utils": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.35.1",
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
- "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
- "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/parser": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
- "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/project-service": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
- "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.35.1",
- "@typescript-eslint/types": "^8.35.1",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
- "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
- "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/types": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
- "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
- "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/project-service": "8.35.1",
- "@typescript-eslint/tsconfig-utils": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
- "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.35.1",
- "eslint-visitor-keys": "^4.2.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
+ "eslint-plugin-qunit": "^8.2.5",
+ "eslint-plugin-security": "^3.0.1",
+ "eslint-plugin-unicorn": "^56.0.1",
+ "eslint-plugin-vue": "^9.33.0",
+ "eslint-plugin-wdio": "^9.16.2",
+ "eslint-plugin-yml": "^1.19.0"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
+ "node": ">=20 <25"
}
},
"node_modules/eslint-plugin-compat": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
- "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
+ "integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
"dev": true,
"dependencies": {
- "@mdn/browser-compat-data": "^5.3.13",
- "ast-metadata-inferer": "^0.8.0",
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001524",
+ "@mdn/browser-compat-data": "^5.5.35",
+ "ast-metadata-inferer": "^0.8.1",
+ "browserslist": "^4.24.2",
+ "caniuse-lite": "^1.0.30001687",
"find-up": "^5.0.0",
+ "globals": "^15.7.0",
"lodash.memoize": "^4.1.2",
- "semver": "^7.5.4"
+ "semver": "^7.6.2"
},
"engines": {
- "node": ">=14.x"
+ "node": ">=18.x"
},
"peerDependencies": {
- "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
"node_modules/eslint-plugin-compat/node_modules/find-up": {
@@ -2982,6 +2507,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/eslint-plugin-compat/node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/eslint-plugin-compat/node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -3028,9 +2565,9 @@
}
},
"node_modules/eslint-plugin-es-x": {
- "version": "7.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.7.0.tgz",
- "integrity": "sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==",
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-8.7.0.tgz",
+ "integrity": "sha512-Du5Sb067sjqzmglaPhsfcEQgE1EYfL8sko+4jOMcAB/XKGoCxntSrOmTYuVzswA1rzM9+MZwH6+GOp0G3/wVCg==",
"dev": true,
"funding": [
"https://github.com/sponsors/ota-meshi",
@@ -3038,8 +2575,8 @@
],
"dependencies": {
"@eslint-community/eslint-utils": "^4.1.2",
- "@eslint-community/regexpp": "^4.6.0",
- "eslint-compat-utils": "^0.5.1"
+ "@eslint-community/regexpp": "^4.12.1",
+ "eslint-compat-utils": "^0.6.3"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -3049,19 +2586,19 @@
}
},
"node_modules/eslint-plugin-jest": {
- "version": "28.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz",
- "integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==",
+ "version": "29.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
+ "integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
+ "@typescript-eslint/utils": "^8.0.0"
},
"engines": {
- "node": "^16.10.0 || ^18.12.0 || >=20.0.0"
+ "node": "^20.12.0 || ^22.0.0 || >=24.0.0"
},
"peerDependencies": {
- "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0",
- "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0",
"jest": "*"
},
"peerDependenciesMeta": {
@@ -3074,38 +2611,58 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "48.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
- "integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
+ "version": "61.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
+ "integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
"dev": true,
"dependencies": {
- "@es-joy/jsdoccomment": "~0.43.0",
+ "@es-joy/jsdoccomment": "~0.75.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
- "debug": "^4.3.4",
+ "debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "esquery": "^1.5.0",
- "is-builtin-module": "^3.2.1",
- "semver": "^7.6.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.6.0",
+ "html-entities": "^2.6.0",
+ "object-deep-merge": "^1.0.5",
+ "parse-imports-exports": "^0.2.4",
+ "semver": "^7.7.3",
"spdx-expression-parse": "^4.0.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=20.11.0"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
- "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "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==",
"dev": true,
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-json-es": {
@@ -3122,12 +2679,11 @@
}
},
"node_modules/eslint-plugin-mediawiki": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
- "integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
+ "integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
"dev": true,
"dependencies": {
- "eslint-plugin-vue": "^9.23.0",
"upath": "^2.0.1"
},
"peerDependencies": {
@@ -3135,9 +2691,9 @@
}
},
"node_modules/eslint-plugin-mocha": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
- "integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz",
+ "integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==",
"dev": true,
"dependencies": {
"eslint-utils": "^3.0.0",
@@ -3152,19 +2708,20 @@
}
},
"node_modules/eslint-plugin-n": {
- "version": "17.8.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.8.1.tgz",
- "integrity": "sha512-KdG0h0voZms8UhndNu8DeWx1eM4sY+A4iXtsNo6kOfJLYHNeTGPacGalJ9GcvrbmOL3r/7QOMwVZDSw+1SqsrA==",
+ "version": "17.23.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
+ "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
"dev": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "enhanced-resolve": "^5.17.0",
- "eslint-plugin-es-x": "^7.5.0",
- "get-tsconfig": "^4.7.0",
- "globals": "^15.0.0",
- "ignore": "^5.2.4",
- "minimatch": "^9.0.0",
- "semver": "^7.5.3"
+ "@eslint-community/eslint-utils": "^4.5.0",
+ "enhanced-resolve": "^5.17.1",
+ "eslint-plugin-es-x": "^7.8.0",
+ "get-tsconfig": "^4.8.1",
+ "globals": "^15.11.0",
+ "globrex": "^0.1.2",
+ "ignore": "^5.3.2",
+ "semver": "^7.6.3",
+ "ts-declaration-location": "^1.0.6"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3176,40 +2733,52 @@
"eslint": ">=8.23.0"
}
},
- "node_modules/eslint-plugin-n/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "node_modules/eslint-plugin-n/node_modules/eslint-compat-utils": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+ "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
"dev": true,
"dependencies": {
- "balanced-match": "^1.0.0"
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
}
},
- "node_modules/eslint-plugin-n/node_modules/globals": {
- "version": "15.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-15.4.0.tgz",
- "integrity": "sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==",
+ "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es-x": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+ "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
"dev": true,
+ "funding": [
+ "https://github.com/sponsors/ota-meshi",
+ "https://opencollective.com/eslint"
+ ],
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.1.2",
+ "@eslint-community/regexpp": "^4.11.0",
+ "eslint-compat-utils": "^0.5.1"
+ },
"engines": {
- "node": ">=18"
+ "node": "^14.18.0 || >=16.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "eslint": ">=8"
}
},
- "node_modules/eslint-plugin-n/node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "node_modules/eslint-plugin-n/node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-plugin-no-jquery": {
@@ -3222,9 +2791,9 @@
}
},
"node_modules/eslint-plugin-qunit": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
- "integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
+ "integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
"dev": true,
"dependencies": {
"eslint-utils": "^3.0.0",
@@ -3235,75 +2804,13 @@
}
},
"node_modules/eslint-plugin-security": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz",
- "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
+ "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
"dev": true,
"dependencies": {
"safe-regex": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-unicorn": {
- "version": "53.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
- "integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.24.5",
- "@eslint-community/eslint-utils": "^4.4.0",
- "@eslint/eslintrc": "^3.0.2",
- "ci-info": "^4.0.0",
- "clean-regexp": "^1.0.0",
- "core-js-compat": "^3.37.0",
- "esquery": "^1.5.0",
- "indent-string": "^4.0.0",
- "is-builtin-module": "^3.2.1",
- "jsesc": "^3.0.2",
- "pluralize": "^8.0.0",
- "read-pkg-up": "^7.0.1",
- "regexp-tree": "^0.1.27",
- "regjsparser": "^0.10.0",
- "semver": "^7.6.1",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
- },
- "peerDependencies": {
- "eslint": ">=8.56.0"
- }
- },
- "node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
- "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
- "dev": true,
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
- "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
- "dev": true,
+ },
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -3311,27 +2818,43 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint-plugin-unicorn/node_modules/espree": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
- "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
+ "node_modules/eslint-plugin-unicorn": {
+ "version": "56.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+ "integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
"dev": true,
"dependencies": {
- "acorn": "^8.11.3",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.0.0"
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "ci-info": "^4.0.0",
+ "clean-regexp": "^1.0.0",
+ "core-js-compat": "^3.38.1",
+ "esquery": "^1.6.0",
+ "globals": "^15.9.0",
+ "indent-string": "^4.0.0",
+ "is-builtin-module": "^3.2.1",
+ "jsesc": "^3.0.2",
+ "pluralize": "^8.0.0",
+ "read-pkg-up": "^7.0.1",
+ "regexp-tree": "^0.1.27",
+ "regjsparser": "^0.10.0",
+ "semver": "^7.6.3",
+ "strip-indent": "^3.0.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=18.18"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
+ },
+ "peerDependencies": {
+ "eslint": ">=8.56.0"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true,
"engines": {
"node": ">=18"
@@ -3341,9 +2864,9 @@
}
},
"node_modules/eslint-plugin-unicorn/node_modules/jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"dev": true,
"bin": {
"jsesc": "bin/jsesc"
@@ -3352,22 +2875,10 @@
"node": ">=6"
}
},
- "node_modules/eslint-plugin-unicorn/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/eslint-plugin-vue": {
- "version": "9.26.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz",
- "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==",
+ "version": "9.33.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+ "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
@@ -3375,8 +2886,8 @@
"natural-compare": "^1.4.0",
"nth-check": "^2.1.1",
"postcss-selector-parser": "^6.0.15",
- "semver": "^7.6.0",
- "vue-eslint-parser": "^9.4.2",
+ "semver": "^7.6.3",
+ "vue-eslint-parser": "^9.4.3",
"xml-name-validator": "^4.0.0"
},
"engines": {
@@ -3396,23 +2907,24 @@
}
},
"node_modules/eslint-plugin-wdio": {
- "version": "8.24.12",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
- "integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
+ "version": "9.16.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
+ "integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
"dev": true,
"engines": {
- "node": "^16.13 || >=18"
+ "node": ">=18.20.0"
}
},
"node_modules/eslint-plugin-yml": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
- "integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.0.tgz",
+ "integrity": "sha512-S+4GbcCWksFKAvFJtf0vpdiCkZZvDJCV4Zsi9ahmYkYOYcf+LRqqzvzkb/ST7vTYV6sFwXOvawzYyL/jFT2nQA==",
"dev": true,
"dependencies": {
"debug": "^4.3.2",
- "eslint-compat-utils": "^0.5.0",
- "lodash": "^4.17.21",
+ "diff-sequences": "^27.5.1",
+ "escape-string-regexp": "4.0.0",
+ "eslint-compat-utils": "^0.6.0",
"natural-compare": "^1.4.0",
"yaml-eslint-parser": "^1.2.1"
},
@@ -3490,18 +3002,6 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/eslint/node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -3618,9 +3118,9 @@
}
},
"node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"dev": true,
"dependencies": {
"estraverse": "^5.1.0"
@@ -4051,9 +3551,9 @@
}
},
"node_modules/get-tsconfig": {
- "version": "4.7.5",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
- "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+ "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
"dev": true,
"dependencies": {
"resolve-pkg-maps": "^1.0.0"
@@ -4404,9 +3904,9 @@
}
},
"node_modules/grunt/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true,
"dependencies": {
"argparse": "^1.0.7",
@@ -4521,6 +4021,22 @@
"whatwg-encoding": "^1.0.1"
}
},
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ]
+ },
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -4586,9 +4102,9 @@
}
},
"node_modules/ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"engines": {
"node": ">= 4"
@@ -5048,9 +4564,9 @@
"dev": true
},
"node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
"dependencies": {
"argparse": "^2.0.1"
@@ -5066,12 +4582,12 @@
"dev": true
},
"node_modules/jsdoc-type-pratt-parser": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
- "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
+ "integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
"dev": true,
"engines": {
- "node": ">=12.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/jsdom": {
@@ -5562,9 +5078,9 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"dev": true
},
"node_modules/node-watch": {
@@ -5637,9 +5153,9 @@
"dev": true
},
"node_modules/nyc": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz",
- "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
"dev": true,
"dependencies": {
"@istanbuljs/load-nyc-config": "^1.0.0",
@@ -5650,6 +5166,7 @@
"find-cache-dir": "^3.2.0",
"find-up": "^4.1.0",
"foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
"glob": "^7.1.6",
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-hook": "^3.0.0",
@@ -5657,10 +5174,9 @@
"istanbul-lib-processinfo": "^2.0.2",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.0.0",
- "js-yaml": "^3.13.1",
+ "istanbul-reports": "^3.0.2",
"make-dir": "^3.0.0",
- "node-preload": "^0.2.0",
+ "node-preload": "^0.2.1",
"p-map": "^3.0.0",
"process-on-spawn": "^1.0.0",
"resolve-from": "^5.0.0",
@@ -5668,7 +5184,6 @@
"signal-exit": "^3.0.2",
"spawn-wrap": "^2.0.0",
"test-exclude": "^6.0.0",
- "uuid": "^3.3.3",
"yargs": "^15.0.2"
},
"bin": {
@@ -5678,15 +5193,6 @@
"node": ">=8.9"
}
},
- "node_modules/nyc/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
"node_modules/nyc/node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -5716,19 +5222,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/nyc/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
"node_modules/nyc/node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -5774,16 +5267,6 @@
"semver": "bin/semver.js"
}
},
- "node_modules/nyc/node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "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.",
- "dev": true,
- "bin": {
- "uuid": "bin/uuid"
- }
- },
"node_modules/nyc/node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@@ -5848,6 +5331,27 @@
"node": "*"
}
},
+ "node_modules/object-deep-merge": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
+ "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "4.2.0"
+ }
+ },
+ "node_modules/object-deep-merge/node_modules/type-fest": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
+ "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/object.defaults": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
@@ -6048,6 +5552,15 @@
"node": ">=0.8"
}
},
+ "node_modules/parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+ "dev": true,
+ "dependencies": {
+ "parse-statements": "1.0.11"
+ }
+ },
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -6075,6 +5588,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+ "dev": true
+ },
"node_modules/parse5": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
@@ -6288,9 +5807,9 @@
}
},
"node_modules/postcss-selector-parser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
- "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
@@ -6762,9 +6281,9 @@
}
},
"node_modules/semver": {
- "version": "7.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
@@ -6973,9 +6492,9 @@
}
},
"node_modules/spdx-license-ids": {
- "version": "3.0.18",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
- "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
+ "version": "3.0.22",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz",
+ "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==",
"dev": true
},
"node_modules/sprintf-js": {
@@ -7567,12 +7086,16 @@
}
},
"node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
"dev": true,
"engines": {
"node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
"node_modules/test-exclude": {
@@ -7664,15 +7187,49 @@
}
},
"node_modules/ts-api-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
- "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"dev": true,
"engines": {
- "node": ">=16"
+ "node": ">=18.12"
},
"peerDependencies": {
- "typescript": ">=4.2.0"
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/ts-declaration-location": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+ "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "ko-fi",
+ "url": "https://ko-fi.com/rebeccastevens"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/ts-declaration-location"
+ }
+ ],
+ "dependencies": {
+ "picomatch": "^4.0.2"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.0.0"
+ }
+ },
+ "node_modules/ts-declaration-location/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/tunnel-agent": {
@@ -7813,9 +7370,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
- "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+ "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
"dev": true,
"funding": [
{
@@ -8130,13 +7687,12 @@
}
},
"node_modules/yaml-eslint-parser": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
- "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz",
+ "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==",
"dev": true,
"dependencies": {
"eslint-visitor-keys": "^3.0.0",
- "lodash": "^4.17.21",
"yaml": "^2.0.0"
},
"engines": {
@@ -8147,15 +7703,15 @@
}
},
"node_modules/yaml-eslint-parser/node_modules/yaml": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
- "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
"dev": true,
"bin": {
"yaml": "bin.mjs"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 14.6"
}
},
"node_modules/yargs": {
@@ -8494,17 +8050,16 @@
"dev": true
},
"@es-joy/jsdoccomment": {
- "version": "0.43.1",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
- "integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
+ "version": "0.75.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
+ "integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
"dev": true,
"requires": {
- "@types/eslint": "^8.56.5",
- "@types/estree": "^1.0.5",
- "@typescript-eslint/types": "^7.2.0",
+ "@types/estree": "^1.0.8",
+ "@typescript-eslint/types": "^8.46.0",
"comment-parser": "1.4.1",
- "esquery": "^1.5.0",
- "jsdoc-type-pratt-parser": "~4.0.0"
+ "esquery": "^1.6.0",
+ "jsdoc-type-pratt-parser": "~6.9.1"
}
},
"@eslint-community/eslint-utils": {
@@ -8517,9 +8072,9 @@
}
},
"@eslint-community/regexpp": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
- "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true
},
"@eslint/eslintrc": {
@@ -8608,9 +8163,9 @@
"dev": true
},
"js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -8671,9 +8226,9 @@
}
},
"@mdn/browser-compat-data": {
- "version": "5.3.14",
- "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.3.14.tgz",
- "integrity": "sha512-Y9XQrphVcE6u9xMm+gIqN86opbU/5s2W1pdPyKRyFV5B7+2jWM2gLI5JpfhZncaoDKvhy6FYwK04aCz5UM/bTQ==",
+ "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
},
"@nodelib/fs.scandir": {
@@ -8751,71 +8306,6 @@
"picomatch": "^4.0.2"
},
"dependencies": {
- "@typescript-eslint/scope-manager": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
- "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0"
- }
- },
- "@typescript-eslint/types": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
- "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
- "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/project-service": "8.38.0",
- "@typescript-eslint/tsconfig-utils": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- }
- },
- "@typescript-eslint/utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
- "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
- "dev": true,
- "requires": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/typescript-estree": "8.38.0"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
- "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.38.0",
- "eslint-visitor-keys": "^4.2.1"
- }
- },
- "brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
"eslint-visitor-keys": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
@@ -8839,27 +8329,11 @@
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true
},
- "minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
"picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true
- },
- "ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "requires": {}
}
}
},
@@ -8893,39 +8367,13 @@
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true
- },
- "postcss-selector-parser": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
- "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
- "dev": true,
- "requires": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- }
}
}
},
- "@types/eslint": {
- "version": "8.56.10",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
- "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
- "dev": true,
- "requires": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
"@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true
},
"@types/minimatch": {
@@ -8941,135 +8389,108 @@
"dev": true
},
"@typescript-eslint/eslint-plugin": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
- "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+ "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
"dev": true,
- "optional": true,
- "peer": true,
"requires": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/type-utils": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/type-utils": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "ignore": "^7.0.0",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true
+ }
}
},
"@typescript-eslint/parser": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
- "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+ "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
"dev": true,
- "optional": true,
- "peer": true,
"requires": {
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4"
- },
- "dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
- "optional": true,
- "peer": true
- }
}
},
"@typescript-eslint/project-service": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
- "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+ "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
"dev": true,
"requires": {
- "@typescript-eslint/tsconfig-utils": "^8.38.0",
- "@typescript-eslint/types": "^8.38.0",
+ "@typescript-eslint/tsconfig-utils": "^8.46.0",
+ "@typescript-eslint/types": "^8.46.0",
"debug": "^4.3.4"
- },
- "dependencies": {
- "@typescript-eslint/types": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
- "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
- "dev": true
- }
}
},
"@typescript-eslint/scope-manager": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
- "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+ "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0"
- },
- "dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true
- }
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0"
}
},
"@typescript-eslint/tsconfig-utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
- "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+ "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
"dev": true,
"requires": {}
},
"@typescript-eslint/type-utils": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
- "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+ "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
"dev": true,
- "optional": true,
- "peer": true,
"requires": {
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
"debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
}
},
"@typescript-eslint/types": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
- "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+ "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
- "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+ "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/project-service": "8.46.0",
+ "@typescript-eslint/tsconfig-utils": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4",
- "globby": "^11.1.0",
+ "fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true
- },
"brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -9091,39 +8512,31 @@
}
},
"@typescript-eslint/utils": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
- "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+ "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
"dev": true,
"requires": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0"
- },
- "dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true
- }
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0"
}
},
"@typescript-eslint/visitor-keys": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
- "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+ "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "7.18.0",
- "eslint-visitor-keys": "^3.4.3"
+ "@typescript-eslint/types": "8.46.0",
+ "eslint-visitor-keys": "^4.2.1"
},
"dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true
}
}
@@ -9305,12 +8718,12 @@
"dev": true
},
"ast-metadata-inferer": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
- "integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
+ "integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
"dev": true,
"requires": {
- "@mdn/browser-compat-data": "^5.2.34"
+ "@mdn/browser-compat-data": "^5.6.19"
}
},
"astral-regex": {
@@ -9355,6 +8768,12 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "baseline-browser-mapping": {
+ "version": "2.8.28",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz",
+ "integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==",
+ "dev": true
+ },
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -9396,15 +8815,16 @@
"dev": true
},
"browserslist": {
- "version": "4.24.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
- "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "version": "4.28.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
+ "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001688",
- "electron-to-chromium": "^1.5.73",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
+ "baseline-browser-mapping": "^2.8.25",
+ "caniuse-lite": "^1.0.30001754",
+ "electron-to-chromium": "^1.5.249",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.1.4"
}
},
"browserslist-config-wikimedia": {
@@ -9455,9 +8875,9 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001692",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
- "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+ "version": "1.0.30001754",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+ "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
"dev": true
},
"caseless": {
@@ -9477,9 +8897,9 @@
}
},
"ci-info": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
- "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz",
+ "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==",
"dev": true
},
"clean-regexp": {
@@ -9489,6 +8909,14 @@
"dev": true,
"requires": {
"escape-string-regexp": "^1.0.5"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ }
}
},
"clean-stack": {
@@ -9592,12 +9020,12 @@
}
},
"core-js-compat": {
- "version": "3.37.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
- "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+ "version": "3.46.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz",
+ "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==",
"dev": true,
"requires": {
- "browserslist": "^4.23.0"
+ "browserslist": "^4.26.3"
}
},
"core-util-is": {
@@ -9703,9 +9131,9 @@
"dev": true
},
"debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"requires": {
"ms": "^2.1.3"
@@ -9746,6 +9174,12 @@
"integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
"dev": true
},
+ "diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "dev": true
+ },
"dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -9885,9 +9319,9 @@
}
},
"electron-to-chromium": {
- "version": "1.5.80",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz",
- "integrity": "sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==",
+ "version": "1.5.253",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.253.tgz",
+ "integrity": "sha512-O0tpQ/35rrgdiGQ0/OFWhy1itmd9A6TY9uQzlqj3hKSu/aYpe7UIn5d7CU2N9myH6biZiWF3VMZVuup8pw5U9w==",
"dev": true
},
"emoji-regex": {
@@ -9906,9 +9340,9 @@
}
},
"enhanced-resolve": {
- "version": "5.17.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
- "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
+ "version": "5.18.3",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.4",
@@ -9949,9 +9383,9 @@
"dev": true
},
"escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
},
"escodegen": {
@@ -10061,12 +9495,6 @@
"text-table": "^0.2.0"
},
"dependencies": {
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true
- },
"find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -10125,212 +9553,56 @@
}
},
"eslint-compat-utils": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
- "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+ "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
"dev": true,
"requires": {
"semver": "^7.5.4"
}
},
"eslint-config-wikimedia": {
- "version": "0.31.0",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.31.0.tgz",
- "integrity": "sha512-Z/t/zGPdxs/ehxb0EM6THNWAzueT7GtuqzjUvmBpkxcTKzZPJEXWnnpswdj/hgv8Ce8PIeDp0zwQxR4e3c9CIw==",
+ "version": "0.32.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.1.tgz",
+ "integrity": "sha512-gPvhyVFNlpKFOcJfoVTNlzg3A0b6qjhAbjjBIJ9xp5m+om0oqix5gkqIIEav5BaGxdDxYNmrY4ge3DAPP3u/lg==",
"dev": true,
"requires": {
"@stylistic/eslint-plugin": "^3.1.0",
- "@typescript-eslint/eslint-plugin": "8.35.1",
- "@typescript-eslint/parser": "8.35.1",
+ "@typescript-eslint/eslint-plugin": "8.46.0",
+ "@typescript-eslint/parser": "8.46.0",
"browserslist-config-wikimedia": "^0.7.0",
"eslint": "^8.57.0",
- "eslint-plugin-compat": "^4.2.0",
- "eslint-plugin-es-x": "^7.6.0",
- "eslint-plugin-jest": "^28.5.0",
- "eslint-plugin-jsdoc": "48.2.5",
+ "eslint-plugin-compat": "^6.0.2",
+ "eslint-plugin-es-x": "^8.7.0",
+ "eslint-plugin-jest": "^29.0.1",
+ "eslint-plugin-jsdoc": "61.0.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.7.0",
- "eslint-plugin-mocha": "^10.4.3",
- "eslint-plugin-n": "^17.7.0",
+ "eslint-plugin-mediawiki": "^0.8.1",
+ "eslint-plugin-mocha": "^10.5.0",
+ "eslint-plugin-n": "^17.23.1",
"eslint-plugin-no-jquery": "^3.1.1",
- "eslint-plugin-qunit": "^8.1.1",
- "eslint-plugin-security": "^1.7.1",
- "eslint-plugin-unicorn": "^53.0.0",
- "eslint-plugin-vue": "^9.26.0",
- "eslint-plugin-wdio": "^8.24.12",
- "eslint-plugin-yml": "^1.14.0"
- },
- "dependencies": {
- "@typescript-eslint/eslint-plugin": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
- "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
- "dev": true,
- "requires": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/type-utils": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
- },
- "dependencies": {
- "@typescript-eslint/type-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
- "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.1.0"
- }
- },
- "@typescript-eslint/utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
- "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
- "dev": true,
- "requires": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1"
- }
- }
- }
- },
- "@typescript-eslint/parser": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
- "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
- "dev": true,
- "requires": {
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "debug": "^4.3.4"
- }
- },
- "@typescript-eslint/project-service": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
- "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
- "dev": true,
- "requires": {
- "@typescript-eslint/tsconfig-utils": "^8.35.1",
- "@typescript-eslint/types": "^8.35.1",
- "debug": "^4.3.4"
- }
- },
- "@typescript-eslint/scope-manager": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
- "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1"
- }
- },
- "@typescript-eslint/tsconfig-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
- "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
- "dev": true,
- "requires": {}
- },
- "@typescript-eslint/types": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
- "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
- "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
- "dev": true,
- "requires": {
- "@typescript-eslint/project-service": "8.35.1",
- "@typescript-eslint/tsconfig-utils": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
- "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.35.1",
- "eslint-visitor-keys": "^4.2.1"
- }
- },
- "brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
- "dev": true
- },
- "ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
- "dev": true
- },
- "minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "requires": {}
- }
+ "eslint-plugin-qunit": "^8.2.5",
+ "eslint-plugin-security": "^3.0.1",
+ "eslint-plugin-unicorn": "^56.0.1",
+ "eslint-plugin-vue": "^9.33.0",
+ "eslint-plugin-wdio": "^9.16.2",
+ "eslint-plugin-yml": "^1.19.0"
}
},
"eslint-plugin-compat": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
- "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
+ "integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
"dev": true,
"requires": {
- "@mdn/browser-compat-data": "^5.3.13",
- "ast-metadata-inferer": "^0.8.0",
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001524",
+ "@mdn/browser-compat-data": "^5.5.35",
+ "ast-metadata-inferer": "^0.8.1",
+ "browserslist": "^4.24.2",
+ "caniuse-lite": "^1.0.30001687",
"find-up": "^5.0.0",
+ "globals": "^15.7.0",
"lodash.memoize": "^4.1.2",
- "semver": "^7.5.4"
+ "semver": "^7.6.2"
},
"dependencies": {
"find-up": {
@@ -10343,6 +9615,12 @@
"path-exists": "^4.0.0"
}
},
+ "globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true
+ },
"locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -10373,47 +9651,61 @@
}
},
"eslint-plugin-es-x": {
- "version": "7.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.7.0.tgz",
- "integrity": "sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==",
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-8.7.0.tgz",
+ "integrity": "sha512-Du5Sb067sjqzmglaPhsfcEQgE1EYfL8sko+4jOMcAB/XKGoCxntSrOmTYuVzswA1rzM9+MZwH6+GOp0G3/wVCg==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.1.2",
- "@eslint-community/regexpp": "^4.6.0",
- "eslint-compat-utils": "^0.5.1"
+ "@eslint-community/regexpp": "^4.12.1",
+ "eslint-compat-utils": "^0.6.3"
}
},
"eslint-plugin-jest": {
- "version": "28.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz",
- "integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==",
+ "version": "29.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
+ "integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
"dev": true,
"requires": {
- "@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
+ "@typescript-eslint/utils": "^8.0.0"
}
},
"eslint-plugin-jsdoc": {
- "version": "48.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
- "integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
+ "version": "61.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
+ "integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
"dev": true,
"requires": {
- "@es-joy/jsdoccomment": "~0.43.0",
+ "@es-joy/jsdoccomment": "~0.75.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
- "debug": "^4.3.4",
+ "debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "esquery": "^1.5.0",
- "is-builtin-module": "^3.2.1",
- "semver": "^7.6.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.6.0",
+ "html-entities": "^2.6.0",
+ "object-deep-merge": "^1.0.5",
+ "parse-imports-exports": "^0.2.4",
+ "semver": "^7.7.3",
"spdx-expression-parse": "^4.0.0"
},
"dependencies": {
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true
+ },
+ "espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ }
}
}
},
@@ -10428,19 +9720,18 @@
}
},
"eslint-plugin-mediawiki": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
- "integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
+ "integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
"dev": true,
"requires": {
- "eslint-plugin-vue": "^9.23.0",
"upath": "^2.0.1"
}
},
"eslint-plugin-mocha": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
- "integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz",
+ "integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==",
"dev": true,
"requires": {
"eslint-utils": "^3.0.0",
@@ -10449,44 +9740,47 @@
}
},
"eslint-plugin-n": {
- "version": "17.8.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.8.1.tgz",
- "integrity": "sha512-KdG0h0voZms8UhndNu8DeWx1eM4sY+A4iXtsNo6kOfJLYHNeTGPacGalJ9GcvrbmOL3r/7QOMwVZDSw+1SqsrA==",
- "dev": true,
- "requires": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "enhanced-resolve": "^5.17.0",
- "eslint-plugin-es-x": "^7.5.0",
- "get-tsconfig": "^4.7.0",
- "globals": "^15.0.0",
- "ignore": "^5.2.4",
- "minimatch": "^9.0.0",
- "semver": "^7.5.3"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "17.23.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
+ "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/eslint-utils": "^4.5.0",
+ "enhanced-resolve": "^5.17.1",
+ "eslint-plugin-es-x": "^7.8.0",
+ "get-tsconfig": "^4.8.1",
+ "globals": "^15.11.0",
+ "globrex": "^0.1.2",
+ "ignore": "^5.3.2",
+ "semver": "^7.6.3",
+ "ts-declaration-location": "^1.0.6"
+ },
+ "dependencies": {
+ "eslint-compat-utils": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+ "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
"dev": true,
"requires": {
- "balanced-match": "^1.0.0"
+ "semver": "^7.5.4"
}
},
- "globals": {
- "version": "15.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-15.4.0.tgz",
- "integrity": "sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==",
- "dev": true
- },
- "minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "eslint-plugin-es-x": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+ "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
"dev": true,
"requires": {
- "brace-expansion": "^2.0.1"
+ "@eslint-community/eslint-utils": "^4.1.2",
+ "@eslint-community/regexpp": "^4.11.0",
+ "eslint-compat-utils": "^0.5.1"
}
+ },
+ "globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true
}
}
},
@@ -10498,9 +9792,9 @@
"requires": {}
},
"eslint-plugin-qunit": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
- "integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
+ "integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
"dev": true,
"requires": {
"eslint-utils": "^3.0.0",
@@ -10508,27 +9802,27 @@
}
},
"eslint-plugin-security": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz",
- "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
+ "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
"dev": true,
"requires": {
"safe-regex": "^2.1.1"
}
},
"eslint-plugin-unicorn": {
- "version": "53.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
- "integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
+ "version": "56.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+ "integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.24.5",
+ "@babel/helper-validator-identifier": "^7.24.7",
"@eslint-community/eslint-utils": "^4.4.0",
- "@eslint/eslintrc": "^3.0.2",
"ci-info": "^4.0.0",
"clean-regexp": "^1.0.0",
- "core-js-compat": "^3.37.0",
- "esquery": "^1.5.0",
+ "core-js-compat": "^3.38.1",
+ "esquery": "^1.6.0",
+ "globals": "^15.9.0",
"indent-string": "^4.0.0",
"is-builtin-module": "^3.2.1",
"jsesc": "^3.0.2",
@@ -10536,71 +9830,28 @@
"read-pkg-up": "^7.0.1",
"regexp-tree": "^0.1.27",
"regjsparser": "^0.10.0",
- "semver": "^7.6.1",
+ "semver": "^7.6.3",
"strip-indent": "^3.0.0"
},
"dependencies": {
- "@eslint/eslintrc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
- "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
- "dev": true,
- "requires": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- }
- },
- "eslint-visitor-keys": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
- "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
- "dev": true
- },
- "espree": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
- "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
- "dev": true,
- "requires": {
- "acorn": "^8.11.3",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.0.0"
- }
- },
"globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true
},
"jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"dev": true
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
}
}
},
"eslint-plugin-vue": {
- "version": "9.26.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz",
- "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==",
+ "version": "9.33.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+ "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.4.0",
@@ -10608,8 +9859,8 @@
"natural-compare": "^1.4.0",
"nth-check": "^2.1.1",
"postcss-selector-parser": "^6.0.15",
- "semver": "^7.6.0",
- "vue-eslint-parser": "^9.4.2",
+ "semver": "^7.6.3",
+ "vue-eslint-parser": "^9.4.3",
"xml-name-validator": "^4.0.0"
},
"dependencies": {
@@ -10622,20 +9873,21 @@
}
},
"eslint-plugin-wdio": {
- "version": "8.24.12",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
- "integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
+ "version": "9.16.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
+ "integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
"dev": true
},
"eslint-plugin-yml": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
- "integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.0.tgz",
+ "integrity": "sha512-S+4GbcCWksFKAvFJtf0vpdiCkZZvDJCV4Zsi9ahmYkYOYcf+LRqqzvzkb/ST7vTYV6sFwXOvawzYyL/jFT2nQA==",
"dev": true,
"requires": {
"debug": "^4.3.2",
- "eslint-compat-utils": "^0.5.0",
- "lodash": "^4.17.21",
+ "diff-sequences": "^27.5.1",
+ "escape-string-regexp": "4.0.0",
+ "eslint-compat-utils": "^0.6.0",
"natural-compare": "^1.4.0",
"yaml-eslint-parser": "^1.2.1"
}
@@ -10699,9 +9951,9 @@
"dev": true
},
"esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
@@ -11018,9 +10270,9 @@
"dev": true
},
"get-tsconfig": {
- "version": "4.7.5",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
- "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+ "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
"dev": true,
"requires": {
"resolve-pkg-maps": "^1.0.0"
@@ -11217,9 +10469,9 @@
}
},
"js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -11378,6 +10630,12 @@
"whatwg-encoding": "^1.0.1"
}
},
+ "html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "dev": true
+ },
"html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -11423,9 +10681,9 @@
}
},
"ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true
},
"import-fresh": {
@@ -11778,9 +11036,9 @@
"dev": true
},
"js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
"requires": {
"argparse": "^2.0.1"
@@ -11793,9 +11051,9 @@
"dev": true
},
"jsdoc-type-pratt-parser": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
- "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
+ "integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
"dev": true
},
"jsdom": {
@@ -12189,9 +11447,9 @@
}
},
"node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"dev": true
},
"node-watch": {
@@ -12251,9 +11509,9 @@
"dev": true
},
"nyc": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz",
- "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
"dev": true,
"requires": {
"@istanbuljs/load-nyc-config": "^1.0.0",
@@ -12264,6 +11522,7 @@
"find-cache-dir": "^3.2.0",
"find-up": "^4.1.0",
"foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
"glob": "^7.1.6",
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-hook": "^3.0.0",
@@ -12271,10 +11530,9 @@
"istanbul-lib-processinfo": "^2.0.2",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.0.0",
- "js-yaml": "^3.13.1",
+ "istanbul-reports": "^3.0.2",
"make-dir": "^3.0.0",
- "node-preload": "^0.2.0",
+ "node-preload": "^0.2.1",
"p-map": "^3.0.0",
"process-on-spawn": "^1.0.0",
"resolve-from": "^5.0.0",
@@ -12282,19 +11540,9 @@
"signal-exit": "^3.0.2",
"spawn-wrap": "^2.0.0",
"test-exclude": "^6.0.0",
- "uuid": "^3.3.3",
"yargs": "^15.0.2"
},
"dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -12318,16 +11566,6 @@
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
"make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -12358,12 +11596,6 @@
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
},
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "dev": true
- },
"wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@@ -12418,6 +11650,23 @@
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true
},
+ "object-deep-merge": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
+ "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "4.2.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
+ "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
+ "dev": true
+ }
+ }
+ },
"object.defaults": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
@@ -12581,6 +11830,15 @@
"path-root": "^0.1.1"
}
},
+ "parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+ "dev": true,
+ "requires": {
+ "parse-statements": "1.0.11"
+ }
+ },
"parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -12599,6 +11857,12 @@
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
"dev": true
},
+ "parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+ "dev": true
+ },
"parse5": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
@@ -12750,9 +12014,9 @@
"requires": {}
},
"postcss-selector-parser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
- "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
@@ -13081,9 +12345,9 @@
}
},
"semver": {
- "version": "7.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true
},
"set-blocking": {
@@ -13250,9 +12514,9 @@
}
},
"spdx-license-ids": {
- "version": "3.0.18",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
- "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
+ "version": "3.0.22",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz",
+ "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==",
"dev": true
},
"sprintf-js": {
@@ -13658,9 +12922,9 @@
}
},
"tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
"dev": true
},
"test-exclude": {
@@ -13739,12 +13003,29 @@
}
},
"ts-api-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
- "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"dev": true,
"requires": {}
},
+ "ts-declaration-location": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+ "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^4.0.2"
+ },
+ "dependencies": {
+ "picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true
+ }
+ }
+ },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -13847,9 +13128,9 @@
"dev": true
},
"update-browserslist-db": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
- "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+ "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
"dev": true,
"requires": {
"escalade": "^3.2.0",
@@ -14112,20 +13393,19 @@
"dev": true
},
"yaml-eslint-parser": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
- "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz",
+ "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^3.0.0",
- "lodash": "^4.17.21",
"yaml": "^2.0.0"
},
"dependencies": {
"yaml": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
- "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
"dev": true
}
}
diff --git a/package.json b/package.json
index f720256..81f3f34 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
},
"devDependencies": {
"dotenv": "8.0.0",
- "eslint-config-wikimedia": "0.31.0",
+ "eslint-config-wikimedia": "0.32.1",
"grunt": "1.6.1",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
@@ -22,7 +22,7 @@
"jsdom": "14.0.0",
"mockery": "2.1.0",
"mustache": "3.0.1",
- "nyc": "15.0.0",
+ "nyc": "15.1.0",
"oojs": "3.0.0",
"oojs-ui": "0.36.3",
"qunit": "2.24.1",
diff --git a/resources/.eslintrc.json b/resources/.eslintrc.json
index d3712ee..f1163ac 100644
--- a/resources/.eslintrc.json
+++ b/resources/.eslintrc.json
@@ -9,7 +9,8 @@
},
"rules": {
"max-len": "off",
- "no-jquery/no-done-fail": "warn"
+ "no-jquery/no-done-fail": "warn",
+ "mediawiki/no-unlabeled-buttonwidget": "warn"
},
"settings": {
"jsdoc": {
--
2.47.3
$ date
--- stdout ---
Sat Nov 15 15:27:10 UTC 2025
--- end ---
$ git clone file:///srv/git/mediawiki-extensions-WikibaseMediaInfo.git repo --depth=1 -b master
--- stderr ---
Cloning into 'repo'...
--- stdout ---
--- end ---
$ git config user.name libraryupgrader
--- stdout ---
--- end ---
$ git config user.email tools.libraryupgrader@tools.wmflabs.org
--- stdout ---
--- end ---
$ git submodule update --init
--- stdout ---
--- end ---
$ grr init
--- stdout ---
Installed commit-msg hook.
--- end ---
$ git show-ref refs/heads/master
--- stdout ---
897c92551107cca3de424bdf0c6d78cba794ddfc refs/heads/master
--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {
"@istanbuljs/load-nyc-config": {
"name": "@istanbuljs/load-nyc-config",
"severity": "moderate",
"isDirect": false,
"via": [
"js-yaml"
],
"effects": [
"nyc"
],
"range": "*",
"nodes": [
"node_modules/@istanbuljs/load-nyc-config"
],
"fixAvailable": {
"name": "nyc",
"version": "15.1.0",
"isSemVerMajor": false
}
},
"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": "27.2.0",
"isSemVerMajor": true
}
},
"grunt": {
"name": "grunt",
"severity": "moderate",
"isDirect": true,
"via": [
"js-yaml"
],
"effects": [
"grunt-eslint"
],
"range": ">=0.4.0-a",
"nodes": [
"node_modules/grunt"
],
"fixAvailable": {
"name": "grunt",
"version": "0.3.17",
"isSemVerMajor": true
}
},
"grunt-eslint": {
"name": "grunt-eslint",
"severity": "moderate",
"isDirect": true,
"via": [
"grunt"
],
"effects": [],
"range": "<=1.0.0 || >=18.1.0",
"nodes": [
"node_modules/grunt-eslint"
],
"fixAvailable": {
"name": "grunt-eslint",
"version": "18.0.0",
"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": 1102100,
"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.2.0 <3.5.0"
},
{
"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"
}
],
"effects": [
"oojs-ui"
],
"range": "<=3.4.1",
"nodes": [
"node_modules/oojs-ui/node_modules/jquery"
],
"fixAvailable": {
"name": "oojs-ui",
"version": "0.53.0",
"isSemVerMajor": true
}
},
"js-yaml": {
"name": "js-yaml",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1109754,
"name": "js-yaml",
"dependency": "js-yaml",
"title": "js-yaml has prototype pollution in merge (<<)",
"url": "https://github.com/advisories/GHSA-mh29-5h37-fv8m",
"severity": "moderate",
"cwe": [
"CWE-1321"
],
"cvss": {
"score": 5.3,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
},
"range": "<4.1.1"
}
],
"effects": [
"@istanbuljs/load-nyc-config",
"grunt",
"nyc"
],
"range": "<4.1.1",
"nodes": [
"node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml",
"node_modules/grunt/node_modules/js-yaml",
"node_modules/js-yaml",
"node_modules/nyc/node_modules/js-yaml"
],
"fixAvailable": {
"name": "grunt",
"version": "0.3.17",
"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": "27.2.0",
"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
},
"nyc": {
"name": "nyc",
"severity": "moderate",
"isDirect": true,
"via": [
"@istanbuljs/load-nyc-config",
"js-yaml"
],
"effects": [],
"range": ">=14.1.0",
"nodes": [
"node_modules/nyc"
],
"fixAvailable": {
"name": "nyc",
"version": "15.1.0",
"isSemVerMajor": 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.0",
"isSemVerMajor": true
}
},
"request": {
"name": "request",
"severity": "critical",
"isDirect": false,
"via": [
{
"source": 1096727,
"name": "request",
"dependency": "request",
"title": "Server-Side Request Forgery in Request",
"url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
"severity": "moderate",
"cwe": [
"CWE-918"
],
"cvss": {
"score": 6.1,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
},
"range": "<=2.88.2"
},
"form-data",
"tough-cookie"
],
"effects": [
"jsdom",
"request-promise-core",
"request-promise-native"
],
"range": "*",
"nodes": [
"node_modules/request"
],
"fixAvailable": {
"name": "jsdom",
"version": "27.2.0",
"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": "27.2.0",
"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": "27.2.0",
"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": "27.2.0",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 1,
"moderate": 11,
"high": 1,
"critical": 3,
"total": 16
},
"dependencies": {
"prod": 1,
"dev": 680,
"optional": 5,
"peer": 5,
"peerOptional": 0,
"total": 680
}
}
}
--- 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: 39 installs, 0 updates, 0 removals
- Locking composer/pcre (3.3.2)
- Locking composer/semver (3.4.4)
- Locking composer/spdx-licenses (1.5.9)
- Locking composer/xdebug-handler (3.0.5)
- Locking dealerdirect/phpcodesniffer-composer-installer (v1.2.0)
- Locking doctrine/deprecations (1.1.5)
- Locking felixfbecker/advanced-json-rpc (v3.2.1)
- Locking mediawiki/mediawiki-codesniffer (v48.0.0)
- Locking mediawiki/mediawiki-phan-config (0.17.0)
- Locking mediawiki/minus-x (1.1.3)
- Locking mediawiki/phan-taint-check-plugin (7.0.0)
- Locking microsoft/tolerant-php-parser (v0.1.2)
- Locking netresearch/jsonmapper (v4.5.0)
- Locking phan/phan (5.5.1)
- Locking php-parallel-lint/php-console-color (v1.0.1)
- Locking php-parallel-lint/php-console-highlighter (v1.0.0)
- Locking php-parallel-lint/php-parallel-lint (v1.4.0)
- Locking phpcsstandards/phpcsextra (1.4.0)
- Locking phpcsstandards/phpcsutils (1.1.1)
- Locking phpdocumentor/reflection-common (2.2.0)
- Locking phpdocumentor/reflection-docblock (5.6.3)
- Locking phpdocumentor/type-resolver (1.10.0)
- Locking phpstan/phpdoc-parser (2.3.0)
- Locking psr/container (2.0.2)
- Locking psr/log (3.0.2)
- Locking sabre/event (5.1.7)
- Locking serialization/serialization (4.1.0)
- Locking squizlabs/php_codesniffer (3.13.2)
- Locking symfony/console (v7.3.6)
- Locking symfony/deprecation-contracts (v3.6.0)
- Locking symfony/polyfill-ctype (v1.33.0)
- Locking symfony/polyfill-intl-grapheme (v1.33.0)
- Locking symfony/polyfill-intl-normalizer (v1.33.0)
- Locking symfony/polyfill-mbstring (v1.33.0)
- Locking symfony/polyfill-php80 (v1.33.0)
- Locking symfony/service-contracts (v3.6.1)
- Locking symfony/string (v7.3.4)
- Locking tysonandre/var_representation_polyfill (0.1.3)
- Locking webmozart/assert (1.12.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 39 installs, 0 updates, 0 removals
0 [>---------------------------] 0 [->--------------------------]
- Installing squizlabs/php_codesniffer (3.13.2): Extracting archive
- Installing dealerdirect/phpcodesniffer-composer-installer (v1.2.0): Extracting archive
- Installing composer/pcre (3.3.2): Extracting archive
- Installing phpcsstandards/phpcsutils (1.1.1): Extracting archive
- Installing phpcsstandards/phpcsextra (1.4.0): Extracting archive
- Installing symfony/polyfill-mbstring (v1.33.0): Extracting archive
- Installing composer/spdx-licenses (1.5.9): Extracting archive
- Installing composer/semver (3.4.4): Extracting archive
- Installing mediawiki/mediawiki-codesniffer (v48.0.0): Extracting archive
- Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
- Installing symfony/polyfill-php80 (v1.33.0): Extracting archive
- Installing symfony/polyfill-intl-normalizer (v1.33.0): Extracting archive
- Installing symfony/polyfill-intl-grapheme (v1.33.0): Extracting archive
- Installing symfony/polyfill-ctype (v1.33.0): Extracting archive
- Installing symfony/string (v7.3.4): Extracting archive
- Installing symfony/deprecation-contracts (v3.6.0): Extracting archive
- Installing psr/container (2.0.2): Extracting archive
- Installing symfony/service-contracts (v3.6.1): Extracting archive
- Installing symfony/console (v7.3.6): Extracting archive
- Installing sabre/event (5.1.7): Extracting archive
- Installing netresearch/jsonmapper (v4.5.0): Extracting archive
- Installing microsoft/tolerant-php-parser (v0.1.2): Extracting archive
- Installing webmozart/assert (1.12.1): Extracting archive
- Installing phpstan/phpdoc-parser (2.3.0): Extracting archive
- Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
- Installing doctrine/deprecations (1.1.5): Extracting archive
- Installing phpdocumentor/type-resolver (1.10.0): Extracting archive
- Installing phpdocumentor/reflection-docblock (5.6.3): Extracting archive
- Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
- Installing psr/log (3.0.2): Extracting archive
- Installing composer/xdebug-handler (3.0.5): Extracting archive
- Installing phan/phan (5.5.1): Extracting archive
- Installing mediawiki/phan-taint-check-plugin (7.0.0): Extracting archive
- Installing mediawiki/mediawiki-phan-config (0.17.0): Extracting archive
- Installing mediawiki/minus-x (1.1.3): Extracting archive
- Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
- Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
- Installing php-parallel-lint/php-parallel-lint (v1.4.0): Extracting archive
- Installing serialization/serialization (4.1.0): Extracting archive
0/37 [>---------------------------] 0%
27/37 [====================>-------] 72%
37/37 [============================] 100%
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
17 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils
--- end ---
Upgrading n:eslint-config-wikimedia from 0.31.0 -> 0.32.1
$ /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 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 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 657 packages, and audited 658 packages in 21s
108 packages are looking for funding
run `npm fund` for details
16 vulnerabilities (1 low, 11 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 package-lock.json
--- stdout ---
Checking package-lock.json
--- end ---
$ /usr/bin/npm install grunt-eslint@24.3.0 --save-exact
--- stdout ---
removed 1 package, and audited 658 packages in 2s
108 packages are looking for funding
run `npm fund` for details
16 vulnerabilities (1 low, 11 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 package-lock.json
--- stdout ---
Checking package-lock.json
--- end ---
$ ./node_modules/.bin/eslint . --fix
--- stdout ---
/src/repo/resources/README/1.ExampleComponentWidget.js
64:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
118:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
148:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/README/2.TemplatingFeatures.js
53:11 error OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
75:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/README/3.BestPractices.js
68:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/base/ComponentWidget.js
31:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
43:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
66:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
88:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
127:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
274:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
626:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
/src/repo/resources/base/FormatValueElement.js
54:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/datamodel/MediaInfo.js
11:1 warning The type 'datamodel.Entity' is undefined jsdoc/no-undefined-types
18:1 warning The type 'datamodel.TermMap' is undefined jsdoc/no-undefined-types
19:1 warning The type 'datamodel.TermMap' is undefined jsdoc/no-undefined-types
20:1 warning The type 'datamodel.StatementGroupSet' is undefined jsdoc/no-undefined-types
49:1 warning The type 'datamodel.StatementGroupSet' is undefined jsdoc/no-undefined-types
55:1 warning The type 'datamodel.StatementGroupSet' is undefined jsdoc/no-undefined-types
/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 error OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/filepage/CaptionsPanel.js
39:1 warning The type 'datamodel.MediaInfo' is undefined jsdoc/no-undefined-types
106:1 warning The type 'datamodel.MediaInfo' is undefined jsdoc/no-undefined-types
230:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
241:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
289:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
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/LicenseDialogWidget.js
20:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/filepage/StatementPanel.js
26:1 warning The type 'dataLoadedReadOnly' is undefined jsdoc/no-undefined-types
76:1 warning The type 'datamodel.StatementList' is undefined jsdoc/no-undefined-types
77:1 warning The type 'jQuery.promise' is undefined jsdoc/no-undefined-types
240:1 warning The type 'widgetRemoved' is undefined jsdoc/no-undefined-types
/src/repo/resources/serialization/MediaInfoDeserializer.js
10:1 warning The type 'SERIALIZER.Deserializer' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/AddPropertyWidget.js
53:23 error OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
86:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
98:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/ItemWidget.js
135:24 error OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
232:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
250:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
350:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
411:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
473:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/LinkNoticeWidget.js
62:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/SnakListWidget.js
78:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
139:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
167:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
230:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/SnakWidget.js
93:22 error OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
116:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
136:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
146:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
245:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
254:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/StatementWidget.js
186:1 warning The type 'change' is undefined jsdoc/no-undefined-types
251:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
323:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
335:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
417:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
433:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
675:2 warning Prefer .then to .done no-jquery/no-done-fail
/src/repo/resources/statements/inputs/AbstractInputWidget.js
15:1 warning The type 'AbstractInputWidget' is undefined jsdoc/no-undefined-types
22:1 warning The type 'AbstractInputWidget' is undefined jsdoc/no-undefined-types
63:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
74:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
110:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/EntityAutocompleteInputWidget.js
79:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/GlobeCoordinateInputWidget.js
110:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
389:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/MultiTypeInputWrapperWidget.js
136:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
180:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
293:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/QuantityInputWidget.js
90:27 error OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/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
✖ 123 problems (6 errors, 117 warnings)
--- end ---
$ ./node_modules/.bin/eslint . -f json
--- stdout ---
[{"filePath":"/src/repo/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":64,"column":1,"nodeType":"Block","endLine":64,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":118,"column":1,"nodeType":"Block","endLine":118,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":148,"column":1,"nodeType":"Block","endLine":148,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst ComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget;\n\n/**\n * This is an example ComponentWidget implementation, to show\n * how to use/implement its methods to control the rendering flow.\n *\n * ComponentWidget is a mixin with a very simple API. The purpose\n * of this plugin is to automate template-based rendering by regulating\n * when to automatically rerender: when data changes, but changes are\n * queued/combined to avoid race conditions, and active DOM nodes getting\n * replaced.\n *\n * There are 3 protected methods that any implementation can override\n * to control what happens:\n *\n * - shouldRerender( previousState: Object ): boolean\n * Called before rerender, can prevent automatic rerender (e.g. when\n * nothing relevant to output has changed)\n * - getTemplateData(): Promise<Object> | Object\n * Provides the variables to the template\n * - setState( state: Object ): Promise<jQuery>\n * Not to be implemented/overwritten by implementations - only meant\n * to be called with new data (which will then trigger rerender)\n *\n * There is 1 public method:\n *\n * - render()\n * Can be called both from the inside or outside, to retrieve a promise\n * that will return the DOM (jQuery nodes) once it has completed rendering\n *\n * @constructor\n * @param {Object} config\n */\nconst ExampleComponentWidget = function ExampleComponentWidgetConstructor( config ) {\n\tconfig = config || {};\n\n\tExampleComponentWidget.super.call( this, config );\n\n\t// initialize state - this data will be used for the initial render\n\tthis.state = Object.assign( {}, config, {\n\t\tediting: false,\n\t\tdisabled: false,\n\t\ttitle: config.title || 'Main Page'\n\t} );\n\n\t// wire up ComponentWidget, kicking off the initial render\n\tComponentWidget.call(\n\t\tthis,\n\t\t// these 2 arguments are the name of the module and the relevant\n\t\t// template, as defined in extension.json ResourceModules\n\t\t'wikibase.mediainfo.readme',\n\t\t'templates/README/1.ExampleComponentWidget.mustache+dom'\n\t);\n};\nOO.inheritClass( ExampleComponentWidget, OO.ui.Widget );\nOO.mixinClass( ExampleComponentWidget, ComponentWidget );\n\n/**\n * Called after state has been modified, and before rerendering.\n * Return an object to be passed on to the template.\n *\n * @return {Object|jQuery.Promise<Object>}\n */\nExampleComponentWidget.prototype.getTemplateData = function () {\n\t// this method will be used to feed data to the template\n\t// it should return a { key: value } map of variables to\n\t// be parsed into the template\n\n\t// if this method is not implemented, it'll default to\n\t// parsing the entire content of `this.state` into the template\n\t// i.e.: `return this.state;`\n\n\t// but it can be useful to keep `state` minimal, and use this\n\t// method to derive additional data from the state. E.g.:\n\treturn {\n\t\tediting: this.state.editing && !this.state.disabled,\n\t\tdisabled: this.state.disabled,\n\t\ttitle: new mw.Title( this.state.title ).getNameText(),\n\t\tnamespace: new mw.Title( this.state.title ).getNamespaceId(),\n\t\timages: []\n\t};\n\n\t// or it could return a promise that resolves with such object\n\t// (useful when e.g. API requests are needed to grab some of the\n\t// data - careful though, better cache API responses to avoid\n\t// making the same API call every time we have to rerender)\n\t/*\n\tvar self = this;\n\tthis.cache = this.cache || {};\n\tif ( !( this.state.title in this.cache ) ) {\n\t\tthis.cache[ this.state.title ] = new mw.Api().get( { action: 'query', titles: this.state.title, prop: 'images' } );\n\t}\n\treturn this.cache[ this.state.title ].then( function ( result ) {\n\t\tvar result.query.pages[ Object.keys( result.query.pages ).pop() ];\n\t\treturn {\n\t\t\tediting: self.state.editing && !self.state.disabled,\n\t\t\tdisabled: self.state.disabled,\n\t\t\ttitle: data.title,\n\t\t\tnamespace: data.ns,\n\t\t\timages: data.images.map( function ( image ) {\n\t\t\t\treturn image.title;\n\t\t\t} )\n\t\t};\n\t} );\n\t*/\n};\n\n/**\n * Called after state has been modified, and before rerendering.\n * Return false to prevent rerender.\n *\n * Argument previousState can be used to compare again new\n * `this.state` to determine whether a rerender is warranted.\n *\n * @param {Object} previousState\n * @return {Object|jQuery.Promise<Object>}\n */\nExampleComponentWidget.prototype.shouldRerender = function ( previousState ) {\n\t// this method can be used to tell the rendering pipeline whether\n\t// or not to go ahead rerendering a change, by returning `true` or `false`\n\n\t// this can be used to prevent changes in data from actually\n\t// rerendering the data when it should or must not do so (possibly\n\t// because the data is in an incomplete/invalid state and it must\n\t// not change for some reason)\n\n\t// the `previousState` argument is the data that was used in the\n\t// previous render of the component (i.e. what is currently being\n\t// displayed)\n\t// `this.state` is the new data, that'll be used in a new rerender\n\n\t// an example, where we may not want to render any updates when the\n\t// widget is disabled, until it gets re-enabled:\n\treturn previousState.disabled !== true || this.state.disabled !== true;\n\n\t// this method does not have to exist, in which case it'll just\n\t// default to `true`, i.e. rerender whenever state is changed\n};\n\n/**\n * This is not a ComponentWidget method that we're overriding, but\n * just a random 'own' example method to demonstrate the use of\n * `this.setState`\n *\n * @param {boolean} editing\n * @return {jQuery.Promise<jQuery>}\n */\nExampleComponentWidget.prototype.setEditing = function ( editing ) {\n\t// this is just an example method that needs to manipulate some data\n\t// and update the DOM\n\n\t// we can update the internal state of the element with a simple call\n\t// to `this.setState`, where we provide an object with *only the data\n\t// that has changed*, and it'll be merged into the existing state:\n\tlet promise = this.setState( { editing: editing } );\n\t// above will update `this.state` by only overwriting\n\t// `this.state.editing` - other keys in state will remain untouched\n\n\t// if `this.state.editing` has changed, it'll make sure to rerender\n\t// the DOM to reflect the new changes (unless `shouldRerender` tells\n\t// it not to)\n\t// if the new state has not changed, no rerender will happen...\n\n\tpromise = promise.then(\n\t// `this.setState` returns a promise that doesn't resolve until\n\t// `render` is complete and the DOM has been updated (or even\n\t// when it didn't have to rerender, in which case it'll resolve\n\t// right away with the existing DOM)\n\n\t\t// this is useful to synchronize changes, e.g.\n\t\t// - wait until rendering has completed before emitting the relevant events\n\t\t// - wait until rendering has completed before checking correct output in unit tests\n\n\t\t// and the setState promise callback argument will always include\n\t\t// the post-render DOM node `$element`, which is an up-to-date\n\t\t// DOM representation of that new state\n\t\t( $element ) => $element\n\t);\n\n\treturn promise;\n};\n\nmodule.exports = ExampleComponentWidget;\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/2.TemplatingFeatures.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":53,"column":11,"nodeType":"NewExpression","messageId":"noLabel","endLine":53,"endColumn":70},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":75,"column":1,"nodeType":"Block","endLine":75,"endColumn":1}],"suppressedMessages":[],"errorCount":1,"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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":68,"column":1,"nodeType":"Block","endLine":68,"endColumn":1}],"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 & TemplatingFetaures\n * to show some of the current working best practices in MediaInfo.\n *\n * As of writing these examples, not all MediaInfo code has been\n * refactored to match these best practices, and we may come up\n * with more formal best practices, or adjust some of what is\n * described in these examples, in which case I hope we update\n * these to remain relevant :)\n *\n * @constructor\n * @param {Object} config\n */\nconst BestPractices = function BestPracticesConstructor( config ) {\n\tconfig = config || {};\n\n\tBestPractices.super.call( this, config );\n\n\tthis.state = Object.assign( {}, config, {\n\t\tsome: '',\n\t\trelevant: 0,\n\t\tdata: {}\n\t} );\n\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.readme',\n\t\t'templates/README/3.BestPractices.mustache+dom'\n\t);\n};\nOO.inheritClass( BestPractices, OO.ui.Widget );\nOO.mixinClass( BestPractices, ComponentWidget );\n\n/**\n * This method returns a complete and accurate description of the state\n * of this element.\n *\n * This data could be used to construct a new copy of this object.\n *\n * @return {*}\n */\nBestPractices.prototype.getData = function () {\n\t// this could be returned in any format, as long as `setData` accepts\n\t// that same format and is able to convert it to state\n\treturn {\n\t\tsome: this.state.some,\n\t\trelevant: this.state.relevant,\n\t\tdata: this.state.data\n\t};\n};\n\n/**\n * This method accepts data to completely alter all state of this component.\n *\n * It must accept the data in the same format as `getData()` would return it.\n *\n * It must return a promise that resolves with the new DOM, after the\n * component has rerendered with the new data.\n *\n * After completing the rerender, it also throws an event if (and only if)\n * the new data was different than the previous data.\n *\n * @param {*} data\n * @return {jQuery.Promise<jQuery>}\n */\nBestPractices.prototype.setData = function ( data ) {\n\tconst self = this,\n\t\t// some way of determining whether or not the new data is different than\n\t\t// the current state of the component\n\t\t// this could be implemented in any way that makes sense\n\t\thasChanges = JSON.stringify( this.getData() ) !== JSON.stringify( data );\n\n\treturn this.setState( {\n\t\tsome: data.some,\n\t\trelevant: data.relevant,\n\t\tdata: data.data\n\t} ).then( ( $element ) => {\n\t\tif ( hasChanges ) {\n\t\t\tself.emit( 'change' );\n\t\t}\n\t\treturn $element;\n\t} );\n};\n\nmodule.exports = BestPractices;\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/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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":31,"column":1,"nodeType":"Block","endLine":31,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":43,"column":1,"nodeType":"Block","endLine":43,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":66,"column":1,"nodeType":"Block","endLine":66,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":88,"column":1,"nodeType":"Block","endLine":88,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":127,"column":1,"nodeType":"Block","endLine":127,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":274,"column":1,"nodeType":"Block","endLine":274,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":626,"column":1,"nodeType":"Block","endLine":626,"endColumn":1}],"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":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/**\n * @constructor\n * @param {string} moduleName\n * @param {string} templateName\n */\nconst ComponentWidget = function MediaInfoComponentWidget( moduleName, templateName ) {\n\t// add default state for default OOUI functionality where we\n\t// can resonably expect that we'll want to rerender if it\n\t// changes; probably should prefer using OOUI's built-in\n\t// `isDisabled` and `getItems` methods over these copies in state\n\tthis.state = Object.assign( { _disabled: this.isDisabled(), _group: [] }, this.state || {} );\n\tthis.pendingState = {};\n\tthis.moduleName = moduleName;\n\tthis.templateName = templateName;\n\n\t// force initial render\n\tthis.render();\n};\n\n/**\n * Called after state has been modified, and before rerendering.\n * Return false to prevent rerender.\n *\n * Argument previousState can be used to compare again new\n * `this.state` to determine whether a rerender is warranted.\n *\n * @protected\n * @param {Object} previousState\n * @return {Object|jQuery.Promise<Object>}\n */\n// eslint-disable-next-line no-unused-vars\nComponentWidget.prototype.shouldRerender = function ( previousState ) {\n\treturn true;\n};\n\n/**\n * Called after state has been modified, and before rerendering.\n * Return an object to be passed on to the template.\n *\n * @protected\n * @return {Object|jQuery.Promise<Object>}\n */\nComponentWidget.prototype.getTemplateData = function () {\n\treturn this.state;\n};\n\n/**\n * Accepts a `{ key: value }` map (state) whose data will be\n * added to, *not replace*, the current state.\n *\n * E.g. given current this.state is `{ a: 'one' }`, and an\n * argument `{ b: 'two' }` is passed to this method, that'll\n * result in a state of `{ a: 'one', b: 'two' }`.\n *\n * After the state is changed, a rerender will be initiated,\n * which can further be controlled via `shouldRerender` and\n * `getTemplateData`.\n *\n * This method returns a promise that will not resolve until\n * rerendering (if needed) is complete.\n *\n * @protected\n * @param {Object} state\n * @return {jQuery.Promise}\n */\nComponentWidget.prototype.setState = function ( state ) {\n\tconst deferred = $.Deferred();\n\n\t// add the newest state changes - expanding on previous (if any)\n\t// changes that have no yet been rendered (because previous render\n\t// was still happening, possibly)\n\tthis.pendingState = Object.assign( {}, this.pendingState, state );\n\n\t// this will prevent new data from starting a render right\n\t// away (there may be more changes coming in and it'd be\n\t// better if we can combine them) - it'll kick off a new\n\t// render at the end of the current call stack instead\n\tsetTimeout( deferred.resolve );\n\treturn deferred.promise().then( this.render.bind( this ) );\n};\n\n/**\n * Returns a promise that will resolve with the jQuery $element\n * as soon as it is done rendering.\n *\n * @return {jQuery.Promise<jQuery>}\n */\nComponentWidget.prototype.render = function () {\n\tconst self = this;\n\n\tif ( this.renderPromise === undefined ) {\n\t\t// initial render\n\t\tthis.renderPromise = this.renderInternal();\n\t\treturn this.renderPromise;\n\t}\n\n\tthis.renderPromise = this.renderPromise\n\t\t.then( ( $element ) => {\n\t\t\tconst previousState = Object.assign( {}, self.state ),\n\t\t\t\thasChanges = Object.keys( self.pendingState ).some( ( key ) => ( !( key in self.state ) || self.state[ key ] !== self.pendingState[ key ] ) );\n\n\t\t\tself.state = Object.assign( {}, self.state, self.pendingState );\n\t\t\tself.pendingState = {};\n\n\t\t\tif ( !hasChanges ) {\n\t\t\t\t// if there are no changes, the existing render is still valid\n\t\t\t\treturn $element;\n\t\t\t}\n\n\t\t\tif ( !self.shouldRerender( previousState ) ) {\n\t\t\t\t// if code indicates the changes are not worth rerendering, the existing render will do\n\t\t\t\treturn $element;\n\t\t\t}\n\n\t\t\treturn self.renderInternal();\n\t\t} );\n\treturn this.renderPromise;\n};\n\n/**\n * Returns a promise that will resolve with the jQuery $element\n * as soon as it is done rendering.\n *\n * @private\n * @return {jQuery.Promise<jQuery>}\n */\nComponentWidget.prototype.renderInternal = function () {\n\tconst self = this;\n\n\t// always chain renders on top of the previous one, so a new\n\t// render does not conflict with an in-progress one\n\treturn $.Deferred().resolve().promise()\n\t\t.then( this.getTemplateData.bind( this ) )\n\t\t.then( this.extractParamDOMNodes.bind( this ) )\n\t\t.then( ( data, nodes ) => {\n\t\t\tconst template = mw.template.get( self.moduleName, self.templateName ),\n\t\t\t\t$rendered = template.render( data ),\n\t\t\t\tscrollTop = $( window ).scrollTop();\n\n\t\t\tnodes = nodes.concat( self.extractDOMNodesWithContext( self.$element.get( 0 ) ) );\n\n\t\t\tself.$element = $( self.rebuildDOM(\n\t\t\t\tself.$element.get( 0 ),\n\t\t\t\t$( self.$element.get( 0 ).cloneNode( false ) ).append( $rendered ).get( 0 ),\n\t\t\t\tnodes\n\t\t\t) );\n\n\t\t\t// after having rebuilt the DOM and things might have shifted up & down,\n\t\t\t// let's make sure we're back at the scroll position we were before\n\t\t\t$( window ).scrollTop( scrollTop );\n\n\t\t\treturn self.$element;\n\t\t} )\n\t\t.catch( ( e ) => {\n\t\t\t// something somewhere in the render process failed, but that's ok\n\t\t\t// we won't handle this except for just catching it & turning the\n\t\t\t// promise back into a thenable state, so that follow-up renders\n\t\t\t// can still proceed\n\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn( e );\n\n\t\t\treturn $();\n\t\t} );\n};\n\n/**\n * This method will take 2 jQuery collections: $old and $new.\n * $old will be populated with nodes from $new, except for nodes that match,\n * those will be left as they were - only new changes (additions or removals)\n * will be taken from $new.\n *\n * This is done to preserve existing nodes as much as possible, because if they\n * get replaced/attached/detached/..., they'd otherwise lose context (e.g. focus\n * state)\n *\n * @private\n * @param {Node} oldContainer\n * @param {Node} newContainer\n * @param {Node[]} [preservedNodes]\n * @return {Node}\n */\nComponentWidget.prototype.rebuildDOM = function ( oldContainer, newContainer, preservedNodes ) {\n\tconst newChildrenArray = [].slice.call( newContainer.childNodes );\n\tconst oldChildrenArray = [].slice.call( oldContainer.childNodes );\n\tconst matchedNodes = this.matchNodes( newChildrenArray, oldChildrenArray, preservedNodes );\n\n\tfor ( let newIndex = 0; newIndex < newChildrenArray.length; newIndex++ ) {\n\t\tconst newNode = newChildrenArray[ newIndex ];\n\t\tlet oldNode = matchedNodes[ newIndex ];\n\t\tconst currentIndex = oldNode ? [].slice.call( oldContainer.childNodes ).indexOf( oldNode ) : -1;\n\n\t\t// step 1: figure out the position of the new nodes in the old DOM,\n\t\t// insert it at the correct position (if new) or detach existing\n\t\t// nodes that now no longer exist before the new node\n\t\tif ( currentIndex < 0 ) {\n\t\t\t// if new node did not previously exist, insert it at this index\n\t\t\tif ( oldContainer.childNodes.length === 0 ) {\n\t\t\t\toldContainer.appendChild( newNode );\n\t\t\t} else {\n\t\t\t\toldContainer.insertBefore( newNode, oldContainer.childNodes[ newIndex ] );\n\t\t\t}\n\t\t\t// it's a new node; there's no merging left to be done with an old\n\t\t\t// node, so let's bail early!\n\t\t\tcontinue;\n\t\t} else if ( currentIndex > newIndex ) {\n\t\t\t// if node already exists, but further away in DOM, detach everything\n\t\t\t// in between (could be old nodes that will end up removed;\n\t\t\t// could be old nodes that we'll still need elsewhere later on)\n\t\t\t[].slice.call( oldContainer.childNodes, newIndex, currentIndex ).forEach( ( node ) => {\n\t\t\t\tnode.parentNode.removeChild( node );\n\t\t\t} );\n\t\t}\n\n\t\t// step 2: if we have a new node that corresponds with an existing one,\n\t\t// figure out what to do with it: this could mean keeping either the old\n\t\t// or new node (if it's one to be preserved - i.e. we're manipulating the\n\t\t// node directly elsewhere in JS), or trying to apply properties of the\n\t\t// new node to the old node\n\t\tif ( preservedNodes.includes( oldNode ) ) {\n\t\t\t// oldNode is a node that needs to be preserved: it was a DOM node\n\t\t\t// directly assigned as a variable to the template and it may have\n\t\t\t// context that we must not lose (event listeners, focus state...)\n\t\t\t// leave this node alone!\n\t\t\tpreservedNodes.splice( preservedNodes.indexOf( oldNode ), 1 );\n\t\t} else if ( preservedNodes.includes( newNode ) ) {\n\t\t\t// same as above: it was assigned to the template, but it did not\n\t\t\t// yet exist in the old render (a very similar node might exist,\n\t\t\t// but not this exact one, which might have other event handlers\n\t\t\t// bound or so)\n\t\t\t// we must not try to merge old & new nodes, this is the exact\n\t\t\t// right node - it was passed into the template as such\n\t\t\toldNode.parentNode.replaceChild( newNode, oldNode );\n\t\t\tpreservedNodes.splice( preservedNodes.indexOf( oldNode ), 1 );\n\t\t} else if ( this.isEqualNodeAndProps( oldNode, newNode ) ) {\n\t\t\t// this node is identical, there's nothing we need to do here,\n\t\t\t// we can simply keep our old node\n\t\t} else if ( oldNode.tagName && oldNode.tagName === newNode.tagName ) {\n\t\t\t// this is for all other nodes, that were built from the HTML in\n\t\t\t// the template\n\t\t\t// we don't want to simply swap out these nodes, because then we\n\t\t\t// could lose context (e.g. focus state or input values), so let's\n\t\t\t// just try to apply the new characteristics on to the existing nodes\n\t\t\tfor ( let i = 0; i < oldNode.attributes.length; i++ ) {\n\t\t\t\toldNode.removeAttribute( oldNode.attributes[ i ].name );\n\t\t\t}\n\t\t\tfor ( let i = 0; i < newNode.attributes.length; i++ ) {\n\t\t\t\toldNode.setAttribute( newNode.attributes[ i ].name, newNode.attributes[ i ].value );\n\t\t\t}\n\n\t\t\t// rebuild children as needed, recursively\n\t\t\toldNode = this.rebuildDOM( oldNode, newNode, preservedNodes );\n\t\t} else {\n\t\t\toldNode.parentNode.replaceChild( newNode, oldNode );\n\t\t}\n\t}\n\n\t// remove leftover nodes, returning only the relevant ones\n\t[].slice.call( oldContainer.childNodes, newChildrenArray.length ).forEach( ( node ) => {\n\t\tnode.parentNode.removeChild( node );\n\t} );\n\treturn oldContainer;\n};\n\n/**\n * This will extract DOM nodes (or their OOUI/jQuery representation) and\n * substitute them for a clone, to prevent those nodes from being detached from\n * their current position in DOM (which would make them lose focus)\n *\n * @private\n * @param {Object} data\n * @return {jQuery.Promise}\n */\nComponentWidget.prototype.extractParamDOMNodes = function ( data ) {\n\tconst self = this;\n\n\tconst getNode = function ( variable ) {\n\t\t// check if `instanceof Node` (except that wouldn't work headless;\n\t\t// ref `Node` missing)\n\t\tif ( typeof variable === 'object' && typeof variable.nodeType === 'number' ) {\n\t\t\treturn [ variable ];\n\t\t} else if ( variable instanceof $ ) {\n\t\t\treturn variable.toArray();\n\t\t} else if ( variable.$element !== undefined ) {\n\t\t\treturn variable.$element.toArray();\n\t\t}\n\t\tthrow new Error( 'Not a node-like variable' );\n\t};\n\n\tconst transformNodes = function ( d ) {\n\t\tconst keys = Object.keys( d );\n\t\tconst result = new d.constructor();\n\t\tlet originals = [];\n\n\t\tfor ( let i = 0; i < keys.length; i++ ) {\n\t\t\tconst key = keys[ i ];\n\n\t\t\tif (\n\t\t\t\t// check if array or object literal, in which case\n\t\t\t\t// we'll want to go recursive\n\t\t\t\td[ key ] instanceof Array ||\n\t\t\t\t( d[ key ] instanceof Object && Object.getPrototypeOf( d[ key ] ) === Object.prototype )\n\t\t\t) {\n\t\t\t\tconst recursive = transformNodes( d[ key ] );\n\t\t\t\tresult[ key ] = recursive.data;\n\t\t\t\toriginals = originals.concat( recursive.nodes );\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\t// clone the node we might want to parse into the template;\n\t\t\t\t\t// it'd be parsed into the template just fine unaltered\n\t\t\t\t\t// (by mediawiki.template.mustache+dom.js), but it'd mean\n\t\t\t\t\t// that the node would get detached from its current place\n\t\t\t\t\t// in DOM - instead, we'll parse a clone in there, and then\n\t\t\t\t\t// our post-render processing (`rebuildDOM`) will recognize\n\t\t\t\t\t// these nodes are the same and use the original one instead\n\t\t\t\t\tconst nodes = getNode( d[ key ] );\n\t\t\t\t\tresult[ key ] = [];\n\t\t\t\t\tfor ( let j = 0; j < nodes.length; j++ ) {\n\t\t\t\t\t\tconst node = nodes[ j ];\n\t\t\t\t\t\toriginals.push( node );\n\t\t\t\t\t\t// only clone nodes that are currently rendered - others\n\t\t\t\t\t\t// should actually render the real nodes (not clones)\n\t\t\t\t\t\tif ( self.$element.find( node ).length > 0 ) {\n\t\t\t\t\t\t\tresult[ key ].push( node.cloneNode( true ) );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult[ key ].push( node );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// fall through, leaving data unaltered\n\t\t\t\t\tresult[ key ] = d[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { data: result, nodes: originals };\n\t};\n\n\tconst transformed = transformNodes( data );\n\treturn $.Deferred().resolve( transformed.data, transformed.nodes ).promise();\n};\n\n/**\n * @private\n * @param {Node} node\n * @return {Array}\n */\nComponentWidget.prototype.extractDOMNodesWithContext = function ( node ) {\n\treturn [].concat(\n\t\t// the active node must be preserved, so that we don't lose e.g. focus\n\t\t$( node ).find( document.activeElement ).addBack( document.activeElement ).get(),\n\t\t// if this node or one of its children is a form element whose value has\n\t\t// been altered compared to what it rendered with initially, it matters\n\t\t$( node )\n\t\t\t.find( 'input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea' )\n\t\t\t.addBack( 'input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea' )\n\t\t\t.filter( ( i, n ) => n.value !== n.defaultValue ).get(),\n\t\t$( node )\n\t\t\t.find( 'input[type=\"checkbox\"], input[type=\"radio\"]' )\n\t\t\t.addBack( 'input[type=\"checkbox\"], input[type=\"radio\"]' )\n\t\t\t.filter( ( i, n ) => n.checked !== n.defaultChecked ).get(),\n\t\t$( node )\n\t\t\t.find( 'option' )\n\t\t\t.addBack( 'option' )\n\t\t\t.filter( ( i, n ) => n.selected !== n.defaultSelected ).get()\n\t);\n};\n\n/**\n * Given 2 collection of nodes (`one` and `two`), this will return\n * an array of the same size as `one`, where the indices correspond\n * to the nodes in `one`, and the values are the best matching/most\n * similar node in `two`.\n *\n * @private\n * @param {Node[]} one\n * @param {Node[]} two\n * @param {Node[]} [preserve]\n * @return {Node[]}\n */\nComponentWidget.prototype.matchNodes = function ( one, two, preserve ) {\n\tconst self = this,\n\t\tisRelevantNode = function ( node ) {\n\t\t\treturn node.tagName && (\n\t\t\t\t// if this node or one of its children is one to be preserved, it matters\n\t\t\t\t( preserve || [] ).some( ( p ) => $( node ).find( p ).addBack( p ).length > 0 ) ||\n\t\t\t\tself.extractDOMNodesWithContext( node ).length > 0\n\t\t\t);\n\t\t},\n\t\tgetNumberOfEqualChildren = function ( needle, haystack ) {\n\t\t\treturn haystack.map( ( target ) => {\n\t\t\t\tif ( self.getNumberOfEqualNodes( [ needle ], [ target ] ) === 0 ) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn self.getNumberOfEqualNodes(\n\t\t\t\t\t[].slice.call( needle.children ),\n\t\t\t\t\t[].slice.call( target.children )\n\t\t\t\t);\n\t\t\t} );\n\t\t},\n\t\tfilterRelevantNodes = function ( needle, haystack ) {\n\t\t\treturn haystack.filter( ( target ) => (\n\t\t\t\ttarget.tagName &&\n\t\t\t\t\t// exclude nodes where neither this or the other node are relevant\n\t\t\t\t\t( isRelevantNode( needle ) || isRelevantNode( target ) )\n\t\t\t) );\n\t\t},\n\t\tfilterByMostSimilar = function ( needle, haystack ) {\n\t\t\tconst numbers = getNumberOfEqualChildren( needle, haystack ),\n\t\t\t\tbest = Math.max.apply( Math, numbers.concat( 0 ) );\n\n\t\t\treturn haystack.filter( ( target, i ) => numbers[ i ] === best );\n\t\t},\n\t\tfilterByLeastDissimilar = function ( needle, haystack ) {\n\t\t\tconst numbers = getNumberOfEqualChildren( needle, haystack ).map( ( number, i ) => Math.max( needle.children.length, haystack[ i ].children.length ) - number ),\n\t\t\t\tbest = Math.min.apply( Math, numbers.concat( needle.children.length ) );\n\n\t\t\treturn haystack.filter( ( target, i ) => numbers[ i ] === best );\n\t\t};\n\n\treturn one.reduce( ( result, node, index, arr ) => {\n\t\tlet other = [].concat( two );\n\t\tconst remaining = arr.slice( index ).filter( ( target ) => target.tagName !== undefined );\n\n\t\t// don't bother matching non-nodes\n\t\tif ( node.tagName === undefined ) {\n\t\t\treturn result.concat( undefined );\n\t\t}\n\n\t\tother = filterRelevantNodes( node, other ).filter(\n\t\t\t// exclude nodes that we've already paired to a previous node\n\t\t\t( target ) => !result.includes( target )\n\t\t);\n\n\t\t// find the first unmatched relevant equal node (if any)\n\t\tfor ( let i = 0; i < other.length; i++ ) {\n\t\t\tif ( node.isEqualNode( other[ i ] ) ) {\n\t\t\t\treturn result.concat( other[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// narrow it down to nodes with the most matching children\n\t\tother = filterByMostSimilar( node, other );\n\n\t\t// narrow down nodes by cross-referencing similarities from the\n\t\t// other side: a future node might actually be a better match...\n\t\tother = other.filter( ( target ) => filterByMostSimilar( target, remaining ).includes( node ) );\n\n\t\t// narrow it down further to the one(s) with the minimum amount\n\t\t// of different children\n\t\tother = filterByLeastDissimilar( node, other );\n\n\t\t// narrow down nodes by cross-referencing dissimilarities from the\n\t\t// other side: a future node might actually be a better match...\n\t\tother = other.filter( ( target ) => filterByLeastDissimilar( target, remaining ).includes( node ) );\n\n\t\t// return the first of whatever is left\n\t\treturn result.concat( other.shift() );\n\t}, [] );\n};\n\n/**\n * Similar to Node.isEqualNode, except that it will also compare live properties.\n *\n * @private\n * @param {Node} one\n * @param {Node} two\n * @return {boolean}\n */\nComponentWidget.prototype.isEqualNodeAndProps = function ( one, two ) {\n\tconst self = this;\n\n\tif ( !one.isEqualNode( two ) ) {\n\t\treturn false;\n\t}\n\n\t// isEqualNode doesn't compare props, so an input field with some manual\n\t// text input (where `value` prop is different from the `value` attribute,\n\t// because the one doesn't sync back when it changes) could be considered\n\t// equal even if they have different values - hence the added value compare\n\tfor ( const property in one.constructor.prototype ) {\n\t\t// some properties or getters are auto computed and can't be set\n\t\t// comparing these (e.g. `webkitEntries`) makes no sense\n\t\tconst descriptor = Object.getOwnPropertyDescriptor( one.constructor.prototype, property );\n\t\tif ( descriptor === undefined || !descriptor.writable || descriptor.set === undefined ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// if properties don't match, these nodes are not equal...\n\t\tif ( one[ property ] !== two[ property ] ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// nodes are the same, but there may be similar prop differences in children...\n\treturn !one.children || ![].slice.call( one.children ).some( ( child, i ) => !self.isEqualNodeAndProps( child, two.children[ i ] ) );\n};\n\n/**\n * Find the amount of equal nodes, based on the nodes themselves being\n * `.isEqualNode`, or their children (or theirs, recursively) matching.\n *\n * @private\n * @param {Node[]} one\n * @param {Node[]} two\n * @return {number}\n */\nComponentWidget.prototype.getNumberOfEqualNodes = function ( one, two ) {\n\tconst self = this;\n\n\treturn one\n\t\t.map( ( twoNode ) => two.some( ( oneNode ) => {\n\n\t\t\tif ( oneNode.tagName !== twoNode.tagName ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( oneNode.id || twoNode.id ) {\n\t\t\t\t// nodes that have an id must match\n\t\t\t\treturn oneNode.id === twoNode.id;\n\t\t\t}\n\n\t\t\tif ( oneNode.getAttribute( 'data-key' ) || twoNode.getAttribute( 'data-key' ) ) {\n\t\t\t\t// nodes that have a data-key attribute must match\n\t\t\t\t// (similar to id, but doesn't have to be unique\n\t\t\t\t// on the page, as long as it's unique in the template)\n\t\t\t\treturn oneNode.getAttribute( 'data-key' ) === twoNode.getAttribute( 'data-key' );\n\t\t\t}\n\n\t\t\tif ( oneNode.isEqualNode( twoNode ) ) {\n\t\t\t\t// node with exact same characteristics = match!\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// node is not a perfect match - let's run their children through the same set of criteria\n\t\t\tconst nodeOneChildren = [].slice.call( oneNode.children );\n\t\t\tconst nodeTwoChildren = [].slice.call( twoNode.children );\n\t\t\treturn self.getNumberOfEqualNodes( nodeOneChildren, nodeTwoChildren ) > 0;\n\t\t} ) )\n\t\t.reduce( ( sum, isEqual ) => sum + ( isEqual ? 1 : 0 ), 0 );\n};\n\n/**\n * OOUI widgets support this by default (and GroupWidget takes it\n * a little further, which is why I'm calling that one instead)\n * Let's also keep track of the disabled status in our internal\n * state, and make sure that when this is changed, it also triggers\n * a rerender.\n *\n * @inheritDoc\n */\nComponentWidget.prototype.setDisabled = function ( disabled ) {\n\t// object may not yet have been constructed fully\n\tif ( this.renderPromise ) {\n\t\tthis.setState( { _disabled: disabled } );\n\t}\n\treturn OO.ui.mixin.GroupWidget.prototype.setDisabled.call( this, disabled );\n};\n\n/**\n * Override for when this is used alongside a GroupElement, where one\n * would likely expect DOM updates when items are modified.\n *\n * @inheritDoc\n */\nComponentWidget.prototype.addItems = function () {\n\tconst result = OO.ui.mixin.GroupElement.prototype.addItems.apply( this, arguments );\n\tthis.setState( { _group: Object.assign( [], this.getItems() ) } );\n\treturn result;\n};\n\n/**\n * Override for when this is used alongside a GroupElement, where one\n * would likely expect DOM updates when items are modified.\n *\n * @inheritDoc\n */\nComponentWidget.prototype.removeItems = function () {\n\tconst result = OO.ui.mixin.GroupElement.prototype.removeItems.apply( this, arguments );\n\tthis.setState( { _group: Object.assign( [], this.getItems() ) } );\n\treturn result;\n};\n\n/**\n * Override for when this is used alongside a GroupElement, where one\n * would likely expect DOM updates when items are modified.\n *\n * @inheritDoc\n */\nComponentWidget.prototype.moveItem = function () {\n\tconst result = OO.ui.mixin.GroupElement.prototype.moveItem.apply( this, arguments );\n\tthis.setState( { _group: Object.assign( [], this.getItems() ) } );\n\treturn result;\n};\n\n/**\n * Override for when this is used alongside a GroupElement, where one\n * would likely expect DOM updates when items are modified.\n *\n * @inheritDoc\n */\nComponentWidget.prototype.insertItem = function () {\n\tconst result = OO.ui.mixin.GroupElement.prototype.insertItem.apply( this, arguments );\n\tthis.setState( { _group: Object.assign( [], this.getItems() ) } );\n\treturn result;\n};\n\n/**\n * Override for when this is used alongside a GroupElement, where one\n * would likely expect DOM updates when items are modified.\n *\n * @inheritDoc\n */\nComponentWidget.prototype.clearItems = function () {\n\tconst result = OO.ui.mixin.GroupElement.prototype.clearItems.apply( this, arguments );\n\tthis.setState( { _group: Object.assign( [], this.getItems() ) } );\n\treturn result;\n};\n\n/**\n * Set error text(s) to be used by template.\n *\n * @param {Array} errors An array of error texts\n * @return {jQuery.Deferred}\n */\nComponentWidget.prototype.setErrors = function ( errors ) {\n\treturn this.setState( { errors: errors } );\n};\n\n/**\n * Get an array of current error messages.\n *\n * @return {Array}\n */\nComponentWidget.prototype.getErrors = function () {\n\treturn this.state.errors || [];\n};\n\nmodule.exports = ComponentWidget;\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/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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":54,"column":1,"nodeType":"Block","endLine":54,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst FormatValueElement = function MediaInfoStatementsFormatValueElement() {};\nOO.initClass( FormatValueElement );\n\nFormatValueElement.cache = {};\n\n/**\n * @param {dataValues.DataValue} dataValue\n * @param {string} format\n * @param {string} language\n * @param {string} [propertyId]\n * @return {string}\n */\nFormatValueElement.getKey = function ( dataValue, format, language, propertyId ) {\n\treturn JSON.stringify( {\n\t\tdata: { type: dataValue.getType(), value: dataValue.toJSON() },\n\t\tformat: format,\n\t\tlanguage: language,\n\t\tproperty: propertyId\n\t}, ( key, value ) => {\n\t\t// make sure the data gets sorted during stringify, or we might\n\t\t// end up with a different key for data that is essentially the\n\t\t// same, but where the properties were stringified in a different\n\t\t// order (e.g. {a:1,b:2} and {b:2,a:1})\n\t\t// @see https://gist.github.com/davidfurlong/463a83a33b70a3b6618e97ec9679e490\n\t\tif ( value instanceof Object && !( value instanceof Array ) ) {\n\t\t\treturn Object.keys( value )\n\t\t\t\t.sort()\n\t\t\t\t.reduce( ( sorted, sortedKey ) => {\n\t\t\t\t\tsorted[ sortedKey ] = value[ sortedKey ];\n\t\t\t\t\treturn sorted;\n\t\t\t\t}, {} );\n\t\t}\n\n\t\treturn value;\n\t} );\n};\n\n/**\n * @param {string} key\n * @param {string} result\n */\nFormatValueElement.toCache = function ( key, result ) {\n\tFormatValueElement.cache[ key ] =\n\t\t$.Deferred().resolve( result ).promise( { abort: function () {} } );\n};\n\n/**\n * @param {dataValues.DataValue} dataValue\n * @param {string} [format] e.g. text/plain or text/html\n * @param {string} [language]\n * @param {string} [propertyId] Used when property-specific formatting rules are required\n * @return {jQuery.Promise}\n */\nFormatValueElement.prototype.formatValue = function ( dataValue, format, language, propertyId ) {\n\tconst data = { type: dataValue.getType(), value: dataValue.toJSON() };\n\tconst stringified = JSON.stringify( data );\n\n\tconst api = wikibase.api.getLocationAgnosticMwApi(\n\t\tmw.config.get( 'wbmiRepoApiUrl', mw.config.get( 'wbRepoApiUrl' ) ),\n\t\t{ anonymous: true }\n\t);\n\n\tformat = format || 'text/plain';\n\tlanguage = language || mw.config.get( 'wgUserLanguage' );\n\tconst key = FormatValueElement.getKey( dataValue, format, language, propertyId );\n\n\tif ( !( key in FormatValueElement.cache ) ) {\n\t\tconst params = {\n\t\t\taction: 'wbformatvalue',\n\t\t\tdatavalue: stringified,\n\t\t\tformat: 'json',\n\t\t\tgenerate: format,\n\t\t\toptions: JSON.stringify( { lang: language } ),\n\t\t\tproperty: propertyId\n\t\t};\n\t\tconst promise = api.get( params );\n\n\t\tFormatValueElement.cache[ key ] = promise.then( ( response ) => response.result || '' ).promise( { abort: function () {\n\t\t\tif ( !( key in FormatValueElement.cache ) ) {\n\t\t\t\t// request already aborted/failed and cleaned out of cache\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// replace the cached promise with a non-abortable one, so we can't\n\t\t\t// abort this once more (since there's only 1 underlying API request\n\t\t\t// to cancel...)\n\t\t\tFormatValueElement.cache[ key ] = FormatValueElement.cache[ key ].promise( { abort: function () {\n\t\t\t\treturn FormatValueElement.cache[ key ];\n\t\t\t} } );\n\t\t\t// actually abort underlying API call\n\t\t\tpromise.abort();\n\t\t\t// immediately delete from cache\n\t\t\tdelete FormatValueElement.cache[ key ];\n\t\t} } );\n\n\t\tFormatValueElement.cache[ key ].catch( () => {\n\t\t\t// this promise seems to have failed, might as well remove this from\n\t\t\t// cache, so it's re-attempted next time we need this...\n\t\t\tdelete FormatValueElement.cache[ key ];\n\t\t} );\n\t}\n\n\treturn FormatValueElement.cache[ key ];\n};\n\nmodule.exports = FormatValueElement;\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/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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'datamodel.Entity' is undefined.","line":11,"column":1,"nodeType":"Block","endLine":11,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'datamodel.TermMap' is undefined.","line":18,"column":1,"nodeType":"Block","endLine":18,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'datamodel.TermMap' is undefined.","line":19,"column":1,"nodeType":"Block","endLine":19,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'datamodel.StatementGroupSet' is undefined.","line":20,"column":1,"nodeType":"Block","endLine":20,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'datamodel.StatementGroupSet' is undefined.","line":49,"column":1,"nodeType":"Block","endLine":49,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'datamodel.StatementGroupSet' is undefined.","line":55,"column":1,"nodeType":"Block","endLine":55,"endColumn":1}],"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":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function ( util ) {\n\t'use strict';\n\n\t/* eslint-disable no-underscore-dangle */\n\n\tconst datamodel = require( 'wikibase.datamodel' ),\n\t\tPARENT = datamodel.Entity,\n\n\t\t/**\n\t\t * @class datamodel.MediaInfo\n\t\t * @extends datamodel.Entity\n\t\t * @license GPL-2.0-or-later\n\t\t * @author Adrian Heine <adrian.heine@wikimedia.de>\n\t\t *\n\t\t * @constructor\n\t\t *\n\t\t * @param {string} mediaInfoId\n\t\t * @param {datamodel.TermMap|null} [labels=new datamodel.TermMap()]\n\t\t * @param {datamodel.TermMap|null} [descriptions=new datamodel.TermMap()]\n\t\t * @param {datamodel.StatementGroupSet|null}\n\t\t * [statementGroupSet=new datamodel.StatementGroupSet()]\n\t\t *\n\t\t * @throws {Error} if a required parameter is not specified properly.\n\t\t */\n\t\tSELF = util.inherit(\n\t\t\t'WbDataModelMediaInfo',\n\t\t\tPARENT,\n\t\t\tfunction ( mediaInfoId, labels, descriptions, statementGroupSet ) {\n\t\t\t\tlabels = labels || new datamodel.TermMap();\n\t\t\t\tdescriptions = descriptions || new datamodel.TermMap();\n\t\t\t\tstatementGroupSet = statementGroupSet || new datamodel.StatementGroupSet();\n\n\t\t\t\tif (\n\t\t\t\t\ttypeof mediaInfoId !== 'string' ||\n\t\t\t\t\t!( labels instanceof datamodel.TermMap ) ||\n\t\t\t\t\t!( descriptions instanceof datamodel.TermMap ) ||\n\t\t\t\t\t!( statementGroupSet instanceof datamodel.StatementGroupSet )\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error( 'Required parameter(s) missing or not defined properly' );\n\t\t\t\t}\n\n\t\t\t\tthis._id = mediaInfoId;\n\t\t\t\tthis._statementGroupSet = statementGroupSet;\n\t\t\t\tthis._fingerprint = new datamodel.Fingerprint( labels, descriptions );\n\t\t\t},\n\t\t\t{\n\n\t\t\t\t/**\n\t\t\t\t * @property {datamodel.StatementGroupSet}\n\t\t\t\t * @private\n\t\t\t\t */\n\t\t\t\t_statementGroupSet: null,\n\n\t\t\t\t/**\n\t\t\t\t * @return {datamodel.StatementGroupSet}\n\t\t\t\t */\n\t\t\t\tgetStatements: function () {\n\t\t\t\t\treturn this._statementGroupSet;\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * @return {boolean}\n\t\t\t\t */\n\t\t\t\tisEmpty: function () {\n\t\t\t\t\treturn this._statementGroupSet.isEmpty() && this._fingerprint.isEmpty();\n\t\t\t\t},\n\n\t\t\t\t/**\n\t\t\t\t * @param {*} mediaInfo\n\t\t\t\t * @return {boolean}\n\t\t\t\t */\n\t\t\t\tequals: function ( mediaInfo ) {\n\t\t\t\t\treturn mediaInfo === this ||\n\t\t\t\t\t( mediaInfo instanceof SELF &&\n\t\t\t\t\t\tthis._id === mediaInfo.getId() &&\n\t\t\t\t\t\tthis._statementGroupSet.equals( mediaInfo.getStatements() ) &&\n\t\t\t\t\t\tthis._fingerprint.equals( mediaInfo.getFingerprint() )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\n\t/**\n\t * @inheritdoc\n\t * @property {string} [TYPE='mediainfo']\n\t * @static\n\t */\n\tSELF.TYPE = 'mediainfo';\n\n\tmodule.exports = SELF;\n\n}( util ) );\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/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":2,"message":"OO.ui.ButtonWidget 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":1,"fatalErrorCount":0,"warningCount":2,"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":"jsdoc/no-undefined-types","severity":1,"message":"The type 'datamodel.MediaInfo' is undefined.","line":39,"column":1,"nodeType":"Block","endLine":39,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'datamodel.MediaInfo' is undefined.","line":106,"column":1,"nodeType":"Block","endLine":106,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":230,"column":1,"nodeType":"Block","endLine":230,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":241,"column":1,"nodeType":"Block","endLine":241,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":289,"column":1,"nodeType":"Block","endLine":289,"endColumn":1},{"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":11,"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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":20,"column":1,"nodeType":"Block","endLine":20,"endColumn":1}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":13,"column":2,"nodeType":"CallExpression","endLine":13,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/**\n * @constructor\n */\nconst LicenseDialogWidget = function () {\n\tthis.dialog = new OO.ui.MessageDialog();\n\tthis.windowManager = new OO.ui.WindowManager();\n\tthis.windowManager.addWindows( [ this.dialog ] );\n\tthis.prefKey = 'wbmi-cc0-confirmed';\n\n\t// eslint-disable-next-line no-jquery/no-global-selector\n\t$( 'body' ).append( this.windowManager.$element );\n};\nOO.inheritClass( LicenseDialogWidget, OO.ui.Widget );\n\n/**\n * Returns a promise that will resolve once the window has been closed.\n *\n * @return {jQuery.Promise}\n */\nLicenseDialogWidget.prototype.getConfirmationIfNecessary = function () {\n\tconst self = this,\n\t\tdeferred = $.Deferred(),\n\t\tconfirmed = this.getLicenseConfirmation();\n\n\t// check if we've agreed to this before, either in present\n\t// implementation or in previous cookie-based version\n\tif ( confirmed === 1 ) {\n\t\treturn deferred.resolve().promise();\n\t} else if ( mw.cookie.get( 'wbmi-license-cc0' ) === 1 ) {\n\t\tthis.storeLicenseConfirmation();\n\t\treturn deferred.resolve().promise();\n\t}\n\n\tthis.openDialog();\n\tthis.dialog.getManager().on( 'closing', ( window, compatClosing, data ) => {\n\t\tif ( data && data.action === 'accept' ) {\n\t\t\tdeferred.resolve();\n\t\t\tself.storeLicenseConfirmation();\n\t\t} else {\n\t\t\t// dialog dismissed, e.g. by pressing ESC key\n\t\t\tdeferred.reject();\n\t\t}\n\t\tself.dialog.getManager().off( 'closing' );\n\t} );\n\n\treturn deferred.promise();\n};\n\nLicenseDialogWidget.prototype.openDialog = function () {\n\tthis.windowManager.openWindow( this.dialog, {\n\t\ttitle: mw.msg( 'wikibasemediainfo-filepage-license-title' ),\n\t\tmessage: $( '<div>' ).append(\n\t\t\t$( '<p>' ).msg( 'wikibasemediainfo-filepage-license-content' ),\n\t\t\t$( '<p>' ).msg( 'wikibasemediainfo-filepage-license-content-acceptance' )\n\t\t),\n\t\tactions: [\n\t\t\t{\n\t\t\t\taction: 'accept',\n\t\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-license-agree' ),\n\t\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t\t}\n\t\t]\n\t} );\n};\n\n/**\n * Determines whether or not the user has already accepted the license\n * terms. For anon users, check if the appropriate value has been set in\n * localstorage; for logged-in users, check if the appropriate user pref has\n * been set.\n *\n * @return {number} 0 or 1\n */\nLicenseDialogWidget.prototype.getLicenseConfirmation = function () {\n\tconst storage = mw.storage,\n\t\tkey = this.prefKey,\n\t\tuser = mw.user;\n\n\tif ( user.isAnon() ) {\n\t\treturn Number( storage.get( key ) ) || 0;\n\t} else {\n\t\treturn Number( user.options.get( key ) );\n\t}\n};\n\n/**\n * If the user confirms the license dialogue, store this appropriately:\n * For logged-in users, that means store the confirmation as a hidden user\n * preference. For non-logged-in users, store the confirmation in\n * localstorage.\n */\nLicenseDialogWidget.prototype.storeLicenseConfirmation = function () {\n\tconst storage = mw.storage,\n\t\tkey = this.prefKey,\n\t\tuser = mw.user;\n\n\tif ( user.isAnon() ) {\n\t\tstorage.set( key, 1 );\n\t} else {\n\t\tnew mw.Api().saveOption( key, 1 );\n\t\tuser.options.set( key, 1 );\n\t}\n};\n\nmodule.exports = LicenseDialogWidget;\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/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 'datamodel.StatementList' is undefined.","line":76,"column":1,"nodeType":"Block","endLine":76,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.promise' is undefined.","line":77,"column":1,"nodeType":"Block","endLine":77,"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":4,"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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'SERIALIZER.Deserializer' is undefined.","line":10,"column":1,"nodeType":"Block","endLine":10,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function ( wb, util ) {\n\t'use strict';\n\n\tconst SERIALIZER = require( 'wikibase.serialization' ),\n\t\tPARENT = SERIALIZER.Deserializer,\n\t\tMediaInfo = require( '../datamodel/MediaInfo.js' );\n\n\t/**\n\t * @class wikibase.mediainfo.serialization.MediaInfoDeserializer\n\t * @extends SERIALIZER.Deserializer\n\t * @license GPL-2.0-or-later\n\t * @author Adrian Heine <adrian.heine@wikimedia.de>\n\t *\n\t * @constructor\n\t */\n\tmodule.exports = util.inherit( 'WbMediaInfoDeserializer', PARENT, {\n\t\t/**\n\t\t * @inheritdoc\n\t\t *\n\t\t * @throws {Error} if serialization does not resolve to a serialized MediaInfo.\n\t\t * @return {MediaInfo}\n\t\t */\n\t\tdeserialize: function ( serialization ) {\n\t\t\tif ( serialization.type !== MediaInfo.TYPE ) {\n\t\t\t\tthrow new Error( 'Serialization does not resolve to an MediaInfo' );\n\t\t\t}\n\n\t\t\tconst statementGroupSetDeserializer = new SERIALIZER.StatementGroupSetDeserializer();\n\t\t\tconst termMapDeserializer = new SERIALIZER.TermMapDeserializer();\n\n\t\t\treturn new MediaInfo(\n\t\t\t\tserialization.id,\n\t\t\t\ttermMapDeserializer.deserialize( serialization.labels ),\n\t\t\t\ttermMapDeserializer.deserialize( serialization.descriptions ),\n\t\t\t\tstatementGroupSetDeserializer.deserialize( serialization.statements )\n\t\t\t);\n\t\t}\n\t} );\n\n}( wikibase, util ) );\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/AddPropertyWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":53,"column":23,"nodeType":"NewExpression","messageId":"noLabel","endLine":59,"endColumn":5},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":86,"column":1,"nodeType":"Block","endLine":86,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":98,"column":1,"nodeType":"Block","endLine":98,"endColumn":1}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":2,"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":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":123,"column":46,"nodeType":"ObjectExpression","endLine":138,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":1,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":126,"column":10,"nodeType":"CallExpression","endLine":126,"endColumn":35,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/ItemWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":135,"column":24,"nodeType":"NewExpression","messageId":"noLabel","endLine":141,"endColumn":6},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":232,"column":1,"nodeType":"Block","endLine":232,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":250,"column":1,"nodeType":"Block","endLine":250,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":350,"column":1,"nodeType":"Block","endLine":350,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":411,"column":1,"nodeType":"Block","endLine":411,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":473,"column":1,"nodeType":"Block","endLine":473,"endColumn":1}],"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":1,"fatalErrorCount":0,"warningCount":5,"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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":62,"column":1,"nodeType":"Block","endLine":62,"endColumn":1}],"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 * Dismissable message box which appears above statements UI in both Filepage\n * and UploadWizard.\n *\n * @param {Object} config\n */\nconst LinkNoticeWidget = function ( config ) {\n\tthis.prefKey = 'wbmi-wikidata-link-notice-dismissed';\n\n\tthis.state = {\n\t\tisDismissed: this.isDismissed(),\n\t\tcanDisplay: this.canDisplay()\n\t};\n\n\tLinkNoticeWidget.super.call( this, config );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/LinkNoticeWidget.mustache+dom'\n\t);\n};\nOO.inheritClass( LinkNoticeWidget, OO.ui.Widget );\nOO.mixinClass( LinkNoticeWidget, ComponentWidget );\n\n/**\n * @inheritDoc\n */\nLinkNoticeWidget.prototype.getTemplateData = function () {\n\tconst noticeWidget = new OO.ui.MessageWidget( {\n\t\ttype: 'warning',\n\t\tlabel: mw.msg( 'wikibasemediainfo-statements-link-notice-text' ),\n\t\tclasses: [ 'wbmi-link-notice' ]\n\t} );\n\tnoticeWidget.setIcon( 'info' );\n\n\tconst dismissControl = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'close',\n\t\tlabel: mw.msg( 'wikibasemediainfo-statements-link-notice-dismiss' ),\n\t\tinvisibleLabel: true,\n\t\ttitle: mw.msg( 'wikibasemediainfo-statements-link-notice-dismiss' ),\n\t\tclasses: [ 'wbmi-link-notice__dismiss-icon' ]\n\t} );\n\n\tnoticeWidget.$element.append( dismissControl.$element );\n\tdismissControl.connect( this, { click: 'dismiss' } );\n\n\treturn {\n\t\tcanDisplay: this.state.canDisplay,\n\t\tisDismissed: this.state.isDismissed,\n\t\tnoticeWidget: noticeWidget\n\t};\n};\n\n/**\n * Store the user's decision and rerender.\n *\n * @return {jQuery.Promise}\n */\nLinkNoticeWidget.prototype.dismiss = function () {\n\tif ( mw.user.isAnon() ) {\n\t\tmw.storage.set( this.prefKey, 1 );\n\t} else {\n\t\tnew mw.Api().saveOption( this.prefKey, 1 );\n\t\tmw.user.options.set( this.prefKey, 1 );\n\t}\n\n\treturn this.setState( { isDismissed: true } );\n};\n\n/**\n * Determines whether or not the widget should be shown to the user. Defaults\n * to true. Type coercion is necessary due to the limitations of browser\n * localstorage.\n *\n * @return {boolean}\n */\nLinkNoticeWidget.prototype.isDismissed = function () {\n\tlet numVal;\n\n\tif ( mw.user.isAnon() ) {\n\t\tnumVal = Number( mw.storage.get( this.prefKey ) ) || 0;\n\t} else {\n\t\tnumVal = Number( mw.user.options.get( this.prefKey ) );\n\t}\n\n\treturn Boolean( numVal );\n};\n\n/**\n * Returns whether or not the widget should be be displayed at all, as\n * determined by the presence of the i18n message to be displayed.\n *\n * @return {boolean}\n */\nLinkNoticeWidget.prototype.canDisplay = function () {\n\tconst message = mw.message( 'wikibasemediainfo-statements-link-notice-text' );\n\treturn message.exists() && message.text() !== '-';\n};\n\nmodule.exports = LinkNoticeWidget;\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/SnakListWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":78,"column":1,"nodeType":"Block","endLine":78,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":139,"column":1,"nodeType":"Block","endLine":139,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":167,"column":1,"nodeType":"Block","endLine":167,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":230,"column":1,"nodeType":"Block","endLine":230,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/**\n * @constructor\n * @param {Object} config Configuration options\n * @param {string} [config.editing] True for edit mode, False for read mode\n * @param {string} [config.addText] Text for \"add\" button\n */\nconst SnakWidget = require( './SnakWidget.js' ),\n\tConstraintsReportHandlerElement = require( './ConstraintsReportHandlerElement.js' ),\n\tComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\tdatamodel = require( 'wikibase.datamodel' );\n\n/**\n * @param {Object} [config] Configuration options\n */\nconst SnakListWidget = function MediaInfoStatementsSnakListWidget( config ) {\n\tthis.config = Object.assign( {\n\t\tediting: false,\n\t\taddText: ''\n\t}, config );\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\tsnaks: [],\n\t\tconstraintsReport: null\n\t};\n\n\tSnakListWidget.super.call( this, Object.assign( {}, config ) );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/SnakListWidget.mustache+dom'\n\t);\n\tConstraintsReportHandlerElement.call( this, Object.assign( {}, config ) );\n};\n\nOO.inheritClass( SnakListWidget, OO.ui.Widget );\nOO.mixinClass( SnakListWidget, ComponentWidget );\nOO.mixinClass( SnakListWidget, ConstraintsReportHandlerElement );\n\n/**\n * @inheritDoc\n */\nSnakListWidget.prototype.getTemplateData = function () {\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\tconst addButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 'wbmi-snaklist-add-snak' ],\n\t\tlabel: this.config.addText,\n\t\tflags: 'progressive',\n\t\tframed: false\n\t} );\n\taddButton.connect( this, { click: [ 'addWidget' ] } );\n\n\treturn {\n\t\terrors: errorMessages,\n\t\tediting: this.state.editing,\n\t\tsnaks: this.state.snaks,\n\t\tdisabled: this.isDisabled(),\n\t\taddButton: addButton,\n\t\tconstraintsReport: this.state.constraintsReport &&\n\t\t\tthis.popupFromResults( this.state.constraintsReport )\n\t};\n};\n\n/**\n * @param {SnakWidget[]} snaks\n * @return {jQuery.Promise}\n * @fires OO.EmitterList#remove\n */\nSnakListWidget.prototype.removeWidgets = function ( snaks ) {\n\tconst self = this,\n\t\tnewWidgets = [],\n\t\tremovedWidgets = [];\n\n\tthis.state.snaks.forEach( ( snak ) => {\n\t\tif ( !snaks.includes( snak ) ) {\n\t\t\t// not present in array of items to remove = keep\n\t\t\tnewWidgets.push( snak );\n\t\t} else {\n\t\t\tremovedWidgets.push( snak );\n\t\t}\n\t} );\n\n\treturn this.setState( { snaks: newWidgets } ).then( () => {\n\t\tremovedWidgets.forEach( ( snak ) => {\n\t\t\tself.emit( 'change', snak );\n\t\t} );\n\t\tif ( newWidgets.length === 0 ) {\n\t\t\tself.emit( 'empty' );\n\t\t}\n\t} );\n};\n\n/**\n * @param {datamodel.Snak|undefined} [data]\n * @return {SnakWidget}\n */\nSnakListWidget.prototype.createWidget = function ( data ) {\n\tconst widget = new SnakWidget( { editing: this.state.editing } );\n\tlet promise = $.Deferred().resolve().promise();\n\tconst self = this;\n\n\tif ( data ) {\n\t\tpromise = widget.setData( data );\n\t}\n\n\treturn promise.then(\n\t\t() => {\n\t\t\twidget.connect( self, { delete: [ 'removeWidgets', [ widget ] ] } );\n\t\t\twidget.connect( self, { change: [ 'emit', 'change' ] } );\n\t\t\treturn widget;\n\t\t}\n\t);\n};\n\n/**\n * @param {datamodel.Snak} [data]\n */\nSnakListWidget.prototype.addWidget = function ( data ) {\n\tconst self = this;\n\tthis.createWidget( data ).then( ( widget ) => self.setState( { snaks: self.state.snaks.concat( [ widget ] ) } )\n\t\t.then( self.emit.bind( self, 'change' ) )\n\t\t.then( widget.focus.bind( widget ) ) );\n};\n\n/**\n * @param {boolean} editing\n * @return {jQuery.Promise}\n */\nSnakListWidget.prototype.setEditing = function ( editing ) {\n\tconst promises = this.state.snaks.map( ( widget ) => widget.setEditing( editing ) );\n\n\treturn $.when.apply( $, promises ).then( this.setState.bind( this, { editing: editing } ) );\n};\n\n/**\n * @return {datamodel.SnakList}\n */\nSnakListWidget.prototype.getData = function () {\n\treturn new datamodel.SnakList( this.state.snaks\n\t\t.map( ( snak ) => {\n\t\t\t// try to fetch data - if it fails (likely because of incomplete input),\n\t\t\t// we'll just ignore that snak\n\t\t\ttry {\n\t\t\t\treturn snak.getData();\n\t\t\t} catch ( e ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t} )\n\t\t.filter( ( data ) => data instanceof datamodel.Snak )\n\t);\n};\n\n/**\n * @param {datamodel.SnakList} data\n * @return {jQuery.Deferred}\n */\nSnakListWidget.prototype.setData = function ( data ) {\n\tconst self = this,\n\t\texistingWidgetsData = self.state.snaks.map( ( widget ) => {\n\t\t\ttry {\n\t\t\t\treturn widget.getData();\n\t\t\t} catch ( e ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t} );\n\n\t// Bail early and discard existing data if data argument is not a snaklist\n\tif ( !( data instanceof datamodel.SnakList ) ) {\n\t\tthrow new Error( 'Invalid snaklist' );\n\t}\n\n\treturn $.Deferred().resolve()\n\t\t.then(\n\t\t\t// get rid of existing snak widgets that are no longer present in the\n\t\t\t// new set of data we've been fed (or are in an invalid state)\n\t\t\t() => self.removeWidgets( self.state.snaks.filter( ( item, i ) => {\n\t\t\t\tif ( existingWidgetsData[ i ] === undefined ) {\n\t\t\t\t\t// failed to fetch data (likely because of incomplete input),\n\t\t\t\t\t// so we should remove this snak...\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn !data.hasItem( existingWidgetsData[ i ] );\n\t\t\t} ) )\n\t\t)\n\t\t.then( () => {\n\t\t\tconst newSnakWidgets = [],\n\t\t\t\tpromises = [];\n\n\t\t\t// add new snak widgets that don't already exist\n\t\t\tdata.each( ( i, snak ) => {\n\t\t\t\tconst exists = existingWidgetsData[ i ] && existingWidgetsData[ i ].equals( snak ),\n\t\t\t\t\twidgetPromise = exists ? $.Deferred().resolve( self.state.snaks[ i ] ) : self.createWidget();\n\n\t\t\t\tpromises.push(\n\t\t\t\t\twidgetPromise.then( ( innerWidget ) => {\n\t\t\t\t\t\tnewSnakWidgets[ i ] = innerWidget;\n\t\t\t\t\t\treturn innerWidget.setData( snak );\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t} );\n\n\t\t\treturn $.when.apply( $, promises )\n\t\t\t\t.then( self.setState.bind( self, {\n\t\t\t\t\tsnaks: newSnakWidgets,\n\t\t\t\t\t// if new data was passed in, error is no longer valid\n\t\t\t\t\terrors: data.equals( self.getData() ) ? self.getErrors() : []\n\t\t\t\t} ) );\n\t\t} );\n};\n\n/**\n * Handle the part of the response from a wbcheckconstraints api call that is relevant to this\n * SnakListWidget'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 */\nSnakListWidget.prototype.setConstraintsReport = function ( results ) {\n\t// extract snaklist constraint reports, pass them along to snak widget,\n\t// and gather promises\n\tconst promises = this.state.snaks.map( ( widget ) => {\n\t\ttry {\n\t\t\tconst data = widget.getData();\n\t\t\tconst propertyId = data.getPropertyId();\n\t\t\tconst hash = data.getHash();\n\n\t\t\tconst result = results[ propertyId ].filter( ( responseForSnak ) => responseForSnak.hash === hash )[ 0 ] || null;\n\t\t\treturn widget.setConstraintsReport( result );\n\t\t} catch ( e ) {\n\t\t\treturn widget.setConstraintsReport( null );\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 = SnakListWidget;\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/SnakWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":93,"column":22,"nodeType":"NewExpression","messageId":"noLabel","endLine":97,"endColumn":6},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":116,"column":1,"nodeType":"Block","endLine":116,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":136,"column":1,"nodeType":"Block","endLine":136,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":146,"column":1,"nodeType":"Block","endLine":146,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":245,"column":1,"nodeType":"Block","endLine":245,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":254,"column":1,"nodeType":"Block","endLine":254,"endColumn":1}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":5,"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":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":251,"column":1,"nodeType":"Block","endLine":251,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":323,"column":1,"nodeType":"Block","endLine":323,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Deferred' is undefined.","line":335,"column":1,"nodeType":"Block","endLine":335,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":417,"column":1,"nodeType":"Block","endLine":417,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":433,"column":1,"nodeType":"Block","endLine":433,"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":7,"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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'AbstractInputWidget' is undefined.","line":15,"column":1,"nodeType":"Block","endLine":15,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'AbstractInputWidget' is undefined.","line":22,"column":1,"nodeType":"Block","endLine":22,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":63,"column":1,"nodeType":"Block","endLine":63,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":74,"column":1,"nodeType":"Block","endLine":74,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":110,"column":1,"nodeType":"Block","endLine":110,"endColumn":1}],"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":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\n/**\n * @abstract\n * @param {Object} config Configuration options\n * @param {boolean} [config.isQualifier] True when used as qualifier value, false (default) for statement level\n */\n// eslint-disable-next-line no-unused-vars\nconst AbstractInputWidget = function MediaInfoStatementsAbstractInputWidget( config ) {};\n\n/**\n * Fired when the value is considered \"complete\" (e.g. hitting \"enter\", clicking \"add\", ...)\n *\n * @event add\n * @param {AbstractInputWidget}\n */\n\n/**\n * Fired as the value changes.\n *\n * @event change\n * @param {AbstractInputWidget}\n */\n\n/**\n * Returns a raw input value as understood by the wbparsevalue API endpoint.\n *\n * @abstract\n * @return {string}\n */\nAbstractInputWidget.prototype.getRawValue = function () {\n\tthrow new Error( 'Not implemented' );\n};\n\n/**\n * Returns options for input as understood by the wbparsevalue API endpoint.\n *\n * @return {Object}\n */\nAbstractInputWidget.prototype.getRawValueOptions = function () {\n\treturn undefined;\n};\n\n/**\n * Returns a DataValue object that corresponds to the current input.\n * This method could throw errors for obvious input errors that can\n * be checked client-side, but the returned object is not guaranteed\n * to be valid (see `validate()` for serverside validation)\n *\n * @abstract\n * @return {dataValues.DataValue}\n * @throws {Error}\n */\nAbstractInputWidget.prototype.getData = function () {\n\tthrow new Error( 'Not implemented' );\n};\n\n/**\n * Update the input widget to reflect the given data.\n *\n * @abstract\n * @param {dataValues.DataValue} data\n * @return {jQuery.Promise}\n */\n// eslint-disable-next-line no-unused-vars\nAbstractInputWidget.prototype.setData = function ( data ) {\n\tthrow new Error( 'Not implemented' );\n};\n\n/**\n * Clear existing input, essentially returning input to an empty, pristine state.\n *\n * @abstract\n * @return {jQuery.Promise}\n */\nAbstractInputWidget.prototype.clear = function () {\n\tthrow new Error( 'Not implemented' );\n};\n\n/**\n * Focuses the widget.\n *\n * @abstract\n */\nAbstractInputWidget.prototype.focus = function () {\n\tthrow new Error( 'Not implemented' );\n};\n\n/**\n * Enables/disabled the widget.\n *\n * @abstract\n */\nAbstractInputWidget.prototype.setDisabled = function () {\n\tthrow new Error( 'Not implemented' );\n};\n\n/**\n * More rigorous, server-side, validation (the kind of validation that\n * data will undergo when it'll actually be submitted to the server)\n * This includes validating the data for the datatype of the property\n * it's related with (e.g. any string input might be fine for a 'string'\n * property, but will require a schema etc. for a 'url' property)\n *\n * Returns a promise that resolves with the relevant DataValue, or is\n * rejected when the input is invalid.\n *\n * @param {string} [propertyId] The id of the relevant property to validate against\n * @param {string} [datatype] The datatype to validate against\n * @return {jQuery.Promise.<dataValues.DataValue>}\n */\nAbstractInputWidget.prototype.parseValue = function ( propertyId, datatype ) {\n\tconst api = wikibase.api.getLocationAgnosticMwApi(\n\t\tmw.config.get( 'wbmiRepoApiUrl', mw.config.get( 'wbRepoApiUrl' ) ),\n\t\t{ anonymous: true }\n\t);\n\n\tif ( propertyId === undefined && datatype === undefined ) {\n\t\t// parsevalue API only accepts one or the other\n\t\tthrow new Error( 'Either \"datatype\" or \"propertyId\" must be set' );\n\t}\n\n\tif ( propertyId !== undefined && datatype !== undefined ) {\n\t\t// parsevalue API only accepts one or the other\n\t\tthrow new Error( 'The arguments \"datatype\" and \"propertyId\" can not be used together' );\n\t}\n\n\tconst promise = api.get( {\n\t\taction: 'wbparsevalue',\n\t\tformat: 'json',\n\t\tproperty: propertyId,\n\t\tdatatype: datatype,\n\t\tvalues: [ this.getRawValue() ],\n\t\toptions: JSON.stringify( this.getRawValueOptions() ),\n\t\tvalidate: true\n\t} );\n\n\t// parse on the server\n\treturn promise\n\t\t.then( ( response ) => {\n\t\t\tconst rawValue = response.results[ 0 ];\n\t\t\treturn dataValues.newDataValue( rawValue.type, rawValue.value );\n\t\t} )\n\t\t.promise( { abort: promise.abort } );\n};\n\n/**\n * Use OOUI widget setValidityFlag method to indicate that an input within\n * this widget has caused an error.\n *\n * @abstract\n */\nAbstractInputWidget.prototype.flagAsInvalid = function () {\n\t// Not every input type will be able to use this method; input types with a\n\t// single OOUI input widget (e.g. string, quantity) can use this method to\n\t// call the setValidityFlag method of their OOUI input, but more complex\n\t// input types may have input-level validation or more complex logic for\n\t// determining which input(s) to highlight as invalid.\n\treturn;\n};\n\nmodule.exports = AbstractInputWidget;\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/EntityAutocompleteInputWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":79,"column":1,"nodeType":"Block","endLine":79,"endColumn":1}],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":1,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":37,"column":77,"nodeType":"ObjectExpression","endLine":44,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst FormatValueElement = require( 'wikibase.mediainfo.base' ).FormatValueElement,\n\tdatamodel = require( 'wikibase.datamodel' );\n\n/**\n * @param {Object} config Configuration options\n * @param {string} [config.entityType] 'property' or 'item' (defaults to 'item')\n * @param {number} [config.maxSuggestions] The maximum number of suggestions to display in the auto-suggest\n * @param {Array} [config.filter] Array of objects each containing fields 'field' and 'value'.\n * Suggestions will only displayed if suggestion.{field} === {value} ... e.g. if config.filter\n * contains { 'field': 'type', 'value: 'property' } then only suggestions with 'type'\n * equal to 'property' will be returned.\n * Suffixing the value of 'field' with the character ! inverts the filter\n */\nconst EntityAutocompleteInputWidget = function MediaInfoStatementsEntityAutocompleteInputWidget( config ) {\n\tconfig = config || {};\n\n\tthis.apiUri =\n\t\tmw.config.get( 'wbmiExternalEntitySearchBaseUri' ) ||\n\t\tmw.config.get( 'wbmiRepoApiUrl' ) ||\n\t\tmw.config.get( 'wbRepoApiUrl' );\n\n\tthis.entityType = config.entityType || 'item';\n\tthis.maxSuggestions = config.maxSuggestions;\n\tthis.filter = config.filter || [];\n\tthis.entityId = undefined;\n\n\t// dataCache will temporarily store entity id => entity data mappings of\n\t// entities, so that if we somehow then alter the text (add characters,\n\t// remove some) and then adjust our typing to form a known item,\n\t// it'll recognize it and know what the id was, without us having to\n\t// select it anew\n\tthis.dataCache = {};\n\n\t// eslint-disable-next-line mediawiki/class-doc\n\tEntityAutocompleteInputWidget.super.call( this, Object.assign( {}, config, {\n\t\t// classes should *always* be added, because some essential functionality\n\t\t// (e.g. CSS to turn red on invalid input) depends on these classes\n\t\tclasses: [\n\t\t\t'wbmi-input-widget__autocomplete',\n\t\t\t'wbmi-input-widget__input'\n\t\t].concat( config.classes || [] )\n\t} ) );\n\n\tOO.ui.mixin.FlaggedElement.call(\n\t\tthis,\n\t\tObject.assign( {}, {\n\t\t\t$flagged: this.$element\n\t\t}, config )\n\t);\n\n\tOO.ui.mixin.LookupElement.call(\n\t\tthis,\n\t\tObject.assign( {}, {\n\t\t\tallowSuggestionsWhenEmpty: false,\n\t\t\thighlightFirst: false\n\t\t}, config )\n\t);\n\n\tFormatValueElement.call( this, config );\n};\nOO.inheritClass( EntityAutocompleteInputWidget, OO.ui.TextInputWidget );\nOO.mixinClass( EntityAutocompleteInputWidget, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( EntityAutocompleteInputWidget, OO.ui.mixin.LookupElement );\nOO.mixinClass( EntityAutocompleteInputWidget, FormatValueElement );\n\n/**\n * @inheritdoc\n */\nEntityAutocompleteInputWidget.prototype.onLookupMenuChoose = function ( item ) {\n\tconst data = item.getData();\n\tthis.setData( data.id );\n\tthis.emit( 'add', data );\n};\n\n/**\n * @param {string} entityId\n * @return {jQuery.Promise}\n */\nEntityAutocompleteInputWidget.prototype.setData = function ( entityId ) {\n\tconst self = this;\n\n\tif ( entityId === this.entityId ) {\n\t\treturn $.Deferred().resolve( this.$element ).promise();\n\t}\n\n\tif ( entityId === undefined ) {\n\t\tthis.setValue( '' );\n\t\tthis.setFlags( { destructive: false } );\n\t\tthis.entityId = undefined;\n\t\treturn $.Deferred().resolve( this.$element ).promise();\n\t}\n\n\tif ( entityId && entityId in this.dataCache ) {\n\t\t// input (label) is one we've already selected, we still know the id\n\t\tthis.setValue( this.dataCache[ entityId ].label || this.dataCache[ entityId ].id );\n\t\tthis.setFlags( { destructive: false } );\n\t\t// `self.setValue` might have set an invalid entity id if there are\n\t\t// multiple entities with the exact same label, so let's make sure\n\t\t// to overrule it with the correct entity id\n\t\tthis.entityId = entityId;\n\t\treturn $.Deferred().resolve( this.$element ).promise();\n\t}\n\n\tthis.entityId = entityId;\n\treturn this.formatValue( new datamodel.EntityId( entityId ), 'text/plain' )\n\t\t.then( ( plain ) => {\n\t\t\t// update textual representation (= label) in the input field\n\t\t\tself.setValue( plain );\n\t\t\tself.setFlags( { destructive: false } );\n\t\t\t// `self.setValue` might have reset this for lack of known data,\n\t\t\t// so let's make sure to overrule it and restore the entity id\n\t\t\tself.entityId = entityId;\n\t\t} )\n\t\t.catch( () => {\n\t\t\t// failed to format this id - invalidate it\n\t\t\tself.entityId = undefined;\n\t\t\tself.setFlags( { destructive: true } );\n\t\t} )\n\t\t.always( () => self.$element );\n};\n\n/**\n * @return {string|undefined}\n */\nEntityAutocompleteInputWidget.prototype.getData = function () {\n\treturn this.entityId;\n};\n\n/**\n * @inheritdoc\n */\nEntityAutocompleteInputWidget.prototype.setValue = function ( value ) {\n\tconst self = this,\n\t\tlabels = Object.keys( this.dataCache ).map( ( entityId ) => self.dataCache[ entityId ].label || self.dataCache[ entityId ].id ),\n\t\tindex = labels.indexOf( this.cleanUpValue( value ) );\n\n\tthis.entityId = index >= 0 ? Object.keys( this.dataCache )[ index ] : undefined;\n\n\tEntityAutocompleteInputWidget.super.prototype.setValue.call( this, value );\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nEntityAutocompleteInputWidget.prototype.onBlur = function () {\n\tEntityAutocompleteInputWidget.super.prototype.onBlur.call( this );\n\n\t// verify that this.data (which should contain the entity id) is set\n\t// if not, mark the input as destructive to indicate the value is invalid\n\tif ( this.entityId === undefined && this.getValue() !== '' ) {\n\t\tthis.setFlags( { destructive: true } );\n\t} else {\n\t\tthis.setFlags( { destructive: false } );\n\t}\n\tthis.emit( 'blur' );\n};\n\nEntityAutocompleteInputWidget.prototype.onFocus = function () {\n\tEntityAutocompleteInputWidget.super.prototype.onFocus.call( this );\n\tthis.emit( 'focus' );\n};\n\n/**\n * Fetch autocomplete results.\n *\n * @inheritdoc\n */\nEntityAutocompleteInputWidget.prototype.getLookupRequest = function () {\n\tconst value = this.getValue(),\n\t\tdeferred = $.Deferred(),\n\t\tapi = wikibase.api.getLocationAgnosticMwApi( this.apiUri, { anonymous: true } ),\n\t\trequestParams = {\n\t\t\taction: 'wbsearchentities',\n\t\t\tsearch: value,\n\t\t\tformat: 'json',\n\t\t\tlanguage: mw.config.get( 'wgUserLanguage' ),\n\t\t\tuselang: mw.config.get( 'wgUserLanguage' ),\n\t\t\ttype: this.entityType,\n\t\t\tlimit: this.filter.length > 0 ? 'max' : undefined\n\t\t};\n\n\tif ( value.length === 0 ) {\n\t\treturn deferred.resolve( [] ).promise( { abort: function () {} } );\n\t}\n\n\treturn api.get( requestParams );\n};\n\n/**\n * Transform API response.\n *\n * @inheritdoc\n */\nEntityAutocompleteInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {\n\treturn response.search;\n};\n\n/**\n * If a user middle-clicks a menu option, go to that Wikidata item. This\n * replicates behavior from the Wikidata UI.\n *\n * @param {Object} e Event\n */\nEntityAutocompleteInputWidget.prototype.onMousedown = function ( e ) {\n\tif ( e.which === OO.ui.MouseButtons.MIDDLE ) {\n\t\t// This is less than ideal, but is probably a decent use case for\n\t\t// window.open. This is a response to a mousedown event so it shouldn't\n\t\t// trigger any popup blockers in modern browsers. For browsers set to\n\t\t// prefer new tabs over new windows, this will open in a new tab.\n\t\twindow.open( e.currentTarget.dataset.mwUrl, '_blank' );\n\t}\n};\n\n/**\n * Construct menu options from transformed API data.\n *\n * @inheritdoc\n */\nEntityAutocompleteInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {\n\tdata = this.filterData( data );\n\n\tif ( this.maxSuggestions !== undefined ) {\n\t\tdata = data.slice( 0, this.maxSuggestions - 1 );\n\t}\n\n\tif ( !data ) {\n\t\treturn [];\n\t} else if ( data.length === 0 ) {\n\t\t// Generate a disabled option with a helpful message in case no results are found.\n\t\treturn [\n\t\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\t\tdisabled: true,\n\t\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-statement-no-results' )\n\t\t\t} )\n\t\t];\n\t}\n\n\tconst items = [];\n\tfor ( let i = 0; i < data.length; i++ ) {\n\t\tthis.dataCache[ data[ i ].id ] = data[ i ];\n\n\t\tconst item = new OO.ui.MenuOptionWidget( {\n\t\t\t// this data will be passed to onLookupMenuChoose when item is selected\n\t\t\tdata: data[ i ],\n\t\t\tlabel: this.createLabelFromSuggestion( data[ i ] )\n\t\t} );\n\t\titem.$element.find( '.wbmi-autocomplete-option' ).on( 'mousedown', this.onMousedown.bind( this ) );\n\t\titems.push( item );\n\t}\n\n\treturn items;\n};\n\nEntityAutocompleteInputWidget.prototype.filterData = function ( data ) {\n\tlet filters = this.filter;\n\n\tif ( filters === undefined ) {\n\t\treturn data;\n\t}\n\n\t// If there's just a single filter make it into an array\n\tif ( filters.field !== undefined ) {\n\t\tfilters = [ filters ];\n\t}\n\n\tfilters.forEach( ( filter ) => {\n\t\tlet field = filter.field;\n\t\tlet filterType = 'includeOnMatch';\n\n\t\tif ( field.indexOf( '!' ) === 0 ) {\n\t\t\tfilterType = 'excludeOnMatch';\n\t\t\tfield = filter.field.slice( 1 );\n\t\t}\n\t\tconst values = filter.value.split( '|' );\n\t\tdata = data.filter( ( datum ) => {\n\t\t\tif ( filterType === 'includeOnMatch' ) {\n\t\t\t\treturn values.includes( datum[ field ] );\n\t\t\t} else {\n\t\t\t\treturn !values.includes( datum[ field ] );\n\t\t\t}\n\t\t} );\n\t} );\n\n\treturn data;\n};\n\n/**\n * @param {Object} entityStub\n * @return {jQuery}\n */\nEntityAutocompleteInputWidget.prototype.createLabelFromSuggestion = function ( entityStub ) {\n\tconst template = mw.template.get(\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/inputs/EntityAutocompleteInputWidgetLabel.mustache+dom'\n\t);\n\n\tconst data = {};\n\n\tdata.label = entityStub.label || entityStub.id;\n\tdata.description = entityStub.description;\n\tdata.url = entityStub.url;\n\n\tif ( entityStub.aliases ) {\n\t\tdata.aliases =\n\t\t\tmw.msg( 'word-separator' ) +\n\t\t\tmw.msg( 'parentheses', mw.language.listToText( entityStub.aliases ) );\n\t}\n\n\treturn template.render( data );\n};\n\nmodule.exports = EntityAutocompleteInputWidget;\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/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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":110,"column":1,"nodeType":"Block","endLine":110,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":389,"column":1,"nodeType":"Block","endLine":389,"endColumn":1}],"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":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst ComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\tAbstractInputWidget = require( './AbstractInputWidget.js' );\n\nlet kartoBox,\n\tkartoEditing;\n\n/**\n * Widget that wraps globe-coordinate fields.\n *\n * @param {Object} config Configuration options\n * @param {boolean} [config.isQualifier]\n */\nconst GlobeCoordinateInputWidget = function MediaInfoStatementsGlobeCoordinateInputWidget( config ) {\n\tconst self = this;\n\n\tconfig = config || {};\n\n\tthis.state = {\n\t\tlatitude: null,\n\t\tlongitude: null,\n\t\t// precision will be inferred from input, but can be manually overridden;\n\t\t// as soon as it changes manually, the custom precision will be used\n\t\tinferredPrecision: null,\n\t\tcustomPrecision: null,\n\t\tisQualifier: !!config.isQualifier,\n\t\tkartographer: false,\n\t\texpanded: false\n\t};\n\n\tthis.parseValuePromise = undefined;\n\tthis.debouncedOnChange = OO.ui.debounce( this.onChange.bind( this ), 200 );\n\tthis.onMapClickHandler = this.onMapClick.bind( this );\n\n\tthis.coordinateInput = new OO.ui.TextInputWidget( {\n\t\tclasses: [ 'wbmi-input-widget__input' ],\n\t\tplaceholder: mw.msg( 'wikibasemediainfo-coordinate-input-placeholder' ),\n\t\tisRequired: true,\n\t\ttype: 'string',\n\t\tvalidate: function ( value ) {\n\t\t\t// mark input field as invalid except\n\t\t\treturn value === '' || self.hasValidInput();\n\t\t}\n\t} );\n\n\tthis.precisionInput = new OO.ui.DropdownInputWidget( {\n\t\tclasses: [ 'wbmi-input-widget__input' ],\n\t\tlabel: mw.msg( 'wikibasemediainfo-select-precision-label' ),\n\t\toptions: this.getPrecisionOptions(),\n\t\tisRequired: true,\n\t\t$overlay: true\n\t} );\n\n\t// Set up map element for Kartographer\n\tthis.$map = $( '<div>' ).addClass( 'wbmi-input-widget__map' );\n\tthis.map = undefined;\n\tthis.initializeMap();\n\n\tthis.bindEventListeners();\n\n\tGlobeCoordinateInputWidget.super.call( this );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/inputs/GlobeCoordinateInputWidget.mustache+dom'\n\t);\n};\n\nOO.inheritClass( GlobeCoordinateInputWidget, OO.ui.Widget );\nOO.mixinClass( GlobeCoordinateInputWidget, AbstractInputWidget );\nOO.mixinClass( GlobeCoordinateInputWidget, ComponentWidget );\n\n/**\n * Bind event listeners, including one on the map if using Kartographer\n */\nGlobeCoordinateInputWidget.prototype.bindEventListeners = function () {\n\tconst self = this;\n\n\tthis.coordinateInput.connect( this, { change: this.debouncedOnChange } );\n\tthis.coordinateInput.connect( this, { enter: 'onEnter' } );\n\tthis.precisionInput.connect( this, { change: 'onPrecisionChange' } );\n\tmw.loader.using( [ 'ext.kartographer.box', 'ext.kartographer.editing' ] )\n\t\t.then( () => {\n\t\t\tself.map.on( 'click', self.onMapClickHandler );\n\t\t} );\n};\n\n/**\n * Unbind event listeners, including one on the map if using Kartographer\n */\nGlobeCoordinateInputWidget.prototype.unbindEventListeners = function () {\n\tconst self = this;\n\n\tthis.coordinateInput.disconnect( this, { change: this.debouncedOnChange } );\n\tthis.coordinateInput.disconnect( this, { enter: 'onEnter' } );\n\tthis.precisionInput.disconnect( this, { change: 'onPrecisionChange' } );\n\n\tmw.loader.using( [ 'ext.kartographer.box', 'ext.kartographer.editing' ] )\n\t\t.then( () => {\n\t\t\tself.map.off( 'click', self.onMapClickHandler );\n\t\t} );\n};\n\n/**\n * Set the data of this widget programatically. This method is used to populate\n * qualifier-mode coordinate inputs with pre-existing data.\n *\n * @param {dataValues.DataValue} newData\n * @return {jQuery.Promise}\n */\nGlobeCoordinateInputWidget.prototype.setData = function ( newData ) {\n\tconst json = newData.toJSON(),\n\t\tself = this;\n\n\tlet existingData;\n\n\ttry {\n\t\texistingData = this.getData();\n\t} catch ( e ) {\n\t\t// no existing data, proceed\n\t}\n\n\tthis.unbindEventListeners();\n\tthis.coordinateInput.setValue( json.latitude + ', ' + json.longitude );\n\tthis.precisionInput.setValue( json.precision );\n\tthis.bindEventListeners();\n\n\treturn this.setState( {\n\t\tlatitude: json.latitude,\n\t\tlongitude: json.longitude,\n\t\tinferredPrecision: json.precision,\n\t\tcustomPrecision: null,\n\t\texpanded: false\n\t} ).then( ( $element ) => {\n\t\tif ( !newData.equals( existingData ) ) {\n\t\t\tself.emit( 'change', self );\n\t\t}\n\t\treturn $element;\n\t} );\n};\n\n/**\n * @inheritDoc\n */\nGlobeCoordinateInputWidget.prototype.getData = function () {\n\tif ( this.state.latitude === null || this.state.longitude === null ) {\n\t\tthrow new Error( 'No valid coordinate' );\n\t}\n\n\treturn dataValues.newDataValue( 'globecoordinate', {\n\t\tlatitude: this.state.latitude,\n\t\tlongitude: this.state.longitude,\n\t\tprecision: this.state.customPrecision || this.state.inferredPrecision\n\t} );\n};\n\n/**\n * @inheritDoc\n */\nGlobeCoordinateInputWidget.prototype.getRawValue = function () {\n\treturn this.coordinateInput.getValue();\n};\n\n/**\n * @inheritDoc\n */\nGlobeCoordinateInputWidget.prototype.getRawValueOptions = function () {\n\treturn {\n\t\tprecision: this.state.customPrecision || undefined\n\t};\n};\n\n/**\n * @inheritdoc\n */\nGlobeCoordinateInputWidget.prototype.clear = function () {\n\tlet layer;\n\n\tthis.coordinateInput.setValue( '' );\n\tthis.precisionInput.setValue( '' );\n\tthis.coordinateInput.setValidityFlag( true );\n\n\tif ( kartoEditing && this.map ) {\n\t\tlayer = kartoEditing.getKartographerLayer( this.map );\n\t\tlayer.clearLayers();\n\t}\n\n\treturn this.setState( {\n\t\tlatitude: null,\n\t\tlongitude: null,\n\t\tinferredPrecision: null,\n\t\tcustomPrecision: null,\n\t\texpanded: false\n\t} );\n};\n\n/**\n * @param {string} newValue new input value\n */\nGlobeCoordinateInputWidget.prototype.onChange = function ( newValue ) {\n\tconst self = this;\n\n\tif ( this.parseValuePromise && this.parseValuePromise.abort ) {\n\t\tthis.parseValuePromise.abort();\n\t}\n\n\t// If user is simply deleting the previous value, no need to parse;\n\t// Reset values to null and return\n\tif ( newValue === '' ) {\n\t\tthis.setState( {\n\t\t\tlatitude: null,\n\t\t\tlongitude: null,\n\t\t\tinferredPrecision: null\n\t\t} ).then( this.emit.bind( this, 'change', this ) );\n\n\t\treturn;\n\t}\n\n\tthis.parseValuePromise = this.parseValue( undefined, 'globe-coordinate' );\n\tthis.parseValuePromise\n\t\t.then( ( response ) => {\n\t\t\tconst json = response.toJSON();\n\n\t\t\t// set the value of the precision dropdown to the inferred precision if\n\t\t\t// no custom precision has been set\n\t\t\tif ( !self.state.customPrecision ) {\n\t\t\t\tself.unbindEventListeners();\n\t\t\t\tself.precisionInput.setValue( json.precision );\n\t\t\t\tself.bindEventListeners();\n\t\t\t}\n\n\t\t\tself.coordinateInput.setValidityFlag( true );\n\t\t\tself.emit( 'change', self );\n\n\t\t\treturn self.setState( {\n\t\t\t\tlatitude: json.latitude,\n\t\t\t\tlongitude: json.longitude,\n\t\t\t\tinferredPrecision: json.precision\n\t\t\t} );\n\t\t} )\n\t\t.catch( () => {\n\t\t\tself.coordinateInput.setValidityFlag( false );\n\t\t} );\n};\n\nGlobeCoordinateInputWidget.prototype.onPrecisionChange = function () {\n\tthis.setState( {\n\t\tcustomPrecision: Number( this.precisionInput.getValue() )\n\t} ).then( this.emit.bind( this, 'change', this ) );\n};\n\nGlobeCoordinateInputWidget.prototype.onEnter = function () {\n\tif ( this.hasValidInput() ) {\n\t\tthis.emit( 'add', this );\n\t}\n};\n\nGlobeCoordinateInputWidget.prototype.onExpandClick = function () {\n\t// Toggle the map visibility\n\tthis.setState( { expanded: !( this.state.expanded ) } );\n};\n\n/**\n * @param {Object} e event\n */\nGlobeCoordinateInputWidget.prototype.onMapClick = function ( e ) {\n\tconst coordinates = this.map.mouseEventToLatLng( e.originalEvent ),\n\t\tprecision = this.constructor.zoomToPrecision( this.map.getZoom(), coordinates.lat ),\n\t\tmeaningfulDigits = this.constructor.precisionToDigits( precision ),\n\t\tlat = coordinates.lat.toFixed( meaningfulDigits ),\n\t\tlng = coordinates.lng.toFixed( meaningfulDigits ),\n\t\tlatLngStr = lat + ', ' + lng;\n\n\tthis.unbindEventListeners();\n\tthis.coordinateInput.setValue( latLngStr );\n\tthis.precisionInput.setValue( String( precision ) );\n\tthis.bindEventListeners();\n\n\tthis.coordinateInput.setValidityFlag( true );\n\n\tthis.setState( {\n\t\tlatitude: parseFloat( lat ),\n\t\tlongitude: parseFloat( lng ),\n\t\tinferredPrecision: precision\n\t} ).then( this.emit.bind( this, 'change', this ) );\n};\n\n/**\n * @return {boolean}\n */\nGlobeCoordinateInputWidget.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 */\nGlobeCoordinateInputWidget.prototype.getTemplateData = function () {\n\tconst submitButton = new OO.ui.ButtonWidget( {\n\t\t\tclasses: [ 'wbmi-input-widget__button' ],\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-globecoordinate-input-button-text' ),\n\t\t\tflags: [ 'progressive' ],\n\t\t\tdisabled: !this.hasValidInput()\n\t\t} ),\n\t\texpandButton = new OO.ui.ToggleButtonWidget( {\n\t\t\tclasses: [\n\t\t\t\t'wbmi-input-widget__button',\n\t\t\t\t'wbmi-input-widget__button--map-expand'\n\t\t\t],\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-globecoordinate-map-button-text' ),\n\t\t\tframed: true,\n\t\t\ticon: 'mapPin',\n\t\t\tvalue: this.state.expanded\n\t\t} );\n\n\tsubmitButton.connect( this, { click: [ 'emit', 'add', this ] } );\n\texpandButton.connect( this, { click: 'onExpandClick' } );\n\n\treturn {\n\t\tisQualifier: this.state.isQualifier,\n\t\tcoordinates: {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-coordinate-input-label' ),\n\t\t\tinput: this.coordinateInput\n\t\t},\n\t\tprecision: {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-precision-input-label' ),\n\t\t\tinput: this.precisionInput\n\t\t},\n\t\tsubmitButton: submitButton,\n\t\texpandButton: expandButton,\n\t\texpanded: this.state.expanded,\n\t\tkartographer: this.state.kartographer,\n\t\tmap: this.$map\n\t};\n};\n\n/**\n * @inheritDoc\n */\nGlobeCoordinateInputWidget.prototype.render = function () {\n\tconst self = this;\n\n\treturn ComponentWidget.prototype.render.call( this ).then( ( $element ) => {\n\t\tif ( self.map === undefined || kartoEditing === undefined ) {\n\t\t\treturn $element;\n\t\t}\n\n\t\t// after having re-rendered our DOM, let's also update the marker on our map\n\t\t// to reflect the current state\n\t\tconst layer = kartoEditing.getKartographerLayer( self.map );\n\n\t\ttry {\n\t\t\tconst data = self.getData().getValue();\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\tself.constructor.precisionToZoom( data.getPrecision(), data.getLatitude() )\n\t\t\t);\n\t\t\t/* eslint-enable no-undef */\n\t\t} catch ( e ) {\n\t\t\t// no valid location at this point...\n\t\t\tlayer.clearLayers();\n\t\t}\n\n\t\treturn $element;\n\t} );\n};\n\n/**\n * @return {jQuery.Promise}\n */\nGlobeCoordinateInputWidget.prototype.initializeMap = function () {\n\tconst self = this;\n\n\tif ( this.map ) {\n\t\t// map already initialized previously\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\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\t// Prevent users from entering weird values like 40 N, 250 E by picking\n\t\t\t\t// on the map. If users manually enter such values we will allow it\n\t\t\t\t// (wikidata considers it valid) and ItemWidget's map will do its best\n\t\t\t\t// to display such values; enforcing bounds on the map used for input\n\t\t\t\t// should make it harder for such values to be entered accidentally.\n\t\t\t\tmaxBounds: [\n\t\t\t\t\t[ 90, -180 ],\n\t\t\t\t\t[ -90, 180 ]\n\t\t\t\t],\n\t\t\t\tminZoom: 1\n\t\t\t} );\n\n\t\t\t// because the map node we'll be attaching this map to has not yet been\n\t\t\t// added to the DOM, it won't know what size it needs to initialize with...\n\t\t\t// we'll listen for DOM changes and when we discover this node getting\n\t\t\t// added, we'll invalidate its existing (incorrect) size\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\n\t\t\t\t\t// note: we're not going to disconnect the observer, because\n\t\t\t\t\t// toggling read & edit mode is going to repeatedly attach/detach\n\t\t\t\t\t// the map from DOM, causing the same thing over and over\n\t\t\t\t}\n\t\t\t} ).observe( document, { childList: true, subtree: true } );\n\n\t\t\tself.setState( { kartographer: true } );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nGlobeCoordinateInputWidget.prototype.focus = function () {\n\tthis.coordinateInput.focus();\n};\n\n/**\n * @inheritdoc\n */\nGlobeCoordinateInputWidget.prototype.setDisabled = function ( disabled ) {\n\tthis.coordinateInput.setDisabled( disabled );\n\tthis.precisionInput.setDisabled( disabled );\n\tComponentWidget.prototype.setDisabled.call( this, disabled );\n};\n\n/**\n * Get a language-specific label for a precision value, if one exists.\n *\n * @param {number} precision\n * @return {string}\n */\nGlobeCoordinateInputWidget.prototype.getPrecisionLabel = function ( precision ) {\n\tconst presets = {};\n\n\tpresets[ mw.msg( 'wikibasemediainfo-arcminute-label' ) ] = 1 / 60;\n\tpresets[ mw.msg( 'wikibasemediainfo-arcsecond-label' ) ] = 1 / 3600;\n\tpresets[ mw.msg( 'wikibasemediainfo-tenth-of-arcsecond-label' ) ] = 1 / 36000;\n\tpresets[ mw.msg( 'wikibasemediainfo-hundreth-of-arcsecond-label' ) ] = 1 / 360000;\n\tpresets[ mw.msg( 'wikibasemediainfo-thousanth-of-arcsecond-label' ) ] = 1 / 3600000;\n\n\tfor ( const label in presets ) {\n\t\tif ( Math.abs( precision - presets[ label ] ) < 0.000000000001 ) {\n\t\t\treturn label;\n\t\t}\n\t}\n\n\treturn '±' + precision + '°';\n};\n\n/**\n * Return options for our precision DropdownInputWidget.\n *\n * @return {Object[]}\n */\nGlobeCoordinateInputWidget.prototype.getPrecisionOptions = function () {\n\tconst precisions = this.constructor.getPrecisions(),\n\t\tprecisionValues = [],\n\t\tself = this;\n\n\tprecisions.forEach( ( precision ) => {\n\t\tprecisionValues.unshift( {\n\t\t\tdata: precision,\n\t\t\tlabel: self.getPrecisionLabel( precision )\n\t\t} );\n\t} );\n\treturn precisionValues;\n};\n\n/**\n * Return an array of all available precision values.\n *\n * @return {Array}\n */\nGlobeCoordinateInputWidget.getPrecisions = function () {\n\treturn [\n\t\t10,\n\t\t1,\n\t\t0.1,\n\t\t0.01,\n\t\t0.001,\n\t\t0.0001,\n\t\t0.00001,\n\t\t0.000001,\n\t\t1 / 60,\n\t\t1 / 3600,\n\t\t1 / 36000,\n\t\t1 / 360000,\n\t\t1 / 3600000\n\t];\n};\n\n/**\n * Given a latitude & zoom level, this will figure out the precision.\n *\n * When the map is zoomed out, the coordinate that's being selected will be\n * a lot less precise than when it's zoomed in. We can determine the maximum\n * precision and use that value to prefill the precision value, because most\n * average users won't really know what those values mean anyway...\n *\n * @see https://groups.google.com/d/msg/google-maps-js-api-v3/hDRO4oHVSeM/osOYQYXg2oUJ\n *\n * @param {number} zoom\n * @param {number} latitude\n * @return {number}\n */\nGlobeCoordinateInputWidget.zoomToPrecision = function ( zoom, latitude ) {\n\tconst precisions = this.getPrecisions(),\n\t\tmetersPerPx = ( 156543.03392 * Math.cos( ( latitude * Math.PI ) / 180 ) ) / Math.pow( 2, zoom ),\n\t\t// 111.32m = 1 degree at equator, then corrected for latitude\n\t\tdegrees = metersPerPx / ( 111.32 * 1000 * Math.cos( latitude * ( Math.PI / 180 ) ) );\n\n\t// find closest match for the actual precision\n\treturn precisions.reduce( ( best, value ) => Math.abs( value - degrees ) < Math.abs( best - degrees ) ? value : best, Math.max.apply( null, precisions ) );\n};\n\n/**\n * Given a precision (e.g. 0.001), this will return the amount of digits\n * that are still meaningful (e.g. 3 digits) for that precision.\n *\n * E.g. 50.131224596772 makes no sense with a precision of 0.1 - there just\n * isn't enough precision and we might as well round to 50.1 immediately.\n *\n * @param {number} precision\n * @return {number}\n */\nGlobeCoordinateInputWidget.precisionToDigits = function ( precision ) {\n\tlet digits = -1;\n\tlet previous;\n\n\tdo {\n\t\tprevious = precision;\n\t\tdigits++;\n\t\tprecision %= Math.pow( 1 / 10, digits );\n\t} while ( previous === precision );\n\n\treturn digits;\n};\n\n/**\n * Given a latitude & precision, this will figure out the zoom level.\n *\n * @see https://groups.google.com/d/msg/google-maps-js-api-v3/hDRO4oHVSeM/osOYQYXg2oUJ\n *\n * @param {number} precision\n * @param {number} latitude\n * @return {number}\n */\nGlobeCoordinateInputWidget.precisionToZoom = function ( precision, latitude ) {\n\t// 111.32m = 1 degree at equator, then corrected for latitude\n\tconst metersPerPx = precision * ( 111.32 * 1000 * Math.cos( latitude * ( Math.PI / 180 ) ) ),\n\t\tzoom = Math.log( ( 156543.03392 * Math.cos( ( latitude * Math.PI ) / 180 ) ) / metersPerPx ) / Math.log( 2 );\n\n\treturn Math.round( zoom );\n};\n\nmodule.exports = GlobeCoordinateInputWidget;\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/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":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":136,"column":1,"nodeType":"Block","endLine":136,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":180,"column":1,"nodeType":"Block","endLine":180,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":293,"column":1,"nodeType":"Block","endLine":293,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst ComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\tAbstractInputWidget = require( './AbstractInputWidget.js' ),\n\tEntityInputWidget = require( './EntityInputWidget.js' ),\n\tMonolingualTextInputWidget = require( './MonolingualTextInputWidget.js' ),\n\tQuantityInputWidget = require( './QuantityInputWidget.js' ),\n\tStringInputWidget = require( './StringInputWidget.js' ),\n\tTimeInputWidget = require( './TimeInputWidget.js' ),\n\tGlobeCoordinateInputWidget = require( './GlobeCoordinateInputWidget.js' ),\n\tUnsupportedInputWidget = require( './UnsupportedInputWidget.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\n/**\n * This input widget is essentially a wrapper around other input types,\n * and allows switching the input types.\n *\n * @constructor\n * @param {Object} config\n * @param {string} [config.type]\n * @param {Array} [config.classes]\n * @param {boolean} [config.isQualifier]\n */\nconst MultiTypeInputWrapperWidget = function ( config ) {\n\tthis.config = Object.assign( {\n\t\tisQualifier: false,\n\t\ttype: undefined, // default to unsupported input type\n\t\tclasses: []\n\t}, config );\n\n\tthis.types = {\n\t\t'wikibase-entityid': EntityInputWidget,\n\t\tmonolingualtext: MonolingualTextInputWidget,\n\t\tquantity: QuantityInputWidget,\n\t\tstring: StringInputWidget,\n\t\ttime: TimeInputWidget,\n\t\tglobecoordinate: GlobeCoordinateInputWidget\n\t};\n\n\tthis.allowEmitChange = true;\n\n\tthis.state = {\n\t\ttype: this.config.type,\n\t\tinput: this.createInput( this.config.type ),\n\t\tsnakType: valueTypes.VALUE\n\t};\n\n\tthis.snakTypeWidget = new OO.ui.DropdownInputWidget( {\n\t\tclasses: [ 'wbmi-input-wrapper__snak-type' ],\n\t\tdropdown: {\n\t\t\tinvisibleLabel: true\n\t\t},\n\t\toptions: [\n\t\t\t{\n\t\t\t\tdata: valueTypes.VALUE,\n\t\t\t\tlabel: mw.message( 'wikibasemediainfo-filepage-statement-custom-value-option' ).parse()\n\t\t\t},\n\t\t\t{\n\t\t\t\tdata: valueTypes.SOMEVALUE,\n\t\t\t\tlabel: mw.message( 'wikibasemediainfo-filepage-statement-some-value-option' ).parse()\n\t\t\t},\n\t\t\t{\n\t\t\t\tdata: valueTypes.NOVALUE,\n\t\t\t\tlabel: mw.message( 'wikibasemediainfo-filepage-statement-no-value-option' ).parse()\n\t\t\t}\n\t\t],\n\t\ttitle: mw.message( 'wikibasemediainfo-filepage-statement-value-type-dropdown-title' ).parse()\n\t} );\n\n\tthis.snakTypeWidget.dropdownWidget.setIcon( 'ellipsis' );\n\tthis.snakTypeWidget.dropdownWidget.setIndicator( null );\n\tthis.snakTypeWidget.connect( this, { change: 'onSnakTypeChange' } );\n\n\tMultiTypeInputWrapperWidget.super.call( this, config );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/inputs/MultiTypeInputWrapperWidget.mustache+dom'\n\t);\n};\nOO.inheritClass( MultiTypeInputWrapperWidget, OO.ui.Widget );\nOO.mixinClass( MultiTypeInputWrapperWidget, AbstractInputWidget );\nOO.mixinClass( MultiTypeInputWrapperWidget, ComponentWidget );\n\n/**\n * @inheritDoc\n */\nMultiTypeInputWrapperWidget.prototype.getTemplateData = function () {\n\tconst self = this,\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\t\t// Currently somevalue/novalue are only intended to be used with\n\t\t// Wikidata items. Somevalue/novalue snaks for other datatypes added via\n\t\t// the API will be displayed and can be deleted but cannot be edited,\n\t\t// and these snaks cannot be added for other datatypes via this UI.\n\t\t//\n\t\t// To allow these snaks for all datatypes, this variable and its\n\t\t// associated template logic should be removed, and the getData method\n\t\t// of all datatypes should account for the possibility of no data, which\n\t\t// happens once on page load for existing items.\n\t\tshowSnakTypeWidget = this.state.type === 'wikibase-entityid';\n\n\t// make sure input accurately reflects disabled state\n\tthis.state.input.setDisabled( this.isDisabled() || !( this.state.type in this.types ) );\n\n\treturn {\n\t\terrors: errorMessages,\n\t\tisQualifier: this.config.isQualifier,\n\t\tshowSnakTypeWidget: showSnakTypeWidget,\n\t\tsnakTypeWidget: this.snakTypeWidget,\n\t\tinput: this.state.input,\n\t\ttype: Object.keys( this.types ).reduce( ( result, type ) => {\n\t\t\t// `type` will be a map like: { quantity: true, string: false, ... }\n\t\t\tresult[ type ] = self.state.type === type;\n\t\t\treturn result;\n\t\t}, { unsupported: !( this.state.type in this.types ) } )\n\t};\n};\n\n/**\n * MultiTypeInputWrapperWidget is basically a wrapper for multiple different\n * input types - this'll let you change the input type.\n *\n * @param {string} type One of 'wikibase-entityid', 'quantity', 'time', 'string',\n * 'globecoordinate', or 'monolingualtext'\n * @return {jQuery.Promise}\n */\nMultiTypeInputWrapperWidget.prototype.setInputType = function ( type ) {\n\tconst self = this,\n\t\tchanged = this.state.type !== type || this.getSnakType() !== valueTypes.VALUE,\n\t\tinput = this.createInput( type );\n\n\treturn this.setState( {\n\t\ttype: type,\n\t\t// Always reset snakType to value when property changes.\n\t\tsnakType: valueTypes.VALUE,\n\t\t// re-use existing input if the type has not changed\n\t\tinput: changed ? input : this.state.input\n\t} ).then( ( $element ) => {\n\t\tif ( changed ) {\n\t\t\tself.emit( 'change' );\n\t\t}\n\t\treturn $element;\n\t} );\n};\n\n/**\n * @param {string} type\n * @return {AbstractInputWidget}\n */\nMultiTypeInputWrapperWidget.prototype.createInput = function ( type ) {\n\tconst Constructor = type in this.types ? this.types[ type ] : UnsupportedInputWidget;\n\n\treturn new Constructor( { isQualifier: this.config.isQualifier } ).connect( this, {\n\t\tadd: [ 'emit', 'add', this ],\n\t\tchange: 'onChange'\n\t} );\n};\n\nMultiTypeInputWrapperWidget.prototype.onChange = function () {\n\tif ( this.allowEmitChange ) {\n\t\tthis.emit( 'change' );\n\t}\n};\n\n/**\n * Handle UI changes based on the selected snak type.\n *\n * @param {string} snakType\n * @return {jQuery.Promise}\n */\nMultiTypeInputWrapperWidget.prototype.onSnakTypeChange = function ( snakType ) {\n\tlet promise;\n\n\tswitch ( snakType ) {\n\t\tcase valueTypes.SOMEVALUE:\n\t\tcase valueTypes.NOVALUE: {\n\n\t\t\t// Create a disabled string input with the appropriate message.\n\t\t\tconst input = this.createInput( 'string' );\n\t\t\tinput.input.setValue(\n\t\t\t\tmw.message(\n\t\t\t\t\t( snakType === valueTypes.SOMEVALUE ) ?\n\t\t\t\t\t\t'wikibasemediainfo-filepage-statement-some-value' :\n\t\t\t\t\t\t'wikibasemediainfo-filepage-statement-no-value'\n\t\t\t\t).parse()\n\t\t\t);\n\t\t\tthis.setDisabled( true );\n\n\t\t\tpromise = this.setState( {\n\t\t\t\tsnakType: snakType,\n\t\t\t\tinput: input\n\t\t\t} );\n\n\t\t\t// If this is a statement input, immediately add the new item.\n\t\t\tif ( !this.config.isQualifier ) {\n\t\t\t\tpromise = promise.then( input.onEnter.bind( input ) );\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: {\n\t\t\t// Create a new input with the type corresponding to the property.\n\t\t\tthis.setDisabled( false );\n\t\t\tconst input = this.createInput( this.state.type );\n\t\t\tpromise = this.setState( {\n\t\t\t\tsnakType: snakType,\n\t\t\t\tinput: input\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Create the new input, update state, and emit a change.\n\treturn promise\n\t\t.then( this.emit.bind( this, 'change', this ) );\n};\n\n/**\n * @inheritDoc\n */\nMultiTypeInputWrapperWidget.prototype.getRawValue = function () {\n\treturn this.state.input.getRawValue();\n};\n\n/**\n * @inheritDoc\n */\nMultiTypeInputWrapperWidget.prototype.getRawValueOptions = function () {\n\treturn this.state.input.getRawValueOptions();\n};\n\n/**\n * @inheritDoc\n */\nMultiTypeInputWrapperWidget.prototype.getData = function () {\n\treturn this.getSnakType() === valueTypes.VALUE ? this.state.input.getData() : null;\n};\n\n/**\n * @inheritDoc\n */\nMultiTypeInputWrapperWidget.prototype.setData = function ( data ) {\n\tconst self = this,\n\t\ttype = data ? data.getType() : this.state.type;\n\n\ttry {\n\t\tif ( this.state.snakType !== valueTypes.VALUE || data.equals( this.getData() ) ) {\n\t\t\treturn $.Deferred().resolve( this.$element ).promise();\n\t\t}\n\t} catch ( e ) {\n\t\t// we don't have valid data now, but that's ok, we're about\n\t\t// to set new data...\n\t}\n\n\t// we just confirmed that data *has* changed\n\t// we don't want these new input fields to cause change events when\n\t// we populate then with the given data, because that'd be unreliable\n\t// (e.g. it might *not* fire an event when we populate it with an\n\t// empty value...)\n\t// we'll make sure below events don't propagate, but then emit our\n\t// own later on!\n\tthis.allowEmitChange = false;\n\n\tconst input = this.createInput( type );\n\n\treturn input.setData( data )\n\t\t.then( this.setState.bind( this, {\n\t\t\ttype: type,\n\t\t\tinput: input\n\t\t} ) )\n\t\t.then( ( $element ) => {\n\t\t\tself.allowEmitChange = true;\n\t\t\tself.emit( 'change' );\n\t\t\treturn $element;\n\t\t} );\n};\n\n/**\n * Set the data type in state so we can use it to create an input for an\n * existing value. This is only relevant for existing qualifiers.\n *\n * @param {string} dataType\n * @return {jQuery.Promise}\n */\nMultiTypeInputWrapperWidget.prototype.setDataType = function ( dataType ) {\n\treturn this.setState( { type: dataType } );\n};\n\n/**\n * @inheritDoc\n */\nMultiTypeInputWrapperWidget.prototype.clear = function () {\n\tthis.setSnakType( valueTypes.VALUE );\n\treturn this.state.input.clear();\n};\n\n/**\n * @inheritdoc\n */\nMultiTypeInputWrapperWidget.prototype.focus = function () {\n\tthis.state.input.focus();\n};\n\n/**\n * @inheritdoc\n */\nMultiTypeInputWrapperWidget.prototype.setDisabled = function ( disabled ) {\n\tthis.state.input.setDisabled( disabled );\n\tComponentWidget.prototype.setDisabled.call( this, disabled );\n};\n\n/**\n * @inheritDoc\n */\nMultiTypeInputWrapperWidget.prototype.parseValue = function ( propertyId, datatype ) {\n\t// For somevalue and novalue snaks, there is no value.\n\tif ( this.getSnakType() !== valueTypes.VALUE ) {\n\t\treturn $.Deferred().resolve( null ).promise( { abort: function () {} } );\n\t}\n\n\treturn this.state.input.parseValue( propertyId, datatype );\n};\n\n/**\n * Get the snakType (value, somevalue, or novalue).\n *\n * @return {string}\n */\nMultiTypeInputWrapperWidget.prototype.getSnakType = function () {\n\treturn this.state.snakType;\n};\n\n/**\n * Set the snakType.\n *\n * @param {string} snakType\n */\nMultiTypeInputWrapperWidget.prototype.setSnakType = function ( snakType ) {\n\tthis.snakTypeWidget.setValue( snakType );\n};\n\n/**\n * @inheritdoc\n */\nMultiTypeInputWrapperWidget.prototype.setErrors = function ( errors ) {\n\tconst self = this;\n\n\treturn ComponentWidget.prototype.setErrors.call( this, errors )\n\t\t.then( () => {\n\t\t\tif ( errors.length > 0 ) {\n\t\t\t\tself.state.input.flagAsInvalid();\n\t\t\t}\n\t\t} );\n};\n\nmodule.exports = MultiTypeInputWrapperWidget;\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/QuantityInputWidget.js","messages":[{"ruleId":"mediawiki/no-unlabeled-buttonwidget","severity":2,"message":"OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true.","line":90,"column":27,"nodeType":"NewExpression","messageId":"noLabel","endLine":94,"endColumn":5}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"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 ---
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in resources/.eslintrc.json) on resources/.eslintrc.json
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in resources/.eslintrc.json) on resources/.eslintrc.json
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in resources/.eslintrc.json) on resources/.eslintrc.json
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in resources/.eslintrc.json) on resources/.eslintrc.json
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in resources/.eslintrc.json) on resources/.eslintrc.json
Disabling eslint rule 'mediawiki/no-unlabeled-buttonwidget' (broken in resources/.eslintrc.json) on resources/.eslintrc.json
$ /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 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 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 657 packages, and audited 658 packages in 18s
108 packages are looking for funding
run `npm fund` for details
16 vulnerabilities (1 low, 11 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 ---
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/1.ExampleComponentWidget.js
64:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
118:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
148:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/README/2.TemplatingFeatures.js
53:11 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
75:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/README/3.BestPractices.js
68:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/base/ComponentWidget.js
31:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
43:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
66:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
88:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
127:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
274:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
626:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
/src/repo/resources/base/FormatValueElement.js
54:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/datamodel/MediaInfo.js
11:1 warning The type 'datamodel.Entity' is undefined jsdoc/no-undefined-types
18:1 warning The type 'datamodel.TermMap' is undefined jsdoc/no-undefined-types
19:1 warning The type 'datamodel.TermMap' is undefined jsdoc/no-undefined-types
20:1 warning The type 'datamodel.StatementGroupSet' is undefined jsdoc/no-undefined-types
49:1 warning The type 'datamodel.StatementGroupSet' is undefined jsdoc/no-undefined-types
55:1 warning The type 'datamodel.StatementGroupSet' is undefined jsdoc/no-undefined-types
/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 OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/filepage/CaptionsPanel.js
39:1 warning The type 'datamodel.MediaInfo' is undefined jsdoc/no-undefined-types
106:1 warning The type 'datamodel.MediaInfo' is undefined jsdoc/no-undefined-types
230:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
241:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
289:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
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/LicenseDialogWidget.js
20:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/filepage/StatementPanel.js
26:1 warning The type 'dataLoadedReadOnly' is undefined jsdoc/no-undefined-types
76:1 warning The type 'datamodel.StatementList' is undefined jsdoc/no-undefined-types
77:1 warning The type 'jQuery.promise' is undefined jsdoc/no-undefined-types
240:1 warning The type 'widgetRemoved' is undefined jsdoc/no-undefined-types
/src/repo/resources/serialization/MediaInfoDeserializer.js
10:1 warning The type 'SERIALIZER.Deserializer' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/AddPropertyWidget.js
53:23 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
86:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
98:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/ItemWidget.js
135:24 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
232:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
250:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
350:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
411:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
473:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/LinkNoticeWidget.js
62:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/SnakListWidget.js
78:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
139:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
167:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
230:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/SnakWidget.js
93:22 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
116:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
136:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
146:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
245:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
254:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/StatementWidget.js
186:1 warning The type 'change' is undefined jsdoc/no-undefined-types
251:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
323:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
335:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
417:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
433:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
675:2 warning Prefer .then to .done no-jquery/no-done-fail
/src/repo/resources/statements/inputs/AbstractInputWidget.js
15:1 warning The type 'AbstractInputWidget' is undefined jsdoc/no-undefined-types
22:1 warning The type 'AbstractInputWidget' is undefined jsdoc/no-undefined-types
63:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
74:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
110:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/EntityAutocompleteInputWidget.js
79:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/GlobeCoordinateInputWidget.js
110:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
389:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/MultiTypeInputWrapperWidget.js
136:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
180:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
293:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/QuantityInputWidget.js
90:27 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/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
✖ 123 problems (0 errors, 123 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 ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {
"@istanbuljs/load-nyc-config": {
"name": "@istanbuljs/load-nyc-config",
"severity": "moderate",
"isDirect": false,
"via": [
"js-yaml"
],
"effects": [
"nyc"
],
"range": "*",
"nodes": [
"node_modules/@istanbuljs/load-nyc-config"
],
"fixAvailable": {
"name": "nyc",
"version": "15.1.0",
"isSemVerMajor": false
}
},
"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": "27.2.0",
"isSemVerMajor": true
}
},
"grunt": {
"name": "grunt",
"severity": "moderate",
"isDirect": true,
"via": [
"js-yaml"
],
"effects": [
"grunt-eslint"
],
"range": ">=0.4.0-a",
"nodes": [
"node_modules/grunt"
],
"fixAvailable": {
"name": "grunt",
"version": "0.3.17",
"isSemVerMajor": true
}
},
"grunt-eslint": {
"name": "grunt-eslint",
"severity": "moderate",
"isDirect": true,
"via": [
"grunt"
],
"effects": [],
"range": "<=1.0.0 || >=18.1.0",
"nodes": [
"node_modules/grunt-eslint"
],
"fixAvailable": {
"name": "grunt-eslint",
"version": "18.0.0",
"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": 1102100,
"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.2.0 <3.5.0"
},
{
"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"
}
],
"effects": [
"oojs-ui"
],
"range": "<=3.4.1",
"nodes": [
"node_modules/oojs-ui/node_modules/jquery"
],
"fixAvailable": {
"name": "oojs-ui",
"version": "0.53.0",
"isSemVerMajor": true
}
},
"js-yaml": {
"name": "js-yaml",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1109754,
"name": "js-yaml",
"dependency": "js-yaml",
"title": "js-yaml has prototype pollution in merge (<<)",
"url": "https://github.com/advisories/GHSA-mh29-5h37-fv8m",
"severity": "moderate",
"cwe": [
"CWE-1321"
],
"cvss": {
"score": 5.3,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
},
"range": "<4.1.1"
}
],
"effects": [
"@istanbuljs/load-nyc-config",
"grunt",
"nyc"
],
"range": "<4.1.1",
"nodes": [
"node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml",
"node_modules/grunt/node_modules/js-yaml",
"node_modules/js-yaml",
"node_modules/nyc/node_modules/js-yaml"
],
"fixAvailable": {
"name": "grunt",
"version": "0.3.17",
"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": "27.2.0",
"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
},
"nyc": {
"name": "nyc",
"severity": "moderate",
"isDirect": true,
"via": [
"@istanbuljs/load-nyc-config",
"js-yaml"
],
"effects": [],
"range": ">=14.1.0",
"nodes": [
"node_modules/nyc"
],
"fixAvailable": {
"name": "nyc",
"version": "15.1.0",
"isSemVerMajor": 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.0",
"isSemVerMajor": true
}
},
"request": {
"name": "request",
"severity": "critical",
"isDirect": false,
"via": [
{
"source": 1096727,
"name": "request",
"dependency": "request",
"title": "Server-Side Request Forgery in Request",
"url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
"severity": "moderate",
"cwe": [
"CWE-918"
],
"cvss": {
"score": 6.1,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
},
"range": "<=2.88.2"
},
"form-data",
"tough-cookie"
],
"effects": [
"jsdom",
"request-promise-core",
"request-promise-native"
],
"range": "*",
"nodes": [
"node_modules/request"
],
"fixAvailable": {
"name": "jsdom",
"version": "27.2.0",
"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": "27.2.0",
"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": "27.2.0",
"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": "27.2.0",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 1,
"moderate": 11,
"high": 1,
"critical": 3,
"total": 16
},
"dependencies": {
"prod": 1,
"dev": 657,
"optional": 1,
"peer": 1,
"peerOptional": 0,
"total": 657
}
}
}
--- 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": 4,
"audited": 658,
"funding": 108,
"audit": {
"auditReportVersion": 2,
"vulnerabilities": {
"@istanbuljs/load-nyc-config": {
"name": "@istanbuljs/load-nyc-config",
"severity": "moderate",
"isDirect": false,
"via": [
"js-yaml"
],
"effects": [
"nyc"
],
"range": "*",
"nodes": [
"node_modules/@istanbuljs/load-nyc-config"
],
"fixAvailable": {
"name": "nyc",
"version": "15.1.0",
"isSemVerMajor": false
}
},
"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": "27.2.0",
"isSemVerMajor": true
}
},
"grunt": {
"name": "grunt",
"severity": "moderate",
"isDirect": true,
"via": [
"js-yaml"
],
"effects": [
"grunt-eslint"
],
"range": ">=0.4.0-a",
"nodes": [
"node_modules/grunt"
],
"fixAvailable": {
"name": "grunt",
"version": "0.3.17",
"isSemVerMajor": true
}
},
"grunt-eslint": {
"name": "grunt-eslint",
"severity": "moderate",
"isDirect": true,
"via": [
"grunt"
],
"effects": [],
"range": "<=1.0.0 || >=18.1.0",
"nodes": [
"node_modules/grunt-eslint"
],
"fixAvailable": {
"name": "grunt-eslint",
"version": "18.0.0",
"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": 1102100,
"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.2.0 <3.5.0"
},
{
"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"
}
],
"effects": [
"oojs-ui"
],
"range": "<=3.4.1",
"nodes": [
"node_modules/oojs-ui/node_modules/jquery"
],
"fixAvailable": {
"name": "oojs-ui",
"version": "0.53.0",
"isSemVerMajor": true
}
},
"js-yaml": {
"name": "js-yaml",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1109754,
"name": "js-yaml",
"dependency": "js-yaml",
"title": "js-yaml has prototype pollution in merge (<<)",
"url": "https://github.com/advisories/GHSA-mh29-5h37-fv8m",
"severity": "moderate",
"cwe": [
"CWE-1321"
],
"cvss": {
"score": 5.3,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
},
"range": "<4.1.1"
}
],
"effects": [
"@istanbuljs/load-nyc-config",
"grunt",
"nyc"
],
"range": "<4.1.1",
"nodes": [
"",
"",
"",
""
],
"fixAvailable": {
"name": "grunt",
"version": "0.3.17",
"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": "27.2.0",
"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
},
"nyc": {
"name": "nyc",
"severity": "moderate",
"isDirect": true,
"via": [
"@istanbuljs/load-nyc-config",
"js-yaml"
],
"effects": [],
"range": ">=14.1.0",
"nodes": [
"node_modules/nyc"
],
"fixAvailable": {
"name": "nyc",
"version": "15.1.0",
"isSemVerMajor": 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.0",
"isSemVerMajor": true
}
},
"request": {
"name": "request",
"severity": "critical",
"isDirect": false,
"via": [
{
"source": 1096727,
"name": "request",
"dependency": "request",
"title": "Server-Side Request Forgery in Request",
"url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
"severity": "moderate",
"cwe": [
"CWE-918"
],
"cvss": {
"score": 6.1,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
},
"range": "<=2.88.2"
},
"form-data",
"tough-cookie"
],
"effects": [
"jsdom",
"request-promise-core",
"request-promise-native"
],
"range": "*",
"nodes": [
"node_modules/request"
],
"fixAvailable": {
"name": "jsdom",
"version": "27.2.0",
"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": "27.2.0",
"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": "27.2.0",
"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": "27.2.0",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 1,
"moderate": 11,
"high": 1,
"critical": 3,
"total": 16
},
"dependencies": {
"prod": 1,
"dev": 657,
"optional": 1,
"peer": 1,
"peerOptional": 0,
"total": 657
}
}
}
}
--- end ---
{"added": 0, "removed": 1, "changed": 4, "audited": 658, "funding": 108, "audit": {"auditReportVersion": 2, "vulnerabilities": {"@istanbuljs/load-nyc-config": {"name": "@istanbuljs/load-nyc-config", "severity": "moderate", "isDirect": false, "via": ["js-yaml"], "effects": ["nyc"], "range": "*", "nodes": ["node_modules/@istanbuljs/load-nyc-config"], "fixAvailable": {"name": "nyc", "version": "15.1.0", "isSemVerMajor": false}}, "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": "27.2.0", "isSemVerMajor": true}}, "grunt": {"name": "grunt", "severity": "moderate", "isDirect": true, "via": ["js-yaml"], "effects": ["grunt-eslint"], "range": ">=0.4.0-a", "nodes": ["node_modules/grunt"], "fixAvailable": {"name": "grunt", "version": "0.3.17", "isSemVerMajor": true}}, "grunt-eslint": {"name": "grunt-eslint", "severity": "moderate", "isDirect": true, "via": ["grunt"], "effects": [], "range": "<=1.0.0 || >=18.1.0", "nodes": ["node_modules/grunt-eslint"], "fixAvailable": {"name": "grunt-eslint", "version": "18.0.0", "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": 1102100, "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.2.0 <3.5.0"}, {"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"}], "effects": ["oojs-ui"], "range": "<=3.4.1", "nodes": ["node_modules/oojs-ui/node_modules/jquery"], "fixAvailable": {"name": "oojs-ui", "version": "0.53.0", "isSemVerMajor": true}}, "js-yaml": {"name": "js-yaml", "severity": "moderate", "isDirect": false, "via": [{"source": 1109754, "name": "js-yaml", "dependency": "js-yaml", "title": "js-yaml has prototype pollution in merge (<<)", "url": "https://github.com/advisories/GHSA-mh29-5h37-fv8m", "severity": "moderate", "cwe": ["CWE-1321"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"}, "range": "<4.1.1"}], "effects": ["@istanbuljs/load-nyc-config", "grunt", "nyc"], "range": "<4.1.1", "nodes": ["", "", "", ""], "fixAvailable": {"name": "grunt", "version": "0.3.17", "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": "27.2.0", "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}, "nyc": {"name": "nyc", "severity": "moderate", "isDirect": true, "via": ["@istanbuljs/load-nyc-config", "js-yaml"], "effects": [], "range": ">=14.1.0", "nodes": ["node_modules/nyc"], "fixAvailable": {"name": "nyc", "version": "15.1.0", "isSemVerMajor": 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.0", "isSemVerMajor": true}}, "request": {"name": "request", "severity": "critical", "isDirect": false, "via": [{"source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": ["CWE-918"], "cvss": {"score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"}, "range": "<=2.88.2"}, "form-data", "tough-cookie"], "effects": ["jsdom", "request-promise-core", "request-promise-native"], "range": "*", "nodes": ["node_modules/request"], "fixAvailable": {"name": "jsdom", "version": "27.2.0", "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": "27.2.0", "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": "27.2.0", "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": "27.2.0", "isSemVerMajor": true}}}, "metadata": {"vulnerabilities": {"info": 0, "low": 1, "moderate": 11, "high": 1, "critical": 3, "total": 16}, "dependencies": {"prod": 1, "dev": 657, "optional": 1, "peer": 1, "peerOptional": 0, "total": 657}}}}
{}
Upgrading n:nyc from 15.0.0 -> 15.1.0
$ /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 4 packages, changed 4 packages, and audited 655 packages in 3s
108 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@27.2.0, which is a breaking change
node_modules/form-data
request *
Depends on vulnerable versions of form-data
Depends on vulnerable versions of tough-cookie
node_modules/request
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-gxr4-xjj5-5px2
Potential XSS vulnerability in jQuery - https://github.com/advisories/GHSA-jpcq-cgw6-v4j6
fix available via `npm audit fix --force`
Will install oojs-ui@0.53.0, 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
js-yaml <4.1.1
Severity: moderate
js-yaml has prototype pollution in merge (<<) - https://github.com/advisories/GHSA-mh29-5h37-fv8m
fix available via `npm audit fix --force`
Will install grunt@0.3.17, which is a breaking change
node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml
node_modules/grunt/node_modules/js-yaml
@istanbuljs/load-nyc-config *
Depends on vulnerable versions of js-yaml
node_modules/@istanbuljs/load-nyc-config
nyc >=15.0.0-alpha.0
Depends on vulnerable versions of @istanbuljs/load-nyc-config
node_modules/nyc
grunt >=0.4.0-a
Depends on vulnerable versions of js-yaml
node_modules/grunt
grunt-eslint <=1.0.0 || >=18.1.0
Depends on vulnerable versions of grunt
node_modules/grunt-eslint
mockery *
Severity: critical
mockery is vulnerable to prototype pollution - https://github.com/advisories/GHSA-gmwp-3pwc-3j3g
No fix available
node_modules/mockery
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@27.2.0, which is a breaking change
node_modules/tough-cookie
16 vulnerabilities (1 low, 11 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 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 654 packages, and audited 655 packages in 19s
108 packages are looking for funding
run `npm fund` for details
16 vulnerabilities (1 low, 11 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 ---
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/1.ExampleComponentWidget.js
64:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
118:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
148:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/README/2.TemplatingFeatures.js
53:11 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
75:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/README/3.BestPractices.js
68:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/base/ComponentWidget.js
31:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
43:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
66:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
88:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
127:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
274:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
626:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
/src/repo/resources/base/FormatValueElement.js
54:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/datamodel/MediaInfo.js
11:1 warning The type 'datamodel.Entity' is undefined jsdoc/no-undefined-types
18:1 warning The type 'datamodel.TermMap' is undefined jsdoc/no-undefined-types
19:1 warning The type 'datamodel.TermMap' is undefined jsdoc/no-undefined-types
20:1 warning The type 'datamodel.StatementGroupSet' is undefined jsdoc/no-undefined-types
49:1 warning The type 'datamodel.StatementGroupSet' is undefined jsdoc/no-undefined-types
55:1 warning The type 'datamodel.StatementGroupSet' is undefined jsdoc/no-undefined-types
/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 OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/src/repo/resources/filepage/CaptionsPanel.js
39:1 warning The type 'datamodel.MediaInfo' is undefined jsdoc/no-undefined-types
106:1 warning The type 'datamodel.MediaInfo' is undefined jsdoc/no-undefined-types
230:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
241:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
289:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
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/LicenseDialogWidget.js
20:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/filepage/StatementPanel.js
26:1 warning The type 'dataLoadedReadOnly' is undefined jsdoc/no-undefined-types
76:1 warning The type 'datamodel.StatementList' is undefined jsdoc/no-undefined-types
77:1 warning The type 'jQuery.promise' is undefined jsdoc/no-undefined-types
240:1 warning The type 'widgetRemoved' is undefined jsdoc/no-undefined-types
/src/repo/resources/serialization/MediaInfoDeserializer.js
10:1 warning The type 'SERIALIZER.Deserializer' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/AddPropertyWidget.js
53:23 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
86:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
98:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/ItemWidget.js
135:24 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
232:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
250:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
350:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
411:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
473:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/LinkNoticeWidget.js
62:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/SnakListWidget.js
78:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
139:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
167:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
230:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/SnakWidget.js
93:22 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
116:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
136:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
146:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
245:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
254:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/StatementWidget.js
186:1 warning The type 'change' is undefined jsdoc/no-undefined-types
251:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
323:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
335:1 warning The type 'jQuery.Deferred' is undefined jsdoc/no-undefined-types
417:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
433:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
675:2 warning Prefer .then to .done no-jquery/no-done-fail
/src/repo/resources/statements/inputs/AbstractInputWidget.js
15:1 warning The type 'AbstractInputWidget' is undefined jsdoc/no-undefined-types
22:1 warning The type 'AbstractInputWidget' is undefined jsdoc/no-undefined-types
63:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
74:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
110:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/EntityAutocompleteInputWidget.js
79:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/GlobeCoordinateInputWidget.js
110:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
389:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/MultiTypeInputWrapperWidget.js
136:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
180:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
293:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
/src/repo/resources/statements/inputs/QuantityInputWidget.js
90:27 warning OO.ui.ButtonWidget has no label. Even icon-only buttons should set a label with invisibleLabel set to true mediawiki/no-unlabeled-buttonwidget
/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
✖ 123 problems (0 errors, 123 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 package-lock.json
--- stdout ---
Checking package-lock.json
--- end ---
build: Updating npm dependencies
* eslint-config-wikimedia: 0.31.0 → 0.32.1
The following rules are failing and were disabled:
* resources:
* mediawiki/no-unlabeled-buttonwidget
* nyc: 15.0.0 → 15.1.0
$ git add .
--- stdout ---
--- end ---
$ git commit -F /tmp/tmpvyejsvmo
--- stdout ---
[master 02914a4] build: Updating npm dependencies
3 files changed, 924 insertions(+), 1643 deletions(-)
--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 02914a4cc9d0fc269dcd0fef01c9ee822c35b18f Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Sat, 15 Nov 2025 15:30:08 +0000
Subject: [PATCH] build: Updating npm dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* eslint-config-wikimedia: 0.31.0 → 0.32.1
The following rules are failing and were disabled:
* resources:
* mediawiki/no-unlabeled-buttonwidget
* nyc: 15.0.0 → 15.1.0
Change-Id: Ibb481fbe60549c8fc4037e6f98cc5c33d3263d90
---
package-lock.json | 2560 ++++++++++++++------------------------
package.json | 4 +-
resources/.eslintrc.json | 3 +-
3 files changed, 924 insertions(+), 1643 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 2c08d37..32f3412 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"hasInstallScript": true,
"devDependencies": {
"dotenv": "8.0.0",
- "eslint-config-wikimedia": "0.31.0",
+ "eslint-config-wikimedia": "0.32.1",
"grunt": "1.6.1",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
@@ -21,7 +21,7 @@
"jsdom": "14.0.0",
"mockery": "2.1.0",
"mustache": "3.0.1",
- "nyc": "15.0.0",
+ "nyc": "15.1.0",
"oojs": "3.0.0",
"oojs-ui": "0.36.3",
"qunit": "2.24.1",
@@ -462,20 +462,19 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
- "version": "0.43.1",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
- "integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
+ "version": "0.75.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
+ "integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
"dev": true,
"dependencies": {
- "@types/eslint": "^8.56.5",
- "@types/estree": "^1.0.5",
- "@typescript-eslint/types": "^7.2.0",
+ "@types/estree": "^1.0.8",
+ "@typescript-eslint/types": "^8.46.0",
"comment-parser": "1.4.1",
- "esquery": "^1.5.0",
- "jsdoc-type-pratt-parser": "~4.0.0"
+ "esquery": "^1.6.0",
+ "jsdoc-type-pratt-parser": "~6.9.1"
},
"engines": {
- "node": ">=16"
+ "node": ">=20.11.0"
}
},
"node_modules/@eslint-community/eslint-utils": {
@@ -497,9 +496,9 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
- "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -617,9 +616,9 @@
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true,
"dependencies": {
"argparse": "^1.0.7",
@@ -696,9 +695,9 @@
}
},
"node_modules/@mdn/browser-compat-data": {
- "version": "5.3.14",
- "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.3.14.tgz",
- "integrity": "sha512-Y9XQrphVcE6u9xMm+gIqN86opbU/5s2W1pdPyKRyFV5B7+2jWM2gLI5JpfhZncaoDKvhy6FYwK04aCz5UM/bTQ==",
+ "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/@nodelib/fs.scandir": {
@@ -791,113 +790,6 @@
"eslint": ">=8.40.0"
}
},
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
- "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/types": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
- "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
- "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/project-service": "8.38.0",
- "@typescript-eslint/tsconfig-utils": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
- "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/typescript-estree": "8.38.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
- "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.38.0",
- "eslint-visitor-keys": "^4.2.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@stylistic/eslint-plugin/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
"node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
@@ -936,21 +828,6 @@
"node": ">=4.0"
}
},
- "node_modules/@stylistic/eslint-plugin/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@stylistic/eslint-plugin/node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
@@ -963,18 +840,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/@stylistic/eslint-plugin/node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
- }
- },
"node_modules/@stylistic/stylelint-config": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-2.0.0.tgz",
@@ -1021,39 +886,10 @@
"node": ">=0.10.0"
}
},
- "node_modules/@stylistic/stylelint-plugin/node_modules/postcss-selector-parser": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
- "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
- "dev": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@types/eslint": {
- "version": "8.56.10",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
- "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
- "dev": true,
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
"node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true
},
"node_modules/@types/minimatch": {
@@ -1069,93 +905,75 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
- "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+ "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/type-utils": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/type-utils": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "ignore": "^7.0.0",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^7.0.0",
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "@typescript-eslint/parser": "^8.46.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
- "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+ "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
- "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+ "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.38.0",
- "@typescript-eslint/types": "^8.38.0",
+ "@typescript-eslint/tsconfig-utils": "^8.46.0",
+ "@typescript-eslint/types": "^8.46.0",
"debug": "^4.3.4"
},
"engines": {
@@ -1166,46 +984,20 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
- "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
- "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+ "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
@@ -1213,9 +1005,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
- "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+ "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1225,45 +1017,40 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
- "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+ "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
"debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/types": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
- "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+ "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
"dev": true,
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
@@ -1271,44 +1058,31 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
- "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+ "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/project-service": "8.46.0",
+ "@typescript-eslint/tsconfig-utils": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4",
- "globby": "^11.1.0",
+ "fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
@@ -1336,68 +1110,55 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
- "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+ "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
"dev": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0"
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.56.0"
- }
- },
- "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
- "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+ "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "eslint-visitor-keys": "^3.4.3"
+ "@typescript-eslint/types": "8.46.0",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/@ungap/structured-clone": {
@@ -1632,12 +1393,12 @@
}
},
"node_modules/ast-metadata-inferer": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
- "integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
+ "integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
"dev": true,
"dependencies": {
- "@mdn/browser-compat-data": "^5.2.34"
+ "@mdn/browser-compat-data": "^5.6.19"
}
},
"node_modules/astral-regex": {
@@ -1688,6 +1449,15 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.28",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz",
+ "integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==",
+ "dev": true,
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -1732,9 +1502,9 @@
"dev": true
},
"node_modules/browserslist": {
- "version": "4.24.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
- "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "version": "4.28.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
+ "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
"dev": true,
"funding": [
{
@@ -1751,10 +1521,11 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001688",
- "electron-to-chromium": "^1.5.73",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
+ "baseline-browser-mapping": "^2.8.25",
+ "caniuse-lite": "^1.0.30001754",
+ "electron-to-chromium": "^1.5.249",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.1.4"
},
"bin": {
"browserslist": "cli.js"
@@ -1830,9 +1601,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001692",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
- "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+ "version": "1.0.30001754",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+ "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
"dev": true,
"funding": [
{
@@ -1872,9 +1643,9 @@
}
},
"node_modules/ci-info": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
- "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz",
+ "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==",
"dev": true,
"funding": [
{
@@ -1898,6 +1669,15 @@
"node": ">=4"
}
},
+ "node_modules/clean-regexp/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -2021,12 +1801,12 @@
"dev": true
},
"node_modules/core-js-compat": {
- "version": "3.37.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
- "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+ "version": "3.46.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz",
+ "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==",
"dev": true,
"dependencies": {
- "browserslist": "^4.23.0"
+ "browserslist": "^4.26.3"
},
"funding": {
"type": "opencollective",
@@ -2171,9 +1951,9 @@
}
},
"node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"dependencies": {
"ms": "^2.1.3"
@@ -2232,6 +2012,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "dev": true,
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -2406,9 +2195,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.80",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz",
- "integrity": "sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==",
+ "version": "1.5.253",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.253.tgz",
+ "integrity": "sha512-O0tpQ/35rrgdiGQ0/OFWhy1itmd9A6TY9uQzlqj3hKSu/aYpe7UIn5d7CU2N9myH6biZiWF3VMZVuup8pw5U9w==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -2427,9 +2216,9 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.17.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
- "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
+ "version": "5.18.3",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -2485,12 +2274,15 @@
}
},
"node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"engines": {
- "node": ">=0.8.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/escodegen": {
@@ -2632,9 +2424,9 @@
}
},
"node_modules/eslint-compat-utils": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
- "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+ "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
"dev": true,
"dependencies": {
"semver": "^7.5.4"
@@ -2647,323 +2439,56 @@
}
},
"node_modules/eslint-config-wikimedia": {
- "version": "0.31.0",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.31.0.tgz",
- "integrity": "sha512-Z/t/zGPdxs/ehxb0EM6THNWAzueT7GtuqzjUvmBpkxcTKzZPJEXWnnpswdj/hgv8Ce8PIeDp0zwQxR4e3c9CIw==",
+ "version": "0.32.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.1.tgz",
+ "integrity": "sha512-gPvhyVFNlpKFOcJfoVTNlzg3A0b6qjhAbjjBIJ9xp5m+om0oqix5gkqIIEav5BaGxdDxYNmrY4ge3DAPP3u/lg==",
"dev": true,
"dependencies": {
"@stylistic/eslint-plugin": "^3.1.0",
- "@typescript-eslint/eslint-plugin": "8.35.1",
- "@typescript-eslint/parser": "8.35.1",
+ "@typescript-eslint/eslint-plugin": "8.46.0",
+ "@typescript-eslint/parser": "8.46.0",
"browserslist-config-wikimedia": "^0.7.0",
"eslint": "^8.57.0",
- "eslint-plugin-compat": "^4.2.0",
- "eslint-plugin-es-x": "^7.6.0",
- "eslint-plugin-jest": "^28.5.0",
- "eslint-plugin-jsdoc": "48.2.5",
+ "eslint-plugin-compat": "^6.0.2",
+ "eslint-plugin-es-x": "^8.7.0",
+ "eslint-plugin-jest": "^29.0.1",
+ "eslint-plugin-jsdoc": "61.0.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.7.0",
- "eslint-plugin-mocha": "^10.4.3",
- "eslint-plugin-n": "^17.7.0",
+ "eslint-plugin-mediawiki": "^0.8.1",
+ "eslint-plugin-mocha": "^10.5.0",
+ "eslint-plugin-n": "^17.23.1",
"eslint-plugin-no-jquery": "^3.1.1",
- "eslint-plugin-qunit": "^8.1.1",
- "eslint-plugin-security": "^1.7.1",
- "eslint-plugin-unicorn": "^53.0.0",
- "eslint-plugin-vue": "^9.26.0",
- "eslint-plugin-wdio": "^8.24.12",
- "eslint-plugin-yml": "^1.14.0"
- },
- "engines": {
- "node": ">=18 <25"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
- "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
- "dev": true,
- "dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/type-utils": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.35.1",
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
- "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
- "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/parser": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
- "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/project-service": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
- "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.35.1",
- "@typescript-eslint/types": "^8.35.1",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
- "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
- "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/types": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
- "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
- "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/project-service": "8.35.1",
- "@typescript-eslint/tsconfig-utils": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
- "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "8.35.1",
- "eslint-visitor-keys": "^4.2.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
+ "eslint-plugin-qunit": "^8.2.5",
+ "eslint-plugin-security": "^3.0.1",
+ "eslint-plugin-unicorn": "^56.0.1",
+ "eslint-plugin-vue": "^9.33.0",
+ "eslint-plugin-wdio": "^9.16.2",
+ "eslint-plugin-yml": "^1.19.0"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/eslint-config-wikimedia/node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
+ "node": ">=20 <25"
}
},
"node_modules/eslint-plugin-compat": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
- "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
+ "integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
"dev": true,
"dependencies": {
- "@mdn/browser-compat-data": "^5.3.13",
- "ast-metadata-inferer": "^0.8.0",
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001524",
+ "@mdn/browser-compat-data": "^5.5.35",
+ "ast-metadata-inferer": "^0.8.1",
+ "browserslist": "^4.24.2",
+ "caniuse-lite": "^1.0.30001687",
"find-up": "^5.0.0",
+ "globals": "^15.7.0",
"lodash.memoize": "^4.1.2",
- "semver": "^7.5.4"
+ "semver": "^7.6.2"
},
"engines": {
- "node": ">=14.x"
+ "node": ">=18.x"
},
"peerDependencies": {
- "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
"node_modules/eslint-plugin-compat/node_modules/find-up": {
@@ -2982,6 +2507,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/eslint-plugin-compat/node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/eslint-plugin-compat/node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -3028,9 +2565,9 @@
}
},
"node_modules/eslint-plugin-es-x": {
- "version": "7.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.7.0.tgz",
- "integrity": "sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==",
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-8.7.0.tgz",
+ "integrity": "sha512-Du5Sb067sjqzmglaPhsfcEQgE1EYfL8sko+4jOMcAB/XKGoCxntSrOmTYuVzswA1rzM9+MZwH6+GOp0G3/wVCg==",
"dev": true,
"funding": [
"https://github.com/sponsors/ota-meshi",
@@ -3038,8 +2575,8 @@
],
"dependencies": {
"@eslint-community/eslint-utils": "^4.1.2",
- "@eslint-community/regexpp": "^4.6.0",
- "eslint-compat-utils": "^0.5.1"
+ "@eslint-community/regexpp": "^4.12.1",
+ "eslint-compat-utils": "^0.6.3"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -3049,19 +2586,19 @@
}
},
"node_modules/eslint-plugin-jest": {
- "version": "28.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz",
- "integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==",
+ "version": "29.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
+ "integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
+ "@typescript-eslint/utils": "^8.0.0"
},
"engines": {
- "node": "^16.10.0 || ^18.12.0 || >=20.0.0"
+ "node": "^20.12.0 || ^22.0.0 || >=24.0.0"
},
"peerDependencies": {
- "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0",
- "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0",
"jest": "*"
},
"peerDependenciesMeta": {
@@ -3074,38 +2611,58 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "48.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
- "integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
+ "version": "61.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
+ "integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
"dev": true,
"dependencies": {
- "@es-joy/jsdoccomment": "~0.43.0",
+ "@es-joy/jsdoccomment": "~0.75.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
- "debug": "^4.3.4",
+ "debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "esquery": "^1.5.0",
- "is-builtin-module": "^3.2.1",
- "semver": "^7.6.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.6.0",
+ "html-entities": "^2.6.0",
+ "object-deep-merge": "^1.0.5",
+ "parse-imports-exports": "^0.2.4",
+ "semver": "^7.7.3",
"spdx-expression-parse": "^4.0.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=20.11.0"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
- "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "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==",
"dev": true,
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-json-es": {
@@ -3122,12 +2679,11 @@
}
},
"node_modules/eslint-plugin-mediawiki": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
- "integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
+ "integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
"dev": true,
"dependencies": {
- "eslint-plugin-vue": "^9.23.0",
"upath": "^2.0.1"
},
"peerDependencies": {
@@ -3135,9 +2691,9 @@
}
},
"node_modules/eslint-plugin-mocha": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
- "integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz",
+ "integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==",
"dev": true,
"dependencies": {
"eslint-utils": "^3.0.0",
@@ -3152,19 +2708,20 @@
}
},
"node_modules/eslint-plugin-n": {
- "version": "17.8.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.8.1.tgz",
- "integrity": "sha512-KdG0h0voZms8UhndNu8DeWx1eM4sY+A4iXtsNo6kOfJLYHNeTGPacGalJ9GcvrbmOL3r/7QOMwVZDSw+1SqsrA==",
+ "version": "17.23.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
+ "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
"dev": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "enhanced-resolve": "^5.17.0",
- "eslint-plugin-es-x": "^7.5.0",
- "get-tsconfig": "^4.7.0",
- "globals": "^15.0.0",
- "ignore": "^5.2.4",
- "minimatch": "^9.0.0",
- "semver": "^7.5.3"
+ "@eslint-community/eslint-utils": "^4.5.0",
+ "enhanced-resolve": "^5.17.1",
+ "eslint-plugin-es-x": "^7.8.0",
+ "get-tsconfig": "^4.8.1",
+ "globals": "^15.11.0",
+ "globrex": "^0.1.2",
+ "ignore": "^5.3.2",
+ "semver": "^7.6.3",
+ "ts-declaration-location": "^1.0.6"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3176,40 +2733,52 @@
"eslint": ">=8.23.0"
}
},
- "node_modules/eslint-plugin-n/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "node_modules/eslint-plugin-n/node_modules/eslint-compat-utils": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+ "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
"dev": true,
"dependencies": {
- "balanced-match": "^1.0.0"
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
}
},
- "node_modules/eslint-plugin-n/node_modules/globals": {
- "version": "15.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-15.4.0.tgz",
- "integrity": "sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==",
+ "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es-x": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+ "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
"dev": true,
+ "funding": [
+ "https://github.com/sponsors/ota-meshi",
+ "https://opencollective.com/eslint"
+ ],
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.1.2",
+ "@eslint-community/regexpp": "^4.11.0",
+ "eslint-compat-utils": "^0.5.1"
+ },
"engines": {
- "node": ">=18"
+ "node": "^14.18.0 || >=16.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "eslint": ">=8"
}
},
- "node_modules/eslint-plugin-n/node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "node_modules/eslint-plugin-n/node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-plugin-no-jquery": {
@@ -3222,9 +2791,9 @@
}
},
"node_modules/eslint-plugin-qunit": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
- "integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
+ "integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
"dev": true,
"dependencies": {
"eslint-utils": "^3.0.0",
@@ -3235,75 +2804,13 @@
}
},
"node_modules/eslint-plugin-security": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz",
- "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
+ "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
"dev": true,
"dependencies": {
"safe-regex": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-unicorn": {
- "version": "53.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
- "integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.24.5",
- "@eslint-community/eslint-utils": "^4.4.0",
- "@eslint/eslintrc": "^3.0.2",
- "ci-info": "^4.0.0",
- "clean-regexp": "^1.0.0",
- "core-js-compat": "^3.37.0",
- "esquery": "^1.5.0",
- "indent-string": "^4.0.0",
- "is-builtin-module": "^3.2.1",
- "jsesc": "^3.0.2",
- "pluralize": "^8.0.0",
- "read-pkg-up": "^7.0.1",
- "regexp-tree": "^0.1.27",
- "regjsparser": "^0.10.0",
- "semver": "^7.6.1",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
- },
- "peerDependencies": {
- "eslint": ">=8.56.0"
- }
- },
- "node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
- "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
- "dev": true,
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
- "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
- "dev": true,
+ },
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -3311,27 +2818,43 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint-plugin-unicorn/node_modules/espree": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
- "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
+ "node_modules/eslint-plugin-unicorn": {
+ "version": "56.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+ "integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
"dev": true,
"dependencies": {
- "acorn": "^8.11.3",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.0.0"
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "ci-info": "^4.0.0",
+ "clean-regexp": "^1.0.0",
+ "core-js-compat": "^3.38.1",
+ "esquery": "^1.6.0",
+ "globals": "^15.9.0",
+ "indent-string": "^4.0.0",
+ "is-builtin-module": "^3.2.1",
+ "jsesc": "^3.0.2",
+ "pluralize": "^8.0.0",
+ "read-pkg-up": "^7.0.1",
+ "regexp-tree": "^0.1.27",
+ "regjsparser": "^0.10.0",
+ "semver": "^7.6.3",
+ "strip-indent": "^3.0.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=18.18"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
+ },
+ "peerDependencies": {
+ "eslint": ">=8.56.0"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true,
"engines": {
"node": ">=18"
@@ -3341,9 +2864,9 @@
}
},
"node_modules/eslint-plugin-unicorn/node_modules/jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"dev": true,
"bin": {
"jsesc": "bin/jsesc"
@@ -3352,22 +2875,10 @@
"node": ">=6"
}
},
- "node_modules/eslint-plugin-unicorn/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/eslint-plugin-vue": {
- "version": "9.26.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz",
- "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==",
+ "version": "9.33.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+ "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
@@ -3375,8 +2886,8 @@
"natural-compare": "^1.4.0",
"nth-check": "^2.1.1",
"postcss-selector-parser": "^6.0.15",
- "semver": "^7.6.0",
- "vue-eslint-parser": "^9.4.2",
+ "semver": "^7.6.3",
+ "vue-eslint-parser": "^9.4.3",
"xml-name-validator": "^4.0.0"
},
"engines": {
@@ -3396,23 +2907,24 @@
}
},
"node_modules/eslint-plugin-wdio": {
- "version": "8.24.12",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
- "integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
+ "version": "9.16.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
+ "integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
"dev": true,
"engines": {
- "node": "^16.13 || >=18"
+ "node": ">=18.20.0"
}
},
"node_modules/eslint-plugin-yml": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
- "integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.0.tgz",
+ "integrity": "sha512-S+4GbcCWksFKAvFJtf0vpdiCkZZvDJCV4Zsi9ahmYkYOYcf+LRqqzvzkb/ST7vTYV6sFwXOvawzYyL/jFT2nQA==",
"dev": true,
"dependencies": {
"debug": "^4.3.2",
- "eslint-compat-utils": "^0.5.0",
- "lodash": "^4.17.21",
+ "diff-sequences": "^27.5.1",
+ "escape-string-regexp": "4.0.0",
+ "eslint-compat-utils": "^0.6.0",
"natural-compare": "^1.4.0",
"yaml-eslint-parser": "^1.2.1"
},
@@ -3490,18 +3002,6 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/eslint/node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -3618,9 +3118,9 @@
}
},
"node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"dev": true,
"dependencies": {
"estraverse": "^5.1.0"
@@ -4051,9 +3551,9 @@
}
},
"node_modules/get-tsconfig": {
- "version": "4.7.5",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
- "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+ "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
"dev": true,
"dependencies": {
"resolve-pkg-maps": "^1.0.0"
@@ -4404,9 +3904,9 @@
}
},
"node_modules/grunt/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true,
"dependencies": {
"argparse": "^1.0.7",
@@ -4521,6 +4021,22 @@
"whatwg-encoding": "^1.0.1"
}
},
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ]
+ },
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -4586,9 +4102,9 @@
}
},
"node_modules/ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"engines": {
"node": ">= 4"
@@ -5048,9 +4564,9 @@
"dev": true
},
"node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
"dependencies": {
"argparse": "^2.0.1"
@@ -5066,12 +4582,12 @@
"dev": true
},
"node_modules/jsdoc-type-pratt-parser": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
- "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
+ "integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
"dev": true,
"engines": {
- "node": ">=12.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/jsdom": {
@@ -5562,9 +5078,9 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"dev": true
},
"node_modules/node-watch": {
@@ -5637,9 +5153,9 @@
"dev": true
},
"node_modules/nyc": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz",
- "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
"dev": true,
"dependencies": {
"@istanbuljs/load-nyc-config": "^1.0.0",
@@ -5650,6 +5166,7 @@
"find-cache-dir": "^3.2.0",
"find-up": "^4.1.0",
"foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
"glob": "^7.1.6",
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-hook": "^3.0.0",
@@ -5657,10 +5174,9 @@
"istanbul-lib-processinfo": "^2.0.2",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.0.0",
- "js-yaml": "^3.13.1",
+ "istanbul-reports": "^3.0.2",
"make-dir": "^3.0.0",
- "node-preload": "^0.2.0",
+ "node-preload": "^0.2.1",
"p-map": "^3.0.0",
"process-on-spawn": "^1.0.0",
"resolve-from": "^5.0.0",
@@ -5668,7 +5184,6 @@
"signal-exit": "^3.0.2",
"spawn-wrap": "^2.0.0",
"test-exclude": "^6.0.0",
- "uuid": "^3.3.3",
"yargs": "^15.0.2"
},
"bin": {
@@ -5678,15 +5193,6 @@
"node": ">=8.9"
}
},
- "node_modules/nyc/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
"node_modules/nyc/node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -5716,19 +5222,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/nyc/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
"node_modules/nyc/node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -5774,16 +5267,6 @@
"semver": "bin/semver.js"
}
},
- "node_modules/nyc/node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "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.",
- "dev": true,
- "bin": {
- "uuid": "bin/uuid"
- }
- },
"node_modules/nyc/node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@@ -5848,6 +5331,27 @@
"node": "*"
}
},
+ "node_modules/object-deep-merge": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
+ "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "4.2.0"
+ }
+ },
+ "node_modules/object-deep-merge/node_modules/type-fest": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
+ "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/object.defaults": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
@@ -6048,6 +5552,15 @@
"node": ">=0.8"
}
},
+ "node_modules/parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+ "dev": true,
+ "dependencies": {
+ "parse-statements": "1.0.11"
+ }
+ },
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -6075,6 +5588,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+ "dev": true
+ },
"node_modules/parse5": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
@@ -6288,9 +5807,9 @@
}
},
"node_modules/postcss-selector-parser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
- "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
@@ -6762,9 +6281,9 @@
}
},
"node_modules/semver": {
- "version": "7.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
@@ -6973,9 +6492,9 @@
}
},
"node_modules/spdx-license-ids": {
- "version": "3.0.18",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
- "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
+ "version": "3.0.22",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz",
+ "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==",
"dev": true
},
"node_modules/sprintf-js": {
@@ -7567,12 +7086,16 @@
}
},
"node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
"dev": true,
"engines": {
"node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
"node_modules/test-exclude": {
@@ -7664,15 +7187,49 @@
}
},
"node_modules/ts-api-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
- "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"dev": true,
"engines": {
- "node": ">=16"
+ "node": ">=18.12"
},
"peerDependencies": {
- "typescript": ">=4.2.0"
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/ts-declaration-location": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+ "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "ko-fi",
+ "url": "https://ko-fi.com/rebeccastevens"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/ts-declaration-location"
+ }
+ ],
+ "dependencies": {
+ "picomatch": "^4.0.2"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.0.0"
+ }
+ },
+ "node_modules/ts-declaration-location/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/tunnel-agent": {
@@ -7813,9 +7370,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
- "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+ "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
"dev": true,
"funding": [
{
@@ -8130,13 +7687,12 @@
}
},
"node_modules/yaml-eslint-parser": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
- "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz",
+ "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==",
"dev": true,
"dependencies": {
"eslint-visitor-keys": "^3.0.0",
- "lodash": "^4.17.21",
"yaml": "^2.0.0"
},
"engines": {
@@ -8147,15 +7703,15 @@
}
},
"node_modules/yaml-eslint-parser/node_modules/yaml": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
- "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
"dev": true,
"bin": {
"yaml": "bin.mjs"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 14.6"
}
},
"node_modules/yargs": {
@@ -8494,17 +8050,16 @@
"dev": true
},
"@es-joy/jsdoccomment": {
- "version": "0.43.1",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
- "integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
+ "version": "0.75.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
+ "integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
"dev": true,
"requires": {
- "@types/eslint": "^8.56.5",
- "@types/estree": "^1.0.5",
- "@typescript-eslint/types": "^7.2.0",
+ "@types/estree": "^1.0.8",
+ "@typescript-eslint/types": "^8.46.0",
"comment-parser": "1.4.1",
- "esquery": "^1.5.0",
- "jsdoc-type-pratt-parser": "~4.0.0"
+ "esquery": "^1.6.0",
+ "jsdoc-type-pratt-parser": "~6.9.1"
}
},
"@eslint-community/eslint-utils": {
@@ -8517,9 +8072,9 @@
}
},
"@eslint-community/regexpp": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
- "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true
},
"@eslint/eslintrc": {
@@ -8608,9 +8163,9 @@
"dev": true
},
"js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -8671,9 +8226,9 @@
}
},
"@mdn/browser-compat-data": {
- "version": "5.3.14",
- "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.3.14.tgz",
- "integrity": "sha512-Y9XQrphVcE6u9xMm+gIqN86opbU/5s2W1pdPyKRyFV5B7+2jWM2gLI5JpfhZncaoDKvhy6FYwK04aCz5UM/bTQ==",
+ "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
},
"@nodelib/fs.scandir": {
@@ -8751,71 +8306,6 @@
"picomatch": "^4.0.2"
},
"dependencies": {
- "@typescript-eslint/scope-manager": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
- "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0"
- }
- },
- "@typescript-eslint/types": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
- "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
- "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/project-service": "8.38.0",
- "@typescript-eslint/tsconfig-utils": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- }
- },
- "@typescript-eslint/utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
- "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
- "dev": true,
- "requires": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/typescript-estree": "8.38.0"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
- "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.38.0",
- "eslint-visitor-keys": "^4.2.1"
- }
- },
- "brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
"eslint-visitor-keys": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
@@ -8839,27 +8329,11 @@
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true
},
- "minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
"picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true
- },
- "ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "requires": {}
}
}
},
@@ -8893,39 +8367,13 @@
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true
- },
- "postcss-selector-parser": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
- "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
- "dev": true,
- "requires": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- }
}
}
},
- "@types/eslint": {
- "version": "8.56.10",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
- "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
- "dev": true,
- "requires": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
"@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true
},
"@types/minimatch": {
@@ -8941,135 +8389,108 @@
"dev": true
},
"@typescript-eslint/eslint-plugin": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
- "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+ "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
"dev": true,
- "optional": true,
- "peer": true,
"requires": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/type-utils": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/type-utils": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "ignore": "^7.0.0",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true
+ }
}
},
"@typescript-eslint/parser": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
- "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+ "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
"dev": true,
- "optional": true,
- "peer": true,
"requires": {
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4"
- },
- "dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true,
- "optional": true,
- "peer": true
- }
}
},
"@typescript-eslint/project-service": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
- "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+ "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
"dev": true,
"requires": {
- "@typescript-eslint/tsconfig-utils": "^8.38.0",
- "@typescript-eslint/types": "^8.38.0",
+ "@typescript-eslint/tsconfig-utils": "^8.46.0",
+ "@typescript-eslint/types": "^8.46.0",
"debug": "^4.3.4"
- },
- "dependencies": {
- "@typescript-eslint/types": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
- "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
- "dev": true
- }
}
},
"@typescript-eslint/scope-manager": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
- "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+ "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0"
- },
- "dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true
- }
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0"
}
},
"@typescript-eslint/tsconfig-utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
- "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+ "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
"dev": true,
"requires": {}
},
"@typescript-eslint/type-utils": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
- "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+ "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
"dev": true,
- "optional": true,
- "peer": true,
"requires": {
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
"debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
}
},
"@typescript-eslint/types": {
- "version": "7.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz",
- "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+ "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
- "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+ "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
+ "@typescript-eslint/project-service": "8.46.0",
+ "@typescript-eslint/tsconfig-utils": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4",
- "globby": "^11.1.0",
+ "fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true
- },
"brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -9091,39 +8512,31 @@
}
},
"@typescript-eslint/utils": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
- "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+ "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
"dev": true,
"requires": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0"
- },
- "dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
- "dev": true
- }
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0"
}
},
"@typescript-eslint/visitor-keys": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
- "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+ "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "7.18.0",
- "eslint-visitor-keys": "^3.4.3"
+ "@typescript-eslint/types": "8.46.0",
+ "eslint-visitor-keys": "^4.2.1"
},
"dependencies": {
- "@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true
}
}
@@ -9305,12 +8718,12 @@
"dev": true
},
"ast-metadata-inferer": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
- "integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
+ "integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
"dev": true,
"requires": {
- "@mdn/browser-compat-data": "^5.2.34"
+ "@mdn/browser-compat-data": "^5.6.19"
}
},
"astral-regex": {
@@ -9355,6 +8768,12 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "baseline-browser-mapping": {
+ "version": "2.8.28",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz",
+ "integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==",
+ "dev": true
+ },
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -9396,15 +8815,16 @@
"dev": true
},
"browserslist": {
- "version": "4.24.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
- "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "version": "4.28.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
+ "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001688",
- "electron-to-chromium": "^1.5.73",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
+ "baseline-browser-mapping": "^2.8.25",
+ "caniuse-lite": "^1.0.30001754",
+ "electron-to-chromium": "^1.5.249",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.1.4"
}
},
"browserslist-config-wikimedia": {
@@ -9455,9 +8875,9 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001692",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
- "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+ "version": "1.0.30001754",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+ "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
"dev": true
},
"caseless": {
@@ -9477,9 +8897,9 @@
}
},
"ci-info": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
- "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz",
+ "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==",
"dev": true
},
"clean-regexp": {
@@ -9489,6 +8909,14 @@
"dev": true,
"requires": {
"escape-string-regexp": "^1.0.5"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ }
}
},
"clean-stack": {
@@ -9592,12 +9020,12 @@
}
},
"core-js-compat": {
- "version": "3.37.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
- "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+ "version": "3.46.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz",
+ "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==",
"dev": true,
"requires": {
- "browserslist": "^4.23.0"
+ "browserslist": "^4.26.3"
}
},
"core-util-is": {
@@ -9703,9 +9131,9 @@
"dev": true
},
"debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"requires": {
"ms": "^2.1.3"
@@ -9746,6 +9174,12 @@
"integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
"dev": true
},
+ "diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "dev": true
+ },
"dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -9885,9 +9319,9 @@
}
},
"electron-to-chromium": {
- "version": "1.5.80",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz",
- "integrity": "sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==",
+ "version": "1.5.253",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.253.tgz",
+ "integrity": "sha512-O0tpQ/35rrgdiGQ0/OFWhy1itmd9A6TY9uQzlqj3hKSu/aYpe7UIn5d7CU2N9myH6biZiWF3VMZVuup8pw5U9w==",
"dev": true
},
"emoji-regex": {
@@ -9906,9 +9340,9 @@
}
},
"enhanced-resolve": {
- "version": "5.17.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
- "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
+ "version": "5.18.3",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.4",
@@ -9949,9 +9383,9 @@
"dev": true
},
"escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
},
"escodegen": {
@@ -10061,12 +9495,6 @@
"text-table": "^0.2.0"
},
"dependencies": {
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true
- },
"find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -10125,212 +9553,56 @@
}
},
"eslint-compat-utils": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
- "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+ "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
"dev": true,
"requires": {
"semver": "^7.5.4"
}
},
"eslint-config-wikimedia": {
- "version": "0.31.0",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.31.0.tgz",
- "integrity": "sha512-Z/t/zGPdxs/ehxb0EM6THNWAzueT7GtuqzjUvmBpkxcTKzZPJEXWnnpswdj/hgv8Ce8PIeDp0zwQxR4e3c9CIw==",
+ "version": "0.32.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.1.tgz",
+ "integrity": "sha512-gPvhyVFNlpKFOcJfoVTNlzg3A0b6qjhAbjjBIJ9xp5m+om0oqix5gkqIIEav5BaGxdDxYNmrY4ge3DAPP3u/lg==",
"dev": true,
"requires": {
"@stylistic/eslint-plugin": "^3.1.0",
- "@typescript-eslint/eslint-plugin": "8.35.1",
- "@typescript-eslint/parser": "8.35.1",
+ "@typescript-eslint/eslint-plugin": "8.46.0",
+ "@typescript-eslint/parser": "8.46.0",
"browserslist-config-wikimedia": "^0.7.0",
"eslint": "^8.57.0",
- "eslint-plugin-compat": "^4.2.0",
- "eslint-plugin-es-x": "^7.6.0",
- "eslint-plugin-jest": "^28.5.0",
- "eslint-plugin-jsdoc": "48.2.5",
+ "eslint-plugin-compat": "^6.0.2",
+ "eslint-plugin-es-x": "^8.7.0",
+ "eslint-plugin-jest": "^29.0.1",
+ "eslint-plugin-jsdoc": "61.0.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.7.0",
- "eslint-plugin-mocha": "^10.4.3",
- "eslint-plugin-n": "^17.7.0",
+ "eslint-plugin-mediawiki": "^0.8.1",
+ "eslint-plugin-mocha": "^10.5.0",
+ "eslint-plugin-n": "^17.23.1",
"eslint-plugin-no-jquery": "^3.1.1",
- "eslint-plugin-qunit": "^8.1.1",
- "eslint-plugin-security": "^1.7.1",
- "eslint-plugin-unicorn": "^53.0.0",
- "eslint-plugin-vue": "^9.26.0",
- "eslint-plugin-wdio": "^8.24.12",
- "eslint-plugin-yml": "^1.14.0"
- },
- "dependencies": {
- "@typescript-eslint/eslint-plugin": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
- "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
- "dev": true,
- "requires": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/type-utils": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
- },
- "dependencies": {
- "@typescript-eslint/type-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
- "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.1.0"
- }
- },
- "@typescript-eslint/utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
- "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
- "dev": true,
- "requires": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1"
- }
- }
- }
- },
- "@typescript-eslint/parser": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
- "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
- "dev": true,
- "requires": {
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "debug": "^4.3.4"
- }
- },
- "@typescript-eslint/project-service": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
- "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
- "dev": true,
- "requires": {
- "@typescript-eslint/tsconfig-utils": "^8.35.1",
- "@typescript-eslint/types": "^8.35.1",
- "debug": "^4.3.4"
- }
- },
- "@typescript-eslint/scope-manager": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
- "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1"
- }
- },
- "@typescript-eslint/tsconfig-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
- "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
- "dev": true,
- "requires": {}
- },
- "@typescript-eslint/types": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
- "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
- "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
- "dev": true,
- "requires": {
- "@typescript-eslint/project-service": "8.35.1",
- "@typescript-eslint/tsconfig-utils": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
- "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.35.1",
- "eslint-visitor-keys": "^4.2.1"
- }
- },
- "brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
- "dev": true
- },
- "ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
- "dev": true
- },
- "minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "requires": {}
- }
+ "eslint-plugin-qunit": "^8.2.5",
+ "eslint-plugin-security": "^3.0.1",
+ "eslint-plugin-unicorn": "^56.0.1",
+ "eslint-plugin-vue": "^9.33.0",
+ "eslint-plugin-wdio": "^9.16.2",
+ "eslint-plugin-yml": "^1.19.0"
}
},
"eslint-plugin-compat": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
- "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz",
+ "integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==",
"dev": true,
"requires": {
- "@mdn/browser-compat-data": "^5.3.13",
- "ast-metadata-inferer": "^0.8.0",
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001524",
+ "@mdn/browser-compat-data": "^5.5.35",
+ "ast-metadata-inferer": "^0.8.1",
+ "browserslist": "^4.24.2",
+ "caniuse-lite": "^1.0.30001687",
"find-up": "^5.0.0",
+ "globals": "^15.7.0",
"lodash.memoize": "^4.1.2",
- "semver": "^7.5.4"
+ "semver": "^7.6.2"
},
"dependencies": {
"find-up": {
@@ -10343,6 +9615,12 @@
"path-exists": "^4.0.0"
}
},
+ "globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true
+ },
"locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -10373,47 +9651,61 @@
}
},
"eslint-plugin-es-x": {
- "version": "7.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.7.0.tgz",
- "integrity": "sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==",
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-8.7.0.tgz",
+ "integrity": "sha512-Du5Sb067sjqzmglaPhsfcEQgE1EYfL8sko+4jOMcAB/XKGoCxntSrOmTYuVzswA1rzM9+MZwH6+GOp0G3/wVCg==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.1.2",
- "@eslint-community/regexpp": "^4.6.0",
- "eslint-compat-utils": "^0.5.1"
+ "@eslint-community/regexpp": "^4.12.1",
+ "eslint-compat-utils": "^0.6.3"
}
},
"eslint-plugin-jest": {
- "version": "28.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz",
- "integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==",
+ "version": "29.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.1.0.tgz",
+ "integrity": "sha512-LabxXbASXVjguqL+kBHTPMf3gUeSqwH4fsrEyHTY/MCs42I/p9+ctg09SJpYiD8eGaIsP6GwYr5xW6xWS9XgZg==",
"dev": true,
"requires": {
- "@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
+ "@typescript-eslint/utils": "^8.0.0"
}
},
"eslint-plugin-jsdoc": {
- "version": "48.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
- "integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
+ "version": "61.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
+ "integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
"dev": true,
"requires": {
- "@es-joy/jsdoccomment": "~0.43.0",
+ "@es-joy/jsdoccomment": "~0.75.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
- "debug": "^4.3.4",
+ "debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "esquery": "^1.5.0",
- "is-builtin-module": "^3.2.1",
- "semver": "^7.6.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.6.0",
+ "html-entities": "^2.6.0",
+ "object-deep-merge": "^1.0.5",
+ "parse-imports-exports": "^0.2.4",
+ "semver": "^7.7.3",
"spdx-expression-parse": "^4.0.0"
},
"dependencies": {
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true
+ },
+ "espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ }
}
}
},
@@ -10428,19 +9720,18 @@
}
},
"eslint-plugin-mediawiki": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
- "integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
+ "integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
"dev": true,
"requires": {
- "eslint-plugin-vue": "^9.23.0",
"upath": "^2.0.1"
}
},
"eslint-plugin-mocha": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
- "integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz",
+ "integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==",
"dev": true,
"requires": {
"eslint-utils": "^3.0.0",
@@ -10449,44 +9740,47 @@
}
},
"eslint-plugin-n": {
- "version": "17.8.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.8.1.tgz",
- "integrity": "sha512-KdG0h0voZms8UhndNu8DeWx1eM4sY+A4iXtsNo6kOfJLYHNeTGPacGalJ9GcvrbmOL3r/7QOMwVZDSw+1SqsrA==",
- "dev": true,
- "requires": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "enhanced-resolve": "^5.17.0",
- "eslint-plugin-es-x": "^7.5.0",
- "get-tsconfig": "^4.7.0",
- "globals": "^15.0.0",
- "ignore": "^5.2.4",
- "minimatch": "^9.0.0",
- "semver": "^7.5.3"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "17.23.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz",
+ "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/eslint-utils": "^4.5.0",
+ "enhanced-resolve": "^5.17.1",
+ "eslint-plugin-es-x": "^7.8.0",
+ "get-tsconfig": "^4.8.1",
+ "globals": "^15.11.0",
+ "globrex": "^0.1.2",
+ "ignore": "^5.3.2",
+ "semver": "^7.6.3",
+ "ts-declaration-location": "^1.0.6"
+ },
+ "dependencies": {
+ "eslint-compat-utils": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+ "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
"dev": true,
"requires": {
- "balanced-match": "^1.0.0"
+ "semver": "^7.5.4"
}
},
- "globals": {
- "version": "15.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-15.4.0.tgz",
- "integrity": "sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==",
- "dev": true
- },
- "minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "eslint-plugin-es-x": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+ "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
"dev": true,
"requires": {
- "brace-expansion": "^2.0.1"
+ "@eslint-community/eslint-utils": "^4.1.2",
+ "@eslint-community/regexpp": "^4.11.0",
+ "eslint-compat-utils": "^0.5.1"
}
+ },
+ "globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true
}
}
},
@@ -10498,9 +9792,9 @@
"requires": {}
},
"eslint-plugin-qunit": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
- "integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.2.5.tgz",
+ "integrity": "sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==",
"dev": true,
"requires": {
"eslint-utils": "^3.0.0",
@@ -10508,27 +9802,27 @@
}
},
"eslint-plugin-security": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz",
- "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
+ "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
"dev": true,
"requires": {
"safe-regex": "^2.1.1"
}
},
"eslint-plugin-unicorn": {
- "version": "53.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
- "integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
+ "version": "56.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+ "integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.24.5",
+ "@babel/helper-validator-identifier": "^7.24.7",
"@eslint-community/eslint-utils": "^4.4.0",
- "@eslint/eslintrc": "^3.0.2",
"ci-info": "^4.0.0",
"clean-regexp": "^1.0.0",
- "core-js-compat": "^3.37.0",
- "esquery": "^1.5.0",
+ "core-js-compat": "^3.38.1",
+ "esquery": "^1.6.0",
+ "globals": "^15.9.0",
"indent-string": "^4.0.0",
"is-builtin-module": "^3.2.1",
"jsesc": "^3.0.2",
@@ -10536,71 +9830,28 @@
"read-pkg-up": "^7.0.1",
"regexp-tree": "^0.1.27",
"regjsparser": "^0.10.0",
- "semver": "^7.6.1",
+ "semver": "^7.6.3",
"strip-indent": "^3.0.0"
},
"dependencies": {
- "@eslint/eslintrc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
- "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
- "dev": true,
- "requires": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- }
- },
- "eslint-visitor-keys": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
- "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
- "dev": true
- },
- "espree": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
- "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
- "dev": true,
- "requires": {
- "acorn": "^8.11.3",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.0.0"
- }
- },
"globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true
},
"jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"dev": true
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
}
}
},
"eslint-plugin-vue": {
- "version": "9.26.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz",
- "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==",
+ "version": "9.33.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+ "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.4.0",
@@ -10608,8 +9859,8 @@
"natural-compare": "^1.4.0",
"nth-check": "^2.1.1",
"postcss-selector-parser": "^6.0.15",
- "semver": "^7.6.0",
- "vue-eslint-parser": "^9.4.2",
+ "semver": "^7.6.3",
+ "vue-eslint-parser": "^9.4.3",
"xml-name-validator": "^4.0.0"
},
"dependencies": {
@@ -10622,20 +9873,21 @@
}
},
"eslint-plugin-wdio": {
- "version": "8.24.12",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
- "integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
+ "version": "9.16.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.16.2.tgz",
+ "integrity": "sha512-qkqsPgxN70OnUPWMjmzJbSbvm2+Q087JIGss53/OFI4Y46xKlV5VLhLiYealaAibAiXmnfWKd0tERjZAzVL87A==",
"dev": true
},
"eslint-plugin-yml": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
- "integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.0.tgz",
+ "integrity": "sha512-S+4GbcCWksFKAvFJtf0vpdiCkZZvDJCV4Zsi9ahmYkYOYcf+LRqqzvzkb/ST7vTYV6sFwXOvawzYyL/jFT2nQA==",
"dev": true,
"requires": {
"debug": "^4.3.2",
- "eslint-compat-utils": "^0.5.0",
- "lodash": "^4.17.21",
+ "diff-sequences": "^27.5.1",
+ "escape-string-regexp": "4.0.0",
+ "eslint-compat-utils": "^0.6.0",
"natural-compare": "^1.4.0",
"yaml-eslint-parser": "^1.2.1"
}
@@ -10699,9 +9951,9 @@
"dev": true
},
"esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
@@ -11018,9 +10270,9 @@
"dev": true
},
"get-tsconfig": {
- "version": "4.7.5",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
- "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+ "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
"dev": true,
"requires": {
"resolve-pkg-maps": "^1.0.0"
@@ -11217,9 +10469,9 @@
}
},
"js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -11378,6 +10630,12 @@
"whatwg-encoding": "^1.0.1"
}
},
+ "html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "dev": true
+ },
"html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -11423,9 +10681,9 @@
}
},
"ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true
},
"import-fresh": {
@@ -11778,9 +11036,9 @@
"dev": true
},
"js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
"requires": {
"argparse": "^2.0.1"
@@ -11793,9 +11051,9 @@
"dev": true
},
"jsdoc-type-pratt-parser": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
- "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
+ "integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
"dev": true
},
"jsdom": {
@@ -12189,9 +11447,9 @@
}
},
"node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"dev": true
},
"node-watch": {
@@ -12251,9 +11509,9 @@
"dev": true
},
"nyc": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz",
- "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
"dev": true,
"requires": {
"@istanbuljs/load-nyc-config": "^1.0.0",
@@ -12264,6 +11522,7 @@
"find-cache-dir": "^3.2.0",
"find-up": "^4.1.0",
"foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
"glob": "^7.1.6",
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-hook": "^3.0.0",
@@ -12271,10 +11530,9 @@
"istanbul-lib-processinfo": "^2.0.2",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.0.0",
- "js-yaml": "^3.13.1",
+ "istanbul-reports": "^3.0.2",
"make-dir": "^3.0.0",
- "node-preload": "^0.2.0",
+ "node-preload": "^0.2.1",
"p-map": "^3.0.0",
"process-on-spawn": "^1.0.0",
"resolve-from": "^5.0.0",
@@ -12282,19 +11540,9 @@
"signal-exit": "^3.0.2",
"spawn-wrap": "^2.0.0",
"test-exclude": "^6.0.0",
- "uuid": "^3.3.3",
"yargs": "^15.0.2"
},
"dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -12318,16 +11566,6 @@
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
"make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -12358,12 +11596,6 @@
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
},
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "dev": true
- },
"wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@@ -12418,6 +11650,23 @@
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true
},
+ "object-deep-merge": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
+ "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "4.2.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
+ "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
+ "dev": true
+ }
+ }
+ },
"object.defaults": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
@@ -12581,6 +11830,15 @@
"path-root": "^0.1.1"
}
},
+ "parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+ "dev": true,
+ "requires": {
+ "parse-statements": "1.0.11"
+ }
+ },
"parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -12599,6 +11857,12 @@
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
"dev": true
},
+ "parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+ "dev": true
+ },
"parse5": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
@@ -12750,9 +12014,9 @@
"requires": {}
},
"postcss-selector-parser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
- "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
@@ -13081,9 +12345,9 @@
}
},
"semver": {
- "version": "7.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true
},
"set-blocking": {
@@ -13250,9 +12514,9 @@
}
},
"spdx-license-ids": {
- "version": "3.0.18",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
- "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
+ "version": "3.0.22",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz",
+ "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==",
"dev": true
},
"sprintf-js": {
@@ -13658,9 +12922,9 @@
}
},
"tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
"dev": true
},
"test-exclude": {
@@ -13739,12 +13003,29 @@
}
},
"ts-api-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
- "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"dev": true,
"requires": {}
},
+ "ts-declaration-location": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+ "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^4.0.2"
+ },
+ "dependencies": {
+ "picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true
+ }
+ }
+ },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -13847,9 +13128,9 @@
"dev": true
},
"update-browserslist-db": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
- "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+ "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
"dev": true,
"requires": {
"escalade": "^3.2.0",
@@ -14112,20 +13393,19 @@
"dev": true
},
"yaml-eslint-parser": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
- "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz",
+ "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^3.0.0",
- "lodash": "^4.17.21",
"yaml": "^2.0.0"
},
"dependencies": {
"yaml": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
- "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
"dev": true
}
}
diff --git a/package.json b/package.json
index f720256..81f3f34 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
},
"devDependencies": {
"dotenv": "8.0.0",
- "eslint-config-wikimedia": "0.31.0",
+ "eslint-config-wikimedia": "0.32.1",
"grunt": "1.6.1",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
@@ -22,7 +22,7 @@
"jsdom": "14.0.0",
"mockery": "2.1.0",
"mustache": "3.0.1",
- "nyc": "15.0.0",
+ "nyc": "15.1.0",
"oojs": "3.0.0",
"oojs-ui": "0.36.3",
"qunit": "2.24.1",
diff --git a/resources/.eslintrc.json b/resources/.eslintrc.json
index d3712ee..f1163ac 100644
--- a/resources/.eslintrc.json
+++ b/resources/.eslintrc.json
@@ -9,7 +9,8 @@
},
"rules": {
"max-len": "off",
- "no-jquery/no-done-fail": "warn"
+ "no-jquery/no-done-fail": "warn",
+ "mediawiki/no-unlabeled-buttonwidget": "warn"
},
"settings": {
"jsdoc": {
--
2.47.3
--- end ---