mediawiki/extensions/WikibaseMediaInfo: main (log #1828580)

sourcepatches

This run took 181 seconds.

From 9cdfe0d906890bfef69c040048e400eff2140c5b Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 31 Mar 2025 08:16:59 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.29.1

The following rules are failing and were disabled:
* resources:
  * no-jquery/no-done-fail

Change-Id: I24c496779c48ac12b2608df92299394f7d37f63c
---
 package-lock.json                             | 33 ++++++++++---------
 package.json                                  |  2 +-
 resources/.eslintrc.json                      |  3 +-
 resources/base/ComponentWidget.js             | 10 +++---
 resources/filepage/CaptionsPanel.js           |  6 ++--
 resources/filepage/StatementPanel.js          |  2 +-
 resources/filepage/init.js                    |  2 +-
 resources/statements/AddPropertyWidget.js     |  2 +-
 resources/statements/ItemWidget.js            |  2 +-
 resources/statements/SnakListWidget.js        |  2 +-
 .../inputs/EntityAutocompleteInputWidget.js   |  4 +--
 11 files changed, 36 insertions(+), 32 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 001d57c..5154a91 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
 			"hasInstallScript": true,
 			"devDependencies": {
 				"dotenv": "8.0.0",
-				"eslint-config-wikimedia": "0.28.2",
+				"eslint-config-wikimedia": "0.29.1",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.13.0",
 				"grunt-eslint": "24.3.0",
@@ -2230,9 +2230,9 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.28.2",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
-			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+			"version": "0.29.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+			"integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
 			"dev": true,
 			"dependencies": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -2245,13 +2245,16 @@
 				"eslint-plugin-mediawiki": "^0.7.0",
 				"eslint-plugin-mocha": "^10.4.3",
 				"eslint-plugin-n": "^17.7.0",
-				"eslint-plugin-no-jquery": "^3.0.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 <23"
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
@@ -2522,9 +2525,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz",
-			"integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+			"integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
 			"dev": true,
 			"peerDependencies": {
 				"eslint": ">=8.0.0"
@@ -9204,9 +9207,9 @@
 			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.28.2",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
-			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+			"version": "0.29.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+			"integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
 			"dev": true,
 			"requires": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -9219,7 +9222,7 @@
 				"eslint-plugin-mediawiki": "^0.7.0",
 				"eslint-plugin-mocha": "^10.4.3",
 				"eslint-plugin-n": "^17.7.0",
-				"eslint-plugin-no-jquery": "^3.0.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",
@@ -9401,9 +9404,9 @@
 			}
 		},
 		"eslint-plugin-no-jquery": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz",
-			"integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+			"integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
 			"dev": true,
 			"requires": {}
 		},
