This run took 41 seconds.
From d7dc43c72442d8571a00485d188729d0d8d279d8 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 8 Dec 2025 00:07:37 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.32.3
Change-Id: I3a03689334438118e725ec8de6102b063b0c18db
---
package-lock.json | 209 +++++++++++++++++++++++++++++-----------------
package.json | 2 +-
2 files changed, 133 insertions(+), 78 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d271485..13d08d8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,7 +5,7 @@
"packages": {
"": {
"devDependencies": {
- "eslint-config-wikimedia": "0.32.2"
+ "eslint-config-wikimedia": "0.32.3"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -41,21 +41,30 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
- "version": "0.75.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
- "integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
+ "version": "0.76.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
+ "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
"dev": true,
"dependencies": {
"@types/estree": "^1.0.8",
"@typescript-eslint/types": "^8.46.0",
"comment-parser": "1.4.1",
"esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~6.9.1"
+ "jsdoc-type-pratt-parser": "~6.10.0"
},
"engines": {
"node": ">=20.11.0"
}
},
+ "node_modules/@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
@@ -190,6 +199,18 @@
"node": ">= 8"
}
},
+ "node_modules/@sindresorhus/base62": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+ "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@stylistic/eslint-plugin": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-3.1.0.tgz",
@@ -1026,9 +1047,9 @@
}
},
"node_modules/eslint-config-wikimedia": {
- "version": "0.32.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.2.tgz",
- "integrity": "sha512-vAGz50AJPk23qQ701sL4tAgaF8FEAkP/E3kgojSTVrGgmDqjnRvq8z3EItDNI/EAkb5Ys15WPPFsoBH8YhTdSg==",
+ "version": "0.32.3",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.3.tgz",
+ "integrity": "sha512-Ekz2/ozpCCjQl3VbC6dW7ChqoW7FRilLDxmJ+FJOZhIxxzZSZR5QqQOAGWSZAlG1ONkZbYV/TPwGLWZcrNxyaA==",
"dev": true,
"dependencies": {
"@stylistic/eslint-plugin": "^3.1.0",
@@ -1039,9 +1060,9 @@
"eslint-plugin-compat": "^6.0.2",
"eslint-plugin-es-x": "^8.7.0",
"eslint-plugin-jest": "^29.0.1",
- "eslint-plugin-jsdoc": "61.0.0",
+ "eslint-plugin-jsdoc": "61.3.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.8.1",
+ "eslint-plugin-mediawiki": "^0.8.2",
"eslint-plugin-mocha": "^10.5.0",
"eslint-plugin-n": "^17.23.1",
"eslint-plugin-no-jquery": "^3.1.1",
@@ -1137,12 +1158,13 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "61.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
- "integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
+ "version": "61.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.3.0.tgz",
+ "integrity": "sha512-E4m/5J5lrasd63Z74q4CCZ4PFnywnnrcvA7zZ98802NPhrZKKTp5NH+XAT+afcjXp2ps2/OQF5gPSWCT2XFCJg==",
"dev": true,
"dependencies": {
- "@es-joy/jsdoccomment": "~0.75.0",
+ "@es-joy/jsdoccomment": "~0.76.0",
+ "@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
"debug": "^4.4.3",
@@ -1150,10 +1172,11 @@
"espree": "^10.4.0",
"esquery": "^1.6.0",
"html-entities": "^2.6.0",
- "object-deep-merge": "^1.0.5",
+ "object-deep-merge": "^2.0.0",
"parse-imports-exports": "^0.2.4",
"semver": "^7.7.3",
- "spdx-expression-parse": "^4.0.0"
+ "spdx-expression-parse": "^4.0.0",
+ "to-valid-identifier": "^1.0.0"
},
"engines": {
"node": ">=20.11.0"
@@ -1205,9 +1228,9 @@
}
},
"node_modules/eslint-plugin-mediawiki": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
- "integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
+ "integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
"dev": true,
"dependencies": {
"upath": "^2.0.1"
@@ -1965,9 +1988,9 @@
}
},
"node_modules/jsdoc-type-pratt-parser": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
- "integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz",
+ "integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==",
"dev": true,
"engines": {
"node": ">=20.0.0"
@@ -2150,25 +2173,10 @@
}
},
"node_modules/object-deep-merge": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
- "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
- "dev": true,
- "dependencies": {
- "type-fest": "4.2.0"
- }
- },
- "node_modules/object-deep-merge/node_modules/type-fest": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
- "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
- "dev": true,
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+ "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+ "dev": true
},
"node_modules/once": {
"version": "1.4.0",
@@ -2538,6 +2546,18 @@
"node": ">=0.10.5"
}
},
+ "node_modules/reserved-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+ "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/resolve": {
"version": "1.22.11",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
@@ -2799,6 +2819,22 @@
"node": ">=8.0"
}
},
+ "node_modules/to-valid-identifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+ "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/base62": "^1.0.0",
+ "reserved-identifiers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/ts-api-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
@@ -3078,18 +3114,24 @@
"dev": true
},
"@es-joy/jsdoccomment": {
- "version": "0.75.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
- "integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
+ "version": "0.76.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
+ "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
"dev": true,
"requires": {
"@types/estree": "^1.0.8",
"@typescript-eslint/types": "^8.46.0",
"comment-parser": "1.4.1",
"esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~6.9.1"
+ "jsdoc-type-pratt-parser": "~6.10.0"
}
},
+ "@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
+ "dev": true
+ },
"@eslint-community/eslint-utils": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
@@ -3183,6 +3225,12 @@
"fastq": "^1.6.0"
}
},
+ "@sindresorhus/base62": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+ "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+ "dev": true
+ },
"@stylistic/eslint-plugin": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-3.1.0.tgz",
@@ -3736,9 +3784,9 @@
}
},
"eslint-config-wikimedia": {
- "version": "0.32.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.2.tgz",
- "integrity": "sha512-vAGz50AJPk23qQ701sL4tAgaF8FEAkP/E3kgojSTVrGgmDqjnRvq8z3EItDNI/EAkb5Ys15WPPFsoBH8YhTdSg==",
+ "version": "0.32.3",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.3.tgz",
+ "integrity": "sha512-Ekz2/ozpCCjQl3VbC6dW7ChqoW7FRilLDxmJ+FJOZhIxxzZSZR5QqQOAGWSZAlG1ONkZbYV/TPwGLWZcrNxyaA==",
"dev": true,
"requires": {
"@stylistic/eslint-plugin": "^3.1.0",
@@ -3749,9 +3797,9 @@
"eslint-plugin-compat": "^6.0.2",
"eslint-plugin-es-x": "^8.7.0",
"eslint-plugin-jest": "^29.0.1",
- "eslint-plugin-jsdoc": "61.0.0",
+ "eslint-plugin-jsdoc": "61.3.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.8.1",
+ "eslint-plugin-mediawiki": "^0.8.2",
"eslint-plugin-mocha": "^10.5.0",
"eslint-plugin-n": "^17.23.1",
"eslint-plugin-no-jquery": "^3.1.1",
@@ -3808,12 +3856,13 @@
}
},
"eslint-plugin-jsdoc": {
- "version": "61.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
- "integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
+ "version": "61.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.3.0.tgz",
+ "integrity": "sha512-E4m/5J5lrasd63Z74q4CCZ4PFnywnnrcvA7zZ98802NPhrZKKTp5NH+XAT+afcjXp2ps2/OQF5gPSWCT2XFCJg==",
"dev": true,
"requires": {
- "@es-joy/jsdoccomment": "~0.75.0",
+ "@es-joy/jsdoccomment": "~0.76.0",
+ "@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
"debug": "^4.4.3",
@@ -3821,10 +3870,11 @@
"espree": "^10.4.0",
"esquery": "^1.6.0",
"html-entities": "^2.6.0",
- "object-deep-merge": "^1.0.5",
+ "object-deep-merge": "^2.0.0",
"parse-imports-exports": "^0.2.4",
"semver": "^7.7.3",
- "spdx-expression-parse": "^4.0.0"
+ "spdx-expression-parse": "^4.0.0",
+ "to-valid-identifier": "^1.0.0"
},
"dependencies": {
"eslint-visitor-keys": {
@@ -3857,9 +3907,9 @@
}
},
"eslint-plugin-mediawiki": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
- "integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
+ "integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
"dev": true,
"requires": {
"upath": "^2.0.1"
@@ -4399,9 +4449,9 @@
}
},
"jsdoc-type-pratt-parser": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
- "integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz",
+ "integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==",
"dev": true
},
"jsesc": {
@@ -4550,21 +4600,10 @@
}
},
"object-deep-merge": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
- "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
- "dev": true,
- "requires": {
- "type-fest": "4.2.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
- "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
- "dev": true
- }
- }
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+ "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+ "dev": true
},
"once": {
"version": "1.4.0",
@@ -4830,6 +4869,12 @@
"integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
"dev": true
},
+ "reserved-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+ "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+ "dev": true
+ },
"resolve": {
"version": "1.22.11",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
@@ -5011,6 +5056,16 @@
"is-number": "^7.0.0"
}
},
+ "to-valid-identifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+ "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+ "dev": true,
+ "requires": {
+ "@sindresorhus/base62": "^1.0.0",
+ "reserved-identifiers": "^1.0.0"
+ }
+ },
"ts-api-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
diff --git a/package.json b/package.json
index f67a7a5..cfef263 100644
--- a/package.json
+++ b/package.json
@@ -4,6 +4,6 @@
"test": "eslint ."
},
"devDependencies": {
- "eslint-config-wikimedia": "0.32.2"
+ "eslint-config-wikimedia": "0.32.3"
}
}
--
2.47.3
$ date
--- stdout ---
Mon Dec 8 00:07:12 UTC 2025
--- end ---
$ git clone file:///srv/git/integration-docroot.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 ---
607a9591df618f824c8a59682be43056bde8d4d5 refs/heads/master
--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 0,
"high": 0,
"critical": 0,
"total": 0
},
"dependencies": {
"prod": 1,
"dev": 246,
"optional": 0,
"peer": 1,
"peerOptional": 0,
"total": 246
}
}
}
--- 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: 61 installs, 0 updates, 0 removals
- Locking composer/pcre (3.3.2)
- Locking composer/semver (3.4.4)
- Locking composer/spdx-licenses (1.5.9)
- Locking composer/xdebug-handler (3.0.5)
- Locking dealerdirect/phpcodesniffer-composer-installer (v1.2.0)
- Locking doctrine/deprecations (1.1.5)
- Locking felixfbecker/advanced-json-rpc (v3.2.1)
- Locking mediawiki/mediawiki-codesniffer (v48.0.0)
- Locking mediawiki/mediawiki-phan-config (0.17.0)
- Locking mediawiki/phan-taint-check-plugin (7.0.0)
- Locking microsoft/tolerant-php-parser (v0.1.2)
- Locking myclabs/deep-copy (1.13.4)
- Locking netresearch/jsonmapper (v4.5.0)
- Locking nikic/php-parser (v5.7.0)
- Locking phan/phan (5.5.1)
- Locking phar-io/manifest (2.0.4)
- Locking phar-io/version (3.2.1)
- Locking php-parallel-lint/php-parallel-lint (v1.4.0)
- Locking phpcsstandards/phpcsextra (1.4.0)
- Locking phpcsstandards/phpcsutils (1.1.1)
- Locking phpdocumentor/reflection-common (2.2.0)
- Locking phpdocumentor/reflection-docblock (5.6.5)
- Locking phpdocumentor/type-resolver (1.12.0)
- Locking phpstan/phpdoc-parser (2.3.0)
- Locking phpunit/php-code-coverage (10.1.16)
- Locking phpunit/php-file-iterator (4.1.0)
- Locking phpunit/php-invoker (4.0.0)
- Locking phpunit/php-text-template (3.0.1)
- Locking phpunit/php-timer (6.0.0)
- Locking phpunit/phpunit (10.5.58)
- Locking psr/container (2.0.2)
- Locking psr/log (3.0.2)
- Locking sabre/event (5.1.7)
- Locking sebastian/cli-parser (2.0.1)
- Locking sebastian/code-unit (2.0.0)
- Locking sebastian/code-unit-reverse-lookup (3.0.0)
- Locking sebastian/comparator (5.0.4)
- Locking sebastian/complexity (3.2.0)
- Locking sebastian/diff (5.1.1)
- Locking sebastian/environment (6.1.0)
- Locking sebastian/exporter (5.1.4)
- Locking sebastian/global-state (6.0.2)
- Locking sebastian/lines-of-code (2.0.2)
- Locking sebastian/object-enumerator (5.0.0)
- Locking sebastian/object-reflector (3.0.0)
- Locking sebastian/recursion-context (5.0.1)
- Locking sebastian/type (4.0.0)
- Locking sebastian/version (4.0.1)
- Locking squizlabs/php_codesniffer (3.13.2)
- Locking symfony/console (v7.4.1)
- Locking symfony/deprecation-contracts (v3.6.0)
- Locking symfony/polyfill-ctype (v1.33.0)
- Locking symfony/polyfill-intl-grapheme (v1.33.0)
- Locking symfony/polyfill-intl-normalizer (v1.33.0)
- Locking symfony/polyfill-mbstring (v1.33.0)
- Locking symfony/polyfill-php80 (v1.33.0)
- Locking symfony/service-contracts (v3.6.1)
- Locking symfony/string (v8.0.1)
- Locking theseer/tokenizer (1.3.1)
- Locking tysonandre/var_representation_polyfill (0.1.3)
- Locking webmozart/assert (1.12.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 61 installs, 0 updates, 0 removals
0 [>---------------------------] 0 [->--------------------------]
- Installing squizlabs/php_codesniffer (3.13.2): Extracting archive
- Installing dealerdirect/phpcodesniffer-composer-installer (v1.2.0): Extracting archive
- Installing composer/pcre (3.3.2): Extracting archive
- Installing phpcsstandards/phpcsutils (1.1.1): Extracting archive
- Installing phpcsstandards/phpcsextra (1.4.0): Extracting archive
- Installing symfony/polyfill-mbstring (v1.33.0): Extracting archive
- Installing composer/spdx-licenses (1.5.9): Extracting archive
- Installing composer/semver (3.4.4): Extracting archive
- Installing mediawiki/mediawiki-codesniffer (v48.0.0): Extracting archive
- Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
- Installing symfony/polyfill-php80 (v1.33.0): Extracting archive
- Installing symfony/polyfill-intl-normalizer (v1.33.0): Extracting archive
- Installing symfony/polyfill-intl-grapheme (v1.33.0): Extracting archive
- Installing symfony/polyfill-ctype (v1.33.0): Extracting archive
- Installing symfony/string (v8.0.1): Extracting archive
- Installing symfony/deprecation-contracts (v3.6.0): Extracting archive
- Installing psr/container (2.0.2): Extracting archive
- Installing symfony/service-contracts (v3.6.1): Extracting archive
- Installing symfony/console (v7.4.1): Extracting archive
- Installing sabre/event (5.1.7): Extracting archive
- Installing netresearch/jsonmapper (v4.5.0): Extracting archive
- Installing microsoft/tolerant-php-parser (v0.1.2): Extracting archive
- Installing webmozart/assert (1.12.1): Extracting archive
- Installing phpstan/phpdoc-parser (2.3.0): Extracting archive
- Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
- Installing doctrine/deprecations (1.1.5): Extracting archive
- Installing phpdocumentor/type-resolver (1.12.0): Extracting archive
- Installing phpdocumentor/reflection-docblock (5.6.5): Extracting archive
- Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
- Installing psr/log (3.0.2): Extracting archive
- Installing composer/xdebug-handler (3.0.5): Extracting archive
- Installing phan/phan (5.5.1): Extracting archive
- Installing mediawiki/phan-taint-check-plugin (7.0.0): Extracting archive
- Installing mediawiki/mediawiki-phan-config (0.17.0): Extracting archive
- Installing php-parallel-lint/php-parallel-lint (v1.4.0): Extracting archive
- Installing sebastian/version (4.0.1): Extracting archive
- Installing sebastian/type (4.0.0): Extracting archive
- Installing sebastian/recursion-context (5.0.1): Extracting archive
- Installing sebastian/object-reflector (3.0.0): Extracting archive
- Installing sebastian/object-enumerator (5.0.0): Extracting archive
- Installing sebastian/global-state (6.0.2): Extracting archive
- Installing sebastian/exporter (5.1.4): Extracting archive
- Installing sebastian/environment (6.1.0): Extracting archive
- Installing sebastian/diff (5.1.1): Extracting archive
- Installing sebastian/comparator (5.0.4): Extracting archive
- Installing sebastian/code-unit (2.0.0): Extracting archive
- Installing sebastian/cli-parser (2.0.1): Extracting archive
- Installing phpunit/php-timer (6.0.0): Extracting archive
- Installing phpunit/php-text-template (3.0.1): Extracting archive
- Installing phpunit/php-invoker (4.0.0): Extracting archive
- Installing phpunit/php-file-iterator (4.1.0): Extracting archive
- Installing theseer/tokenizer (1.3.1): Extracting archive
- Installing nikic/php-parser (v5.7.0): Extracting archive
- Installing sebastian/lines-of-code (2.0.2): Extracting archive
- Installing sebastian/complexity (3.2.0): Extracting archive
- Installing sebastian/code-unit-reverse-lookup (3.0.0): Extracting archive
- Installing phpunit/php-code-coverage (10.1.16): Extracting archive
- Installing phar-io/version (3.2.1): Extracting archive
- Installing phar-io/manifest (2.0.4): Extracting archive
- Installing myclabs/deep-copy (1.13.4): Extracting archive
- Installing phpunit/phpunit (10.5.58): Extracting archive
0/59 [>---------------------------] 0%
28/59 [=============>--------------] 47%
38/59 [==================>---------] 64%
54/59 [=========================>--] 91%
59/59 [============================] 100%
4 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
41 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils
--- end ---
Upgrading n:eslint-config-wikimedia from 0.32.2 -> 0.32.3
$ /usr/bin/npm install
--- stdout ---
added 249 packages, and audited 250 packages in 4s
72 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json
--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json
--- end ---
$ ./node_modules/.bin/eslint . --fix
--- stdout ---
/src/repo/org/wikimedia/integration/zuul/zuul.js
565:5 warning ES2018 'Promise.prototype.finally' method is forbidden es-x/no-promise-prototype-finally
572:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
578:12 warning ES2018 'Promise.prototype.finally' method is forbidden es-x/no-promise-prototype-finally
✖ 3 problems (0 errors, 3 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":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"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":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/org/wikimedia/integration/zuul/init.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-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":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/org/wikimedia/integration/zuul/zuul.js","messages":[{"ruleId":"es-x/no-promise-prototype-finally","severity":1,"message":"ES2018 'Promise.prototype.finally' method is forbidden.","line":565,"column":5,"nodeType":"MemberExpression","messageId":"forbidden","endLine":565,"endColumn":25},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'jQuery.Promise' is undefined.","line":572,"column":1,"nodeType":"Block","endLine":572,"endColumn":1},{"ruleId":"es-x/no-promise-prototype-finally","severity":1,"message":"ES2018 'Promise.prototype.finally' method is forbidden.","line":578,"column":12,"nodeType":"MemberExpression","messageId":"forbidden","endLine":633,"endColumn":14}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"// Zuul status page\n//\n// Copyright 2012 OpenStack Foundation\n// Copyright 2013 Timo Tijhof\n// Copyright 2013 Wikimedia Foundation\n// Copyright 2014 Rackspace Australia\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n// not use this file except in compliance with the License. You may obtain\n// a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n// License for the specific language governing permissions and limitations\n// under the License.\n\n/* eslint max-len: [\"warn\", { \"code\": 120, \"ignoreTemplateLiterals\": true }] */\n/* global Mustache:false */\n/* exported zuul_start */\n\n( function () {\n\t'use strict';\n\n\tconst fragment_filter_prefix = '#q=';\n\n\t// read filter from fragment\n\tfunction read_fragment_filter() {\n\t\tconst hash = location.hash;\n\t\tif ( !hash.includes( fragment_filter_prefix ) ) {\n\t\t\treturn '';\n\t\t}\n\t\treturn hash.slice( fragment_filter_prefix.length );\n\t}\n\n\tfunction update_fragment_filter( value ) {\n\t\tif ( value !== '' ) {\n\t\t\thistory.replaceState( null, '', fragment_filter_prefix + value );\n\t\t} else {\n\t\t\t// Prefer not to leave an empty \"#\" or \"#q=\".\n\t\t\t// If the browser doesn't have the URL API yet, don't bother with workarounds\n\t\t\tif ( window.URL ) {\n\t\t\t\tconst obj = new URL( location.href );\n\t\t\t\tobj.hash = '';\n\t\t\t\thistory.replaceState( null, '', obj.toString() );\n\t\t\t} else {\n\t\t\t\thistory.replaceState( null, '', '#' );\n\t\t\t}\n\t\t}\n\t}\n\n\t// remember for this domain, across browser tabs and restarts.\n\tfunction set_persistent_store( name, value ) {\n\t\ttry {\n\t\t\tlocalStorage.setItem( name, value );\n\t\t} catch ( e ) {\n\t\t\t// Disallowed (disabled, or out of quota).\n\t\t}\n\t}\n\n\tfunction read_persistent_store( name ) {\n\t\ttry {\n\t\t\treturn localStorage.getItem( name );\n\t\t} catch ( e ) {\n\t\t\t// Disallowed.\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * @param {HTMLElement} element\n\t * @param {Object} options\n\t * @param {Object[]} options.keyframes Required\n\t */\n\tfunction animate( element, options ) {\n\t\toptions = Object.assign( {\n\t\t\tduration: options.duration || 0,\n\t\t\teasing: 'ease-in-out',\n\t\t\tfill: 'forwards',\n\t\t\tafter() {}\n\t\t}, options );\n\t\tconst anim = element.animate( options.keyframes, options );\n\t\tanim.finished.then( () => {\n\t\t\toptions.after();\n\t\t\tanim.cancel();\n\t\t} );\n\t}\n\n\tfunction showAnimate( element ) {\n\t\telement.hidden = false;\n\t\tanimate( element, {\n\t\t\tduration: 200,\n\t\t\tkeyframes: [ { transform: 'scaleY(0)' }, { transform: 'scaleY(1)' } ]\n\t\t} );\n\t}\n\n\tfunction hideAnimate( element ) {\n\t\tanimate( element, {\n\t\t\tduration: 200,\n\t\t\tkeyframes: [ { transform: 'scaleY(0)' } ],\n\t\t\tafter() {\n\t\t\t\telement.hidden = true;\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction parseHTML( htmlString ) {\n\t\tconst node = document.createElement( 'div' );\n\t\tnode.innerHTML = htmlString;\n\t\tconst ret = node.firstElementChild;\n\t\t// Detach\n\t\tret.remove();\n\t\treturn ret;\n\t}\n\n\t// Usually 0-5min ago sometimes 1h or 2h ago.\n\tconst demoTime = [ 130, 180, 160, 120, 240, 301, 3600 + 180, 2 * 3600 + 180 ];\n\tlet demoTimeOffset = -1;\n\tfunction demoTimeAgo() {\n\t\tif ( ++demoTimeOffset >= demoTime.length ) {\n\t\t\tdemoTimeOffset = 0;\n\t\t}\n\t\treturn demoTime[ demoTimeOffset ] * 1000;\n\t}\n\n\tconst container_template = `\n\t\t<div hidden class=\"wm-alert zuul-msg\"></div>\n\t\t<span class=\"zuul-badge zuul-spinner\">Updating…</span>\n\t\t<form role=\"form\" class=\"zuul-controls\">\n\t\t\t<label class=\"wm-input-group--aside\">Filter: <input type=\"text\" class=\"wm-input-text zuul-filter-input\" title=\"Any partial match for a gerrit change number, repo name, or pipeline. Multiple terms may be comma-separated.\" placeholder=\"e.g. 1234 or mediawiki… [ / ]\" value=\"{{filter_value}}\"><span class=\"wm-input-icon--clear zuul-filter-clear\" title=\"Clear filter\" {{^filter_value}}hidden{{/filter_value}}></span></label>\n\t\t\t<label><input type=\"checkbox\" class=\"zuul-control-expand\" {{#expandByDefault}}checked{{/expandByDefault}}> Expand by default</label>\n\t\t</form>\n\t\t<div class=\"zuul-pipelines\"></div>\n\t\t<p>Zuul version: <span class=\"zuul-info--version\"></span></p>\n\t\t<p>Last reconfigured: <span class=\"zuul-info--reconfigured\"></span></p>\n\t\t<p>Queue lengths: <span class=\"zuul-info--queue-events\">0</span> events, <span class=\"zuul-info--queue-results\">0</span> results.</p>`;\n\n\tconst pipeline_template = `<div class=\"zuul-pipeline\">\n\t\t<div class=\"zuul-pipeline-header\">\n\t\t\t<h3>{{pipeline.name}} <span class=\"zuul-badge zuul-pipeline-count\">{{count}}</span></h3>\n\t\t\t{{#pipeline_descriptions}}\n\t\t\t<p class=\"zuul-pipeline-desc\">{{.}}</p>\n\t\t\t{{/pipeline_descriptions}}\n\t\t</div>\n\t\t{{#queues_and_changes}}\n\t\t\t{{#queue}}\n\t\t\t<p class=\"zuul-queue-desc\">\n\t\t\tQueue: <abbr title=\"{{name}}\">{{short_name}}</abbr>\n\t\t\t{{#queue.window_size}}\n\t\t\t(window: {{queue.window_size}})\n\t\t\t{{/queue.window_size}}\n\t\t\t</p>\n\t\t\t{{/queue}}\n\t\t\t{{#change_box_data}}\n\t\t\t{{> change_box_template}}\n\t\t\t{{/change_box_data}}\n\t\t{{/queues_and_changes}}\n\t</div>`;\n\n\tconst change_box_template = `<table class=\"zuul-change-box\" data-changeid=\"{{change.id}}\" {{^visibility.showPanel}}hidden{{/visibility.showPanel}}>\n\t\t<tr>\n\t\t\t{{#change_tree_cells}}\n\t\t\t<td class=\"zuul-queue-line {{solid_class}}\">\n\t\t\t\t{{#icon}}\n\t\t\t\t<span class=\"zuul-queue-icon {{icon_class}}\" title=\"{{icon_title}}\"></span>\n\t\t\t\t{{/icon}}\n\t\t\t\t{{#branch_class}}\n\t\t\t\t<span class=\"{{branch_class}}\"></span>\n\t\t\t\t{{/branch_class}}\n\t\t\t</td>\n\t\t\t{{/change_tree_cells}}\n\t\t\t<td class=\"zuul-change-cell\" style=\"width: {{change_width}}px;\">\n\t\t\t\t{{> change_template}}\n\t\t\t</td>\n\t\t</tr>\n\t</table>`;\n\n\tconst change_template = `<div class=\"zuul-change\" id=\"{{panel_id}}\">\n\t\t<div class=\"zuul-patchset-header\">\n\t\t\t<div class=\"zuul-patchset-header-left\">\n\t\t\t\t<span class=\"change_project\">{{change.project}}</span>\n\t\t\t\t<div class=\"zuul-patchset-sub\">\n\t\t\t\t\t<div class=\"zuul-patchset-change\">\n\t\t\t\t\t\t{{#change.url}}\n\t\t\t\t\t\t<a href=\"{{change.url}}\">{{change_id_short}}</a>\n\t\t\t\t\t\t{{/change.url}}\n\t\t\t\t\t\t{{^change.url}}\n\t\t\t\t\t\t<span>{{change_id_short}}</span>\n\t\t\t\t\t\t{{/change.url}}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"zuul-patchset-progress\">\n\t\t\t\t\t\t<div class=\"zuul-job-result--progress zuul-change-total-result\">\n\t\t\t\t\t\t\t{{#change.jobs}}{{#_progressbar_total}}<span class=\"zuul-progressbar\" data-result=\"{{_progressbar_total}}\" title=\"{{name}}\" style=\"width: {{job_percent}}%;\"></span>{{/_progressbar_total}}{{/change.jobs}}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{{#change.live}}\n\t\t\t<div class=\"zuul-patchset-eta\">\n\t\t\t\t<span title=\"Remaining Time\">ETA: {{remaining_time}}</span><br>\n\t\t\t\t<span title=\"Elapsed Time\">Elapsed: <span class=\"{{ellapsed_time.text_class}}\">{{ellapsed_time.text}}</span></span>\n\t\t\t</div>\n\t\t\t{{/change.live}}\n\t\t</div>\n\t\t<ul class=\"zuul-patchset-body\" {{^visibility.showBody}}hidden{{/visibility.showBody}}>\n\t\t\t{{#change.jobs}}\n\t\t\t{{> job_template}}\n\t\t\t{{/change.jobs}}\n\t\t</ul>\n\t</div>`;\n\n\tconst job_template = `<li class=\"zuul-change-job\">\n\t\t{{#report_url}}\n\t\t<a class=\"zuul-job-name\" href=\"{{report_url}}\">{{_display_name}}</a>\n\t\t{{/report_url}}\n\t\t{{^report_url}}\n\t\t{{#url}}\n\t\t<a class=\"zuul-job-name\" href=\"{{url}}\">{{_display_name}}</a>\n\t\t{{/url}}\n\t\t{{^url}}\n\t\t<span class=\"zuul-job-name\">{{_display_name}}</span>\n\t\t{{/url}}\n\t\t{{/report_url}}\n\n\t\t{{#_progressbar}}\n\t\t<span class=\"zuul-job-result zuul-job-result--progress\"><span class=\"{{progress_class}}\" role=\"progressbar\" aria-valuenow=\"{{progress_percent}}\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: {{progress_width}}%;\"></span></span>\n\t\t{{/_progressbar}}\n\t\t{{^_progressbar}}\n\t\t<span class=\"zuul-job-result zuul-job-result--label\" data-result=\"{{_result_normalized}}\">{{_result_normalized}}</span>\n\t\t{{/_progressbar}}\n\t</li>`;\n\n\tfunction Zuul( options ) {\n\t\toptions = Object.assign( {\n\t\t\tdemo: false,\n\t\t\tenabled: true,\n\t\t\tsource: 'status.json',\n\t\t\tcontainer: '#zuul_container',\n\t\t\tonUpdateStart() {\n\t\t\t},\n\t\t\tonUpdateEnd() {\n\t\t\t}\n\t\t}, options );\n\n\t\tconst collapsedExceptions = new Set();\n\t\tconst pipelineStates = [];\n\t\tlet domOut = null;\n\t\tlet current_filter = read_fragment_filter();\n\t\tlet expandByDefault = read_persistent_store( 'zuul_expand_by_default' ) === 'true';\n\t\tlet last_rendered_raw;\n\n\t\tconst format = {\n\t\t\tenqueue_time: function ( ms ) {\n\t\t\t\tconst hours = 60 * 60 * 1000;\n\t\t\t\t// In demo mode, ignore the far-past timestamps in the sample data\n\t\t\t\tconst delta = options.demo ? demoTimeAgo() : Date.now() - ms;\n\t\t\t\tconst text = format.time( delta, true );\n\t\t\t\tlet text_class = '';\n\t\t\t\tif ( delta > ( 4 * hours ) ) {\n\t\t\t\t\ttext_class = 'wm-text-error';\n\t\t\t\t} else if ( delta > ( 2 * hours ) ) {\n\t\t\t\t\ttext_class = 'wm-text-warning';\n\t\t\t\t}\n\t\t\t\treturn { text, text_class };\n\t\t\t},\n\n\t\t\ttime: function ( ms, words ) {\n\t\t\t\tif ( typeof words === 'undefined' ) {\n\t\t\t\t\twords = false;\n\t\t\t\t}\n\t\t\t\tlet seconds = ( +ms ) / 1000;\n\t\t\t\tlet minutes = Math.floor( seconds / 60 );\n\t\t\t\tconst hours = Math.floor( minutes / 60 );\n\t\t\t\tseconds = Math.floor( seconds % 60 );\n\t\t\t\tminutes = Math.floor( minutes % 60 );\n\t\t\t\tlet r = '';\n\t\t\t\tif ( words ) {\n\t\t\t\t\tif ( hours ) {\n\t\t\t\t\t\tr += hours + '\\u2006hr ';\n\t\t\t\t\t}\n\t\t\t\t\tr += minutes + '\\u2006min';\n\t\t\t\t} else {\n\t\t\t\t\tif ( hours < 10 ) {\n\t\t\t\t\t\tr += '0';\n\t\t\t\t\t}\n\t\t\t\t\tr += hours + ':';\n\t\t\t\t\tif ( minutes < 10 ) {\n\t\t\t\t\t\tr += '0';\n\t\t\t\t\t}\n\t\t\t\t\tr += minutes + ':';\n\t\t\t\t\tif ( seconds < 10 ) {\n\t\t\t\t\t\tr += '0';\n\t\t\t\t\t}\n\t\t\t\t\tr += seconds;\n\t\t\t\t}\n\t\t\t\treturn r;\n\t\t\t},\n\n\t\t\tchange_box_data: function ( change, change_queue ) {\n\t\t\t\tconst panel_id = ( change.id || 'unknown' ).replace( ',', '_' );\n\n\t\t\t\t// Zuul events may respond to a commit hash (eg. tag) without a Gerrit change number\n\t\t\t\tconst isLongHash = /^[0-9a-f]{40}$/.test( change.id || '' );\n\t\t\t\tconst change_id_short = isLongHash ? change.id.slice( 0, 7 ) : ( change.id || 'NA' );\n\n\t\t\t\tconst remaining_time = change.live && format.time( change.remaining_time, true );\n\t\t\t\tconst ellapsed_time = change.live && format.enqueue_time( change.enqueue_time );\n\n\t\t\t\t// Each job gets an equal proportion in the combined \"total\" progress bar\n\t\t\t\tconst job_percent = Math.floor( 100 / change.jobs.length );\n\t\t\t\tchange.jobs.forEach( ( job ) => {\n\t\t\t\t\tconst result = job.result ? job.result.toLowerCase() : ( job.url ? 'in progress' : 'queued' );\n\n\t\t\t\t\t// In the combined progressbar, let the unfilled (right) side of the progress\n\t\t\t\t\t// bar represent jobs that are still waiting in the queue. That is, draw no\n\t\t\t\t\t// progress bar segmen for them (null).\n\t\t\t\t\tjob._progressbar_total = ( result === 'queued' ? null : result );\n\t\t\t\t\tjob._display_name = job.name + ( job.voting === false ? ' (non\\u00a0voting)' : '' );\n\t\t\t\t\tjob._result_normalized = result;\n\n\t\t\t\t\tif ( result === 'in progress' ) {\n\t\t\t\t\t\tlet progress_percent = 100 * (\n\t\t\t\t\t\t\tjob.elapsed_time / ( job.elapsed_time + job.remaining_time ) );\n\t\t\t\t\t\tlet progress_width = progress_percent;\n\t\t\t\t\t\tlet progress_class = 'zuul-progressbar';\n\n\t\t\t\t\t\tif ( !progress_percent ) {\n\t\t\t\t\t\t\tprogress_percent = 0;\n\t\t\t\t\t\t\tprogress_width = 100;\n\t\t\t\t\t\t\tprogress_class += ' zuul-progressbar--animated';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tjob._progressbar = {\n\t\t\t\t\t\t\tprogress_percent,\n\t\t\t\t\t\t\tprogress_width,\n\t\t\t\t\t\t\tprogress_class\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tconst change_width = 360 - ( 16 * change_queue._tree_columns );\n\t\t\t\tlet icon_class = 'zuul-queue-icon--success';\n\t\t\t\tlet icon_title = 'Succeeding';\n\t\t\t\tif ( !change.active ) {\n\t\t\t\t\ticon_class = 'zuul-queue-icon--waiting';\n\t\t\t\t\ticon_title = 'Waiting until closer to head of queue to start jobs';\n\t\t\t\t} else if ( !change.live ) {\n\t\t\t\t\ticon_class = 'zuul-queue-icon--waiting';\n\t\t\t\t\ticon_title = 'Dependent change required for testing';\n\t\t\t\t} else if ( change.failing_reasons && change.failing_reasons.length ) {\n\t\t\t\t\ticon_class = 'zuul-queue-icon--error';\n\t\t\t\t\ticon_title = 'Failing because ' + change.failing_reasons.join( ', ' );\n\t\t\t\t}\n\n\t\t\t\tconst change_tree_cells = [];\n\t\t\t\tfor ( let i = 0; i < change_queue._tree_columns; i++ ) {\n\t\t\t\t\t// Start or continue drawing a line down toward the current change box\n\t\t\t\t\tconst draw_line = ( i < change._tree.length && change._tree[ i ] !== null );\n\t\t\t\t\tconst is_self = ( i === change._tree_index );\n\t\t\t\t\tconst is_branch_point = change._tree_branches.includes( i );\n\t\t\t\t\tconst branch_class = is_branch_point && (\n\t\t\t\t\t\t( change._tree_branches.indexOf( i ) === change._tree_branches.length - 1 )\n\t\t\t\t\t\t\t// Angle line\n\t\t\t\t\t\t\t? 'zuul-queue-angle'\n\t\t\t\t\t\t\t// T line\n\t\t\t\t\t\t\t: 'zuul-queue-tee'\n\t\t\t\t\t);\n\n\t\t\t\t\tchange_tree_cells.push( {\n\t\t\t\t\t\tsolid_class: draw_line ? 'zuul-queue-line--solid' : null,\n\t\t\t\t\t\ticon: is_self ? { icon_class, icon_title } : null,\n\t\t\t\t\t\tbranch_class\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tchange,\n\t\t\t\t\tchange_width,\n\t\t\t\t\tchange_tree_cells,\n\t\t\t\t\tpanel_id,\n\t\t\t\t\tchange_id_short,\n\t\t\t\t\tjob_percent,\n\t\t\t\t\tremaining_time,\n\t\t\t\t\tellapsed_time\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tpipeline: function ( pipeline, count ) {\n\t\t\t\tconst pipeline_descriptions = ( typeof pipeline.description === 'string' )\n\t\t\t\t\t? pipeline.description.split( /\\r?\\n\\r?\\n/ )\n\t\t\t\t\t: [];\n\n\t\t\t\t// Track which change boxes are visible so that that when filtering,\n\t\t\t\t// we can easily hide pipelines that contain no visible matches\n\t\t\t\tconst state = {\n\t\t\t\t\tfilterable: {},\n\t\t\t\t\tchangeBoxes: new Set(),\n\t\t\t\t\tvisible: new Set(),\n\t\t\t\t\telement: null\n\t\t\t\t};\n\n\t\t\t\tconst queues_and_changes = [];\n\t\t\t\tpipeline.change_queues.forEach( ( change_queue ) => {\n\t\t\t\t\tchange_queue.heads.forEach( ( changes, head_i ) => {\n\t\t\t\t\t\tconst window_size = change_queue.window;\n\t\t\t\t\t\tif ( pipeline.change_queues.length > 1 && head_i === 0 ) {\n\t\t\t\t\t\t\tconst name = change_queue.name;\n\t\t\t\t\t\t\tconst short_name = ( name.length > 32 )\n\t\t\t\t\t\t\t\t? name.slice( 0, 32 ) + '…'\n\t\t\t\t\t\t\t\t: name;\n\t\t\t\t\t\t\tqueues_and_changes.push( { queue: { name, short_name, window_size } } );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchanges.forEach( ( change ) => {\n\t\t\t\t\t\t\tstate.filterable[ change.id ] = [ pipeline.name, change.project, change.id ]\n\t\t\t\t\t\t\t\t.join( ' ' ).toLowerCase();\n\n\t\t\t\t\t\t\tconst visibility = format.getChangeVisibility( change.id, state );\n\t\t\t\t\t\t\tif ( visibility.showPanel ) {\n\t\t\t\t\t\t\t\tstate.visible.add( change.id );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tqueues_and_changes.push( {\n\t\t\t\t\t\t\t\tvisibility,\n\t\t\t\t\t\t\t\tchange_box_data: format.change_box_data( change, change_queue )\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\t\tconst pipeline_html = Mustache.render( pipeline_template,\n\t\t\t\t\t{\n\t\t\t\t\t\tpipeline,\n\t\t\t\t\t\tcount,\n\t\t\t\t\t\tpipeline_descriptions,\n\t\t\t\t\t\tqueues_and_changes\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tchange_box_template,\n\t\t\t\t\t\tchange_template,\n\t\t\t\t\t\tjob_template\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tconst pipelinesElement = parseHTML( pipeline_html );\n\t\t\t\tpipelinesElement.addEventListener( 'click', ( e ) => {\n\t\t\t\t\tif ( e.target.closest( '.zuul-patchset-header' ) ) {\n\t\t\t\t\t\tformat.toggle_patchset( e );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tpipelinesElement.querySelectorAll( '.zuul-change-box' ).forEach( ( changeBox ) => {\n\t\t\t\t\tstate.changeBoxes.add( changeBox );\n\t\t\t\t} );\n\n\t\t\t\tstate.element = pipelinesElement;\n\t\t\t\tpipelineStates.push( state );\n\n\t\t\t\treturn pipelinesElement;\n\t\t\t},\n\n\t\t\t// Toggle showing/hiding the patchset when the header is clicked.\n\t\t\ttoggle_patchset: function ( e ) {\n\t\t\t\tif ( e.target.nodeName === 'A' ) {\n\t\t\t\t\t// Ignore clicks from gerrit patch set link\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Find the outer change box\n\t\t\t\tconst changeBox = e.target.closest( '.zuul-change-box' );\n\t\t\t\tconst changeID = changeBox.dataset.changeid;\n\t\t\t\tconst changeBody = changeBox.querySelector( '.zuul-patchset-body' );\n\n\t\t\t\tif ( changeBody.hidden ) {\n\t\t\t\t\tshowAnimate( changeBody );\n\t\t\t\t} else {\n\t\t\t\t\thideAnimate( changeBody );\n\t\t\t\t}\n\n\t\t\t\tif ( !collapsedExceptions.has( changeID ) ) {\n\t\t\t\t\t// Currently not an exception, add it to list\n\t\t\t\t\tcollapsedExceptions.add( changeID );\n\t\t\t\t} else {\n\t\t\t\t\t// Currently an except, remove from exceptions\n\t\t\t\t\tcollapsedExceptions.delete( changeID );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetChangeVisibility: function ( changeID, pipelineState ) {\n\t\t\t\t// Determine if we should hide the body/results\n\t\t\t\tconst isCollapsedExempt = collapsedExceptions.has( changeID );\n\t\t\t\t// Expand by default, or is an exception\n\t\t\t\tconst showBody = ( expandByDefault && !isCollapsedExempt ||\n\t\t\t\t\t!expandByDefault && isCollapsedExempt\n\t\t\t\t);\n\n\t\t\t\t// Show panel if no filters, or at least one filter matches one field\n\t\t\t\tconst filterable = pipelineState.filterable[ changeID ];\n\t\t\t\tconst showPanel = ( current_filter === '' ||\n\t\t\t\t\tcurrent_filter.toLowerCase().split( /[\\s,]+/ ).some(\n\t\t\t\t\t\t( f_val ) => f_val !== '' && filterable.includes( f_val )\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\treturn { showBody, showPanel };\n\t\t\t},\n\n\t\t\tdisplay_patchset: function ( changeBox, pipelineState ) {\n\t\t\t\tconst changeID = changeBox.dataset.changeid;\n\t\t\t\tconst { showBody, showPanel } = format.getChangeVisibility( changeID, pipelineState );\n\n\t\t\t\tconst changeBody = changeBox.querySelector( '.zuul-patchset-body' );\n\t\t\t\tchangeBody.hidden = !showBody;\n\t\t\t\tchangeBox.hidden = !showPanel;\n\t\t\t\tif ( showPanel ) {\n\t\t\t\t\tpipelineState.visible.add( changeID );\n\t\t\t\t} else {\n\t\t\t\t\tpipelineState.visible.delete( changeID );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst app = {\n\t\t\trender: function () {\n\t\t\t\tconst container = typeof options.container === 'string'\n\t\t\t\t\t? document.querySelector( options.container )\n\t\t\t\t\t: options.container;\n\n\t\t\t\t// Fill the container with the status page layout,\n\t\t\t\t// and render the form based on current URL/cookies\n\t\t\t\tcontainer.classList.add( 'zuul-container' );\n\t\t\t\tcontainer.innerHTML = Mustache.render( container_template, {\n\t\t\t\t\tfilter_value: current_filter,\n\t\t\t\t\texpandByDefault\n\t\t\t\t} );\n\t\t\t\tdomOut = {\n\t\t\t\t\tmsg: container.querySelector( '.zuul-msg' ),\n\t\t\t\t\tfilterInput: container.querySelector( '.zuul-filter-input' ),\n\t\t\t\t\tfilterClear: container.querySelector( '.zuul-filter-clear' ),\n\t\t\t\t\tcontrolExpand: container.querySelector( '.zuul-control-expand' ),\n\t\t\t\t\tpipelines: container.querySelector( '.zuul-pipelines' ),\n\t\t\t\t\tinfoVersion: container.querySelector( '.zuul-info--version' ),\n\t\t\t\t\tinfoReconfigured: container.querySelector( '.zuul-info--reconfigured' ),\n\t\t\t\t\tinfoQueueEvents: container.querySelector( '.zuul-info--queue-events' ),\n\t\t\t\t\tinfoQueueResults: container.querySelector( '.zuul-info--queue-results' )\n\t\t\t\t};\n\n\t\t\t\t// Listen for 'input' instead of 'change'.\n\t\t\t\t// The input event will fire as-you-type. The 'change' event\n\t\t\t\t// only fires when clicking or tabbing to elsewhere on the page.\n\t\t\t\tdomOut.filterInput.addEventListener( 'input', app.handle_filter_change );\n\t\t\t\tdomOut.filterClear.addEventListener( 'click', () => {\n\t\t\t\t\tdomOut.filterInput.value = '';\n\t\t\t\t\tdomOut.filterInput.focus();\n\t\t\t\t\tapp.handle_filter_change();\n\t\t\t\t} );\n\t\t\t\tdomOut.controlExpand.addEventListener( 'change', app.handle_expand_by_default );\n\t\t\t},\n\n\t\t\tschedule: function () {\n\t\t\t\tif ( !options.enabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tapp.update().finally( () => {\n\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\tapp.schedule();\n\t\t\t\t\t}, 5000 );\n\t\t\t\t} );\n\t\t\t},\n\n\t\t\t/** @return {jQuery.Promise} */\n\t\t\tupdate: function () {\n\t\t\t\toptions.onUpdateStart();\n\n\t\t\t\t// Bypass cache\n\t\t\t\t// https://phabricator.wikimedia.org/T94796\n\t\t\t\treturn fetch( options.source, { cache: 'no-store' } )\n\t\t\t\t\t.then( ( resp ) => {\n\t\t\t\t\t\tif ( !resp.ok ) {\n\t\t\t\t\t\t\tthrow new Error( 'HTTP ' + resp.status );\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn resp.text();\n\t\t\t\t\t} )\n\t\t\t\t\t.then( ( raw ) => {\n\t\t\t\t\t\tif ( last_rendered_raw === raw ) {\n\t\t\t\t\t\t\t// Don't re-render if response identical to last,\n\t\t\t\t\t\t\t// to make debugging easier (e.g. when using demo during development)\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst data = JSON.parse( raw );\n\n\t\t\t\t\t\tif ( 'message' in data ) {\n\t\t\t\t\t\t\tdomOut.msg.classList.remove( 'wm-alert-error' );\n\t\t\t\t\t\t\tdomOut.msg.textContent = data.message;\n\t\t\t\t\t\t\tdomOut.msg.hidden = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdomOut.msg.hidden = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( 'zuul_version' in data ) {\n\t\t\t\t\t\t\tdomOut.infoVersion.textContent = data.zuul_version;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( 'last_reconfigured' in data ) {\n\t\t\t\t\t\t\tconst last_reconfigured = new Date( data.last_reconfigured );\n\t\t\t\t\t\t\tdomOut.infoReconfigured.textContent = last_reconfigured.toString();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdomOut.pipelines.innerHTML = '';\n\t\t\t\t\t\tpipelineStates.length = 0;\n\n\t\t\t\t\t\tdata.pipelines.forEach( ( pipeline ) => {\n\t\t\t\t\t\t\tconst count = app.create_tree( pipeline );\n\t\t\t\t\t\t\tdomOut.pipelines.append( format.pipeline( pipeline, count ) );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tapp.handle_pipeline_visibility();\n\n\t\t\t\t\t\tdomOut.infoQueueEvents.textContent =\n\t\t\t\t\t\t\t( data.trigger_event_queue ? data.trigger_event_queue.length : '0' );\n\t\t\t\t\t\tdomOut.infoQueueResults.textContent =\n\t\t\t\t\t\t\t( data.result_event_queue ? data.result_event_queue.length : '0' );\n\n\t\t\t\t\t\tlast_rendered_raw = raw;\n\t\t\t\t\t} )\n\t\t\t\t\t.catch( ( jqxhrOrError ) => {\n\t\t\t\t\t\t// jqXHR: network failure. Error: JSON syntax error.\n\t\t\t\t\t\tconst errMsg = jqxhrOrError.statusText || jqxhrOrError;\n\t\t\t\t\t\tdomOut.msg.classList.add( 'wm-alert-error' );\n\t\t\t\t\t\tdomOut.msg.textContent = options.source + ': ' + errMsg;\n\t\t\t\t\t\tdomOut.msg.hidden = false;\n\t\t\t\t\t} )\n\t\t\t\t\t.finally( () => {\n\t\t\t\t\t\toptions.onUpdateEnd();\n\t\t\t\t\t} );\n\t\t\t},\n\n\t\t\t// Called from zuul.app.js to focus input field when pressing \"/\" keyboard shortcut.\n\t\t\tfocus_filter_input: function () {\n\t\t\t\tdomOut.filterInput.focus();\n\t\t\t},\n\n\t\t\t// Read and apply the filter, and update the URL fragment\n\t\t\thandle_filter_change: function () {\n\t\t\t\tcurrent_filter = domOut.filterInput.value;\n\n\t\t\t\tfor ( const pipelineState of pipelineStates ) {\n\t\t\t\t\tfor ( const changeBox of pipelineState.changeBoxes ) {\n\t\t\t\t\t\tformat.display_patchset( changeBox, pipelineState );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tapp.handle_pipeline_visibility();\n\t\t\t\tdomOut.filterClear.hidden = ( current_filter === '' );\n\n\t\t\t\tupdate_fragment_filter( current_filter );\n\t\t\t},\n\n\t\t\t// When filtering, hide pipelines that contain zero matches\n\t\t\thandle_pipeline_visibility: function () {\n\t\t\t\tfor ( const pipelineState of pipelineStates ) {\n\t\t\t\t\tpipelineState.element.hidden =\n\t\t\t\t\t\t( current_filter !== '' && !pipelineState.visible.size );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Handle toggling \"Expand by default\"\n\t\t\thandle_expand_by_default: function ( e ) {\n\t\t\t\texpandByDefault = e.target.checked;\n\t\t\t\tset_persistent_store( 'zuul_expand_by_default', String( expandByDefault ) );\n\n\t\t\t\t// Expand or collapse all change boxes\n\t\t\t\tcollapsedExceptions.clear();\n\t\t\t\tapp.handle_filter_change();\n\t\t\t},\n\n\t\t\tcreate_tree: function ( pipeline ) {\n\t\t\t\tlet count = 0;\n\t\t\t\tlet pipeline_max_tree_columns = 1;\n\t\t\t\tpipeline.change_queues.forEach( ( change_queue ) => {\n\t\t\t\t\tconst tree = [];\n\t\t\t\t\tlet max_tree_columns = 1;\n\t\t\t\t\tconst changes = [];\n\t\t\t\t\tlet last_tree_length = 0;\n\t\t\t\t\tchange_queue.heads.forEach( ( head ) => {\n\t\t\t\t\t\thead.forEach( ( change, change_i ) => {\n\t\t\t\t\t\t\tchanges[ change.id ] = change;\n\t\t\t\t\t\t\tchange._tree_position = change_i;\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\t\t\t\t\tchange_queue.heads.forEach( ( head ) => {\n\t\t\t\t\t\thead.forEach( ( change ) => {\n\t\t\t\t\t\t\tif ( change.live ) {\n\t\t\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst idx = tree.indexOf( change.id );\n\t\t\t\t\t\t\tif ( idx > -1 ) {\n\t\t\t\t\t\t\t\tchange._tree_index = idx;\n\t\t\t\t\t\t\t\t// remove...\n\t\t\t\t\t\t\t\ttree[ idx ] = null;\n\t\t\t\t\t\t\t\twhile ( tree[ tree.length - 1 ] === null ) {\n\t\t\t\t\t\t\t\t\ttree.pop();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchange._tree_index = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tchange._tree_branches = [];\n\t\t\t\t\t\t\tchange._tree = [];\n\t\t\t\t\t\t\tif ( typeof change.items_behind === 'undefined' ) {\n\t\t\t\t\t\t\t\tchange.items_behind = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tchange.items_behind.sort( ( a, b ) => ( changes[ b ]._tree_position -\n changes[ a ]._tree_position ) );\n\t\t\t\t\t\t\tchange.items_behind.forEach( ( id ) => {\n\t\t\t\t\t\t\t\ttree.push( id );\n\t\t\t\t\t\t\t\tif ( tree.length > last_tree_length &&\n last_tree_length > 0 ) {\n\t\t\t\t\t\t\t\t\tchange._tree_branches.push(\n\t\t\t\t\t\t\t\t\t\ttree.length - 1 );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\tif ( tree.length > max_tree_columns ) {\n\t\t\t\t\t\t\t\tmax_tree_columns = tree.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( tree.length > pipeline_max_tree_columns ) {\n\t\t\t\t\t\t\t\tpipeline_max_tree_columns = tree.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tchange._tree = tree.slice(); // make a copy\n\t\t\t\t\t\t\tlast_tree_length = tree.length;\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\t\t\t\t\tchange_queue._tree_columns = max_tree_columns;\n\t\t\t\t} );\n\t\t\t\tpipeline._tree_columns = pipeline_max_tree_columns;\n\t\t\t\treturn count;\n\t\t\t}\n\t\t};\n\n\t\tthis.options = options;\n\t\tthis.app = app;\n\t}\n\n\twindow.Zuul = Zuul;\n}() );\n\n/**\n * @param {string} containerSelector CSS selector\n * @return {Zuul}\n */\nfunction zuul_start( containerSelector ) {\n\t/* global Zuul */\n\n\tconst demo = location.search.match( /[?&]demo=([^?&]*)/ );\n\tconst source = demo ?\n\t\t'./status-' + ( demo[ 1 ] || 'basic' ) + '-sample.json' :\n\t\t'status.json';\n\tconst container = document.querySelector( containerSelector );\n\n\tconst zuul = new Zuul( {\n\t\tdemo: !!demo,\n\t\tsource: source,\n\t\tcontainer: container,\n\t\tonUpdateStart() {\n\t\t\tcontainer.classList.add( 'zuul-container-loading' );\n\t\t},\n\t\tonUpdateEnd() {\n\t\t\tcontainer.classList.remove( 'zuul-container-loading' );\n\t\t}\n\t} );\n\n\tzuul.app.render();\n\tzuul.app.schedule();\n\n\tdocument.addEventListener( 'visibilitychange', () => {\n\t\tif ( document.hidden ) {\n\t\t\tzuul.options.enabled = false;\n\t\t} else {\n\t\t\tzuul.options.enabled = true;\n\t\t\tzuul.app.schedule();\n\t\t}\n\t} );\n\tdocument.addEventListener( 'keydown', ( e ) => {\n\t\tif ( e.key === '/' && e.target.nodeName !== 'INPUT' ) {\n\t\t\t// Don't actually insert a slash now\n\t\t\te.preventDefault();\n\t\t\t// Keyboard shortcut\n\t\t\tzuul.app.focus_filter_input();\n\t\t\treturn false;\n\t\t}\n\t} );\n\n\treturn zuul;\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-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":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"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":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"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":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/scap/checks.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-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":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]
--- end ---
$ /usr/bin/npm ci
--- stdout ---
added 249 packages, and audited 250 packages in 3s
72 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
--- end ---
$ /usr/bin/npm test
--- stdout ---
> test
> eslint .
/src/repo/org/wikimedia/integration/zuul/zuul.js
565:5 warning ES2018 'Promise.prototype.finally' method is forbidden es-x/no-promise-prototype-finally
572:1 warning The type 'jQuery.Promise' is undefined jsdoc/no-undefined-types
578:12 warning ES2018 'Promise.prototype.finally' method is forbidden es-x/no-promise-prototype-finally
✖ 3 problems (0 errors, 3 warnings)
--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 0,
"high": 0,
"critical": 0,
"total": 0
},
"dependencies": {
"prod": 1,
"dev": 249,
"optional": 0,
"peer": 1,
"peerOptional": 0,
"total": 249
}
}
}
--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json
--- end ---
build: Updating eslint-config-wikimedia to 0.32.3
$ git add .
--- stdout ---
--- end ---
$ git commit -F /tmp/tmppwrkt2lf
--- stdout ---
[master d7dc43c] build: Updating eslint-config-wikimedia to 0.32.3
2 files changed, 133 insertions(+), 78 deletions(-)
--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From d7dc43c72442d8571a00485d188729d0d8d279d8 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 8 Dec 2025 00:07:37 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.32.3
Change-Id: I3a03689334438118e725ec8de6102b063b0c18db
---
package-lock.json | 209 +++++++++++++++++++++++++++++-----------------
package.json | 2 +-
2 files changed, 133 insertions(+), 78 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d271485..13d08d8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,7 +5,7 @@
"packages": {
"": {
"devDependencies": {
- "eslint-config-wikimedia": "0.32.2"
+ "eslint-config-wikimedia": "0.32.3"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -41,21 +41,30 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
- "version": "0.75.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
- "integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
+ "version": "0.76.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
+ "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
"dev": true,
"dependencies": {
"@types/estree": "^1.0.8",
"@typescript-eslint/types": "^8.46.0",
"comment-parser": "1.4.1",
"esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~6.9.1"
+ "jsdoc-type-pratt-parser": "~6.10.0"
},
"engines": {
"node": ">=20.11.0"
}
},
+ "node_modules/@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
@@ -190,6 +199,18 @@
"node": ">= 8"
}
},
+ "node_modules/@sindresorhus/base62": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+ "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@stylistic/eslint-plugin": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-3.1.0.tgz",
@@ -1026,9 +1047,9 @@
}
},
"node_modules/eslint-config-wikimedia": {
- "version": "0.32.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.2.tgz",
- "integrity": "sha512-vAGz50AJPk23qQ701sL4tAgaF8FEAkP/E3kgojSTVrGgmDqjnRvq8z3EItDNI/EAkb5Ys15WPPFsoBH8YhTdSg==",
+ "version": "0.32.3",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.3.tgz",
+ "integrity": "sha512-Ekz2/ozpCCjQl3VbC6dW7ChqoW7FRilLDxmJ+FJOZhIxxzZSZR5QqQOAGWSZAlG1ONkZbYV/TPwGLWZcrNxyaA==",
"dev": true,
"dependencies": {
"@stylistic/eslint-plugin": "^3.1.0",
@@ -1039,9 +1060,9 @@
"eslint-plugin-compat": "^6.0.2",
"eslint-plugin-es-x": "^8.7.0",
"eslint-plugin-jest": "^29.0.1",
- "eslint-plugin-jsdoc": "61.0.0",
+ "eslint-plugin-jsdoc": "61.3.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.8.1",
+ "eslint-plugin-mediawiki": "^0.8.2",
"eslint-plugin-mocha": "^10.5.0",
"eslint-plugin-n": "^17.23.1",
"eslint-plugin-no-jquery": "^3.1.1",
@@ -1137,12 +1158,13 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "61.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
- "integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
+ "version": "61.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.3.0.tgz",
+ "integrity": "sha512-E4m/5J5lrasd63Z74q4CCZ4PFnywnnrcvA7zZ98802NPhrZKKTp5NH+XAT+afcjXp2ps2/OQF5gPSWCT2XFCJg==",
"dev": true,
"dependencies": {
- "@es-joy/jsdoccomment": "~0.75.0",
+ "@es-joy/jsdoccomment": "~0.76.0",
+ "@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
"debug": "^4.4.3",
@@ -1150,10 +1172,11 @@
"espree": "^10.4.0",
"esquery": "^1.6.0",
"html-entities": "^2.6.0",
- "object-deep-merge": "^1.0.5",
+ "object-deep-merge": "^2.0.0",
"parse-imports-exports": "^0.2.4",
"semver": "^7.7.3",
- "spdx-expression-parse": "^4.0.0"
+ "spdx-expression-parse": "^4.0.0",
+ "to-valid-identifier": "^1.0.0"
},
"engines": {
"node": ">=20.11.0"
@@ -1205,9 +1228,9 @@
}
},
"node_modules/eslint-plugin-mediawiki": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
- "integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
+ "integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
"dev": true,
"dependencies": {
"upath": "^2.0.1"
@@ -1965,9 +1988,9 @@
}
},
"node_modules/jsdoc-type-pratt-parser": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
- "integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz",
+ "integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==",
"dev": true,
"engines": {
"node": ">=20.0.0"
@@ -2150,25 +2173,10 @@
}
},
"node_modules/object-deep-merge": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
- "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
- "dev": true,
- "dependencies": {
- "type-fest": "4.2.0"
- }
- },
- "node_modules/object-deep-merge/node_modules/type-fest": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
- "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
- "dev": true,
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+ "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+ "dev": true
},
"node_modules/once": {
"version": "1.4.0",
@@ -2538,6 +2546,18 @@
"node": ">=0.10.5"
}
},
+ "node_modules/reserved-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+ "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/resolve": {
"version": "1.22.11",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
@@ -2799,6 +2819,22 @@
"node": ">=8.0"
}
},
+ "node_modules/to-valid-identifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+ "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/base62": "^1.0.0",
+ "reserved-identifiers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/ts-api-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
@@ -3078,18 +3114,24 @@
"dev": true
},
"@es-joy/jsdoccomment": {
- "version": "0.75.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.75.0.tgz",
- "integrity": "sha512-Bj+oF8reFb4b+6LUmG6ETpDsBU/28y/bAAzioyIR4VK/V6UodYBNGbtxRyGxk0aJJQqpZZ6jz82vVZWCX6Mwmg==",
+ "version": "0.76.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
+ "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
"dev": true,
"requires": {
"@types/estree": "^1.0.8",
"@typescript-eslint/types": "^8.46.0",
"comment-parser": "1.4.1",
"esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~6.9.1"
+ "jsdoc-type-pratt-parser": "~6.10.0"
}
},
+ "@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
+ "dev": true
+ },
"@eslint-community/eslint-utils": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
@@ -3183,6 +3225,12 @@
"fastq": "^1.6.0"
}
},
+ "@sindresorhus/base62": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+ "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+ "dev": true
+ },
"@stylistic/eslint-plugin": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-3.1.0.tgz",
@@ -3736,9 +3784,9 @@
}
},
"eslint-config-wikimedia": {
- "version": "0.32.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.2.tgz",
- "integrity": "sha512-vAGz50AJPk23qQ701sL4tAgaF8FEAkP/E3kgojSTVrGgmDqjnRvq8z3EItDNI/EAkb5Ys15WPPFsoBH8YhTdSg==",
+ "version": "0.32.3",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.3.tgz",
+ "integrity": "sha512-Ekz2/ozpCCjQl3VbC6dW7ChqoW7FRilLDxmJ+FJOZhIxxzZSZR5QqQOAGWSZAlG1ONkZbYV/TPwGLWZcrNxyaA==",
"dev": true,
"requires": {
"@stylistic/eslint-plugin": "^3.1.0",
@@ -3749,9 +3797,9 @@
"eslint-plugin-compat": "^6.0.2",
"eslint-plugin-es-x": "^8.7.0",
"eslint-plugin-jest": "^29.0.1",
- "eslint-plugin-jsdoc": "61.0.0",
+ "eslint-plugin-jsdoc": "61.3.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.8.1",
+ "eslint-plugin-mediawiki": "^0.8.2",
"eslint-plugin-mocha": "^10.5.0",
"eslint-plugin-n": "^17.23.1",
"eslint-plugin-no-jquery": "^3.1.1",
@@ -3808,12 +3856,13 @@
}
},
"eslint-plugin-jsdoc": {
- "version": "61.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.0.0.tgz",
- "integrity": "sha512-YxvOY3A9H8usnOfOEH82y71yHR7zVNWZJpQbjkC+rWqrADQtM+Gza3+db/j9euNNWCNKnN+/gBrowg16n9lwgg==",
+ "version": "61.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.3.0.tgz",
+ "integrity": "sha512-E4m/5J5lrasd63Z74q4CCZ4PFnywnnrcvA7zZ98802NPhrZKKTp5NH+XAT+afcjXp2ps2/OQF5gPSWCT2XFCJg==",
"dev": true,
"requires": {
- "@es-joy/jsdoccomment": "~0.75.0",
+ "@es-joy/jsdoccomment": "~0.76.0",
+ "@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
"debug": "^4.4.3",
@@ -3821,10 +3870,11 @@
"espree": "^10.4.0",
"esquery": "^1.6.0",
"html-entities": "^2.6.0",
- "object-deep-merge": "^1.0.5",
+ "object-deep-merge": "^2.0.0",
"parse-imports-exports": "^0.2.4",
"semver": "^7.7.3",
- "spdx-expression-parse": "^4.0.0"
+ "spdx-expression-parse": "^4.0.0",
+ "to-valid-identifier": "^1.0.0"
},
"dependencies": {
"eslint-visitor-keys": {
@@ -3857,9 +3907,9 @@
}
},
"eslint-plugin-mediawiki": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.1.tgz",
- "integrity": "sha512-zjTg3hh375lkztKhOYEmPeYiIhKooAu92BkZf2F/fr+5Htvb2i8MNB3gImhM98aTBbkyHTjXoyTHNUrjSjPhmw==",
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
+ "integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
"dev": true,
"requires": {
"upath": "^2.0.1"
@@ -4399,9 +4449,9 @@
}
},
"jsdoc-type-pratt-parser": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.9.1.tgz",
- "integrity": "sha512-HbYNAorY51GnpKvgDf4YINSY+V1segv0qEeijvTSI6OWMCmqah0W6mVwBFeWskJ81uTJJVnDQlwhpJMREvGsXg==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz",
+ "integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==",
"dev": true
},
"jsesc": {
@@ -4550,21 +4600,10 @@
}
},
"object-deep-merge": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz",
- "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==",
- "dev": true,
- "requires": {
- "type-fest": "4.2.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz",
- "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==",
- "dev": true
- }
- }
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+ "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+ "dev": true
},
"once": {
"version": "1.4.0",
@@ -4830,6 +4869,12 @@
"integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
"dev": true
},
+ "reserved-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+ "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+ "dev": true
+ },
"resolve": {
"version": "1.22.11",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
@@ -5011,6 +5056,16 @@
"is-number": "^7.0.0"
}
},
+ "to-valid-identifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+ "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+ "dev": true,
+ "requires": {
+ "@sindresorhus/base62": "^1.0.0",
+ "reserved-identifiers": "^1.0.0"
+ }
+ },
"ts-api-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
diff --git a/package.json b/package.json
index f67a7a5..cfef263 100644
--- a/package.json
+++ b/package.json
@@ -4,6 +4,6 @@
"test": "eslint ."
},
"devDependencies": {
- "eslint-config-wikimedia": "0.32.2"
+ "eslint-config-wikimedia": "0.32.3"
}
}
--
2.47.3
--- end ---