diff --git a/package.json b/package.json
index 8edde48..a9b07b8 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
 	},
 	"devDependencies": {
 		"dotenv": "8.0.0",
-		"eslint-config-wikimedia": "0.28.2",
+		"eslint-config-wikimedia": "0.29.1",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.13.0",
 		"grunt-eslint": "24.3.0",
diff --git a/resources/.eslintrc.json b/resources/.eslintrc.json
index f223cc9..d3712ee 100644
--- a/resources/.eslintrc.json
+++ b/resources/.eslintrc.json
@@ -8,7 +8,8 @@
 		"commonjs": true
 	},
 	"rules": {
-		"max-len": "off"
+		"max-len": "off",
+		"no-jquery/no-done-fail": "warn"
 	},
 	"settings": {
 		"jsdoc": {
diff --git a/resources/base/ComponentWidget.js b/resources/base/ComponentWidget.js
index 9b35add..5b144bc 100644
--- a/resources/base/ComponentWidget.js
+++ b/resources/base/ComponentWidget.js
@@ -219,13 +219,13 @@ ComponentWidget.prototype.rebuildDOM = function ( oldContainer, newContainer, pr
 		// or new node (if it's one to be preserved - i.e. we're manipulating the
 		// node directly elsewhere in JS), or trying to apply properties of the
 		// new node to the old node
-		if ( preservedNodes.indexOf( oldNode ) >= 0 ) {
+		if ( preservedNodes.includes( oldNode ) ) {
 			// oldNode is a node that needs to be preserved: it was a DOM node
 			// directly assigned as a variable to the template and it may have
 			// context that we must not lose (event listeners, focus state...)
 			// leave this node alone!
 			preservedNodes.splice( preservedNodes.indexOf( oldNode ), 1 );
-		} else if ( preservedNodes.indexOf( newNode ) >= 0 ) {
+		} else if ( preservedNodes.includes( newNode ) ) {
 			// same as above: it was assigned to the template, but it did not
 			// yet exist in the old render (a very similar node might exist,
 			// but not this exact one, which might have other event handlers
@@ -431,7 +431,7 @@ ComponentWidget.prototype.matchNodes = function ( one, two, preserve ) {
 
 		other = filterRelevantNodes( node, other ).filter(
 			// exclude nodes that we've already paired to a previous node
-			( target ) => result.indexOf( target ) < 0
+			( target ) => !result.includes( target )
 		);
 
 		// find the first unmatched relevant equal node (if any)
@@ -446,7 +446,7 @@ ComponentWidget.prototype.matchNodes = function ( one, two, preserve ) {
 
 		// narrow down nodes by cross-referencing similarities from the
 		// other side: a future node might actually be a better match...
-		other = other.filter( ( target ) => filterByMostSimilar( target, remaining ).indexOf( node ) >= 0 );
+		other = other.filter( ( target ) => filterByMostSimilar( target, remaining ).includes( node ) );
 
 		// narrow it down further to the one(s) with the minimum amount
 		// of different children
@@ -454,7 +454,7 @@ ComponentWidget.prototype.matchNodes = function ( one, two, preserve ) {
 
 		// narrow down nodes by cross-referencing dissimilarities from the
 		// other side: a future node might actually be a better match...
-		other = other.filter( ( target ) => filterByLeastDissimilar( target, remaining ).indexOf( node ) >= 0 );
+		other = other.filter( ( target ) => filterByLeastDissimilar( target, remaining ).includes( node ) );
 
 		// return the first of whatever is left
 		return result.concat( other.shift() );
diff --git a/resources/filepage/CaptionsPanel.js b/resources/filepage/CaptionsPanel.js
index 082d2f9..b3e4740 100644
--- a/resources/filepage/CaptionsPanel.js
+++ b/resources/filepage/CaptionsPanel.js
@@ -211,14 +211,14 @@ CaptionsPanel.prototype.getOrderedLangCodes = function ( captionDataArray ) {
 
 	// User languages go next
 	this.userLanguages.forEach( ( langCode ) => {
-		if ( rearrangedCaptionLanguages.indexOf( langCode ) === -1 ) {
+		if ( !rearrangedCaptionLanguages.includes( langCode ) ) {
 			rearrangedCaptionLanguages.push( langCode );
 		}
 	} );
 
 	// And finally all other languages
 	captionLanguages.forEach( ( langCode ) => {
-		if ( rearrangedCaptionLanguages.indexOf( langCode ) === -1 ) {
+		if ( !rearrangedCaptionLanguages.includes( langCode ) ) {
 			rearrangedCaptionLanguages.push( langCode );
 		}
 	} );
@@ -570,7 +570,7 @@ CaptionsPanel.prototype.getShowCaptionFlagsByLangCode = function () {
 		) {
 			showCaption = true;
 		} else {
-			if ( self.userLanguages.indexOf( langCode ) === -1 ) {
+			if ( !self.userLanguages.includes( langCode ) ) {
 				showCaption = false;
 			} else {
 				showCaption = true;
diff --git a/resources/filepage/StatementPanel.js b/resources/filepage/StatementPanel.js
index 4bbc1e6..b559ebe 100644
--- a/resources/filepage/StatementPanel.js
+++ b/resources/filepage/StatementPanel.js
@@ -139,7 +139,7 @@ StatementPanel.prototype.isEditable = function () {
  */
 StatementPanel.prototype.isSupportedType = function () {
 	const supportedTypes = mw.config.get( 'wbmiSupportedDataTypes' ) || [];
-	return supportedTypes.indexOf( this.config.propertyType ) >= 0;
+	return supportedTypes.includes( this.config.propertyType );
 };
 
 /**
diff --git a/resources/filepage/init.js b/resources/filepage/init.js
index 9bcce6c..a3db7d0 100644
--- a/resources/filepage/init.js
+++ b/resources/filepage/init.js
@@ -122,7 +122,7 @@
 			$element: $el,
 			entityId: mw.config.get( 'wbEntityId' ),
 			helpUrls: mw.config.get( 'wbmiHelpUrls' ) || {},
-			isDefaultProperty: defaultProperties.indexOf( propId ) >= 0,
+			isDefaultProperty: defaultProperties.includes( propId ),
 			propertyId: propId,
 			propertyType: propertyType,
 			showControls: editable,
diff --git a/resources/statements/AddPropertyWidget.js b/resources/statements/AddPropertyWidget.js
index 9d11a6a..b9ce00b 100644
--- a/resources/statements/AddPropertyWidget.js
+++ b/resources/statements/AddPropertyWidget.js
@@ -86,7 +86,7 @@ AddPropertyWidget.prototype.getFilters = function () {
  * @return {jQuery.Promise}
  */
 AddPropertyWidget.prototype.addPropertyId = function ( propertyId ) {
-	if ( this.state.propertyIds.indexOf( propertyId ) >= 0 ) {
+	if ( this.state.propertyIds.includes( propertyId ) ) {
 		return $.Deferred().resolve( this.$element ).promise();
 	}
 
diff --git a/resources/statements/ItemWidget.js b/resources/statements/ItemWidget.js
index 89d0fd5..00b5774 100644
--- a/resources/statements/ItemWidget.js
+++ b/resources/statements/ItemWidget.js
@@ -377,7 +377,7 @@ ItemWidget.prototype.setData = function ( data ) {
 	const referencesHashes = referencesArray.map( ( reference ) => reference.getHash() );
 
 	for ( let i = 0; i < referencesArray.length; i++ ) {
-		if ( referencesHashes.indexOf( this.state.referenceHashes[ i ] ) >= 0 ) {
+		if ( referencesHashes.includes( this.state.referenceHashes[ i ] ) ) {
 			// salvage existing widgets that are also in the newly received data,
 			newReferenceWidgets[ i ] = this.state.references[ i ];
 		} else {
diff --git a/resources/statements/SnakListWidget.js b/resources/statements/SnakListWidget.js
index 05662ed..f78352d 100644
--- a/resources/statements/SnakListWidget.js
+++ b/resources/statements/SnakListWidget.js
@@ -84,7 +84,7 @@ SnakListWidget.prototype.removeWidgets = function ( snaks ) {
 		removedWidgets = [];
 
 	this.state.snaks.forEach( ( snak ) => {
-		if ( snaks.indexOf( snak ) < 0 ) {
+		if ( !snaks.includes( snak ) ) {
 			// not present in array of items to remove = keep
 			newWidgets.push( snak );
 		} else {
diff --git a/resources/statements/inputs/EntityAutocompleteInputWidget.js b/resources/statements/inputs/EntityAutocompleteInputWidget.js
index bc5bbce..ac21658 100644
--- a/resources/statements/inputs/EntityAutocompleteInputWidget.js
+++ b/resources/statements/inputs/EntityAutocompleteInputWidget.js
@@ -278,9 +278,9 @@ EntityAutocompleteInputWidget.prototype.filterData = function ( data ) {
 		const values = filter.value.split( '|' );
 		data = data.filter( ( datum ) => {
 			if ( filterType === 'includeOnMatch' ) {
-				return values.indexOf( datum[ field ] ) !== -1;
+				return values.includes( datum[ field ] );
 			} else {
-				return values.indexOf( datum[ field ] ) === -1;
+				return !values.includes( datum[ field ] );
 			}
 		} );
 	} );
-- 
2.39.2

$ date
--- stdout ---
Mon Mar 31 08:14:01 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 ---
cb1ad920f4e8ab5ddf19f7bc9a0e86a503378e57 refs/heads/master

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "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": 1102093,
          "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"
          },
          "range": ">=1.0.3 <3.5.0"
        },
        {
          "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"
        }
      ],
      "effects": [
        "oojs-ui"
      ],
      "range": "<=3.4.1",
      "nodes": [
        "node_modules/oojs-ui/node_modules/jquery"
      ],
      "fixAvailable": {
        "name": "oojs-ui",
        "version": "0.51.7",
        "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": "26.0.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
    },
    "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.51.7",
        "isSemVerMajor": true
      }
    },
    "request": {
      "name": "request",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096727,
          "name": "request",
          "dependency": "request",
          "title": "Server-Side Request Forgery in Request",
          "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
          "severity": "moderate",
          "cwe": [
            "CWE-918"
          ],
          "cvss": {
            "score": 6.1,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
          },
          "range": "<=2.88.2"
        },
        "tough-cookie"
      ],
      "effects": [
        "jsdom",
        "request-promise-core",
        "request-promise-native"
      ],
      "range": "*",
      "nodes": [
        "node_modules/request"
      ],
      "fixAvailable": {
        "name": "jsdom",
        "version": "26.0.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": "26.0.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": "26.0.0",
        "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": "26.0.0",
        "isSemVerMajor": true
      }
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 7,
      "high": 1,
      "critical": 1,
      "total": 9
    },
    "dependencies": {
      "prod": 1,
      "dev": 641,
      "optional": 1,
      "peer": 1,
      "peerOptional": 0,
      "total": 641
    }
  }
}

--- 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.3)
  - Locking composer/spdx-licenses (1.5.8)
  - Locking composer/xdebug-handler (3.0.5)
  - Locking dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
  - Locking doctrine/deprecations (1.1.4)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking mediawiki/mediawiki-codesniffer (v46.0.0)
  - Locking mediawiki/mediawiki-phan-config (0.15.1)
  - Locking mediawiki/minus-x (1.1.3)
  - Locking mediawiki/phan-taint-check-plugin (6.1.0)
  - Locking microsoft/tolerant-php-parser (v0.1.2)
  - Locking netresearch/jsonmapper (v4.5.0)
  - Locking phan/phan (5.4.5)
  - 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.2.1)
  - Locking phpcsstandards/phpcsutils (1.0.12)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.6.1)
  - Locking phpdocumentor/type-resolver (1.10.0)
  - Locking phpstan/phpdoc-parser (2.1.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.11.3)
  - Locking symfony/console (v7.2.5)
  - Locking symfony/deprecation-contracts (v3.5.1)
  - Locking symfony/polyfill-ctype (v1.31.0)
  - Locking symfony/polyfill-intl-grapheme (v1.31.0)
  - Locking symfony/polyfill-intl-normalizer (v1.31.0)
  - Locking symfony/polyfill-mbstring (v1.31.0)
  - Locking symfony/polyfill-php80 (v1.31.0)
  - Locking symfony/service-contracts (v3.5.1)
  - Locking symfony/string (v7.2.0)
  - Locking tysonandre/var_representation_polyfill (0.1.3)
  - Locking webmozart/assert (1.11.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 39 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Installing squizlabs/php_codesniffer (3.11.3): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
  - Installing composer/pcre (3.3.2): Extracting archive
  - Installing symfony/polyfill-php80 (v1.31.0): Extracting archive
  - Installing phpcsstandards/phpcsutils (1.0.12): Extracting archive
  - Installing phpcsstandards/phpcsextra (1.2.1): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.31.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.8): Extracting archive
  - Installing composer/semver (3.4.3): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v46.0.0): Extracting archive
  - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.31.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.31.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.31.0): Extracting archive
  - Installing symfony/string (v7.2.0): Extracting archive
  - Installing symfony/deprecation-contracts (v3.5.1): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing symfony/service-contracts (v3.5.1): Extracting archive
  - Installing symfony/console (v7.2.5): 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.11.0): Extracting archive
  - Installing phpstan/phpdoc-parser (2.1.0): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing doctrine/deprecations (1.1.4): Extracting archive
  - Installing phpdocumentor/type-resolver (1.10.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.6.1): 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.4.5): Extracting archive
  - Installing mediawiki/phan-taint-check-plugin (6.1.0): Extracting archive
  - Installing mediawiki/mediawiki-phan-config (0.15.1): 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%
 23/37 [=================>----------]  62%
 36/37 [===========================>]  97%
 37/37 [============================] 100%
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
16 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils

--- end ---
Upgrading n:eslint-config-wikimedia from 0.28.2 -> 0.29.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 641 packages, and audited 642 packages in 18s

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

9 vulnerabilities (7 moderate, 1 high, 1 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 642 packages in 4s

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

9 vulnerabilities (7 moderate, 1 high, 1 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/filepage/CaptionDataEditor.js
  50:4  error  Prefer .then to .done  no-jquery/no-done-fail
  50:4  error  Prefer .then to .fail  no-jquery/no-done-fail

/src/repo/resources/filepage/CaptionsPanel.js
  613:3   error  Prefer .then to .done  no-jquery/no-done-fail
  613:3   error  Prefer .then to .fail  no-jquery/no-done-fail
  687:34  error  Prefer .then to .done  no-jquery/no-done-fail
  687:34  error  Prefer .then to .fail  no-jquery/no-done-fail
  717:34  error  Prefer .then to .done  no-jquery/no-done-fail
  717:34  error  Prefer .then to .fail  no-jquery/no-done-fail

/src/repo/resources/filepage/StatementPanel.js
   26:1  warning  The type 'dataLoadedReadOnly' is undefined  jsdoc/no-undefined-types
  240:1  warning  The type 'widgetRemoved' is undefined       jsdoc/no-undefined-types

/src/repo/resources/serialization/MediaInfoDeserializer.js
  10:1  warning  The type 'SERIALIZER' is undefined  jsdoc/no-undefined-types

/src/repo/resources/statements/StatementWidget.js
  186:1  warning  The type 'change' is undefined  jsdoc/no-undefined-types
  675:2  error    Prefer .then to .done           no-jquery/no-done-fail

/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

✖ 57 problems (9 errors, 48 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":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"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":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/README/3.BestPractices.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/README/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/UlsWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/__namespace.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/base/ComponentWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'previousState' is defined but never used.","line":34,"column":55,"nodeType":"Identifier","messageId":"unusedVar","endLine":34,"endColumn":68,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":163,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":163,"endColumn":16,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"warn"},"fix":{"range":[5197,5215],"text":""},"desc":"Remove the console.warn()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/base/DOMLessGroupWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/base/FormatValueElement.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/base/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/datamodel/MediaInfo.js","messages":[],"suppressedMessages":[{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_id'.","line":42,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":42,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_statementGroupSet'.","line":43,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":43,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_fingerprint'.","line":44,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":44,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_statementGroupSet'.","line":58,"column":13,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":58,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_statementGroupSet'.","line":65,"column":13,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":65,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_fingerprint'.","line":65,"column":50,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":65,"endColumn":67,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_id'.","line":75,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":75,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_statementGroupSet'.","line":76,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":76,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_fingerprint'.","line":77,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":77,"endColumn":24,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/AnonWarning.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CancelPublishWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CaptionData.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CaptionDataEditor.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":50,"column":4,"nodeType":"CallExpression","endLine":69,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":50,"column":4,"nodeType":"CallExpression","endLine":86,"endColumn":8}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst wbTermsLanguages = require( 'wikibase.mediainfo.statements' ).config.wbTermsLanguages;\nconst UlsWidget = require( 'wikibase.mediainfo.uls' );\n\n/**\n * A value object holding all relevant widgets for editing a single caption\n *\n * @constructor\n * @param {string} guid\n * @param {CaptionData} captionData\n * @param {Object} [config]\n * @param {number} [config.minCaptionLength]\n * @param {number} [config.maxCaptionLength]\n * @param {number} [config.warnWithinMaxCaptionLength]\n */\nconst CaptionDataEditor = function ( guid, captionData, config ) {\n\tconst self = this;\n\n\tconfig = config || {};\n\n\tOO.EventEmitter.call( this );\n\n\tthis.minCaptionLength = config.minCaptionLength || mw.config.get( 'wbmiMinCaptionLength' );\n\tthis.maxCaptionLength = config.maxCaptionLength || mw.config.get( 'wbmiMaxCaptionLength' );\n\tthis.warnWithinMaxCaptionLength = config.warnWithinMaxCaptionLength || 0;\n\n\tthis.languageSelector = new UlsWidget( {\n\t\tlanguages: wbTermsLanguages\n\t} );\n\tif ( captionData.languageCode !== '' ) {\n\t\tthis.languageSelector.setValue( captionData.languageCode );\n\t}\n\tthis.languageSelector.on( 'select', () => {\n\t\tself.emit( 'languageSelectorUpdated' );\n\t} );\n\n\tthis.textInput = new OO.ui.TextInputWidget( {\n\t\tvalidate: function ( value ) {\n\t\t\treturn ( self.minCaptionLength === undefined || value.length >= self.minCaptionLength ) &&\n\t\t\t\t( self.maxCaptionLength === undefined || value.length <= self.maxCaptionLength );\n\t\t},\n\t\tvalue: captionData.text,\n\t\tdir: captionData.direction,\n\t\tplaceholder: captionData.text === '' ? mw.msg( 'wikibasemediainfo-filepage-caption-empty' ) : '',\n\t\tclasses: [ 'wbmi-caption-textInput' ]\n\t} );\n\tthis.textInput\n\t\t.on( 'change', () => {\n\t\t\tself.textInput.getValidity()\n\t\t\t\t.done( () => {\n\t\t\t\t\tconst length = self.textInput.getValue().length;\n\t\t\t\t\tself.setInputError( '' );\n\n\t\t\t\t\tif ( self.maxCaptionLength !== undefined ) {\n\t\t\t\t\t\tconst lengthDiff = self.maxCaptionLength - length;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlengthDiff >= 0 &&\n\t\t\t\t\t\t\tlengthDiff < self.warnWithinMaxCaptionLength\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tself.setInputWarning( mw.msg(\n\t\t\t\t\t\t\t\t'wikibasemediainfo-filepage-caption-approaching-limit',\n\t\t\t\t\t\t\t\tlengthDiff\n\t\t\t\t\t\t\t) );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.setInputWarning( '' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.fail( () => {\n\t\t\t\t\tconst length = self.textInput.getValue().length;\n\n\t\t\t\t\tself.setInputWarning( '' );\n\n\t\t\t\t\tif ( self.minCaptionLength !== undefined && self.minCaptionLength - length > 0 ) {\n\t\t\t\t\t\tself.setInputError( mw.message(\n\t\t\t\t\t\t\t'wikibasemediainfo-filepage-caption-too-short',\n\t\t\t\t\t\t\tself.minCaptionLength - length\n\t\t\t\t\t\t).escaped() );\n\t\t\t\t\t} else if ( self.maxCaptionLength !== undefined && length - self.maxCaptionLength > 0 ) {\n\t\t\t\t\t\tself.setInputError( mw.message(\n\t\t\t\t\t\t\t'wikibasemediainfo-filepage-caption-too-long',\n\t\t\t\t\t\t\tlength - self.maxCaptionLength\n\t\t\t\t\t\t).escaped() );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.always( () => {\n\t\t\t\t\tself.emit( 'textInputChanged' );\n\t\t\t\t} );\n\t\t} )\n\t\t.on( 'keypress', ( event ) => {\n\t\t\t// if the key pressed is the 'enter' key\n\t\t\tif ( event.keycode === 13 || event.which === 13 ) {\n\t\t\t\tself.emit( 'textInputSubmitted' );\n\t\t\t}\n\t\t} );\n\n\tthis.deleter = new OO.ui.ButtonWidget( {\n\t\ticon: 'trash',\n\t\tframed: false,\n\t\tflags: 'destructive',\n\t\tclasses: [ 'wbmi-caption-deleteButton' ],\n\t\tid: guid\n\t} );\n\tthis.deleter.on( 'click', () => {\n\t\tself.emit( 'captionDeleted', guid );\n\t} );\n\n\tthis.inputError = '';\n\tthis.inputWarning = '';\n};\n\nOO.mixinClass( CaptionDataEditor, OO.EventEmitter );\n\n/**\n * @return {UlsWidget}\n */\nCaptionDataEditor.prototype.getLanguageSelector = function () {\n\treturn this.languageSelector;\n};\n\n/**\n * @return {OO.ui.TextInputWidget}\n */\nCaptionDataEditor.prototype.getTextInput = function () {\n\treturn this.textInput;\n};\n\n/**\n * @return {OO.ui.ButtonWidget}\n */\nCaptionDataEditor.prototype.getDeleter = function () {\n\treturn this.deleter;\n};\n\n/**\n * @param {boolean} disabled\n */\nCaptionDataEditor.prototype.setDisabled = function ( disabled ) {\n\tthis.textInput.setDisabled( disabled );\n};\n\n/**\n * @param {string} text\n */\nCaptionDataEditor.prototype.setInputError = function ( text ) {\n\tthis.inputError = text;\n};\n\n/**\n * @param {string} text\n */\nCaptionDataEditor.prototype.setInputWarning = function ( text ) {\n\tthis.inputWarning = text;\n};\n\n/**\n * @return {string}\n */\nCaptionDataEditor.prototype.getInputError = function () {\n\treturn this.inputError;\n};\n\n/**\n * @return {string}\n */\nCaptionDataEditor.prototype.getInputWarning = function () {\n\treturn this.inputWarning;\n};\n\n/**\n * @return {string}\n */\nCaptionDataEditor.prototype.getLanguageCode = function () {\n\treturn this.languageSelector.getValue();\n};\n\n/**\n * @return {string}\n */\nCaptionDataEditor.prototype.getText = function () {\n\treturn this.textInput.getValue();\n};\n\nmodule.exports = CaptionDataEditor;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CaptionsEditActionsWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/CaptionsPanel.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":613,"column":3,"nodeType":"CallExpression","endLine":624,"endColumn":7},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":613,"column":3,"nodeType":"CallExpression","endLine":627,"endColumn":7},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":687,"column":34,"nodeType":"CallExpression","endLine":704,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":687,"column":34,"nodeType":"CallExpression","endLine":709,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":717,"column":34,"nodeType":"CallExpression","endLine":733,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":717,"column":34,"nodeType":"CallExpression","endLine":741,"endColumn":8}],"suppressedMessages":[],"errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst AnonWarning = require( './AnonWarning.js' ),\n\tCaptionData = require( './CaptionData.js' ),\n\tCaptionDataEditor = require( './CaptionDataEditor.js' ),\n\tCaptionsEditActionsWidget = require( './CaptionsEditActionsWidget.js' ),\n\tLicenseDialogWidget = require( './LicenseDialogWidget.js' ),\n\tComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\twbTermsLanguages = require( 'wikibase.mediainfo.statements' ).config.wbTermsLanguages;\n\n/**\n * Panel for displaying/editing structured data multi-lingual captions\n *\n * RULES FOR LANGUAGE ORDERING/DISPLAY\n *\n * Order\n * -----\n *\n * 1. Show a caption for the interface language of the page (whether or not it has a value)\n * 2. If there is no caption for the interface language, show the first caption in the fallback\n *    chain that has a value (if any)\n * 3. If the logged-in user has Babel languages, and they haven’t already been shown, then show\n *    captions for all of them next, whether or not they have values\n * 4. Show everything else with a value\n *\n * Display\n * -------\n *\n * 1, 2, 3 are always displayed\n * 4 are hidden/shown by the languagesViewWidget\n * ... or, in other words - the first caption is always shown, the first non-blank caption\n * is always shown, all user languages are always shown, and everything else may be hidden.\n *\n * @extends OO.ui.Element\n * @mixin OO.ui.mixin.PendingElement\n *\n * @constructor\n * @param {Object} [config]\n * @param {datamodel.MediaInfo} config.mediaInfo\n * @param {boolean} [config.canEdit] True if the captions should be editable on the page\n * @param {string[]} [config.userLanguages] The language the user has indicated that they use (via babel)\n * @param {string[]} [config.languageFallbackChain]\n * @param {number} [config.warnWithinMaxCaptionLength] Show a warning when the caption length is within X\n *   characters of the max\n */\nconst CaptionsPanel = function ( config ) {\n\tconst self = this;\n\tconfig = config || {};\n\n\t// Parent constructor\n\tCaptionsPanel.super.call( this, config );\n\n\t// Mixin constructor\n\tOO.ui.mixin.PendingElement.call( this, config );\n\n\tthis.userLanguages = config.userLanguages || [];\n\tthis.languageFallbackChain = config.languageFallbackChain || [ 'en' ];\n\tthis.canEdit = ( typeof config.canEdit === 'undefined' ) ? true : config.canEdit;\n\tthis.warnWithinMaxCaptionLength = config.warnWithinMaxCaptionLength;\n\tthis.savedCaptionsData = this.captionsDataFromMediaInfoEntity( config.mediaInfo );\n\n\tthis.api = wikibase.api.getLocationAgnosticMwApi(\n\t\tmw.config.get(\n\t\t\t'wbmiRepoApiUrl',\n\t\t\tmw.config.get( 'wbRepoApiUrl' )\n\t\t)\n\t);\n\n\t// Create the various widgets\n\tthis.licenseDialogWidget = new LicenseDialogWidget();\n\tthis.editActionsWidget = new CaptionsEditActionsWidget();\n\tthis.editActionsWidget.connect( this, { add: 'addNewEmptyLanguageRow' } );\n\tthis.editActionsWidget.connect( this, { publish: 'sendData' } );\n\tthis.editActionsWidget.connect( this, { cancel: 'onCancel' } );\n\n\tthis.state = Object.assign(\n\t\t{},\n\t\tthis.getCaptionsState( this.savedCaptionsData ),\n\t\t{\n\t\t\tediting: false,\n\t\t\tdisabled: false,\n\t\t\tcaptionsDataEditors: {},\n\t\t\tdisplayAllLanguages: false\n\t\t}\n\t);\n\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.filePageDisplay',\n\t\t'templates/filepage/CaptionsPanel.mustache+dom'\n\t);\n\n\t// Set the target pending element to first child of $element, which is the first node of the\n\t// rendered template\n\tthis.renderPromise.then( () => {\n\t\tself.$pending = self.$element.children( ':first' );\n\t} );\n};\n\n/* Inheritance */\nOO.inheritClass( CaptionsPanel, OO.ui.Widget );\nOO.mixinClass( CaptionsPanel, ComponentWidget );\nOO.mixinClass( CaptionsPanel, OO.ui.mixin.PendingElement );\n\n/**\n * @param {datamodel.MediaInfo} mediaInfo\n * @return {Object} An object with langCodes as keys and CaptionData objects as values\n * @private\n */\nCaptionsPanel.prototype.captionsDataFromMediaInfoEntity = function ( mediaInfo ) {\n\tconst captionsData = {};\n\tif ( mediaInfo.labels !== undefined ) {\n\t\tObject.keys( mediaInfo.labels ).forEach( ( langCode ) => {\n\t\t\tcaptionsData[ langCode ] = new CaptionData(\n\t\t\t\tlangCode,\n\t\t\t\tmediaInfo.labels[ langCode ].value\n\t\t\t);\n\t\t} );\n\t}\n\treturn captionsData;\n};\n\n/**\n * @param {Object} captionsData An object with langCodes as keys and CaptionData objects as values\n * @return {{captionsData:Object, orderedLanguageCodes:Array}}\n */\nCaptionsPanel.prototype.getCaptionsState = function ( captionsData ) {\n\t// ensure we have the interface language\n\tcaptionsData = this.ensureCaptionDataArrayHasLanguage(\n\t\tcaptionsData,\n\t\tthis.languageFallbackChain[ 0 ]\n\t);\n\n\tif ( this.canEdit ) {\n\t\tcaptionsData = this.addCaptionsDataForUserLanguages( captionsData );\n\t}\n\n\treturn {\n\t\tcaptionsData: captionsData,\n\t\torderedLanguageCodes: this.getOrderedLangCodes( captionsData )\n\t};\n};\n\n/**\n * If the input object does not have a CaptionData object for the specified langCode, add a\n * blank one\n *\n * @param {Object} captionDataArray Object with langCodes as keys and CaptionData objects as values\n * @param {string} langCode\n * @return {Object} Object with langCodes as keys and CaptionData objects as values\n * @private\n */\nCaptionsPanel.prototype.ensureCaptionDataArrayHasLanguage = function (\n\tcaptionDataArray,\n\tlangCode\n) {\n\tif ( captionDataArray[ langCode ] === undefined ) {\n\t\tcaptionDataArray[ langCode ] = new CaptionData( langCode );\n\t}\n\treturn captionDataArray;\n};\n\n/**\n * If the input object does not have a CaptionData object for each user language,\n * add a blank one\n *\n * @param {Object} captionDataArray Object with langCodes as keys and CaptionData objects as values\n * @return {Object} Object with langCodes as keys and CaptionData objects as values\n * @private\n */\nCaptionsPanel.prototype.addCaptionsDataForUserLanguages = function ( captionDataArray ) {\n\tconst self = this;\n\t// Create CaptionData objects for user languages that we don't already have on the screen\n\tthis.userLanguages.forEach( ( langCode ) => {\n\t\tcaptionDataArray = self.ensureCaptionDataArrayHasLanguage( captionDataArray, langCode );\n\t} );\n\treturn captionDataArray;\n};\n\n/**\n * Returns a list of langCodes from captionDataArray, ordered based on the rules specified\n * in the class comments\n *\n * @param {Object} captionDataArray Object with langCodes as keys and CaptionData objects as values\n * @return {Array}\n * @private\n */\nCaptionsPanel.prototype.getOrderedLangCodes = function ( captionDataArray ) {\n\tconst captionLanguages = Object.keys( captionDataArray );\n\tconst rearrangedCaptionLanguages = [];\n\n\t// First language in fallback chain (i.e. the interface language) is always first\n\trearrangedCaptionLanguages.push( this.languageFallbackChain[ 0 ] );\n\n\t// If there is no data for the interface language, then the first language in the fallback\n\t// chain with a value goes next\n\tif (\n\t\ttypeof captionDataArray[ this.languageFallbackChain[ 0 ] ] !== CaptionData ||\n\t\tcaptionDataArray[ this.languageFallbackChain[ 0 ] ].text !== ''\n\t) {\n\t\tfor ( let i = 1; i < this.languageFallbackChain.length; i++ ) {\n\t\t\tif (\n\t\t\t\tcaptionDataArray[ this.languageFallbackChain[ i ] ] &&\n\t\t\t\tcaptionDataArray[ this.languageFallbackChain[ i ] ].text !== ''\n\t\t\t) {\n\t\t\t\trearrangedCaptionLanguages.push( this.languageFallbackChain[ i ] );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// User languages go next\n\tthis.userLanguages.forEach( ( langCode ) => {\n\t\tif ( !rearrangedCaptionLanguages.includes( langCode ) ) {\n\t\t\trearrangedCaptionLanguages.push( langCode );\n\t\t}\n\t} );\n\n\t// And finally all other languages\n\tcaptionLanguages.forEach( ( langCode ) => {\n\t\tif ( !rearrangedCaptionLanguages.includes( langCode ) ) {\n\t\t\trearrangedCaptionLanguages.push( langCode );\n\t\t}\n\t} );\n\n\treturn rearrangedCaptionLanguages;\n};\n\n/**\n * @return {Object|jQuery.Promise<Object>}\n */\nCaptionsPanel.prototype.getTemplateData = function () {\n\tif ( this.state.editing === true ) {\n\t\treturn this.getTemplateDataEditable();\n\t} else {\n\t\treturn this.getTemplateDataReadOnly();\n\t}\n};\n\n/**\n * @return {Object|jQuery.Promise<Object>}\n */\nCaptionsPanel.prototype.getTemplateDataEditable = function () {\n\tconst self = this;\n\tconst templateCaptions = [];\n\tconst data = {\n\t\tediting: true,\n\t\ttitle: mw.msg( 'wikibasemediainfo-entitytermsforlanguagelistview-caption' ),\n\t\teditActionsWidget: this.editActionsWidget\n\t};\n\n\tlet inputErrorFound = false;\n\n\tObject.keys( this.state.captionsDataEditors ).forEach( ( guid ) => {\n\t\tconst captionDataEditor = self.state.captionsDataEditors[ guid ];\n\n\t\ttemplateCaptions.push( {\n\t\t\tshow: true,\n\t\t\tempty: false,\n\t\t\ttextDirection: $.uls.data.getDir( captionDataEditor.getLanguageCode() ),\n\t\t\tlangCode: captionDataEditor.getLanguageCode(),\n\t\t\tlanguage: captionDataEditor.getLanguageSelector(),\n\t\t\tcaption: captionDataEditor.getTextInput(),\n\t\t\tdeleter: captionDataEditor.getDeleter(),\n\t\t\tinputError: captionDataEditor.getInputError(),\n\t\t\tinputWarning: captionDataEditor.getInputWarning()\n\t\t} );\n\n\t\tif ( captionDataEditor.getInputError() !== '' ) {\n\t\t\tinputErrorFound = true;\n\t\t}\n\t} );\n\tdata.captions = templateCaptions;\n\n\tif ( !this.hasChanges() ) {\n\t\tdata.editActionsWidget.disablePublish();\n\t} else {\n\t\tif ( inputErrorFound ) {\n\t\t\tdata.editActionsWidget.disablePublish();\n\t\t} else {\n\t\t\tdata.editActionsWidget.enablePublish();\n\t\t}\n\t}\n\n\treturn data;\n};\n\n/**\n * @return {Object|jQuery.Promise<Object>}\n */\nCaptionsPanel.prototype.getTemplateDataReadOnly = function () {\n\tconst self = this;\n\tconst templateCaptions = [];\n\tconst showCaptionFlags = this.getShowCaptionFlagsByLangCode();\n\n\t// basic template data\n\tconst data = {\n\t\tediting: false,\n\t\ttitle: mw.msg( 'wikibasemediainfo-entitytermsforlanguagelistview-caption' )\n\t};\n\n\t// the \"edit\" button\n\tif ( this.canEdit ) {\n\t\tdata.editToggle = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-edit' ),\n\t\t\tframed: false,\n\t\t\tflags: 'progressive',\n\t\t\ttitle: mw.msg( 'wikibasemediainfo-filepage-edit-captions' ),\n\t\t\tclasses: [ 'wbmi-entityview-editButton' ]\n\t\t} );\n\t\tdata.editToggle.connect( this, { click: [ 'makeEditable' ] } );\n\t} else {\n\t\tdata.editToggle = '';\n\t}\n\n\t// \"see X more languages\"/\"see fewer languages\" link\n\tif ( self.getHideableLanguageCount() > 0 ) {\n\t\tdata.languagesViewWidget = new OO.ui.ButtonWidget( {\n\t\t\ticon: this.state.displayAllLanguages ? 'collapse' : 'expand',\n\t\t\tflags: 'progressive',\n\t\t\tframed: false,\n\t\t\tlabel: this.state.displayAllLanguages ?\n\t\t\t\tmw.msg( 'wikibasemediainfo-filepage-fewer-languages' ) :\n\t\t\t\tmw.msg(\n\t\t\t\t\t'wikibasemediainfo-filepage-more-languages',\n\t\t\t\t\tmw.language.convertNumber( self.getHideableLanguageCount() )\n\t\t\t\t)\n\t\t} ).on(\n\t\t\t'click',\n\t\t\tthis.setState.bind( this, { displayAllLanguages: !this.state.displayAllLanguages } )\n\t\t);\n\t}\n\n\tlet count = 0;\n\t// captions data\n\tthis.state.orderedLanguageCodes.forEach( ( langCode ) => {\n\t\tconst captionData = self.state.captionsData[ langCode ];\n\t\tconst language = captionData.languageText;\n\t\tconst caption = captionData.text ?\n\t\t\tmw.html.escape( captionData.text ) :\n\t\t\tmw.message( 'wikibasemediainfo-filepage-caption-empty' ).escaped();\n\n\t\ttemplateCaptions.push( {\n\t\t\tshow: self.state.displayAllLanguages ? true : showCaptionFlags[ langCode ],\n\t\t\tindex: count,\n\t\t\ttextDirection: captionData.direction,\n\t\t\tlangCode: captionData.languageCode,\n\t\t\tlanguage: language,\n\t\t\tcaption: caption,\n\t\t\tempty: captionData.text === ''\n\t\t} );\n\t\tcount++;\n\n\t} );\n\tdata.captions = templateCaptions;\n\n\treturn data;\n};\n\n/**\n * Triggered when cancelling the edit mode.\n */\nCaptionsPanel.prototype.onCancel = function () {\n\tconst self = this;\n\n\tif ( this.hasChanges() ) {\n\t\tOO.ui.confirm(\n\t\t\tmw.msg( 'wikibasemediainfo-filepage-cancel-confirm' ),\n\t\t\t{\n\t\t\t\ttitle: mw.msg( 'wikibasemediainfo-filepage-cancel-confirm-title' ),\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\taction: 'accept',\n\t\t\t\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-cancel-confirm-accept' ),\n\t\t\t\t\t\tflags: [ 'primary', 'destructive' ]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\taction: 'reject',\n\t\t\t\t\t\tlabel: mw.msg( 'ooui-dialog-message-reject' ),\n\t\t\t\t\t\tflags: 'safe'\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t).then( ( confirmed ) => {\n\t\t\tif ( confirmed ) {\n\t\t\t\tself.restoreToSaved();\n\t\t\t}\n\t\t} );\n\t} else {\n\t\tthis.restoreToSaved();\n\t}\n};\n\n/**\n * Recreate this.state.captionsDataEditors with one element removed, and update\n * this.state.captionsData\n *\n * @param {string} guidToRemove\n */\nCaptionsPanel.prototype.onCaptionDeleted = function ( guidToRemove ) {\n\tconst modifiedCaptionsDataEditors = Object.assign( {}, this.state.captionsDataEditors );\n\tdelete modifiedCaptionsDataEditors[ guidToRemove ];\n\tthis.setState( {\n\t\tcaptionsDataEditors: modifiedCaptionsDataEditors\n\t} ).then( this.onDataChanged.bind( this ) );\n};\n\n/**\n * 1. Make sure each language can only be selected once\n * 2. Update the direction of textInputs based on selected languages\n * 3. Update this.state.captions from this.state.captionsDataEditors\n */\nCaptionsPanel.prototype.onDataChanged = function () {\n\tconst self = this, captionsData = {};\n\tthis.refreshLanguageSelectorsOptions();\n\tObject.keys( this.state.captionsDataEditors ).forEach( ( guid ) => {\n\t\tconst langSelector = self.state.captionsDataEditors[ guid ].languageSelector,\n\t\t\tlangCode = langSelector.getValue(),\n\t\t\ttextInput = self.state.captionsDataEditors[ guid ].textInput;\n\t\tif ( langCode ) {\n\t\t\ttextInput.setDir( $.uls.data.getDir( langCode ) );\n\t\t\tif ( textInput.getValue() ) {\n\t\t\t\tcaptionsData[ langCode ] = new CaptionData(\n\t\t\t\t\tlangCode,\n\t\t\t\t\ttextInput.getValue()\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} );\n\tthis.setState( this.getCaptionsState( captionsData ) );\n};\n\n/**\n * Restores to a read-only view with the saved captions data\n */\nCaptionsPanel.prototype.restoreToSaved = function () {\n\tconst restoredState = Object.assign( {}, this.getCaptionsState( this.savedCaptionsData ), {\n\t\tediting: false,\n\t\tdisabled: false\n\t} );\n\tthis.setState( restoredState );\n};\n\n/**\n * Gets all languages that we accept captions for EXCEPT languages in excludeLanguages\n *\n * @param {string[]} excludeLanguages Languages to exclude from the return array\n * @return {Object} Lang codes as keys, lang names in interface language as values\n * @private\n */\nCaptionsPanel.prototype.getAvailableLanguages = function ( excludeLanguages ) {\n\tconst languages = {};\n\tObject.assign( languages, wbTermsLanguages );\n\t( excludeLanguages || [] ).forEach( ( languageCode ) => {\n\t\tdelete languages[ languageCode ];\n\t} );\n\treturn languages;\n};\n\n/**\n * Make sure available languages in each language selector don't include languages that are\n * selected in another selector\n *\n * @private\n */\nCaptionsPanel.prototype.refreshLanguageSelectorsOptions = function () {\n\tconst self = this,\n\t\tcurrentlySelectedLanguages = [],\n\t\tcaptionsDataEditors = this.state.captionsDataEditors;\n\n\tObject.keys( captionsDataEditors ).forEach( ( guid ) => {\n\t\tcurrentlySelectedLanguages.push( captionsDataEditors[ guid ].languageSelector.getValue() );\n\t} );\n\tObject.keys( captionsDataEditors ).forEach( ( guid ) => {\n\t\tcaptionsDataEditors[ guid ].languageSelector.updateLanguages(\n\t\t\tself.getAvailableLanguages(\n\t\t\t\tcurrentlySelectedLanguages.filter( ( langCode ) => langCode !== captionsDataEditors[ guid ].languageSelector.getValue() )\n\t\t\t)\n\t\t);\n\t} );\n};\n\n/**\n * @return {boolean} True if any captions have been changed/added/deleted\n */\nCaptionsPanel.prototype.hasChanges = function () {\n\tconst self = this;\n\tconst nonEmptyCaptionsData = {};\n\tlet hasChanges;\n\thasChanges = Object.keys( this.state.captionsData ).some( ( langCode ) => {\n\t\tif ( self.state.captionsData[ langCode ].text !== '' ) {\n\t\t\tnonEmptyCaptionsData[ langCode ] = self.state.captionsData[ langCode ];\n\t\t\tif ( !self.savedCaptionsData[ langCode ] ) {\n\t\t\t\thasChanges = true;\n\t\t\t\treturn true;\n\t\t\t} else if (\n\t\t\t\tself.state.captionsData[ langCode ].text !== self.savedCaptionsData[ langCode ].text\n\t\t\t) {\n\t\t\t\thasChanges = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t} );\n\tif (\n\t\tObject.keys( nonEmptyCaptionsData ).length !==\n\t\tObject.keys( this.savedCaptionsData ).length\n\t) {\n\t\thasChanges = true;\n\t}\n\treturn hasChanges;\n};\n\n/**\n * Get a value object for sending data to the api\n *\n * @param {string} language Language code\n * @param {string} text Caption text\n * @return {{bot: number, action: string, id, value: *, language: *}} Value object\n * @private\n */\nCaptionsPanel.prototype.getWbSetLabelParams = function ( language, text ) {\n\tconst apiParams = {\n\t\t/*\n\t\t * Unconditionally set the bot parameter to match the UI behavior of core.\n\t\t * In normal page editing, if you have the \"bot\" user right and edit through the GUI\n\t\t * interface, your edit is marked as bot no matter what.\n\t\t * @see https://gerrit.wikimedia.org/r/71246\n\t\t * @see https://phabricator.wikimedia.org/T189477\n\t\t */\n\t\tbot: 1,\n\t\taction: 'wbsetlabel',\n\t\tid: mw.config.get( 'wbEntityId' ),\n\t\tvalue: text,\n\t\tlanguage: language,\n\t\treturnto: mw.config.get( 'wgPageName' )\n\t};\n\t// Don't send baserevid unless we already have saved captions (a quirk of the api)\n\tif ( Object.keys( this.savedCaptionsData ).length > 0 ) {\n\t\tapiParams.baserevid = mw.mediaInfo.structuredData.currentRevision;\n\t}\n\treturn apiParams;\n};\n\n/**\n * Returns an object containing of showCaption flags for each element of labelsData, indexed by\n * langCode. Flags are set to true if a caption *must always* be shown\n *\n * See class comments for rules on when to show/hide captions\n *\n * @return {Object}\n * Array of showCaption flags, indexed by langCode\n * @private\n */\nCaptionsPanel.prototype.getShowCaptionFlagsByLangCode = function () {\n\tconst self = this;\n\tlet firstCaptionIsBlank;\n\tconst indexedShowCaptionFlags = {};\n\n\tthis.state.orderedLanguageCodes.forEach( ( langCode, index ) => {\n\t\tconst captionData = self.state.captionsData[ langCode ];\n\t\tlet showCaption;\n\t\tif ( index === 0 ) {\n\t\t\tshowCaption = true;\n\t\t\tfirstCaptionIsBlank = ( captionData.text === '' );\n\t\t} else if (\n\t\t\tindex === 1 &&\n\t\t\tfirstCaptionIsBlank &&\n\t\t\tcaptionData.text !== ''\n\t\t) {\n\t\t\tshowCaption = true;\n\t\t} else {\n\t\t\tif ( !self.userLanguages.includes( langCode ) ) {\n\t\t\t\tshowCaption = false;\n\t\t\t} else {\n\t\t\t\tshowCaption = true;\n\t\t\t}\n\t\t}\n\t\tindexedShowCaptionFlags[ langCode ] = showCaption;\n\t} );\n\treturn indexedShowCaptionFlags;\n};\n\n/**\n * Returns the number of languages which may be hidden from the user\n *\n * See class comments for rules on when to show/hide captions\n *\n * @return {number}\n * @private\n */\nCaptionsPanel.prototype.getHideableLanguageCount = function () {\n\tconst showCaptionFlags = this.getShowCaptionFlagsByLangCode();\n\n\treturn Object.keys( showCaptionFlags ).filter(\n\t\t( langCode ) => showCaptionFlags[ langCode ] === false\n\t).length;\n};\n\nCaptionsPanel.prototype.makeEditable = function () {\n\tconst self = this;\n\n\t// Show IP address logging notice to anon users\n\tif ( mw.config.get( 'wbmiShowIPEditingWarning' ) && mw.user.isAnon() ) {\n\t\tAnonWarning.notifyOnce();\n\t}\n\n\t// show dialog informing user of licensing\n\tself.licenseDialogWidget.getConfirmationIfNecessary().then( () => {\n\t\tconst entityId = mw.config.get( 'wbEntityId' );\n\t\tself.pushPending();\n\t\t// refresh caption data from the api\n\t\tself.api\n\t\t\t.get( {\n\t\t\t\taction: 'wbgetentities',\n\t\t\t\tprops: 'info|labels',\n\t\t\t\tids: entityId\n\t\t\t} )\n\t\t\t.done( ( result ) => {\n\t\t\t\tmw.mediaInfo.structuredData.currentRevision = result.entities[ entityId ].lastrevid;\n\t\t\t\tself.savedCaptionsData = self.captionsDataFromMediaInfoEntity(\n\t\t\t\t\tresult.entities[ entityId ]\n\t\t\t\t);\n\t\t\t} )\n\t\t\t.fail( () => {\n\t\t\t\t// Ignore the failure and just make do with the data we already have saved\n\t\t\t} )\n\t\t\t.always( () => {\n\t\t\t\tconst captionsDataEditors = {},\n\t\t\t\t\tcaptionsState = self.getCaptionsState(\n\t\t\t\t\t\t// Copy by value so the saved data isn't modified\n\t\t\t\t\t\tObject.assign( {}, self.savedCaptionsData )\n\t\t\t\t\t);\n\n\t\t\t\tcaptionsState.orderedLanguageCodes.forEach( ( langCode ) => {\n\t\t\t\t\tconst guid = self.createGuid();\n\t\t\t\t\tcaptionsDataEditors[ guid ] = self.createCaptionDataEditor(\n\t\t\t\t\t\tguid,\n\t\t\t\t\t\tself.savedCaptionsData[ langCode ] || new CaptionData( langCode )\n\t\t\t\t\t);\n\t\t\t\t} );\n\n\t\t\t\tself.setState(\n\t\t\t\t\tObject.assign(\n\t\t\t\t\t\tcaptionsState,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcaptionsDataEditors: captionsDataEditors,\n\t\t\t\t\t\t\tediting: true\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t).then( () => {\n\t\t\t\t\tself.refreshLanguageSelectorsOptions();\n\t\t\t\t\tself.popPending();\n\t\t\t\t} );\n\t\t\t} );\n\t} );\n};\n\nCaptionsPanel.prototype.addNewEmptyLanguageRow = function () {\n\tconst guid = this.createGuid(),\n\t\tcaptionsDataEditors = Object.assign(\n\t\t\t{},\n\t\t\tthis.state.captionsDataEditors\n\t\t);\n\tcaptionsDataEditors[ guid ] = this.createCaptionDataEditor( guid, new CaptionData() );\n\tthis.setState( {\n\t\tcaptionsDataEditors: captionsDataEditors\n\t} ).then( this.refreshLanguageSelectorsOptions.bind( this ) );\n};\n\nCaptionsPanel.prototype.sendData = function () {\n\tconst self = this;\n\tconst captionsDataEditors = Object.assign( {}, this.state.captionsDataEditors );\n\tlet promise = $.Deferred().resolve().promise();\n\tconst tempuser = {};\n\n\tthis.setSending();\n\n\t// Send changed data\n\tObject.keys( captionsDataEditors ).forEach( ( guid ) => {\n\t\tconst captionDataEditor = captionsDataEditors[ guid ],\n\t\t\tlangCode = captionDataEditor.getLanguageCode(),\n\t\t\ttext = captionDataEditor.getText(),\n\t\t\tsavedData = self.savedCaptionsData[ langCode ];\n\n\t\tif ( text && langCode && ( !savedData || savedData.text !== text ) ) {\n\t\t\tpromise = promise.then( () => self.api.postWithToken(\n\t\t\t\t'csrf',\n\t\t\t\tself.getWbSetLabelParams( langCode, text )\n\t\t\t)\n\t\t\t\t.done( ( response ) => {\n\t\t\t\t\tmw.mediaInfo.structuredData.currentRevision = response.entity.lastrevid;\n\n\t\t\t\t\tself.savedCaptionsData[ langCode ] =\n\t\t\t\t\t\t\tnew CaptionData( langCode, text );\n\n\t\t\t\t\t// extract tempuser properties from response, if present\n\t\t\t\t\t// (this will only be present the first request)\n\t\t\t\t\tfor ( const property in response ) {\n\t\t\t\t\t\tif ( property.match( /^tempuser/ ) ) {\n\t\t\t\t\t\t\ttempuser[ property ] = response[ property ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.fail( ( errorCode, error ) => {\n\t\t\t\t\tconst apiError =\n\t\t\t\t\t\t\twikibase.api.RepoApiError.newFromApiResponse( error, 'save' );\n\t\t\t\t\tcaptionDataEditor.setInputError( apiError.detailedMessage );\n\t\t\t\t} ) );\n\t\t}\n\t} );\n\n\t// Delete removed data\n\tObject.keys( this.savedCaptionsData ).forEach( ( langCode ) => {\n\t\tconst captionsData = self.state.captionsData[ langCode ];\n\t\tif ( !captionsData || captionsData.text === '' ) {\n\t\t\tpromise = promise.then( () => self.api.postWithToken(\n\t\t\t\t'csrf',\n\t\t\t\tself.getWbSetLabelParams( langCode, '' )\n\t\t\t)\n\t\t\t\t.done( ( response ) => {\n\t\t\t\t\tmw.mediaInfo.structuredData.currentRevision = response.entity.lastrevid;\n\n\t\t\t\t\tdelete self.savedCaptionsData[ langCode ];\n\n\t\t\t\t\t// extract tempuser properties from response, if present\n\t\t\t\t\t// (this will only be present the first request)\n\t\t\t\t\tfor ( const property in response ) {\n\t\t\t\t\t\tif ( property.match( /^tempuser/ ) ) {\n\t\t\t\t\t\t\ttempuser[ property ] = response[ property ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.fail( ( errorCode, error ) => {\n\t\t\t\t\tconst apiError =\n\t\t\t\t\t\t\t\twikibase.api.RepoApiError.newFromApiResponse( error, 'save' ),\n\t\t\t\t\t\tguid = self.createGuid(),\n\t\t\t\t\t\tcaptionDataEditor = self.createCaptionDataEditor( guid, self.savedCaptionsData[ langCode ] );\n\t\t\t\t\tcaptionDataEditor.setInputError( apiError.detailedMessage );\n\t\t\t\t\tcaptionsDataEditors[ guid ] = captionDataEditor;\n\t\t\t\t} ) );\n\t\t}\n\t} );\n\n\tpromise.then( () => {\n\t\tself.setState(\n\t\t\tObject.assign(\n\t\t\t\t{},\n\t\t\t\tself.getCaptionsState( self.savedCaptionsData ),\n\t\t\t\t{\n\t\t\t\t\tediting: false,\n\t\t\t\t\tcaptionsDataEditors: {},\n\t\t\t\t\tdisplayAllLanguages: true\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t} ).catch( () => {\n\t\tself.setState( {\n\t\t\tediting: true,\n\t\t\tcaptionsDataEditors: captionsDataEditors\n\t\t} );\n\t} ).always( () => {\n\t\tif ( tempuser.tempuserredirect ) {\n\t\t\twindow.location.href = tempuser.tempuserredirect;\n\t\t} else if ( tempuser.tempusercreated ) {\n\t\t\tmw.tempUserCreated.showPopup();\n\t\t}\n\t\tself.setReady();\n\t} );\n};\n\n/**\n * @param {string} guid\n * @param {CaptionData} captionData\n * @return {CaptionDataEditor}\n */\nCaptionsPanel.prototype.createCaptionDataEditor = function ( guid, captionData ) {\n\tconst captionDataEditor = new CaptionDataEditor( guid, captionData, { warnWithinMaxCaptionLength: this.warnWithinMaxCaptionLength } );\n\tthis.enableCaptionDataEditor( captionDataEditor );\n\treturn captionDataEditor;\n};\n\n/**\n * @param {CaptionDataEditor} captionDataEditor\n */\nCaptionsPanel.prototype.enableCaptionDataEditor = function ( captionDataEditor ) {\n\tcaptionDataEditor.setDisabled( false );\n\n\tcaptionDataEditor.connect( this, { captionDeleted: 'onCaptionDeleted' } );\n\tcaptionDataEditor.connect( this, { languageSelectorUpdated: 'onDataChanged' } );\n\tcaptionDataEditor.connect( this, { textInputChanged: 'onDataChanged' } );\n\tcaptionDataEditor.connect( this, { textInputSubmitted: 'sendData' } );\n};\n\n/**\n * @param {CaptionDataEditor} captionDataEditor\n */\nCaptionsPanel.prototype.disableCaptionDataEditor = function ( captionDataEditor ) {\n\tcaptionDataEditor.setDisabled( true );\n\n\tcaptionDataEditor.disconnect( this, { captionDeleted: 'onCaptionDeleted' } );\n\tcaptionDataEditor.disconnect( this, { languageSelectorUpdated: 'onDataChanged' } );\n\tcaptionDataEditor.disconnect( this, { textInputChanged: 'onDataChanged' } );\n\tcaptionDataEditor.disconnect( this, { textInputSubmitted: 'sendData' } );\n};\n\n/**\n * Puts the panel into a 'sending' state without re-rendering\n */\nCaptionsPanel.prototype.setSending = function () {\n\tconst self = this;\n\tthis.editActionsWidget.setStateSending();\n\tObject.keys( this.state.captionsDataEditors ).forEach( ( guid ) => {\n\t\tself.disableCaptionDataEditor( self.state.captionsDataEditors[ guid ] );\n\t} );\n\tthis.pushPending();\n};\n\n/**\n * Puts the panel into a ready' state without re-rendering\n */\nCaptionsPanel.prototype.setReady = function () {\n\tconst self = this;\n\tthis.editActionsWidget.setStateReady();\n\tObject.keys( this.state.captionsDataEditors ).forEach( ( guid ) => {\n\t\tself.enableCaptionDataEditor( self.state.captionsDataEditors[ guid ] );\n\t} );\n\tthis.popPending();\n};\n\n/**\n * Create a GUID for keeping track of CaptionDataEditWidgets\n *\n * @see derived from https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript\n * @return {string}\n */\nCaptionsPanel.prototype.createGuid = function () {\n\treturn 'xxxxxxxx-xxxx-4xxx-8xxx-xxxxxxxxxxxx'.replace(\n\t\t/[x]/g, () => ( Math.random() * 16 ).toString( 16 ).slice( 0, 1 )\n\t);\n};\n\nCaptionsPanel.prototype.isEditable = function () {\n\treturn this.state.editable;\n};\n\nCaptionsPanel.prototype.isDisabled = function () {\n\treturn false;\n};\n\nmodule.exports = CaptionsPanel;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/LicenseDialogWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":13,"column":2,"nodeType":"CallExpression","endLine":13,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/ProtectionMsgWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/filepage/StatementPanel.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'dataLoadedReadOnly' is undefined.","line":26,"column":1,"nodeType":"Block","endLine":26,"endColumn":1},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'widgetRemoved' is undefined.","line":240,"column":1,"nodeType":"Block","endLine":240,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst AnonWarning = require( './AnonWarning.js' ),\n\tFormatValueElement = require( 'wikibase.mediainfo.base' ).FormatValueElement,\n\tLicenseDialogWidget = require( './LicenseDialogWidget.js' ),\n\tStatementWidget = require( 'wikibase.mediainfo.statements' ).StatementWidget,\n\tdataTypesMap = mw.config.get( 'wbDataTypes' );\n\n/**\n * Panel for displaying/editing structured data statements\n *\n * @extends OO.ui.Element\n * @mixin OO.ui.mixin.PendingElement\n *\n * @constructor\n * @param {Object} config Configuration options\n * @param {jQuery} config.$element Node to replace with statement panel\n * @param {string} config.entityId Entity ID (e.g. M123 id of the file you just uploaded)\n * @param {string} config.propertyId Property ID (e.g. P123 id of `depicts` property)\n * @param {string} config.propertyType Property datatype (e.g. 'wikibase-item', 'url', 'string', ...)\n * @param {string} config.showControls Whether or not to display editing controls\n * @param {Object} [config.helpUrls] An object with property id as members and help urls for\n * @param {Object} [config.disabled] True/false to indicate whether the statement is disabled/enabled\n *  the property as values\n *  e.g. { P1: \"https://commons.wikimedia.org/wiki/Special:MyLanguage/Commons:Depicts\" }\n * @fires dataLoadedReadOnly\n */\nconst StatementPanel = function StatementPanelConstructor( config ) {\n\t// Parent constructor\n\tStatementPanel.super.apply( this, arguments );\n\n\tthis.$element = config.$element;\n\tdelete config.$element;\n\tthis.config = config || {};\n\n\t// Mixin constructors\n\tOO.ui.mixin.PendingElement.call( this, this.config );\n\n\tif ( this.$element.attr( 'data-formatvalue' ) ) {\n\t\tthis.populateFormatValueCache( JSON.parse( this.$element.attr( 'data-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":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/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' 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":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"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":[],"suppressedMessages":[{"ruleId":"no-undef","severity":2,"message":"'L' is not defined.","line":218,"column":5,"nodeType":"Identifier","messageId":"undef","endLine":218,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":452,"column":18,"nodeType":"CallExpression","endLine":452,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/LinkNoticeWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/SnakListWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/SnakWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/StatementWidget.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'change' is undefined.","line":186,"column":1,"nodeType":"Block","endLine":186,"endColumn":1},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":675,"column":2,"nodeType":"CallExpression","endLine":696,"endColumn":5}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst dataTypesMap = mw.config.get( 'wbDataTypes' ),\n\tItemWidget = require( './ItemWidget.js' ),\n\tinputs = require( './inputs/index.js' ),\n\tFormatValueElement = require( 'wikibase.mediainfo.base' ).FormatValueElement,\n\tComponentWidget = require( 'wikibase.mediainfo.base' ).ComponentWidget,\n\tDOMLessGroupWidget = require( 'wikibase.mediainfo.base' ).DOMLessGroupWidget,\n\tdatamodel = require( 'wikibase.datamodel' ),\n\tserialization = require( 'wikibase.serialization' );\n\n/**\n * @constructor\n * @param {Object} config Configuration options\n * @param {string} config.entityId Entity ID (e.g. M123 id of the file you just uploaded)\n * @param {string} config.propertyId Property ID (e.g. P123 id of `depicts` property)\n * @param {string} config.valueType Datavalue type (e.g. 'wikibase-entityid', 'string', ...)\n * @param {Object} [config.data] Initial data\n * @param {string} [config.title]\n * @param {string} [config.editing] True for edit mode, False for read mode\n * @param {boolean} [config.isDefaultProperty] True if the widget is shown even if there are\n *  no values for the property\n * @param {Object} [config.helpUrls] An object with property id as members and help urls for\n *  the property as values\n *  e.g. { P1: \"https://commons.wikimedia.org/wiki/Special:MyLanguage/Commons:Depicts\" }\n * @param {boolean} [config.showControls] Whether or not to display editing controls (default to false)\n * @param {string} [config.summary] Summary for edits\n * @param {string[]} [config.tags] Change tags to apply to edits\n */\nconst StatementWidget = function ( config ) {\n\tlet valueType = config.valueType;\n\n\tif ( !valueType && config.propertyType && config.propertyType in dataTypesMap ) {\n\t\t// backward compatibility from before we were using value type...\n\t\tvalueType = dataTypesMap[ config.propertyType ].dataValueType;\n\t}\n\n\tconfig.showControls = !!config.showControls;\n\tconfig.helpUrls = config.helpUrls || {};\n\tconfig.isDefaultProperty = !!config.isDefaultProperty;\n\tthis.config = config;\n\n\tthis.state = {\n\t\tentityId: config.entityId,\n\t\tpropertyId: config.propertyId,\n\t\tvalueType: valueType,\n\t\tinitialData: new datamodel.StatementList(),\n\t\ttitle: config.title || ( mw.config.get( 'wbmiPropertyTitles' ) || {} )[ config.propertyId ] || '',\n\t\tediting: config.editing || false\n\t};\n\n\tthis.input = new inputs.MultiTypeInputWrapperWidget( {\n\t\tisQualifier: false,\n\t\ttype: valueType,\n\t\tclasses: [ 'wbmi-statement-input' ],\n\t\tdisabled: this.disabled\n\t} );\n\n\tthis.publishButton = new OO.ui.ButtonInputWidget( {\n\t\ttype: 'submit',\n\t\tuseInputTag: true,\n\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-publish' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tdisabled: true\n\t} );\n\n\tStatementWidget.super.call( this, config );\n\tDOMLessGroupWidget.call( this );\n\tComponentWidget.call(\n\t\tthis,\n\t\t'wikibase.mediainfo.statements',\n\t\t'templates/statements/StatementWidget.mustache+dom'\n\t);\n\n\tthis.input.connect( this, { add: 'addItemFromInput' } );\n\tthis.publishButton.connect( this, { click: [ 'emit', 'publish' ] } );\n\tthis.connect( this, { change: 'updatePublishButtonState' } );\n\n\tif ( config.data ) {\n\t\tthis.resetData( config.data );\n\t}\n};\n\nOO.inheritClass( StatementWidget, OO.ui.Widget );\nOO.mixinClass( StatementWidget, DOMLessGroupWidget );\nOO.mixinClass( StatementWidget, ComponentWidget );\nOO.mixinClass( StatementWidget, FormatValueElement );\n\n/**\n * @inheritDoc\n */\nStatementWidget.prototype.getTemplateData = function () {\n\tconst self = this,\n\t\tdataValue = new datamodel.EntityId( this.state.propertyId ),\n\t\terrors = this.getErrors(),\n\t\terrorMessages = ( errors.length > 0 ) ?\n\t\t\terrors.map( ( error ) => new OO.ui.MessageWidget( {\n\t\t\t\ttype: 'error',\n\t\t\t\tlabel: error,\n\t\t\t\tclasses: [ 'wbmi-statement-error-msg' ]\n\t\t\t} ) ) : null;\n\n\t// fetch property value & url\n\treturn this.formatValue( dataValue, 'text/html' ).then( ( html ) => {\n\t\tconst formatResponse = function ( response ) {\n\t\t\treturn $( '<div>' )\n\t\t\t\t.append( response )\n\t\t\t\t.find( 'a' )\n\t\t\t\t.attr( 'target', '_blank' )\n\t\t\t\t.end()\n\t\t\t\t.html();\n\t\t};\n\n\t\tconst editButton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-edit' ),\n\t\t\tframed: false,\n\t\t\tflags: 'progressive',\n\t\t\ttitle: mw.msg( 'wikibasemediainfo-filepage-edit-depicts' ),\n\t\t\tclasses: [ 'wbmi-entityview-editButton' ],\n\t\t\tdisabled: self.isDisabled() || self.isEditing()\n\t\t} );\n\n\t\tconst cancelButton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-cancel' ),\n\t\t\tframed: false\n\t\t} );\n\n\t\tconst removeButton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-statements-remove' ),\n\t\t\tframed: false,\n\t\t\tflags: 'destructive',\n\t\t\tclasses: [ 'wbmi-statement-remove' ]\n\t\t} );\n\n\t\tconst learnMoreLink = self.config.helpUrls[ self.state.propertyId ];\n\t\tconst learnMoreButton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: mw.msg( 'wikibasemediainfo-statements-learn-more' ),\n\t\t\tframed: false,\n\t\t\tflags: 'progressive',\n\t\t\tclasses: [ 'wbmi-statement-learn-more' ]\n\t\t} );\n\n\t\teditButton.connect( self, { click: [ 'emit', 'edit' ] } );\n\t\teditButton.connect( self, { click: [ 'setEditing', true ] } );\n\t\tcancelButton.connect( self, { click: 'showCancelConfirmationDialog' } );\n\t\tremoveButton.connect( self, { click: 'showRemoveConfirmationDialog' } );\n\t\tlearnMoreButton.connect( self, {\n\t\t\tclick: window.open.bind( window, learnMoreLink, '_blank' )\n\t\t} );\n\n\t\treturn {\n\t\t\ttitle: self.state.title,\n\t\t\tid: self.state.propertyId,\n\t\t\tlabel: formatResponse( html ),\n\t\t\tisDefaultProperty: self.config.isDefaultProperty,\n\t\t\tshowControls: self.config.showControls,\n\t\t\tdisabled: self.isDisabled(),\n\t\t\tediting: self.isEditing(),\n\t\t\titems: self.getItems(),\n\t\t\tinput: self.input,\n\t\t\tpublishButton: self.publishButton,\n\t\t\teditButton: editButton,\n\t\t\tcancelButton: cancelButton,\n\t\t\tremoveAll: removeButton,\n\t\t\tlearnMoreLink: learnMoreLink,\n\t\t\tlearnMoreButton: learnMoreButton,\n\t\t\terrors: errorMessages\n\t\t};\n\t} );\n};\n\n/**\n * @return {boolean}\n */\nStatementWidget.prototype.hasChanges = function () {\n\tconst changes = this.getChanges(),\n\t\tremovals = this.getRemovals();\n\n\treturn changes.length > 0 || removals.length > 0;\n};\n\n/**\n * Receives a DataValue from the input widget and uses it to create a\n * new ItemWidget, add it to the list, and set the widget into edit mode.\n *\n * @fires change\n */\nStatementWidget.prototype.addItemFromInput = function () {\n\tconst self = this;\n\n\tthis.input.parseValue( this.state.propertyId ).then(\n\t\t() => {\n\t\t\tconst dataValue = self.input.getData(),\n\t\t\t\twidget = self.createItem( self.input.getSnakType(), dataValue );\n\n\t\t\tself.addItems( [ widget ] );\n\n\t\t\t// we just added a new item - let's switch all of them into editing mode\n\t\t\tself.setEditing( true );\n\n\t\t\t// clear the autocomplete input field to select entities to add\n\t\t\tself.emit( 'manual-add', widget );\n\t\t\tself.emit( 'change', widget );\n\n\t\t\tself.input.clear();\n\t\t\tself.input.setErrors( [] );\n\t\t},\n\t\t( errorCode, error ) => {\n\t\t\tconst apiError = wikibase.api.RepoApiError.newFromApiResponse( error, 'save' ),\n\t\t\t\terrorMessage = new OO.ui.HtmlSnippet( apiError.detailedMessage );\n\t\t\tself.input.setErrors( [ errorMessage ] );\n\t\t}\n\t);\n};\n\n/**\n * @param {string} snakType value, somevalue, or novalue\n * @param {dataValues.DataValue} dataValue\n * @return {ItemWidget}\n */\nStatementWidget.prototype.createItem = function ( snakType, dataValue ) {\n\tconst widget = new ItemWidget( {\n\t\tdisabled: this.isDisabled(),\n\t\tediting: this.state.editing,\n\t\tentityId: this.state.entityId,\n\t\tpropertyId: this.state.propertyId,\n\t\trank: datamodel.Statement.RANK.NORMAL,\n\t\tsnakType: snakType,\n\t\tdataValue: dataValue\n\t} );\n\n\twidget.connect( this, { delete: [ 'removeItems', [ widget ] ] } );\n\twidget.connect( this, { delete: [ 'emit', 'change' ] } );\n\twidget.connect( this, { change: [ 'setEditing', true ] } );\n\twidget.connect( this, { change: [ 'emit', 'change' ] } );\n\n\treturn widget;\n};\n\n/**\n * @return {datamodel.StatementList}\n */\nStatementWidget.prototype.getData = function () {\n\treturn new datamodel.StatementList( this.getItems().map( ( item ) => item.getData() ) );\n};\n\n/**\n * Update DOM with latest data, sorted by prominence\n *\n * @param {datamodel.StatementList} data\n * @return {jQuery.Promise}\n */\nStatementWidget.prototype.setData = function ( data ) {\n\tconst self = this;\n\tconst existing = [];\n\tconst promises = [];\n\n\t// Bail early and discard existing data if data argument is not a statement list\n\tif ( !( data instanceof datamodel.StatementList ) ) {\n\t\tthrow new Error( 'Invalid statement list' );\n\t}\n\n\t// clear out input field\n\tthis.input.clear();\n\n\tconst sortedData = data.toArray().sort( ( statement1, statement2 ) => statement2.getRank() - statement1.getRank() );\n\n\t// get rid of existing widgets that are no longer present in the\n\t// new set of data we've been fed\n\tthis.removeItems( this.getItems().filter(\n\t\t// we could pretty much just do `!data.hasItem( item.getData() )`,\n\t\t// but that one does not compare GUIDs, so if there are multiple\n\t\t// similar claims, but with a similar GUID, it'll consider them\n\t\t// all the same\n\t\t( item ) => !data.toArray().some(\n\t\t\t( statement ) => statement.equals( item.getData() ) && statement.getClaim().getGuid() === item.getData().getClaim().getGuid()\n\t\t)\n\t) );\n\n\t// figure out which items have an existing widget already\n\t// we're doing this outside of the creation below, because\n\t// setData is async, and new objects may not immediately\n\t// have their data set\n\tsortedData.forEach( ( statement, i ) => {\n\t\texisting[ i ] = self.findItemFromData( statement );\n\t} );\n\n\tsortedData.forEach( ( statement, i ) => {\n\t\tconst mainSnak = statement.getClaim().getMainSnak();\n\t\tlet widget = existing[ i ];\n\t\tconst type = mainSnak.getType();\n\n\t\tif ( mainSnak.getPropertyId() !== self.state.propertyId ) {\n\t\t\tthrow new Error( 'Invalid statement: property ID mismatch' );\n\t\t}\n\n\t\tif ( !( mainSnak instanceof datamodel.Snak ) ) {\n\t\t\t// ignore value-less snak\n\t\t\tdata.removeItem( statement );\n\t\t\treturn;\n\t\t}\n\n\t\tconst value = type === 'value' ? mainSnak.getValue() : null;\n\n\t\tif ( self.state.valueType && value && value.getType() !== self.state.valueType ) {\n\t\t\tthrow new Error( 'Invalid statement: value type mismatch' );\n\t\t}\n\n\t\tif ( widget !== null ) {\n\t\t\tself.moveItem( widget, i );\n\t\t} else {\n\t\t\twidget = self.createItem( type, value );\n\t\t\tself.insertItem( widget, i );\n\t\t}\n\n\t\tpromises.push( widget.setData( statement ) );\n\t} );\n\n\treturn $.when.apply( $, promises ).then( () => self.$element );\n};\n\n/**\n * @return {jQuery.Deferred}\n */\nStatementWidget.prototype.updatePublishButtonState = function () {\n\tif ( this.publishButton && this.items ) {\n\t\tthis.publishButton.setDisabled( this.isDisabled() || !this.hasChanges() );\n\t}\n\n\treturn $.Deferred().resolve( this.$element ).promise();\n};\n\n/**\n * @param {boolean} editing\n * @return {jQuery.Deferred}\n */\nStatementWidget.prototype.setEditing = function ( editing ) {\n\tconst self = this,\n\t\tpromises = [];\n\n\tthis.getItems().forEach( ( item ) => {\n\t\ttry {\n\t\t\tpromises.push( item.setEditing( editing ) );\n\t\t} catch ( e ) {\n\t\t\t// when switching modes, make sure to remove invalid (incomplete) items\n\t\t\tself.removeItems( [ item ] );\n\t\t}\n\t} );\n\n\treturn $.when( promises )\n\t\t.then( this.setState.bind( this, { editing: editing } ) )\n\t\t.then( this.updatePublishButtonState.bind( this ) );\n};\n\n/**\n * @return {boolean}\n */\nStatementWidget.prototype.isEditing = function () {\n\treturn this.state.editing;\n};\n\n/**\n * @inheritDoc\n */\nStatementWidget.prototype.setDisabled = function ( disabled ) {\n\tComponentWidget.prototype.setDisabled.call( this, disabled );\n\n\t// update disabled state for the relevant child objects, if they\n\t// exist (they might not yet, since this method also gets called\n\t// while we're still constructing `this` object)\n\tif ( this.input ) {\n\t\tthis.input.setDisabled( disabled );\n\t}\n\n\tthis.updatePublishButtonState();\n\treturn this;\n};\n\n/**\n * @return {datamodel.Statement[]}\n */\nStatementWidget.prototype.getChanges = function () {\n\tconst currentStatements = this.getData().toArray(),\n\t\tpreviousStatements = this.state.initialData.toArray().reduce( ( result, statement ) => {\n\t\t\tresult[ statement.getClaim().getGuid() ] = statement;\n\t\t\treturn result;\n\t\t}, {} );\n\n\treturn currentStatements.filter( ( statement ) => !( statement.getClaim().getGuid() in previousStatements ) ||\n\t\t\t!statement.equals( previousStatements[ statement.getClaim().getGuid() ] ) );\n};\n\n/**\n * @return {datamodel.Statement[]}\n */\nStatementWidget.prototype.getRemovals = function () {\n\tconst data = this.getData(),\n\t\tcurrentStatements = data.toArray().reduce( ( result, statement ) => {\n\t\t\tresult[ statement.getClaim().getGuid() ] = statement;\n\t\t\treturn result;\n\t\t}, {} );\n\n\treturn this.state.initialData.toArray().filter( ( statement ) => !( statement.getClaim().getGuid() in currentStatements ) );\n};\n\n/**\n * Set data to a specific state (or reset it to last state, if data argument\n * is not provided)\n *\n * This is different from `setData` in that this one will also modify the\n * known state, which is then used to compare for changes.\n * The data that is set via `resetData` is the default state; data set via\n * `setData` is working state, and any changes between that state and the\n * default state, can then be submitted via `submit`.\n *\n * @param {datamodel.StatementList} [data]\n * @return {jQuery.Promise}\n */\nStatementWidget.prototype.resetData = function ( data ) {\n\tconst self = this;\n\n\tdata = this.cloneData( data === undefined ? this.state.initialData : data );\n\n\treturn this.setData( data )\n\t\t// use the `.getData()` result instead of `data` because that'll\n\t\t// already include valid GUIDs, whereas `data` might not\n\t\t.then( () => self.setState( { initialData: self.getData() } ) )\n\t\t.then( this.setEditing.bind( this, false ) );\n};\n\n/**\n * @param {number} [baseRevId]\n * @return {jQuery.Promise}\n */\nStatementWidget.prototype.submit = function ( baseRevId ) {\n\tconst self = this;\n\tconst api = wikibase.api.getLocationAgnosticMwApi(\n\t\tmw.config.get( 'wbmiRepoApiUrl', mw.config.get( 'wbRepoApiUrl' ) )\n\t);\n\tconst data = this.getData();\n\tconst statementsByGuid = {};\n\tconst serializer = new serialization.StatementSerializer();\n\tlet promise = $.Deferred().resolve( { pageinfo: { lastrevid: baseRevId } } ).promise();\n\tconst changedStatements = this.getChanges();\n\tconst removedStatements = this.getRemovals();\n\tlet hasFailures = false;\n\tconst errors = [];\n\tconst disabled = this.isDisabled();\n\tconst tempuser = {};\n\n\tthis.setEditing( false )\n\t\t.then( self.setErrors.bind( self, [] ) );\n\tthis.setDisabled( true );\n\n\tdata.toArray().forEach( ( statement ) => {\n\t\tstatementsByGuid[ statement.getClaim().getGuid() ] = statement;\n\t} );\n\n\tchangedStatements.forEach( ( statement ) => {\n\t\tpromise = promise.then( ( ( innerStatement, prevResponse ) => api.postWithEditToken( {\n\t\t\taction: 'wbsetclaim',\n\t\t\tformat: 'json',\n\t\t\tclaim: JSON.stringify( serializer.serialize( innerStatement ) ),\n\t\t\t// fetch the previous response's rev id and feed it to the next\n\t\t\tbaserevid: prevResponse.pageinfo ? ( prevResponse.pageinfo.lastrevid || undefined ) : undefined,\n\t\t\tbot: 1,\n\t\t\tsummary: self.config.summary || undefined,\n\t\t\ttags: self.config.tags || undefined,\n\t\t\tassertuser: mw.user.isNamed() ? mw.user.getName() : undefined,\n\t\t\terrorformat: 'html',\n\t\t\terrorlang: mw.config.get( 'wgUserLanguage' ),\n\t\t\terrorsuselocal: true,\n\t\t\treturnto: mw.config.get( 'wgPageName' ),\n\t\t\treturntoanchor: '#' + statement.getClaim().getMainSnak().getPropertyId()\n\t\t} ).then(\n\t\t\t( response ) => {\n\t\t\t\tconst guid = response.claim.id;\n\t\t\t\tconst originalStatement = statementsByGuid[ guid ];\n\t\t\t\tconst deserializer = new serialization.StatementDeserializer();\n\t\t\t\tif ( response.claim.qualifiers !== undefined ) {\n\t\t\t\t\t// Capture hashes for new qualifiers by replacing the original\n\t\t\t\t\t// statement with a new statement created from the response\n\t\t\t\t\tconst responseStatement = deserializer.deserialize( response.claim );\n\t\t\t\t\tif ( data.hasItem( originalStatement ) ) {\n\t\t\t\t\t\tdata.removeItem( originalStatement );\n\t\t\t\t\t\t// also remove the item from the StatementWidget itself,\n\t\t\t\t\t\t// or the data will be recreated in this.resetData()\n\t\t\t\t\t\tself.removeItems( [ self.findItemFromData( originalStatement ) ] );\n\t\t\t\t\t}\n\t\t\t\t\tdata.addItem( responseStatement );\n\t\t\t\t}\n\n\t\t\t\t// extract tempuser properties from response, if present\n\t\t\t\t// (this will only be present the first request)\n\t\t\t\tfor ( const property in response ) {\n\t\t\t\t\tif ( property.match( /^tempuser/ ) ) {\n\t\t\t\t\t\ttempuser[ property ] = response[ property ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// make sure to attach known tempuser data to any follow-up\n\t\t\t\t// response, so it ends up propagating until the last response,\n\t\t\t\t// and can be handled once all changes have been submitted\n\t\t\t\tif ( Object.keys( tempuser ).length > 0 ) {\n\t\t\t\t\tObject.assign( response, tempuser );\n\t\t\t\t}\n\n\t\t\t\treturn response;\n\t\t\t}\n\t\t).catch(\n\t\t\t( errorCode, error ) => {\n\t\t\t\tconst apiError = wikibase.api.RepoApiError.newFromApiResponse( error, 'save' ),\n\t\t\t\t\terrorMessage = new OO.ui.HtmlSnippet( apiError.detailedMessage ),\n\t\t\t\t\tguid = statement.getClaim().getGuid(),\n\t\t\t\t\tinitialStatement = self.state.initialData.toArray().filter( ( filterStatement ) => filterStatement.getClaim().getGuid() === guid )[ 0 ];\n\n\t\t\t\t// TODO: show item-specific errors within item UI by using\n\t\t\t\t// the item's setErrors method.\n\t\t\t\t// TODO: flag the offending input so we can make it clear to\n\t\t\t\t// the user which top-level statement or qualifier needs to\n\t\t\t\t// be fixed.\n\t\t\t\thasFailures = true;\n\t\t\t\terrors.push( errorMessage );\n\n\t\t\t\t// replace statement with what we previously had, since we failed\n\t\t\t\t// to submit the changes...\n\t\t\t\tdata.removeItem( statement );\n\t\t\t\tif ( initialStatement ) {\n\t\t\t\t\tdata.addItem( initialStatement );\n\t\t\t\t}\n\n\t\t\t\treturn prevResponse;\n\t\t\t}\n\t\t) ).bind( null, statement ) );\n\t} );\n\n\t// Delete removed items\n\tif ( removedStatements.length > 0 ) {\n\t\tpromise = promise.then( ( prevResponse ) => api.postWithEditToken( {\n\t\t\taction: 'wbremoveclaims',\n\t\t\tformat: 'json',\n\t\t\tclaim: removedStatements.map( ( statement ) => statement.getClaim().getGuid() ).join( '|' ),\n\t\t\t// fetch the previous response's rev id and feed it to the next\n\t\t\tbaserevid: prevResponse.pageinfo ? ( prevResponse.pageinfo.lastrevid || undefined ) : undefined,\n\t\t\tbot: 1,\n\t\t\tsummary: self.config.summary || undefined,\n\t\t\ttags: self.config.tags || undefined,\n\t\t\tassertuser: mw.user.isNamed() ? mw.user.getName() : undefined,\n\t\t\treturnto: mw.config.get( 'wgPageName' ),\n\t\t\treturntoanchor: '#' + removedStatements[ 0 ].getClaim().getMainSnak().getPropertyId()\n\t\t} ).then( ( response ) => {\n\t\t\t// extract tempuser properties from response, if present\n\t\t\t// (this will only be present the first request)\n\t\t\tfor ( const property in response ) {\n\t\t\t\tif ( property.match( /^tempuser/ ) ) {\n\t\t\t\t\ttempuser[ property ] = response[ property ];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// make sure to attach known tempuser data to any follow-up\n\t\t\t// response, so it ends up propagating until the last response,\n\t\t\t// and can be handled once all changes have been submitted\n\t\t\tif ( Object.keys( tempuser ).length > 0 ) {\n\t\t\t\tObject.assign( response, tempuser );\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} ).catch( ( errorCode, error ) => {\n\t\t\tconst apiError = wikibase.api.RepoApiError.newFromApiResponse( error, 'save' );\n\n\t\t\thasFailures = true;\n\t\t\terrors.push( apiError.detailedMessage );\n\n\t\t\t// restore statements that failed to delete\n\t\t\tconst promises = removedStatements.map( ( statement ) => {\n\t\t\t\tconst mainSnak = statement.getClaim().getMainSnak(),\n\t\t\t\t\tsnakType = mainSnak.getType(),\n\t\t\t\t\tvalue = snakType === 'value' ? mainSnak.getValue() : null,\n\t\t\t\t\titem = self.createItem( snakType, value );\n\n\t\t\t\tself.addItems( [ item ] );\n\n\t\t\t\tdata.addItem( statement );\n\t\t\t\treturn item.setData( statement );\n\t\t\t} );\n\n\t\t\t// keep the update chain moving...\n\t\t\treturn $.when.apply( $, promises ).then( () => prevResponse );\n\t\t} ) );\n\t}\n\n\t// store data after we've submitted all changes, so that we'll reset to the\n\t// actual most recent correct state\n\tpromise = promise.then( ( response ) => {\n\t\tconst deferred = $.Deferred();\n\n\t\t// reset to original, pre-submit, disabled state\n\t\tself.setDisabled( disabled );\n\n\t\tif ( hasFailures ) {\n\t\t\t// if we've had failures, put the widget back in edit mode, show\n\t\t\t// error(s), and reject this promise, so callers will know something\n\t\t\t// went wrong.\n\t\t\tself.setEditing( true )\n\t\t\t\t.then( self.setState.bind( self, { initialData: data } ) )\n\t\t\t\t.then( self.setErrors.bind( self, errors ) )\n\t\t\t\t.then( deferred.reject );\n\t\t} else {\n\t\t\t// reset data to what we've just submitted to the API (items that failed\n\t\t\t// to submit have been reset to their previous state in `data`)\n\t\t\tself.resetData( data )\n\t\t\t\t.then( deferred.resolve.bind( deferred, response ) );\n\t\t}\n\n\t\treturn deferred.promise();\n\t} );\n\n\treturn promise;\n};\n\n/**\n * @private\n * @param {datamodel.StatementList} data\n * @return {datamodel.StatementList}\n */\nStatementWidget.prototype.cloneData = function ( data ) {\n\tconst serializer = new serialization.StatementListSerializer(),\n\t\tdeserializer = new serialization.StatementListDeserializer();\n\n\treturn deserializer.deserialize( serializer.serialize( data ) );\n};\n\n/**\n * Display the confirmation dialog to the user when they click the \"Cancel\"\n * button for a given block of statements.\n */\nStatementWidget.prototype.showCancelConfirmationDialog = function () {\n\tconst self = this;\n\n\tif ( this.hasChanges() ) {\n\t\tOO.ui.confirm(\n\t\t\tmw.msg( 'wikibasemediainfo-filepage-cancel-confirm' ),\n\t\t\t{\n\t\t\t\ttitle: mw.msg( 'wikibasemediainfo-filepage-cancel-confirm-title' ),\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\taction: 'accept',\n\t\t\t\t\t\tlabel: mw.msg( 'wikibasemediainfo-filepage-cancel-confirm-accept' ),\n\t\t\t\t\t\tflags: [ 'primary', 'destructive' ]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\taction: 'reject',\n\t\t\t\t\t\tlabel: mw.msg( 'ooui-dialog-message-reject' ),\n\t\t\t\t\t\tflags: 'safe'\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t).then( ( confirmed ) => {\n\t\t\tif ( confirmed ) {\n\t\t\t\tself.setErrors( [] )\n\t\t\t\t\t.then( self.emit.bind( self, 'cancel' ) );\n\t\t\t}\n\t\t} );\n\t} else {\n\t\tself.setErrors( [] )\n\t\t\t.then( self.emit.bind( self, 'cancel' ) );\n\t}\n};\n\n/**\n * Display the confirmation dialog to the user when they click the \"Remove\n * All\" button for a given block of statements.\n */\nStatementWidget.prototype.showRemoveConfirmationDialog = function () {\n\tconst self = this;\n\n\tOO.ui.confirm(\n\t\tmw.msg( 'wikibasemediainfo-remove-all-statements-confirm' ),\n\t\t{\n\t\t\ttitle: mw.msg( 'wikibasemediainfo-remove-all-statements-confirm-title' ),\n\t\t\tactions: [ {\n\t\t\t\taction: 'accept',\n\t\t\t\tlabel: mw.msg( 'wikibasemediainfo-remove-all-statements-confirm-accept' ),\n\t\t\t\tflags: [ 'primary', 'destructive' ]\n\t\t\t}, {\n\t\t\t\taction: 'reject',\n\t\t\t\tlabel: mw.msg( 'ooui-dialog-message-reject' ),\n\t\t\t\tflags: 'safe'\n\t\t\t} ]\n\t\t}\n\t).done( ( confirmed ) => {\n\t\tif ( confirmed ) {\n\t\t\tself.clearItems();\n\t\t\tself.submit().then( () => {\n\t\t\t\tself.emit( 'widgetRemoved', self.state.propertyId );\n\t\t\t} );\n\t\t}\n\t} );\n};\n\n/**\n * Handle the part of the response from a wbcheckconstraints api call that is relevant to this\n * StatementWidget's property id\n *\n * @param {Object} responseForPropertyId\n */\nStatementWidget.prototype.handleConstraintsResponse = function ( responseForPropertyId ) {\n\tif ( responseForPropertyId === null ) {\n\t\treturn;\n\t}\n\tthis.getItems().forEach( ( itemWidget ) => {\n\t\ttry {\n\t\t\t// find the constraint report for this GUID\n\t\t\tconst guid = itemWidget.getData().getClaim().getGuid();\n\t\t\tconst result = responseForPropertyId.filter( ( responseForStatement ) => responseForStatement.id === guid )[ 0 ] || null;\n\t\t\titemWidget.setConstraintsReport( result );\n\t\t} catch ( e ) {\n\t\t\titemWidget.setConstraintsReport( null );\n\t\t}\n\t} );\n};\n\nmodule.exports = StatementWidget;\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/config/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/config/wbMonolingualTextLanguages.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/config/wbTermsLanguages.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/AbstractInputWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'config' is defined but never used.","line":9,"column":78,"nodeType":"Identifier","messageId":"unusedVar","endLine":9,"endColumn":84,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is defined but never used.","line":66,"column":52,"nodeType":"Identifier","messageId":"unusedVar","endLine":66,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/EntityAutocompleteInputWidget.js","messages":[],"suppressedMessages":[{"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":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/EntityInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/GlobeCoordinateInputWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-undef","severity":2,"message":"'L' is not defined.","line":375,"column":5,"nodeType":"Identifier","messageId":"undef","endLine":375,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/MonolingualTextInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/MultiTypeInputWrapperWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/statements/inputs/QuantityInputWidget.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"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 'no-jquery/no-done-fail' (broken in resources/.eslintrc.json) on resources/.eslintrc.json
Disabling eslint rule 'no-jquery/no-done-fail' (broken in resources/.eslintrc.json) on resources/.eslintrc.json
Disabling eslint rule 'no-jquery/no-done-fail' (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 641 packages, and audited 642 packages in 18s

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

9 vulnerabilities (7 moderate, 1 high, 1 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:569:17)
    at process.processTimers (node:internal/timers:512:7) undefined
--- stdout ---

> wikibase-media-info@0.1.0 test
> grunt test && npm run test:unit

Running "eslint:all" (eslint) task

/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

/src/repo/resources/filepage/CaptionsPanel.js
  613:3   warning  Prefer .then to .done  no-jquery/no-done-fail
  613:3   warning  Prefer .then to .fail  no-jquery/no-done-fail
  687:34  warning  Prefer .then to .done  no-jquery/no-done-fail
  687:34  warning  Prefer .then to .fail  no-jquery/no-done-fail
  717:34  warning  Prefer .then to .done  no-jquery/no-done-fail
  717:34  warning  Prefer .then to .fail  no-jquery/no-done-fail

/src/repo/resources/filepage/StatementPanel.js
   26:1  warning  The type 'dataLoadedReadOnly' is undefined  jsdoc/no-undefined-types
  240:1  warning  The type 'widgetRemoved' is undefined       jsdoc/no-undefined-types

/src/repo/resources/serialization/MediaInfoDeserializer.js
  10:1  warning  The type 'SERIALIZER' is undefined  jsdoc/no-undefined-types

/src/repo/resources/statements/StatementWidget.js
  186:1  warning  The type 'change' is undefined  jsdoc/no-undefined-types
  675:2  warning  Prefer .then to .done           no-jquery/no-done-fail

/src/repo/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

✖ 57 problems (0 errors, 57 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": {
    "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": 1102093,
          "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"
          },
          "range": ">=1.0.3 <3.5.0"
        },
        {
          "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"
        }
      ],
      "effects": [
        "oojs-ui"
      ],
      "range": "<=3.4.1",
      "nodes": [
        "node_modules/oojs-ui/node_modules/jquery"
      ],
      "fixAvailable": {
        "name": "oojs-ui",
        "version": "0.51.7",
        "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": "26.0.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
    },
    "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.51.7",
        "isSemVerMajor": true
      }
    },
    "request": {
      "name": "request",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096727,
          "name": "request",
          "dependency": "request",
          "title": "Server-Side Request Forgery in Request",
          "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
          "severity": "moderate",
          "cwe": [
            "CWE-918"
          ],
          "cvss": {
            "score": 6.1,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
          },
          "range": "<=2.88.2"
        },
        "tough-cookie"
      ],
      "effects": [
        "jsdom",
        "request-promise-core",
        "request-promise-native"
      ],
      "range": "*",
      "nodes": [
        "node_modules/request"
      ],
      "fixAvailable": {
        "name": "jsdom",
        "version": "26.0.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": "26.0.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": "26.0.0",
        "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": "26.0.0",
        "isSemVerMajor": true
      }
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 7,
      "high": 1,
      "critical": 1,
      "total": 9
    },
    "dependencies": {
      "prod": 1,
      "dev": 641,
      "optional": 1,
      "peer": 1,
      "peerOptional": 0,
      "total": 641
    }
  }
}

--- end ---
Attempting to npm audit fix
$ /usr/bin/npm audit fix --dry-run --only=dev --json
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
--- stdout ---
{
  "added": 0,
  "removed": 1,
  "changed": 0,
  "audited": 642,
  "funding": 97,
  "audit": {
    "auditReportVersion": 2,
    "vulnerabilities": {
      "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": 1102093,
            "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"
            },
            "range": ">=1.0.3 <3.5.0"
          },
          {
            "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"
          }
        ],
        "effects": [
          "oojs-ui"
        ],
        "range": "<=3.4.1",
        "nodes": [
          "node_modules/oojs-ui/node_modules/jquery"
        ],
        "fixAvailable": {
          "name": "oojs-ui",
          "version": "0.51.7",
          "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": "26.0.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
      },
      "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.51.7",
          "isSemVerMajor": true
        }
      },
      "request": {
        "name": "request",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          {
            "source": 1096727,
            "name": "request",
            "dependency": "request",
            "title": "Server-Side Request Forgery in Request",
            "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
            "severity": "moderate",
            "cwe": [
              "CWE-918"
            ],
            "cvss": {
              "score": 6.1,
              "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
            },
            "range": "<=2.88.2"
          },
          "tough-cookie"
        ],
        "effects": [
          "jsdom",
          "request-promise-core",
          "request-promise-native"
        ],
        "range": "*",
        "nodes": [
          "node_modules/request"
        ],
        "fixAvailable": {
          "name": "jsdom",
          "version": "26.0.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": "26.0.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": "26.0.0",
          "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": "26.0.0",
          "isSemVerMajor": true
        }
      }
    },
    "metadata": {
      "vulnerabilities": {
        "info": 0,
        "low": 0,
        "moderate": 7,
        "high": 1,
        "critical": 1,
        "total": 9
      },
      "dependencies": {
        "prod": 1,
        "dev": 641,
        "optional": 1,
        "peer": 1,
        "peerOptional": 0,
        "total": 641
      }
    }
  }
}

--- end ---
{"added": 0, "removed": 1, "changed": 0, "audited": 642, "funding": 97, "audit": {"auditReportVersion": 2, "vulnerabilities": {"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": 1102093, "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"}, "range": ">=1.0.3 <3.5.0"}, {"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"}], "effects": ["oojs-ui"], "range": "<=3.4.1", "nodes": ["node_modules/oojs-ui/node_modules/jquery"], "fixAvailable": {"name": "oojs-ui", "version": "0.51.7", "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": "26.0.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}, "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.51.7", "isSemVerMajor": true}}, "request": {"name": "request", "severity": "moderate", "isDirect": false, "via": [{"source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": ["CWE-918"], "cvss": {"score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"}, "range": "<=2.88.2"}, "tough-cookie"], "effects": ["jsdom", "request-promise-core", "request-promise-native"], "range": "*", "nodes": ["node_modules/request"], "fixAvailable": {"name": "jsdom", "version": "26.0.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": "26.0.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": "26.0.0", "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": "26.0.0", "isSemVerMajor": true}}}, "metadata": {"vulnerabilities": {"info": 0, "low": 0, "moderate": 7, "high": 1, "critical": 1, "total": 9}, "dependencies": {"prod": 1, "dev": 641, "optional": 1, "peer": 1, "peerOptional": 0, "total": 641}}}}
$ /usr/bin/npm audit fix --only=dev
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
--- stdout ---

removed 1 package, and audited 642 packages in 2s

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

# npm audit report

jpeg-js  <=0.4.3
Severity: high
Infinite loop in jpeg-js - https://github.com/advisories/GHSA-xvf7-4v9q-58w6
Uncontrolled resource consumption in jpeg-js - https://github.com/advisories/GHSA-w7q9-p3jq-fmhm
fix available via `npm audit fix --force`
Will install jpeg-js@0.4.4, which is a breaking change
node_modules/jpeg-js

jquery  <=3.4.1
Severity: moderate
Potential XSS vulnerability in jQuery - https://github.com/advisories/GHSA-jpcq-cgw6-v4j6
Potential XSS vulnerability in jQuery - https://github.com/advisories/GHSA-gxr4-xjj5-5px2
fix available via `npm audit fix --force`
Will install oojs-ui@0.51.7, which is a breaking change
node_modules/oojs-ui/node_modules/jquery
  oojs-ui  0.11.0 - 0.38.1
  Depends on vulnerable versions of jquery
  node_modules/oojs-ui

mockery  *
Severity: critical
mockery is vulnerable to prototype pollution - https://github.com/advisories/GHSA-gmwp-3pwc-3j3g
No fix available
node_modules/mockery

request  *
Severity: moderate
Server-Side Request Forgery in Request - https://github.com/advisories/GHSA-p8p7-x288-28g6
Depends on vulnerable versions of tough-cookie
fix available via `npm audit fix --force`
Will install jsdom@26.0.0, which is a breaking change
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

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@26.0.0, which is a breaking change
node_modules/tough-cookie

9 vulnerabilities (7 moderate, 1 high, 1 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 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 641 packages, and audited 642 packages in 23s

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

9 vulnerabilities (7 moderate, 1 high, 1 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:569:17)
    at process.processTimers (node:internal/timers:512:7) undefined
--- stdout ---

> wikibase-media-info@0.1.0 test
> grunt test && npm run test:unit

Running "eslint:all" (eslint) task

/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

/src/repo/resources/filepage/CaptionsPanel.js
  613:3   warning  Prefer .then to .done  no-jquery/no-done-fail
  613:3   warning  Prefer .then to .fail  no-jquery/no-done-fail
  687:34  warning  Prefer .then to .done  no-jquery/no-done-fail
  687:34  warning  Prefer .then to .fail  no-jquery/no-done-fail
  717:34  warning  Prefer .then to .done  no-jquery/no-done-fail
  717:34  warning  Prefer .then to .fail  no-jquery/no-done-fail

/src/repo/resources/filepage/StatementPanel.js
   26:1  warning  The type 'dataLoadedReadOnly' is undefined  jsdoc/no-undefined-types
  240:1  warning  The type 'widgetRemoved' is undefined       jsdoc/no-undefined-types

/src/repo/resources/serialization/MediaInfoDeserializer.js
  10:1  warning  The type 'SERIALIZER' is undefined  jsdoc/no-undefined-types

/src/repo/resources/statements/StatementWidget.js
  186:1  warning  The type 'change' is undefined  jsdoc/no-undefined-types
  675:2  warning  Prefer .then to .done           no-jquery/no-done-fail

/src/repo/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

✖ 57 problems (0 errors, 57 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 eslint-config-wikimedia to 0.29.1

The following rules are failing and were disabled:
* resources:
  * no-jquery/no-done-fail

$ git add .
--- stdout ---

--- end ---
$ git commit -F /tmp/tmphzfmsr01
--- stdout ---
[master 9cdfe0d] build: Updating eslint-config-wikimedia to 0.29.1
 11 files changed, 36 insertions(+), 32 deletions(-)

--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 9cdfe0d906890bfef69c040048e400eff2140c5b Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 31 Mar 2025 08:16:59 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.29.1

The following rules are failing and were disabled:
* resources:
  * no-jquery/no-done-fail

Change-Id: I24c496779c48ac12b2608df92299394f7d37f63c
---
 package-lock.json                             | 33 ++++++++++---------
 package.json                                  |  2 +-
 resources/.eslintrc.json                      |  3 +-
 resources/base/ComponentWidget.js             | 10 +++---
 resources/filepage/CaptionsPanel.js           |  6 ++--
 resources/filepage/StatementPanel.js          |  2 +-
 resources/filepage/init.js                    |  2 +-
 resources/statements/AddPropertyWidget.js     |  2 +-
 resources/statements/ItemWidget.js            |  2 +-
 resources/statements/SnakListWidget.js        |  2 +-
 .../inputs/EntityAutocompleteInputWidget.js   |  4 +--
 11 files changed, 36 insertions(+), 32 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 001d57c..5154a91 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
 			"hasInstallScript": true,
 			"devDependencies": {
 				"dotenv": "8.0.0",
-				"eslint-config-wikimedia": "0.28.2",
+				"eslint-config-wikimedia": "0.29.1",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.13.0",
 				"grunt-eslint": "24.3.0",
@@ -2230,9 +2230,9 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.28.2",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
-			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+			"version": "0.29.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+			"integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
 			"dev": true,
 			"dependencies": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -2245,13 +2245,16 @@
 				"eslint-plugin-mediawiki": "^0.7.0",
 				"eslint-plugin-mocha": "^10.4.3",
 				"eslint-plugin-n": "^17.7.0",
-				"eslint-plugin-no-jquery": "^3.0.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 <23"
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
@@ -2522,9 +2525,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz",
-			"integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+			"integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
 			"dev": true,
 			"peerDependencies": {
 				"eslint": ">=8.0.0"
@@ -9204,9 +9207,9 @@
 			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.28.2",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
-			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+			"version": "0.29.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+			"integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
 			"dev": true,
 			"requires": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -9219,7 +9222,7 @@
 				"eslint-plugin-mediawiki": "^0.7.0",
 				"eslint-plugin-mocha": "^10.4.3",
 				"eslint-plugin-n": "^17.7.0",
-				"eslint-plugin-no-jquery": "^3.0.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",
@@ -9401,9 +9404,9 @@
 			}
 		},
 		"eslint-plugin-no-jquery": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz",
-			"integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+			"integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
 			"dev": true,
 			"requires": {}
 		},
diff --git a/package.json b/package.json
index 8edde48..a9b07b8 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
 	},
 	"devDependencies": {
 		"dotenv": "8.0.0",
-		"eslint-config-wikimedia": "0.28.2",
+		"eslint-config-wikimedia": "0.29.1",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.13.0",
 		"grunt-eslint": "24.3.0",
diff --git a/resources/.eslintrc.json b/resources/.eslintrc.json
index f223cc9..d3712ee 100644
--- a/resources/.eslintrc.json
+++ b/resources/.eslintrc.json
@@ -8,7 +8,8 @@
 		"commonjs": true
 	},
 	"rules": {
-		"max-len": "off"
+		"max-len": "off",
+		"no-jquery/no-done-fail": "warn"
 	},
 	"settings": {
 		"jsdoc": {
diff --git a/resources/base/ComponentWidget.js b/resources/base/ComponentWidget.js
index 9b35add..5b144bc 100644
--- a/resources/base/ComponentWidget.js
+++ b/resources/base/ComponentWidget.js
@@ -219,13 +219,13 @@ ComponentWidget.prototype.rebuildDOM = function ( oldContainer, newContainer, pr
 		// or new node (if it's one to be preserved - i.e. we're manipulating the
 		// node directly elsewhere in JS), or trying to apply properties of the
 		// new node to the old node
-		if ( preservedNodes.indexOf( oldNode ) >= 0 ) {
+		if ( preservedNodes.includes( oldNode ) ) {
 			// oldNode is a node that needs to be preserved: it was a DOM node
 			// directly assigned as a variable to the template and it may have
 			// context that we must not lose (event listeners, focus state...)
 			// leave this node alone!
 			preservedNodes.splice( preservedNodes.indexOf( oldNode ), 1 );
-		} else if ( preservedNodes.indexOf( newNode ) >= 0 ) {
+		} else if ( preservedNodes.includes( newNode ) ) {
 			// same as above: it was assigned to the template, but it did not
 			// yet exist in the old render (a very similar node might exist,
 			// but not this exact one, which might have other event handlers
@@ -431,7 +431,7 @@ ComponentWidget.prototype.matchNodes = function ( one, two, preserve ) {
 
 		other = filterRelevantNodes( node, other ).filter(
 			// exclude nodes that we've already paired to a previous node
-			( target ) => result.indexOf( target ) < 0
+			( target ) => !result.includes( target )
 		);
 
 		// find the first unmatched relevant equal node (if any)
@@ -446,7 +446,7 @@ ComponentWidget.prototype.matchNodes = function ( one, two, preserve ) {
 
 		// narrow down nodes by cross-referencing similarities from the
 		// other side: a future node might actually be a better match...
-		other = other.filter( ( target ) => filterByMostSimilar( target, remaining ).indexOf( node ) >= 0 );
+		other = other.filter( ( target ) => filterByMostSimilar( target, remaining ).includes( node ) );
 
 		// narrow it down further to the one(s) with the minimum amount
 		// of different children
@@ -454,7 +454,7 @@ ComponentWidget.prototype.matchNodes = function ( one, two, preserve ) {
 
 		// narrow down nodes by cross-referencing dissimilarities from the
 		// other side: a future node might actually be a better match...
-		other = other.filter( ( target ) => filterByLeastDissimilar( target, remaining ).indexOf( node ) >= 0 );
+		other = other.filter( ( target ) => filterByLeastDissimilar( target, remaining ).includes( node ) );
 
 		// return the first of whatever is left
 		return result.concat( other.shift() );
diff --git a/resources/filepage/CaptionsPanel.js b/resources/filepage/CaptionsPanel.js
index 082d2f9..b3e4740 100644
--- a/resources/filepage/CaptionsPanel.js
+++ b/resources/filepage/CaptionsPanel.js
@@ -211,14 +211,14 @@ CaptionsPanel.prototype.getOrderedLangCodes = function ( captionDataArray ) {
 
 	// User languages go next
 	this.userLanguages.forEach( ( langCode ) => {
-		if ( rearrangedCaptionLanguages.indexOf( langCode ) === -1 ) {
+		if ( !rearrangedCaptionLanguages.includes( langCode ) ) {
 			rearrangedCaptionLanguages.push( langCode );
 		}
 	} );
 
 	// And finally all other languages
 	captionLanguages.forEach( ( langCode ) => {
-		if ( rearrangedCaptionLanguages.indexOf( langCode ) === -1 ) {
+		if ( !rearrangedCaptionLanguages.includes( langCode ) ) {
 			rearrangedCaptionLanguages.push( langCode );
 		}
 	} );
@@ -570,7 +570,7 @@ CaptionsPanel.prototype.getShowCaptionFlagsByLangCode = function () {
 		) {
 			showCaption = true;
 		} else {
-			if ( self.userLanguages.indexOf( langCode ) === -1 ) {
+			if ( !self.userLanguages.includes( langCode ) ) {
 				showCaption = false;
 			} else {
 				showCaption = true;
diff --git a/resources/filepage/StatementPanel.js b/resources/filepage/StatementPanel.js
index 4bbc1e6..b559ebe 100644
--- a/resources/filepage/StatementPanel.js
+++ b/resources/filepage/StatementPanel.js
@@ -139,7 +139,7 @@ StatementPanel.prototype.isEditable = function () {
  */
 StatementPanel.prototype.isSupportedType = function () {
 	const supportedTypes = mw.config.get( 'wbmiSupportedDataTypes' ) || [];
-	return supportedTypes.indexOf( this.config.propertyType ) >= 0;
+	return supportedTypes.includes( this.config.propertyType );
 };
 
 /**
diff --git a/resources/filepage/init.js b/resources/filepage/init.js
index 9bcce6c..a3db7d0 100644
--- a/resources/filepage/init.js
+++ b/resources/filepage/init.js
@@ -122,7 +122,7 @@
 			$element: $el,
 			entityId: mw.config.get( 'wbEntityId' ),
 			helpUrls: mw.config.get( 'wbmiHelpUrls' ) || {},
-			isDefaultProperty: defaultProperties.indexOf( propId ) >= 0,
+			isDefaultProperty: defaultProperties.includes( propId ),
 			propertyId: propId,
 			propertyType: propertyType,
 			showControls: editable,
diff --git a/resources/statements/AddPropertyWidget.js b/resources/statements/AddPropertyWidget.js
index 9d11a6a..b9ce00b 100644
--- a/resources/statements/AddPropertyWidget.js
+++ b/resources/statements/AddPropertyWidget.js
@@ -86,7 +86,7 @@ AddPropertyWidget.prototype.getFilters = function () {
  * @return {jQuery.Promise}
  */
 AddPropertyWidget.prototype.addPropertyId = function ( propertyId ) {
-	if ( this.state.propertyIds.indexOf( propertyId ) >= 0 ) {
+	if ( this.state.propertyIds.includes( propertyId ) ) {
 		return $.Deferred().resolve( this.$element ).promise();
 	}
 
diff --git a/resources/statements/ItemWidget.js b/resources/statements/ItemWidget.js
index 89d0fd5..00b5774 100644
--- a/resources/statements/ItemWidget.js
+++ b/resources/statements/ItemWidget.js
@@ -377,7 +377,7 @@ ItemWidget.prototype.setData = function ( data ) {
 	const referencesHashes = referencesArray.map( ( reference ) => reference.getHash() );
 
 	for ( let i = 0; i < referencesArray.length; i++ ) {
-		if ( referencesHashes.indexOf( this.state.referenceHashes[ i ] ) >= 0 ) {
+		if ( referencesHashes.includes( this.state.referenceHashes[ i ] ) ) {
 			// salvage existing widgets that are also in the newly received data,
 			newReferenceWidgets[ i ] = this.state.references[ i ];
 		} else {
diff --git a/resources/statements/SnakListWidget.js b/resources/statements/SnakListWidget.js
index 05662ed..f78352d 100644
--- a/resources/statements/SnakListWidget.js
+++ b/resources/statements/SnakListWidget.js
@@ -84,7 +84,7 @@ SnakListWidget.prototype.removeWidgets = function ( snaks ) {
 		removedWidgets = [];
 
 	this.state.snaks.forEach( ( snak ) => {
-		if ( snaks.indexOf( snak ) < 0 ) {
+		if ( !snaks.includes( snak ) ) {
 			// not present in array of items to remove = keep
 			newWidgets.push( snak );
 		} else {
diff --git a/resources/statements/inputs/EntityAutocompleteInputWidget.js b/resources/statements/inputs/EntityAutocompleteInputWidget.js
index bc5bbce..ac21658 100644
--- a/resources/statements/inputs/EntityAutocompleteInputWidget.js
+++ b/resources/statements/inputs/EntityAutocompleteInputWidget.js
@@ -278,9 +278,9 @@ EntityAutocompleteInputWidget.prototype.filterData = function ( data ) {
 		const values = filter.value.split( '|' );
 		data = data.filter( ( datum ) => {
 			if ( filterType === 'includeOnMatch' ) {
-				return values.indexOf( datum[ field ] ) !== -1;
+				return values.includes( datum[ field ] );
 			} else {
-				return values.indexOf( datum[ field ] ) === -1;
+				return !values.includes( datum[ field ] );
 			}
 		} );
 	} );
-- 
2.39.2


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