mediawiki/extensions/CIForms: main (log #1929954)

sourcepatches

This run took 54 seconds.

From 21e3fbabe8ad68a42e07742fe0979ae10cde4731 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Fri, 6 Jun 2025 00:38:55 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

composer:
* mediawiki/mediawiki-codesniffer: 46.0.0 → 47.0.0

npm:
* eslint-config-wikimedia: 0.28.2 → 0.30.0
  The following rules are failing and were disabled:
  * no-var

Additional changes:
* eslint: Replaced `wikimedia/client-es5` with `wikimedia/client`.

Change-Id: I3627eb04d0ef929fdb5dc0744f6d697d877a48c0
---
 .eslintrc.json          |  5 ++-
 Gruntfile.js            |  2 +-
 composer.json           |  2 +-
 package-lock.json       | 33 ++++++++-------
 package.json            |  2 +-
 resources/manage.js     | 42 +++++++++----------
 resources/validation.js | 90 ++++++++++++++++++++---------------------
 7 files changed, 90 insertions(+), 86 deletions(-)

diff --git a/.eslintrc.json b/.eslintrc.json
index 115c8ff..de60734 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,13 +1,14 @@
 {
 	"root": true,
 	"extends": [
-		"wikimedia/client-es5",
+		"wikimedia/client",
 		"wikimedia/mediawiki"
 	],
 	"rules": {
 		"camelcase": "off",
 		"no-alert": "off",
 		"no-undef": "off",
-		"no-unused-vars": "off"
+		"no-unused-vars": "off",
+		"no-var": "warn"
 	}
 }
diff --git a/Gruntfile.js b/Gruntfile.js
index d2e7a8f..159b532 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,6 +1,6 @@
 /* eslint-env node, es6 */
 module.exports = function ( grunt ) {
-	var conf = grunt.file.readJSON( 'extension.json' );
+	const conf = grunt.file.readJSON( 'extension.json' );
 
 	grunt.loadNpmTasks( 'grunt-banana-checker' );
 	grunt.loadNpmTasks( 'grunt-eslint' );
diff --git a/composer.json b/composer.json
index 4a82507..b070910 100644
--- a/composer.json
+++ b/composer.json
@@ -5,7 +5,7 @@
 		"phpoffice/phpspreadsheet": "^1.29"
 	},
 	"require-dev": {
-		"mediawiki/mediawiki-codesniffer": "46.0.0",
+		"mediawiki/mediawiki-codesniffer": "47.0.0",
 		"mediawiki/mediawiki-phan-config": "0.15.1",
 		"mediawiki/minus-x": "1.1.3",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
diff --git a/package-lock.json b/package-lock.json
index 5f55465..6ccf1ca 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,7 @@
 		"": {
 			"name": "CIForms",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.28.2",
+				"eslint-config-wikimedia": "0.30.0",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.13.0",
 				"grunt-eslint": "24.3.0",
@@ -1437,9 +1437,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.30.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.30.0.tgz",
+			"integrity": "sha512-i8ESzSoo0x3Jur/0JhAgCVPxbV51zfdI3MN3MVQPnjiFdmo21CNKmiBBmw8JnJ3fx/d5zHDrBa+yDjxSLpnDlA==",
 			"dev": true,
 			"dependencies": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -1452,13 +1452,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": {
@@ -1656,9 +1659,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
-			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+			"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"
@@ -6010,9 +6013,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.30.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.30.0.tgz",
+			"integrity": "sha512-i8ESzSoo0x3Jur/0JhAgCVPxbV51zfdI3MN3MVQPnjiFdmo21CNKmiBBmw8JnJ3fx/d5zHDrBa+yDjxSLpnDlA==",
 			"dev": true,
 			"requires": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -6025,7 +6028,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",
@@ -6160,9 +6163,9 @@
 			}
 		},
 		"eslint-plugin-no-jquery": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
-			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+			"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 94734e7..ea293b4 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.28.2",
+		"eslint-config-wikimedia": "0.30.0",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.13.0",
 		"grunt-eslint": "24.3.0",
diff --git a/resources/manage.js b/resources/manage.js
index 1b105f9..b57e531 100644
--- a/resources/manage.js
+++ b/resources/manage.js
@@ -19,18 +19,18 @@
  * @copyright Copyright © 2021-2024, https://wikisphere.org
  */
 
-$( document ).ready( function () {
+$( document ).ready( () => {
 	// display every 3 days
 	if ( !mw.cookie.get( 'ciforms-check-latest-version' ) ) {
-		mw.loader.using( 'mediawiki.api', function () {
+		mw.loader.using( 'mediawiki.api', () => {
 			new mw.Api()
 				.postWithToken( 'csrf', {
 					action: 'ciforms-check-latest-version'
 				} )
-				.done( function ( res ) {
+				.done( ( res ) => {
 					if ( 'ciforms-check-latest-version' in res ) {
 						if ( res[ 'ciforms-check-latest-version' ].result === 2 ) {
-							var messageWidget = new OO.ui.MessageWidget( {
+							const messageWidget = new OO.ui.MessageWidget( {
 								type: 'warning',
 								label: new OO.ui.HtmlSnippet(
 									mw.msg( 'ciforms-jsmodule-outdated-version' )
@@ -38,8 +38,8 @@ $( document ).ready( function () {
 								// *** this does not work before ooui v0.43.0
 								showClose: true
 							} );
-							var closeFunction = function () {
-								var three_days = 3 * 86400;
+							const closeFunction = function () {
+								const three_days = 3 * 86400;
 								mw.cookie.set( 'ciforms-check-latest-version', true, {
 									path: '/',
 									expires: three_days
@@ -59,7 +59,7 @@ $( document ).ready( function () {
 								messageWidget.$element.addClass(
 									'oo-ui-messageWidget-showClose'
 								);
-								var closeButton = new OO.ui.ButtonWidget( {
+								const closeButton = new OO.ui.ButtonWidget( {
 									classes: [ 'oo-ui-messageWidget-close' ],
 									framed: false,
 									icon: 'close',
@@ -80,20 +80,20 @@ $( document ).ready( function () {
 	// var checkBox = OO.ui.infuse( $( this ) );
 	// } );
 
-	var selected = false;
-	$( '#ci-forms-manage-pager-button-select-all' ).on( 'click', function ( evt ) {
+	let selected = false;
+	$( '#ci-forms-manage-pager-button-select-all' ).on( 'click', ( evt ) => {
 		selected = !selected;
 		$( '.ciforms-manage-button-select' ).each( function () {
 			// @see https://www.mediawiki.org/wiki/OOUI/Using_OOUI_in_MediaWiki
-			var checkBox = OO.ui.infuse( $( this ) );
+			const checkBox = OO.ui.infuse( $( this ) );
 			checkBox.setSelected( selected );
 		} );
 	} );
 
-	$( '#ci-forms-manage-pager-button-delete-selected' ).on( 'click', function ( evt ) {
-		var arr = [];
+	$( '#ci-forms-manage-pager-button-delete-selected' ).on( 'click', ( evt ) => {
+		const arr = [];
 		$( '.ciforms-manage-button-select' ).each( function () {
-			var checkBox = OO.ui.infuse( $( this ) );
+			const checkBox = OO.ui.infuse( $( this ) );
 			if ( checkBox.isSelected() ) {
 				arr.push( checkBox.getData().id );
 			}
@@ -107,8 +107,8 @@ $( document ).ready( function () {
 			return false;
 		}
 
-		var url = window.location.href;
-		var form = $( '<form>', {
+		const url = window.location.href;
+		const form = $( '<form>', {
 			action: window.location.href,
 			method: 'POST'
 			// 'target': '_top'
@@ -122,11 +122,11 @@ $( document ).ready( function () {
 	} );
 
 	$( '.ciforms-manage-button-export' ).each( function () {
-		var $buttonExport = $( this );
+		const $buttonExport = $( this );
 
-		var href = $buttonExport.data().ooui.href;
+		const href = $buttonExport.data().ooui.href;
 
-		var buttonMenu = new OO.ui.ButtonMenuSelectWidget( {
+		const buttonMenu = new OO.ui.ButtonMenuSelectWidget( {
 			label: mw.msg( 'ci-forms-manage-pager-button-export' ),
 			icon: 'menu',
 			flags: [ 'progressive', 'primary' ],
@@ -144,14 +144,14 @@ $( document ).ready( function () {
 			}
 		} );
 
-		var panelLayout = new OO.ui.PanelLayout( {
+		const panelLayout = new OO.ui.PanelLayout( {
 			padded: false,
 			expanded: false,
 			classes: [ 'ci-forms-manage-pager-panel-layout' ]
 		} );
 
-		buttonMenu.getMenu().on( 'choose', function ( menuOption ) {
-			var data = menuOption.getData();
+		buttonMenu.getMenu().on( 'choose', ( menuOption ) => {
+			const data = menuOption.getData();
 			window.location.assign( href.replace( 'format=csv', 'format=' + data ) );
 		} );
 
diff --git a/resources/validation.js b/resources/validation.js
index d6c7e5b..665749f 100644
--- a/resources/validation.js
+++ b/resources/validation.js
@@ -19,12 +19,12 @@
  * @copyright Copyright © 2021-2024, https://wikisphere.org
  */
 
-$( function () {
-	var msg1 = mw.config.get( 'ci-forms-validation-msg1' );
-	var msg2 = mw.config.get( 'ci-forms-validation-msg2' );
+$( () => {
+	const msg1 = mw.config.get( 'ci-forms-validation-msg1' );
+	const msg2 = mw.config.get( 'ci-forms-validation-msg2' );
 	// var msg3 = mw.config.get( 'ci-forms-validation-msg3' );
 
-	var currentSection = {};
+	const currentSection = {};
 
 	function escape( s ) {
 		return String( s )
@@ -35,29 +35,29 @@ $( function () {
 			.replace( />/g, '\x3E' );
 	}
 
-	var site_key = mw.config.get( 'ci_forms_google_recaptcha_site_key' );
+	const site_key = mw.config.get( 'ci_forms_google_recaptcha_site_key' );
 
 	// @see https://www.mediawiki.org/wiki/Topic:Y2pfh94nkkqzsjw3
 	function executeRecaptchaValidation() {
 		mw.loader
 			.getScript( 'https://www.google.com/recaptcha/api.js?render=' + site_key )
 			.then(
-				function () {
+				() => {
 					if ( $( 'input[name="g-recaptcha-response"]' ).length ) {
-						grecaptcha.ready( function () {
+						grecaptcha.ready( () => {
 							grecaptcha
 								.execute( site_key, { action: 'validate_captcha' } )
-								.then( function ( token ) {
+								.then( ( token ) => {
 									$( 'input[name="g-recaptcha-response"]' ).val( token );
 								} )
-								.catch( function ( error ) {
+								.catch( ( error ) => {
 									// eslint-disable-next-line no-console
 									console.log( error );
 								} );
 						} );
 					}
 				},
-				function ( e ) {
+				( e ) => {
 					mw.log.error( e.message );
 				}
 			);
@@ -71,7 +71,7 @@ $( function () {
 	}
 
 	$( '.ci_form' ).each( function ( index ) {
-		var paging = $( this )
+		const paging = $( this )
 			.find( 'input[type=hidden][name=form_paging]' )
 			.first()
 			.val();
@@ -92,19 +92,19 @@ $( function () {
 	} );
 
 	$( '.ci_form li' ).each( function ( index ) {
-		var el = this;
-		var section_el = $( this ).closest( '.ci_form_section' );
-		var radioForCheckboxes = $( section_el )
+		const el = this;
+		const section_el = $( this ).closest( '.ci_form_section' );
+		const radioForCheckboxes = $( section_el )
 			.find( '.radio_for_required_checkboxes' )
 			.first();
-		var max_answers = $( section_el )
+		const max_answers = $( section_el )
 			.find( 'input[type=hidden][name$=_multiple-choice-max-answers]' )
 			.val();
 
 		$( this )
 			.find( 'input[type=text]' )
 			.on( 'click', function () {
-				var count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;
+				const count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;
 
 				if ( count > max_answers ) {
 					alert( msg1.replace( '$1', max_answers ) );
@@ -123,8 +123,8 @@ $( function () {
 
 		$( this )
 			.find( 'input[type=checkbox]' )
-			.on( 'click', function () {
-				var count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;
+			.on( 'click', () => {
+				const count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;
 
 				if ( count > max_answers ) {
 					alert( msg1.replace( '$1', max_answers ) );
@@ -136,14 +136,14 @@ $( function () {
 
 	// https://stackoverflow.com/questions/15031513/jquery-help-to-enforce-maxlength-on-textarea
 	$( '.ci_form textarea[maxlength]' ).on( 'keyup', function () {
-		var limit = parseInt( $( this ).attr( 'maxlength' ) );
-		var text = $( this ).val();
-		var chars = text.length;
+		const limit = parseInt( $( this ).attr( 'maxlength' ) );
+		const text = $( this ).val();
+		const chars = text.length;
 
 		$( this )
 			.parents()
 			.each( function () {
-				var span = $( this )
+				const span = $( this )
 					.find( '.ci_form_section_inputs_textarea_maxlength' )
 					.first();
 
@@ -153,7 +153,7 @@ $( function () {
 			} );
 
 		if ( chars > limit ) {
-			var new_text = text.slice( 0, Math.max( 0, limit ) );
+			const new_text = text.slice( 0, Math.max( 0, limit ) );
 			$( this ).val( new_text );
 		}
 	} );
@@ -168,16 +168,16 @@ $( function () {
 	// is triggered after the native validation
 
 	$( '.ci_form input[type=radio]' ).on( 'click', function () {
-		var section_el = $( this ).closest( '.ci_form_section' );
+		const section_el = $( this ).closest( '.ci_form_section' );
 
 		$( section_el )
 			.find( 'li' )
 			.each( function () {
-				var el = this;
+				const el = this;
 
 				$( this )
 					.find( 'input[type=radio][name$=_selected]:checked' )
-					.each( function () {
+					.each( () => {
 						$( el )
 							.find( 'input[type=text][data-required="1"]' )
 							.prop( 'required', true );
@@ -185,23 +185,23 @@ $( function () {
 
 				$( this )
 					.find( 'input[type=radio][name$=_selected]:not(:checked)' )
-					.each( function () {
+					.each( () => {
 						$( el ).find( 'input[type=text]' ).removeAttr( 'required' );
 					} );
 			} );
 	} );
 
 	$( '.ci_form input[type=checkbox]' ).on( 'click', function () {
-		var section_el = $( this ).closest( '.ci_form_section' );
+		const section_el = $( this ).closest( '.ci_form_section' );
 
 		$( section_el )
 			.find( 'li' )
 			.each( function () {
-				var el = this;
+				const el = this;
 
 				$( this )
 					.find( 'input[type=checkbox][name$=_selected]:checked' )
-					.each( function () {
+					.each( () => {
 						$( el )
 							.find( 'input[type=text][data-required="1"]' )
 							.prop( 'required', true );
@@ -209,16 +209,16 @@ $( function () {
 
 				$( this )
 					.find( 'input[type=checkbox][name$=_selected]:not(:checked)' )
-					.each( function () {
+					.each( () => {
 						$( el ).find( 'input[type=text]' ).removeAttr( 'required' );
 					} );
 			} );
 	} );
 
 	$( '.ci_form_section_submit button' ).on( 'click', function ( evt ) {
-		var form_el = $( this ).closest( '.ci_form' );
+		const form_el = $( this ).closest( '.ci_form' );
 
-		var next = $( this ).prop( 'class' ).indexOf( 'next' ) !== -1;
+		const next = $( this ).prop( 'class' ).includes( 'next' );
 
 		if ( next ) {
 			return;
@@ -226,10 +226,10 @@ $( function () {
 
 		form_el.get( 0 ).scrollIntoView();
 
-		var index = form_el.data( 'form-index' );
-		var current_section = currentSection[ index ] + ( next ? 1 : -1 );
+		const index = form_el.data( 'form-index' );
+		const current_section = currentSection[ index ] + ( next ? 1 : -1 );
 
-		var count =
+		const count =
 			$( form_el ).find( "[class^='ci_form_section_display_']" ).length - 1;
 
 		// $(form_el).find(".ci_form_section").length - 1;
@@ -272,16 +272,16 @@ $( function () {
 	} );
 
 	$( '.ci_form' ).on( 'submit', function ( evt ) {
-		var form_el = $( this );
+		const form_el = $( this );
 
 		form_el.get( 0 ).scrollIntoView();
 
-		var paging = $( this )
+		const paging = $( this )
 			.find( 'input[type=hidden][name=form_paging]' )
 			.first()
 			.val();
 
-		var index, current_section, count;
+		let index, current_section, count;
 
 		if ( paging && paging !== 'false' ) {
 			index = form_el.data( 'form-index' );
@@ -291,7 +291,7 @@ $( function () {
 			// $(form_el).find(".ci_form_section").length - 1;
 		}
 
-		var preventSubmit = false;
+		let preventSubmit = false;
 		$( this )
 			.find(
 				( paging && paging !== 'false' ?
@@ -299,15 +299,15 @@ $( function () {
 					'' ) + '.ci_form_section'
 			)
 			.each( function () {
-				var section_type = $( this )
+				const section_type = $( this )
 					.find( 'input[type=hidden][name$=_section_type]' )
 					.val();
 
-				var min_answers = $( this )
+				const min_answers = $( this )
 					.find( 'input[type=hidden][name$=_multiple-choice-min-answers]' )
 					.val();
 
-				var question_name = $( this ).find( '.ci_form_section_title' ).text();
+				let question_name = $( this ).find( '.ci_form_section_title' ).text();
 
 				if ( !question_name ) {
 					question_name = $( form_el ).find( '.ci_form_title' ).text();
@@ -321,7 +321,7 @@ $( function () {
 						$( this )
 							.find( 'input[type=text][name$=_value]' )
 							.each( function () {
-								var val = $( this ).val().trim();
+								const val = $( this ).val().trim();
 
 								if ( val !== '' && val !== null ) {
 									filledIn++;
@@ -345,7 +345,7 @@ $( function () {
 
 					case 'multiple choice':
 						if ( min_answers ) {
-							var checked = $( this ).find(
+							const checked = $( this ).find(
 								'input[type=checkbox][name$=_selected]:checked'
 							).length;
 							if ( checked < min_answers ) {
-- 
2.39.5

$ date
--- stdout ---
Fri Jun  6 00:38:14 UTC 2025

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-CIForms.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 ---
378f50b695ab8c7068d6601d24c89c6257e48105 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": 411,
      "optional": 0,
      "peer": 1,
      "peerOptional": 0,
      "total": 411
    }
  }
}

--- 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: 53 installs, 0 updates, 0 removals
  - Locking composer/pcre (3.3.2)
  - Locking composer/semver (3.4.3)
  - Locking composer/spdx-licenses (1.5.9)
  - Locking composer/xdebug-handler (3.0.5)
  - Locking dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
  - Locking doctrine/deprecations (1.1.5)
  - Locking dompdf/dompdf (v3.1.0)
  - Locking dompdf/php-font-lib (1.0.1)
  - Locking dompdf/php-svg-lib (1.0.0)
  - Locking ezyang/htmlpurifier (v4.18.0)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking maennchen/zipstream-php (3.1.2)
  - Locking markbaker/complex (3.0.2)
  - Locking markbaker/matrix (3.0.1)
  - Locking masterminds/html5 (2.9.0)
  - 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.2)
  - Locking phpdocumentor/type-resolver (1.10.0)
  - Locking phpmailer/phpmailer (v6.10.0)
  - Locking phpoffice/phpspreadsheet (1.29.10)
  - Locking phpstan/phpdoc-parser (2.1.0)
  - Locking psr/container (2.0.2)
  - Locking psr/http-client (1.0.3)
  - Locking psr/http-factory (1.1.0)
  - Locking psr/http-message (2.0)
  - Locking psr/log (3.0.2)
  - Locking psr/simple-cache (3.0.0)
  - Locking sabberworm/php-css-parser (v8.8.0)
  - Locking sabre/event (5.1.7)
  - Locking squizlabs/php_codesniffer (3.11.3)
  - Locking symfony/console (v7.3.0)
  - Locking symfony/deprecation-contracts (v3.6.0)
  - Locking symfony/polyfill-ctype (v1.32.0)
  - Locking symfony/polyfill-intl-grapheme (v1.32.0)
  - Locking symfony/polyfill-intl-normalizer (v1.32.0)
  - Locking symfony/polyfill-mbstring (v1.32.0)
  - Locking symfony/polyfill-php80 (v1.32.0)
  - Locking symfony/service-contracts (v3.6.0)
  - Locking symfony/string (v7.3.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: 53 installs, 0 updates, 0 removals
  - Downloading masterminds/html5 (2.9.0)
  - Downloading sabberworm/php-css-parser (v8.8.0)
  - Downloading dompdf/php-svg-lib (1.0.0)
  - Downloading dompdf/php-font-lib (1.0.1)
  - Downloading dompdf/dompdf (v3.1.0)
  - Downloading psr/simple-cache (3.0.0)
  - Downloading markbaker/matrix (3.0.1)
  - Downloading markbaker/complex (3.0.2)
  - Downloading maennchen/zipstream-php (3.1.2)
  - Downloading ezyang/htmlpurifier (v4.18.0)
  - Downloading phpoffice/phpspreadsheet (1.29.10)
  0/11 [>---------------------------]   0%
 11/11 [============================] 100%
  - Installing squizlabs/php_codesniffer (3.11.3): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
  - Installing masterminds/html5 (2.9.0): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.32.0): Extracting archive
  - Installing sabberworm/php-css-parser (v8.8.0): Extracting archive
  - Installing dompdf/php-svg-lib (1.0.0): Extracting archive
  - Installing dompdf/php-font-lib (1.0.1): Extracting archive
  - Installing dompdf/dompdf (v3.1.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.32.0): Extracting archive
  - Installing phpcsstandards/phpcsutils (1.0.12): Extracting archive
  - Installing phpcsstandards/phpcsextra (1.2.1): Extracting archive
  - Installing composer/spdx-licenses (1.5.9): 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.32.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.32.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.32.0): Extracting archive
  - Installing symfony/string (v7.3.0): 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.0): Extracting archive
  - Installing symfony/console (v7.3.0): 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.5): Extracting archive
  - Installing phpdocumentor/type-resolver (1.10.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.6.2): Extracting archive
  - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
  - Installing psr/log (3.0.2): Extracting archive
  - Installing composer/pcre (3.3.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 phpmailer/phpmailer (v6.10.0): Extracting archive
  - Installing psr/simple-cache (3.0.0): Extracting archive
  - Installing psr/http-message (2.0): Extracting archive
  - Installing psr/http-factory (1.1.0): Extracting archive
  - Installing psr/http-client (1.0.3): Extracting archive
  - Installing markbaker/matrix (3.0.1): Extracting archive
  - Installing markbaker/complex (3.0.2): Extracting archive
  - Installing maennchen/zipstream-php (3.1.2): Extracting archive
  - Installing ezyang/htmlpurifier (v4.18.0): Extracting archive
  - Installing phpoffice/phpspreadsheet (1.29.10): Extracting archive
  0/51 [>---------------------------]   0%
 19/51 [==========>-----------------]  37%
 32/51 [=================>----------]  62%
 43/51 [=======================>----]  84%
 50/51 [===========================>]  98%
 51/51 [============================] 100%
14 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
18 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.30.0
$ /usr/bin/npm install
--- stdout ---

added 411 packages, and audited 412 packages in 5s

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

found 0 vulnerabilities

--- 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 ---

up to date, audited 412 packages in 971ms

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

found 0 vulnerabilities

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ ./node_modules/.bin/eslint resources/validation.js composer.json Gruntfile.js package-lock.json i18n/qqq.json resources/manage.js package.json i18n/de.json extension.json i18n/en.json --fix
--- stdout ---

/src/repo/resources/validation.js
  318:7  error  Unexpected var, use let or const instead  no-var
  319:7  error  Unexpected var, use let or const instead  no-var
  332:7  error  Unexpected var, use let or const instead  no-var

✖ 3 problems (3 errors, 0 warnings)


--- end ---
$ ./node_modules/.bin/eslint resources/validation.js composer.json Gruntfile.js package-lock.json i18n/qqq.json resources/manage.js package.json i18n/de.json extension.json i18n/en.json -f json
--- stdout ---
[{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","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-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"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":"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/extension.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/i18n/de.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/i18n/en.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/i18n/qqq.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/package-lock.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/package.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/manage.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","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-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"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/validation.js","messages":[{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":318,"column":7,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":318,"endColumn":22},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":319,"column":7,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":319,"endColumn":24},{"ruleId":"no-var","severity":2,"message":"Unexpected var, use let or const instead.","line":332,"column":7,"nodeType":"VariableDeclaration","messageId":"unexpectedVar","endLine":332,"endColumn":67}],"suppressedMessages":[{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":55,"column":10,"nodeType":"MemberExpression","messageId":"unexpected","endLine":55,"endColumn":21,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[1888,1909],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension CIForms.\n *\n * CIForms is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * CIForms is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with CIForms.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2024, https://wikisphere.org\n */\n\n$( () => {\n\tconst msg1 = mw.config.get( 'ci-forms-validation-msg1' );\n\tconst msg2 = mw.config.get( 'ci-forms-validation-msg2' );\n\t// var msg3 = mw.config.get( 'ci-forms-validation-msg3' );\n\n\tconst currentSection = {};\n\n\tfunction escape( s ) {\n\t\treturn String( s )\n\t\t\t.replace( /&/g, '\\x26' )\n\t\t\t.replace( /'/g, '\\x27' )\n\t\t\t.replace( /\"/g, '\\x22' )\n\t\t\t.replace( /</g, '\\x3C' )\n\t\t\t.replace( />/g, '\\x3E' );\n\t}\n\n\tconst site_key = mw.config.get( 'ci_forms_google_recaptcha_site_key' );\n\n\t// @see https://www.mediawiki.org/wiki/Topic:Y2pfh94nkkqzsjw3\n\tfunction executeRecaptchaValidation() {\n\t\tmw.loader\n\t\t\t.getScript( 'https://www.google.com/recaptcha/api.js?render=' + site_key )\n\t\t\t.then(\n\t\t\t\t() => {\n\t\t\t\t\tif ( $( 'input[name=\"g-recaptcha-response\"]' ).length ) {\n\t\t\t\t\t\tgrecaptcha.ready( () => {\n\t\t\t\t\t\t\tgrecaptcha\n\t\t\t\t\t\t\t\t.execute( site_key, { action: 'validate_captcha' } )\n\t\t\t\t\t\t\t\t.then( ( token ) => {\n\t\t\t\t\t\t\t\t\t$( 'input[name=\"g-recaptcha-response\"]' ).val( token );\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.catch( ( error ) => {\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\t\t\tconsole.log( error );\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t( e ) => {\n\t\t\t\t\tmw.log.error( e.message );\n\t\t\t\t}\n\t\t\t);\n\t}\n\n\tif ( site_key ) {\n\t\texecuteRecaptchaValidation();\n\n\t\t// refresh each 90 seconds\n\t\tsetInterval( executeRecaptchaValidation, 90 * 1000 );\n\t}\n\n\t$( '.ci_form' ).each( function ( index ) {\n\t\tconst paging = $( this )\n\t\t\t.find( 'input[type=hidden][name=form_paging]' )\n\t\t\t.first()\n\t\t\t.val();\n\n\t\tif ( paging && paging !== 'false' ) {\n\t\t\t$( this ).find( '.ci_form_input_navigation_next' ).attr( 'type', 'submit' );\n\t\t}\n\n\t\tcurrentSection[ index ] = 0;\n\t\t$( this )\n\t\t\t.find(\n\t\t\t\t( paging && paging !== 'false' ?\n\t\t\t\t\t'.ci_form_section_display_' + currentSection[ index ] + ' ' :\n\t\t\t\t\t'' ) + ':input[data-required=\"1\"]'\n\t\t\t)\n\t\t\t.prop( 'required', true );\n\t\t$( this ).data( 'form-index', index );\n\t} );\n\n\t$( '.ci_form li' ).each( function ( index ) {\n\t\tconst el = this;\n\t\tconst section_el = $( this ).closest( '.ci_form_section' );\n\t\tconst radioForCheckboxes = $( section_el )\n\t\t\t.find( '.radio_for_required_checkboxes' )\n\t\t\t.first();\n\t\tconst max_answers = $( section_el )\n\t\t\t.find( 'input[type=hidden][name$=_multiple-choice-max-answers]' )\n\t\t\t.val();\n\n\t\t$( this )\n\t\t\t.find( 'input[type=text]' )\n\t\t\t.on( 'click', function () {\n\t\t\t\tconst count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;\n\n\t\t\t\tif ( count > max_answers ) {\n\t\t\t\t\talert( msg1.replace( '$1', max_answers ) );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( $( this ).attr( 'data-required' ) === 1 ) {\n\t\t\t\t\t$( this ).prop( 'required', true );\n\t\t\t\t}\n\n\t\t\t\t$( el ).find( 'input[type=radio]' ).prop( 'checked', true );\n\t\t\t\t$( el ).find( 'input[type=checkbox]' ).prop( 'checked', true );\n\n\t\t\t\tradioForCheckboxes[ 0 ].checked = !!count;\n\t\t\t} );\n\n\t\t$( this )\n\t\t\t.find( 'input[type=checkbox]' )\n\t\t\t.on( 'click', () => {\n\t\t\t\tconst count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;\n\n\t\t\t\tif ( count > max_answers ) {\n\t\t\t\t\talert( msg1.replace( '$1', max_answers ) );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tradioForCheckboxes[ 0 ].checked = !!count;\n\t\t\t} );\n\t} );\n\n\t// https://stackoverflow.com/questions/15031513/jquery-help-to-enforce-maxlength-on-textarea\n\t$( '.ci_form textarea[maxlength]' ).on( 'keyup', function () {\n\t\tconst limit = parseInt( $( this ).attr( 'maxlength' ) );\n\t\tconst text = $( this ).val();\n\t\tconst chars = text.length;\n\n\t\t$( this )\n\t\t\t.parents()\n\t\t\t.each( function () {\n\t\t\t\tconst span = $( this )\n\t\t\t\t\t.find( '.ci_form_section_inputs_textarea_maxlength' )\n\t\t\t\t\t.first();\n\n\t\t\t\tif ( span.length ) {\n\t\t\t\t\tspan.html( chars + '/' + limit + ' characters' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\tif ( chars > limit ) {\n\t\t\tconst new_text = text.slice( 0, Math.max( 0, limit ) );\n\t\t\t$( this ).val( new_text );\n\t\t}\n\t} );\n\n\t$( '.ci_form select' ).each( function () {\n\t\tif ( $( this ).find( 'option' ).length > 20 ) {\n\t\t\t$( this ).select2();\n\t\t}\n\t} );\n\n\t// we cannot use form on submit because\n\t// is triggered after the native validation\n\n\t$( '.ci_form input[type=radio]' ).on( 'click', function () {\n\t\tconst section_el = $( this ).closest( '.ci_form_section' );\n\n\t\t$( section_el )\n\t\t\t.find( 'li' )\n\t\t\t.each( function () {\n\t\t\t\tconst el = this;\n\n\t\t\t\t$( this )\n\t\t\t\t\t.find( 'input[type=radio][name$=_selected]:checked' )\n\t\t\t\t\t.each( () => {\n\t\t\t\t\t\t$( el )\n\t\t\t\t\t\t\t.find( 'input[type=text][data-required=\"1\"]' )\n\t\t\t\t\t\t\t.prop( 'required', true );\n\t\t\t\t\t} );\n\n\t\t\t\t$( this )\n\t\t\t\t\t.find( 'input[type=radio][name$=_selected]:not(:checked)' )\n\t\t\t\t\t.each( () => {\n\t\t\t\t\t\t$( el ).find( 'input[type=text]' ).removeAttr( 'required' );\n\t\t\t\t\t} );\n\t\t\t} );\n\t} );\n\n\t$( '.ci_form input[type=checkbox]' ).on( 'click', function () {\n\t\tconst section_el = $( this ).closest( '.ci_form_section' );\n\n\t\t$( section_el )\n\t\t\t.find( 'li' )\n\t\t\t.each( function () {\n\t\t\t\tconst el = this;\n\n\t\t\t\t$( this )\n\t\t\t\t\t.find( 'input[type=checkbox][name$=_selected]:checked' )\n\t\t\t\t\t.each( () => {\n\t\t\t\t\t\t$( el )\n\t\t\t\t\t\t\t.find( 'input[type=text][data-required=\"1\"]' )\n\t\t\t\t\t\t\t.prop( 'required', true );\n\t\t\t\t\t} );\n\n\t\t\t\t$( this )\n\t\t\t\t\t.find( 'input[type=checkbox][name$=_selected]:not(:checked)' )\n\t\t\t\t\t.each( () => {\n\t\t\t\t\t\t$( el ).find( 'input[type=text]' ).removeAttr( 'required' );\n\t\t\t\t\t} );\n\t\t\t} );\n\t} );\n\n\t$( '.ci_form_section_submit button' ).on( 'click', function ( evt ) {\n\t\tconst form_el = $( this ).closest( '.ci_form' );\n\n\t\tconst next = $( this ).prop( 'class' ).includes( 'next' );\n\n\t\tif ( next ) {\n\t\t\treturn;\n\t\t}\n\n\t\tform_el.get( 0 ).scrollIntoView();\n\n\t\tconst index = form_el.data( 'form-index' );\n\t\tconst current_section = currentSection[ index ] + ( next ? 1 : -1 );\n\n\t\tconst count =\n\t\t\t$( form_el ).find( \"[class^='ci_form_section_display_']\" ).length - 1;\n\n\t\t// $(form_el).find(\".ci_form_section\").length - 1;\n\n\t\tif ( current_section < 0 || current_section > count ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$( form_el )\n\t\t\t.find( '.ci_form_section_display_' + currentSection[ index ] )\n\t\t\t.first()\n\t\t\t.hide();\n\n\t\t$( form_el )\n\t\t\t.find(\n\t\t\t\t'.ci_form_section_display_' +\n\t\t\t\t\tcurrentSection[ index ] +\n\t\t\t\t\t' :input[data-required=\"1\"]'\n\t\t\t)\n\t\t\t.removeAttr( 'required' );\n\n\t\tcurrentSection[ index ] = current_section;\n\n\t\t$( form_el )\n\t\t\t.find( '.ci_form_section_display_' + current_section )\n\t\t\t.first()\n\t\t\t.fadeIn( 'slow' );\n\t\t$( form_el )\n\t\t\t.find( '.ci_form_input_navigation_back' )\n\t\t\t.first()\n\t\t\t.css( 'display', current_section ? 'inline-block' : 'none' );\n\t\t$( form_el )\n\t\t\t.find( '.ci_form_input_navigation_next' )\n\t\t\t.first()\n\t\t\t.css( 'display', current_section !== count ? 'inline-block' : 'none' );\n\t\t$( form_el )\n\t\t\t.find( '.ci_form_input_submit' )\n\t\t\t.first()\n\t\t\t.css( 'display', current_section === count ? 'inline-block' : 'none' );\n\t} );\n\n\t$( '.ci_form' ).on( 'submit', function ( evt ) {\n\t\tconst form_el = $( this );\n\n\t\tform_el.get( 0 ).scrollIntoView();\n\n\t\tconst paging = $( this )\n\t\t\t.find( 'input[type=hidden][name=form_paging]' )\n\t\t\t.first()\n\t\t\t.val();\n\n\t\tlet index, current_section, count;\n\n\t\tif ( paging && paging !== 'false' ) {\n\t\t\tindex = form_el.data( 'form-index' );\n\t\t\tcurrent_section = currentSection[ index ] + 1;\n\t\t\tcount = $( form_el ).find( \"[class^='ci_form_section_display_']\" ).length - 1;\n\n\t\t\t// $(form_el).find(\".ci_form_section\").length - 1;\n\t\t}\n\n\t\tlet preventSubmit = false;\n\t\t$( this )\n\t\t\t.find(\n\t\t\t\t( paging && paging !== 'false' ?\n\t\t\t\t\t'.ci_form_section_display_' + currentSection[ index ] + ' ' :\n\t\t\t\t\t'' ) + '.ci_form_section'\n\t\t\t)\n\t\t\t.each( function () {\n\t\t\t\tconst section_type = $( this )\n\t\t\t\t\t.find( 'input[type=hidden][name$=_section_type]' )\n\t\t\t\t\t.val();\n\n\t\t\t\tconst min_answers = $( this )\n\t\t\t\t\t.find( 'input[type=hidden][name$=_multiple-choice-min-answers]' )\n\t\t\t\t\t.val();\n\n\t\t\t\tlet question_name = $( this ).find( '.ci_form_section_title' ).text();\n\n\t\t\t\tif ( !question_name ) {\n\t\t\t\t\tquestion_name = $( form_el ).find( '.ci_form_title' ).text();\n\t\t\t\t}\n\n\t\t\t\tswitch ( section_type ) {\n\t\t\t\t\tcase 'cloze test':\n\t\t\t\t\t\tvar inputs = 0;\n\t\t\t\t\t\tvar filledIn = 0;\n\n\t\t\t\t\t\t$( this )\n\t\t\t\t\t\t\t.find( 'input[type=text][name$=_value]' )\n\t\t\t\t\t\t\t.each( function () {\n\t\t\t\t\t\t\t\tconst val = $( this ).val().trim();\n\n\t\t\t\t\t\t\t\tif ( val !== '' && val !== null ) {\n\t\t\t\t\t\t\t\t\tfilledIn++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tinputs++;\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tvar minNumber = min_answers || Math.floor( inputs / 2 ) + 1;\n\n\t\t\t\t\t\tif ( filledIn < minNumber ) {\n\t\t\t\t\t\t\talert(\n\t\t\t\t\t\t\t\tmsg2\n\t\t\t\t\t\t\t\t\t.replace( '$1', minNumber )\n\t\t\t\t\t\t\t\t\t.replace( '$2', escape( question_name ) )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tpreventSubmit = true;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'multiple choice':\n\t\t\t\t\t\tif ( min_answers ) {\n\t\t\t\t\t\t\tconst checked = $( this ).find(\n\t\t\t\t\t\t\t\t'input[type=checkbox][name$=_selected]:checked'\n\t\t\t\t\t\t\t).length;\n\t\t\t\t\t\t\tif ( checked < min_answers ) {\n\t\t\t\t\t\t\t\talert(\n\t\t\t\t\t\t\t\t\tmsg2\n\t\t\t\t\t\t\t\t\t\t.replace( '$1', min_answers )\n\t\t\t\t\t\t\t\t\t\t.replace( '$2', escape( question_name ) )\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tpreventSubmit = true;\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} );\n\n\t\tif ( preventSubmit ) {\n\t\t\tevt.preventDefault();\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( paging && paging !== 'false' ) {\n\t\t\tif ( current_section <= count ) {\n\t\t\t\t$( form_el )\n\t\t\t\t\t.find( '.ci_form_section_display_' + currentSection[ index ] )\n\t\t\t\t\t.first()\n\t\t\t\t\t.hide();\n\n\t\t\t\t// next section\n\t\t\t\tcurrentSection[ index ] = current_section;\n\n\t\t\t\t$( form_el )\n\t\t\t\t\t.find( '.ci_form_section_display_' + current_section )\n\t\t\t\t\t.first()\n\t\t\t\t\t.fadeIn( 'slow' );\n\n\t\t\t\t$( this )\n\t\t\t\t\t.find( '.ci_form_section_display_' + current_section )\n\t\t\t\t\t.find( ':input[data-required=\"1\"]' )\n\t\t\t\t\t.prop( 'required', true );\n\t\t\t}\n\n\t\t\t$( form_el )\n\t\t\t\t.find( '.ci_form_input_navigation_back' )\n\t\t\t\t.first()\n\t\t\t\t.css( 'display', current_section ? 'inline-block' : 'none' );\n\t\t\t$( form_el )\n\t\t\t\t.find( '.ci_form_input_navigation_next' )\n\t\t\t\t.first()\n\t\t\t\t.css( 'display', current_section !== count ? 'inline-block' : 'none' );\n\t\t\t$( form_el )\n\t\t\t\t.find( '.ci_form_input_submit' )\n\t\t\t\t.first()\n\t\t\t\t.css( 'display', current_section === count ? 'inline-block' : 'none' );\n\n\t\t\tif ( current_section <= count ) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","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-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"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-var' (broken in .eslintrc.json) on .eslintrc.json
$ /usr/bin/npm ci
--- stdout ---

added 411 packages, and audited 412 packages in 5s

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

found 0 vulnerabilities

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

> test
> grunt test

Running "eslint:all" (eslint) task

/src/repo/resources/validation.js
  318:7  warning  Unexpected var, use let or const instead  no-var
  319:7  warning  Unexpected var, use let or const instead  no-var
  332:7  warning  Unexpected var, use let or const instead  no-var

✖ 3 problems (0 errors, 3 warnings)


Running "banana:CIForms" (banana) task
>> 1 message directory checked.

Running "stylelint:all" (stylelint) task
>> Linted 2 files without errors

Done.

--- end ---
Upgrading c:mediawiki/mediawiki-codesniffer from 46.0.0 -> 47.0.0
$ /usr/bin/composer update
--- stderr ---
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 2 updates, 0 removals
  - Upgrading mediawiki/mediawiki-codesniffer (v46.0.0 => v47.0.0)
  - Upgrading squizlabs/php_codesniffer (3.11.3 => 3.12.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 2 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Upgrading squizlabs/php_codesniffer (3.11.3 => 3.12.2): Extracting archive
  - Upgrading mediawiki/mediawiki-codesniffer (v46.0.0 => v47.0.0): Extracting archive
 0/2 [>---------------------------]   0%
 1/2 [==============>-------------]  50%
 2/2 [============================] 100%
Generating autoload files
18 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils

--- end ---
Previously failing phpcs rules: {'Generic.Files.LineLength.TooLong', 'MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate', 'MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment', 'MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName', 'MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage', 'Generic.CodeAnalysis.AssignmentInCondition.Found'}
$ vendor/bin/phpcs --report=json
--- stdout ---
{"totals":{"errors":18,"warnings":92,"fixable":0},"files":{"\/src\/repo\/CIForms.alias.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/CIForms.i18n.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/.phan\/config.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/CIFormsApiCheckLatestVersion.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/PrevNextNavigationRendererCIForms.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/CIFormsSubmit.php":{"errors":4,"warnings":25,"messages":[{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":32,"column":13},{"message":"Should use function $this->getConfig()->get() rather than global $wgEnableEmail","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":53,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgCIFormsSenderEmail","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":54,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgCIFormsSenderName","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":55,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgPasswordSenderName","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":56,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgPasswordSender","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":57,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgSitename","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":58,"column":16},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":99,"column":146},{"message":"Line exceeds 120 characters; contains 154 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":100,"column":154},{"message":"Line exceeds 120 characters; contains 152 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":125,"column":152},{"message":"Variable assignment found within a condition. Did you mean to do a comparison ?","source":"Generic.CodeAnalysis.AssignmentInCondition.Found","severity":5,"fixable":false,"type":"WARNING","line":250,"column":25},{"message":"Variable assignment found within a condition. Did you mean to do a comparison ?","source":"Generic.CodeAnalysis.AssignmentInCondition.Found","severity":5,"fixable":false,"type":"WARNING","line":256,"column":25},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":310,"column":53},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":312,"column":48},{"message":"Line exceeds 120 characters; contains 142 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":319,"column":142},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":323,"column":146},{"message":"Line exceeds 120 characters; contains 141 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":325,"column":9},{"message":"Method name \"exit_message\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":365,"column":15},{"message":"Should use function $this->getConfig()->get() rather than global $wgSitename","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":433,"column":16},{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":435,"column":135},{"message":"Line exceeds 120 characters; contains 231 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":437,"column":231},{"message":"Method name \"check_captcha\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":498,"column":15},{"message":"Should use function $this->getConfig()->get() rather than global $wgCIFormsGoogleRecaptchaSecret","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":499,"column":16},{"message":"Method name \"create_output\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":605,"column":15},{"message":"Line exceeds 120 characters; contains 157 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":643,"column":157},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":670,"column":51},{"message":"Line exceeds 120 characters; contains 176 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":680,"column":176},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":704,"column":171},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":726,"column":126}]},"\/src\/repo\/includes\/CIForms.php":{"errors":7,"warnings":43,"messages":[{"message":"Method name \"ci_form\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":179,"column":19},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":185,"column":31},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":188,"column":42},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":194,"column":31},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":199,"column":12},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":215,"column":128},{"message":"Line exceeds 120 characters; contains 427 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":220,"column":427},{"message":"Line exceeds 120 characters; contains 130 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":223,"column":130},{"message":"Line exceeds 120 characters; contains 200 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":265,"column":200},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":274,"column":171},{"message":"Line exceeds 120 characters; contains 235 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":284,"column":235},{"message":"Line exceeds 120 characters; contains 283 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":287,"column":283},{"message":"Line exceeds 120 characters; contains 248 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":288,"column":248},{"message":"Line exceeds 120 characters; contains 256 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":289,"column":256},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":296,"column":171},{"message":"Method name \"parse_function_arguments\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":313,"column":22},{"message":"Method name \"replace_wikitext_and_html\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":367,"column":22},{"message":"Method name \"hidden_input\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":396,"column":22},{"message":"Method name \"ci_form_section_process\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":405,"column":22},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":437,"column":124},{"message":"Line exceeds 120 characters; contains 155 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":438,"column":155},{"message":"Line exceeds 120 characters; contains 139 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":464,"column":139},{"message":"Line exceeds 120 characters; contains 139 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":467,"column":139},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":555,"column":133},{"message":"Line exceeds 120 characters; contains 193 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":603,"column":193},{"message":"Line exceeds 120 characters; contains 153 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":607,"column":153},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":614,"column":128},{"message":"Line exceeds 120 characters; contains 143 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":616,"column":143},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":619,"column":122},{"message":"Line exceeds 120 characters; contains 140 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":628,"column":140},{"message":"Line exceeds 120 characters; contains 214 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":635,"column":214},{"message":"Line exceeds 120 characters; contains 137 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":641,"column":137},{"message":"Line exceeds 120 characters; contains 258 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":645,"column":258},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":654,"column":122},{"message":"Line exceeds 120 characters; contains 123 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":659,"column":123},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":672,"column":122},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":673,"column":128},{"message":"Line exceeds 120 characters; contains 168 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":688,"column":29},{"message":"Line exceeds 120 characters; contains 189 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":689,"column":29},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":696,"column":38},{"message":"Line exceeds 120 characters; contains 168 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":706,"column":168},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":732,"column":38},{"message":"Line exceeds 120 characters; contains 130 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":765,"column":130},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":777,"column":126},{"message":"Line exceeds 120 characters; contains 148 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":805,"column":148},{"message":"Line exceeds 120 characters; contains 127 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":811,"column":127},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":829,"column":42},{"message":"Method name \"ci_form_parse_input_symbol\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":845,"column":19},{"message":"Method name \"ci_form_section\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":893,"column":19},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":905,"column":13}]},"\/src\/repo\/includes\/specials\/CIFormsManage.php":{"errors":7,"warnings":24,"messages":[{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":37,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":38,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":39,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":40,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":41,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":42,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":43,"column":13},{"message":"Should use function $this->getConfig()->get() rather than global $wgDBprefix","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":99,"column":16},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":217,"column":58},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":264,"column":19},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":266,"column":50},{"message":"Line exceeds 120 characters; contains 123 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":316,"column":88},{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":549,"column":135},{"message":"Line exceeds 120 characters; contains 152 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":693,"column":152},{"message":"Line exceeds 120 characters; contains 123 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":708,"column":20},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":750,"column":37},{"message":"Variable assignment found within a condition. Did you mean to do a comparison ?","source":"Generic.CodeAnalysis.AssignmentInCondition.Found","severity":5,"fixable":false,"type":"WARNING","line":826,"column":45},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":885,"column":74},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":913,"column":146},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":922,"column":146},{"message":"Line exceeds 120 characters; contains 180 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1009,"column":180},{"message":"Line exceeds 120 characters; contains 127 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1056,"column":127},{"message":"Line exceeds 120 characters; contains 154 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1058,"column":154},{"message":"Line exceeds 120 characters; contains 136 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1065,"column":136},{"message":"Line exceeds 120 characters; contains 147 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1079,"column":147},{"message":"Line exceeds 120 characters; contains 139 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1083,"column":139},{"message":"Line exceeds 120 characters; contains 168 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1100,"column":168},{"message":"Line exceeds 120 characters; contains 139 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1104,"column":139},{"message":"Line exceeds 120 characters; contains 229 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1107,"column":229},{"message":"Line exceeds 120 characters; contains 151 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1111,"column":151},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1137,"column":171}]}}}

--- end ---
PHPCS run failed
$ vendor/bin/phpcs --report=json
--- stdout ---
{"totals":{"errors":18,"warnings":92,"fixable":0},"files":{"\/src\/repo\/CIForms.alias.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/PrevNextNavigationRendererCIForms.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/.phan\/config.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/CIForms.i18n.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/CIFormsApiCheckLatestVersion.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/CIFormsSubmit.php":{"errors":4,"warnings":25,"messages":[{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":32,"column":13},{"message":"Should use function $this->getConfig()->get() rather than global $wgEnableEmail","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":53,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgCIFormsSenderEmail","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":54,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgCIFormsSenderName","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":55,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgPasswordSenderName","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":56,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgPasswordSender","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":57,"column":16},{"message":"Should use function $this->getConfig()->get() rather than global $wgSitename","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":58,"column":16},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":99,"column":146},{"message":"Line exceeds 120 characters; contains 154 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":100,"column":154},{"message":"Line exceeds 120 characters; contains 152 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":125,"column":152},{"message":"Variable assignment found within a condition. Did you mean to do a comparison ?","source":"Generic.CodeAnalysis.AssignmentInCondition.Found","severity":5,"fixable":false,"type":"WARNING","line":250,"column":25},{"message":"Variable assignment found within a condition. Did you mean to do a comparison ?","source":"Generic.CodeAnalysis.AssignmentInCondition.Found","severity":5,"fixable":false,"type":"WARNING","line":256,"column":25},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":310,"column":53},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":312,"column":48},{"message":"Line exceeds 120 characters; contains 142 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":319,"column":142},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":323,"column":146},{"message":"Line exceeds 120 characters; contains 141 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":325,"column":9},{"message":"Method name \"exit_message\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":365,"column":15},{"message":"Should use function $this->getConfig()->get() rather than global $wgSitename","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":433,"column":16},{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":435,"column":135},{"message":"Line exceeds 120 characters; contains 231 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":437,"column":231},{"message":"Method name \"check_captcha\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":498,"column":15},{"message":"Should use function $this->getConfig()->get() rather than global $wgCIFormsGoogleRecaptchaSecret","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":499,"column":16},{"message":"Method name \"create_output\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":605,"column":15},{"message":"Line exceeds 120 characters; contains 157 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":643,"column":157},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":670,"column":51},{"message":"Line exceeds 120 characters; contains 176 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":680,"column":176},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":704,"column":171},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":726,"column":126}]},"\/src\/repo\/includes\/CIForms.php":{"errors":7,"warnings":43,"messages":[{"message":"Method name \"ci_form\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":179,"column":19},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":185,"column":31},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":188,"column":42},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":194,"column":31},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":199,"column":12},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":215,"column":128},{"message":"Line exceeds 120 characters; contains 427 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":220,"column":427},{"message":"Line exceeds 120 characters; contains 130 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":223,"column":130},{"message":"Line exceeds 120 characters; contains 200 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":265,"column":200},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":274,"column":171},{"message":"Line exceeds 120 characters; contains 235 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":284,"column":235},{"message":"Line exceeds 120 characters; contains 283 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":287,"column":283},{"message":"Line exceeds 120 characters; contains 248 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":288,"column":248},{"message":"Line exceeds 120 characters; contains 256 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":289,"column":256},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":296,"column":171},{"message":"Method name \"parse_function_arguments\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":313,"column":22},{"message":"Method name \"replace_wikitext_and_html\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":367,"column":22},{"message":"Method name \"hidden_input\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":396,"column":22},{"message":"Method name \"ci_form_section_process\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":405,"column":22},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":437,"column":124},{"message":"Line exceeds 120 characters; contains 155 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":438,"column":155},{"message":"Line exceeds 120 characters; contains 139 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":464,"column":139},{"message":"Line exceeds 120 characters; contains 139 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":467,"column":139},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":555,"column":133},{"message":"Line exceeds 120 characters; contains 193 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":603,"column":193},{"message":"Line exceeds 120 characters; contains 153 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":607,"column":153},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":614,"column":128},{"message":"Line exceeds 120 characters; contains 143 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":616,"column":143},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":619,"column":122},{"message":"Line exceeds 120 characters; contains 140 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":628,"column":140},{"message":"Line exceeds 120 characters; contains 214 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":635,"column":214},{"message":"Line exceeds 120 characters; contains 137 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":641,"column":137},{"message":"Line exceeds 120 characters; contains 258 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":645,"column":258},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":654,"column":122},{"message":"Line exceeds 120 characters; contains 123 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":659,"column":123},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":672,"column":122},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":673,"column":128},{"message":"Line exceeds 120 characters; contains 168 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":688,"column":29},{"message":"Line exceeds 120 characters; contains 189 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":689,"column":29},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":696,"column":38},{"message":"Line exceeds 120 characters; contains 168 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":706,"column":168},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":732,"column":38},{"message":"Line exceeds 120 characters; contains 130 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":765,"column":130},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":777,"column":126},{"message":"Line exceeds 120 characters; contains 148 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":805,"column":148},{"message":"Line exceeds 120 characters; contains 127 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":811,"column":127},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":829,"column":42},{"message":"Method name \"ci_form_parse_input_symbol\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":845,"column":19},{"message":"Method name \"ci_form_section\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":893,"column":19},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":905,"column":13}]},"\/src\/repo\/includes\/specials\/CIFormsManage.php":{"errors":7,"warnings":24,"messages":[{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":37,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":38,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":39,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":40,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":41,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":42,"column":13},{"message":"Missing class property doc comment","source":"MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate","severity":5,"fixable":false,"type":"ERROR","line":43,"column":13},{"message":"Should use function $this->getConfig()->get() rather than global $wgDBprefix","source":"MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage","severity":5,"fixable":false,"type":"WARNING","line":99,"column":16},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":217,"column":58},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":264,"column":19},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":266,"column":50},{"message":"Line exceeds 120 characters; contains 123 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":316,"column":88},{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":549,"column":135},{"message":"Line exceeds 120 characters; contains 152 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":693,"column":152},{"message":"Line exceeds 120 characters; contains 123 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":708,"column":20},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":750,"column":37},{"message":"Variable assignment found within a condition. Did you mean to do a comparison ?","source":"Generic.CodeAnalysis.AssignmentInCondition.Found","severity":5,"fixable":false,"type":"WARNING","line":826,"column":45},{"message":"Comments should start on new line.","source":"MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment","severity":5,"fixable":false,"type":"WARNING","line":885,"column":74},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":913,"column":146},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":922,"column":146},{"message":"Line exceeds 120 characters; contains 180 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1009,"column":180},{"message":"Line exceeds 120 characters; contains 127 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1056,"column":127},{"message":"Line exceeds 120 characters; contains 154 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1058,"column":154},{"message":"Line exceeds 120 characters; contains 136 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1065,"column":136},{"message":"Line exceeds 120 characters; contains 147 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1079,"column":147},{"message":"Line exceeds 120 characters; contains 139 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1083,"column":139},{"message":"Line exceeds 120 characters; contains 168 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1100,"column":168},{"message":"Line exceeds 120 characters; contains 139 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1104,"column":139},{"message":"Line exceeds 120 characters; contains 229 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1107,"column":229},{"message":"Line exceeds 120 characters; contains 151 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1111,"column":151},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1137,"column":171}]}}}

--- end ---
$ git checkout .phpcs.xml
--- stderr ---
Updated 1 path from the index
--- stdout ---

--- end ---
$ /usr/bin/composer install
--- stderr ---
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Nothing to install, update or remove
Generating autoload files
18 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---

--- end ---
$ /usr/bin/composer test
--- stderr ---
> parallel-lint . --exclude vendor --exclude node_modules
> phpcs -sp --cache
> minus-x check .
--- stdout ---
PHP 8.2.28 | 10 parallel jobs
........                                                     8/8 (100%)


Checked 8 files in 0.1 seconds
No syntax error found
........ 8 / 8 (100%)


Time: 113ms; Memory: 8MB

MinusX
======
Processing /src/repo...
.......................................
All good!

--- 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": 411,
      "optional": 0,
      "peer": 1,
      "peerOptional": 0,
      "total": 411
    }
  }
}

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
build: Updating dependencies

composer:
* mediawiki/mediawiki-codesniffer: 46.0.0 → 47.0.0

npm:
* eslint-config-wikimedia: 0.28.2 → 0.30.0
  The following rules are failing and were disabled:
  * no-var


Additional changes:
* eslint: Replaced `wikimedia/client-es5` with `wikimedia/client`.

$ git add .
--- stdout ---

--- end ---
$ git commit -F /tmp/tmpn3qqbu49
--- stdout ---
[master 21e3fba] build: Updating dependencies
 7 files changed, 90 insertions(+), 86 deletions(-)

--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 21e3fbabe8ad68a42e07742fe0979ae10cde4731 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Fri, 6 Jun 2025 00:38:55 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

composer:
* mediawiki/mediawiki-codesniffer: 46.0.0 → 47.0.0

npm:
* eslint-config-wikimedia: 0.28.2 → 0.30.0
  The following rules are failing and were disabled:
  * no-var

Additional changes:
* eslint: Replaced `wikimedia/client-es5` with `wikimedia/client`.

Change-Id: I3627eb04d0ef929fdb5dc0744f6d697d877a48c0
---
 .eslintrc.json          |  5 ++-
 Gruntfile.js            |  2 +-
 composer.json           |  2 +-
 package-lock.json       | 33 ++++++++-------
 package.json            |  2 +-
 resources/manage.js     | 42 +++++++++----------
 resources/validation.js | 90 ++++++++++++++++++++---------------------
 7 files changed, 90 insertions(+), 86 deletions(-)

diff --git a/.eslintrc.json b/.eslintrc.json
index 115c8ff..de60734 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,13 +1,14 @@
 {
 	"root": true,
 	"extends": [
-		"wikimedia/client-es5",
+		"wikimedia/client",
 		"wikimedia/mediawiki"
 	],
 	"rules": {
 		"camelcase": "off",
 		"no-alert": "off",
 		"no-undef": "off",
-		"no-unused-vars": "off"
+		"no-unused-vars": "off",
+		"no-var": "warn"
 	}
 }
diff --git a/Gruntfile.js b/Gruntfile.js
index d2e7a8f..159b532 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,6 +1,6 @@
 /* eslint-env node, es6 */
 module.exports = function ( grunt ) {
-	var conf = grunt.file.readJSON( 'extension.json' );
+	const conf = grunt.file.readJSON( 'extension.json' );
 
 	grunt.loadNpmTasks( 'grunt-banana-checker' );
 	grunt.loadNpmTasks( 'grunt-eslint' );
diff --git a/composer.json b/composer.json
index 4a82507..b070910 100644
--- a/composer.json
+++ b/composer.json
@@ -5,7 +5,7 @@
 		"phpoffice/phpspreadsheet": "^1.29"
 	},
 	"require-dev": {
-		"mediawiki/mediawiki-codesniffer": "46.0.0",
+		"mediawiki/mediawiki-codesniffer": "47.0.0",
 		"mediawiki/mediawiki-phan-config": "0.15.1",
 		"mediawiki/minus-x": "1.1.3",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
diff --git a/package-lock.json b/package-lock.json
index 5f55465..6ccf1ca 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,7 @@
 		"": {
 			"name": "CIForms",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.28.2",
+				"eslint-config-wikimedia": "0.30.0",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.13.0",
 				"grunt-eslint": "24.3.0",
@@ -1437,9 +1437,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.30.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.30.0.tgz",
+			"integrity": "sha512-i8ESzSoo0x3Jur/0JhAgCVPxbV51zfdI3MN3MVQPnjiFdmo21CNKmiBBmw8JnJ3fx/d5zHDrBa+yDjxSLpnDlA==",
 			"dev": true,
 			"dependencies": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -1452,13 +1452,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": {
@@ -1656,9 +1659,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
-			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+			"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"
@@ -6010,9 +6013,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.30.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.30.0.tgz",
+			"integrity": "sha512-i8ESzSoo0x3Jur/0JhAgCVPxbV51zfdI3MN3MVQPnjiFdmo21CNKmiBBmw8JnJ3fx/d5zHDrBa+yDjxSLpnDlA==",
 			"dev": true,
 			"requires": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -6025,7 +6028,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",
@@ -6160,9 +6163,9 @@
 			}
 		},
 		"eslint-plugin-no-jquery": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
-			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+			"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 94734e7..ea293b4 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.28.2",
+		"eslint-config-wikimedia": "0.30.0",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.13.0",
 		"grunt-eslint": "24.3.0",
diff --git a/resources/manage.js b/resources/manage.js
index 1b105f9..b57e531 100644
--- a/resources/manage.js
+++ b/resources/manage.js
@@ -19,18 +19,18 @@
  * @copyright Copyright © 2021-2024, https://wikisphere.org
  */
 
-$( document ).ready( function () {
+$( document ).ready( () => {
 	// display every 3 days
 	if ( !mw.cookie.get( 'ciforms-check-latest-version' ) ) {
-		mw.loader.using( 'mediawiki.api', function () {
+		mw.loader.using( 'mediawiki.api', () => {
 			new mw.Api()
 				.postWithToken( 'csrf', {
 					action: 'ciforms-check-latest-version'
 				} )
-				.done( function ( res ) {
+				.done( ( res ) => {
 					if ( 'ciforms-check-latest-version' in res ) {
 						if ( res[ 'ciforms-check-latest-version' ].result === 2 ) {
-							var messageWidget = new OO.ui.MessageWidget( {
+							const messageWidget = new OO.ui.MessageWidget( {
 								type: 'warning',
 								label: new OO.ui.HtmlSnippet(
 									mw.msg( 'ciforms-jsmodule-outdated-version' )
@@ -38,8 +38,8 @@ $( document ).ready( function () {
 								// *** this does not work before ooui v0.43.0
 								showClose: true
 							} );
-							var closeFunction = function () {
-								var three_days = 3 * 86400;
+							const closeFunction = function () {
+								const three_days = 3 * 86400;
 								mw.cookie.set( 'ciforms-check-latest-version', true, {
 									path: '/',
 									expires: three_days
@@ -59,7 +59,7 @@ $( document ).ready( function () {
 								messageWidget.$element.addClass(
 									'oo-ui-messageWidget-showClose'
 								);
-								var closeButton = new OO.ui.ButtonWidget( {
+								const closeButton = new OO.ui.ButtonWidget( {
 									classes: [ 'oo-ui-messageWidget-close' ],
 									framed: false,
 									icon: 'close',
@@ -80,20 +80,20 @@ $( document ).ready( function () {
 	// var checkBox = OO.ui.infuse( $( this ) );
 	// } );
 
-	var selected = false;
-	$( '#ci-forms-manage-pager-button-select-all' ).on( 'click', function ( evt ) {
+	let selected = false;
+	$( '#ci-forms-manage-pager-button-select-all' ).on( 'click', ( evt ) => {
 		selected = !selected;
 		$( '.ciforms-manage-button-select' ).each( function () {
 			// @see https://www.mediawiki.org/wiki/OOUI/Using_OOUI_in_MediaWiki
-			var checkBox = OO.ui.infuse( $( this ) );
+			const checkBox = OO.ui.infuse( $( this ) );
 			checkBox.setSelected( selected );
 		} );
 	} );
 
-	$( '#ci-forms-manage-pager-button-delete-selected' ).on( 'click', function ( evt ) {
-		var arr = [];
+	$( '#ci-forms-manage-pager-button-delete-selected' ).on( 'click', ( evt ) => {
+		const arr = [];
 		$( '.ciforms-manage-button-select' ).each( function () {
-			var checkBox = OO.ui.infuse( $( this ) );
+			const checkBox = OO.ui.infuse( $( this ) );
 			if ( checkBox.isSelected() ) {
 				arr.push( checkBox.getData().id );
 			}
@@ -107,8 +107,8 @@ $( document ).ready( function () {
 			return false;
 		}
 
-		var url = window.location.href;
-		var form = $( '<form>', {
+		const url = window.location.href;
+		const form = $( '<form>', {
 			action: window.location.href,
 			method: 'POST'
 			// 'target': '_top'
@@ -122,11 +122,11 @@ $( document ).ready( function () {
 	} );
 
 	$( '.ciforms-manage-button-export' ).each( function () {
-		var $buttonExport = $( this );
+		const $buttonExport = $( this );
 
-		var href = $buttonExport.data().ooui.href;
+		const href = $buttonExport.data().ooui.href;
 
-		var buttonMenu = new OO.ui.ButtonMenuSelectWidget( {
+		const buttonMenu = new OO.ui.ButtonMenuSelectWidget( {
 			label: mw.msg( 'ci-forms-manage-pager-button-export' ),
 			icon: 'menu',
 			flags: [ 'progressive', 'primary' ],
@@ -144,14 +144,14 @@ $( document ).ready( function () {
 			}
 		} );
 
-		var panelLayout = new OO.ui.PanelLayout( {
+		const panelLayout = new OO.ui.PanelLayout( {
 			padded: false,
 			expanded: false,
 			classes: [ 'ci-forms-manage-pager-panel-layout' ]
 		} );
 
-		buttonMenu.getMenu().on( 'choose', function ( menuOption ) {
-			var data = menuOption.getData();
+		buttonMenu.getMenu().on( 'choose', ( menuOption ) => {
+			const data = menuOption.getData();
 			window.location.assign( href.replace( 'format=csv', 'format=' + data ) );
 		} );
 
diff --git a/resources/validation.js b/resources/validation.js
index d6c7e5b..665749f 100644
--- a/resources/validation.js
+++ b/resources/validation.js
@@ -19,12 +19,12 @@
  * @copyright Copyright © 2021-2024, https://wikisphere.org
  */
 
-$( function () {
-	var msg1 = mw.config.get( 'ci-forms-validation-msg1' );
-	var msg2 = mw.config.get( 'ci-forms-validation-msg2' );
+$( () => {
+	const msg1 = mw.config.get( 'ci-forms-validation-msg1' );
+	const msg2 = mw.config.get( 'ci-forms-validation-msg2' );
 	// var msg3 = mw.config.get( 'ci-forms-validation-msg3' );
 
-	var currentSection = {};
+	const currentSection = {};
 
 	function escape( s ) {
 		return String( s )
@@ -35,29 +35,29 @@ $( function () {
 			.replace( />/g, '\x3E' );
 	}
 
-	var site_key = mw.config.get( 'ci_forms_google_recaptcha_site_key' );
+	const site_key = mw.config.get( 'ci_forms_google_recaptcha_site_key' );
 
 	// @see https://www.mediawiki.org/wiki/Topic:Y2pfh94nkkqzsjw3
 	function executeRecaptchaValidation() {
 		mw.loader
 			.getScript( 'https://www.google.com/recaptcha/api.js?render=' + site_key )
 			.then(
-				function () {
+				() => {
 					if ( $( 'input[name="g-recaptcha-response"]' ).length ) {
-						grecaptcha.ready( function () {
+						grecaptcha.ready( () => {
 							grecaptcha
 								.execute( site_key, { action: 'validate_captcha' } )
-								.then( function ( token ) {
+								.then( ( token ) => {
 									$( 'input[name="g-recaptcha-response"]' ).val( token );
 								} )
-								.catch( function ( error ) {
+								.catch( ( error ) => {
 									// eslint-disable-next-line no-console
 									console.log( error );
 								} );
 						} );
 					}
 				},
-				function ( e ) {
+				( e ) => {
 					mw.log.error( e.message );
 				}
 			);
@@ -71,7 +71,7 @@ $( function () {
 	}
 
 	$( '.ci_form' ).each( function ( index ) {
-		var paging = $( this )
+		const paging = $( this )
 			.find( 'input[type=hidden][name=form_paging]' )
 			.first()
 			.val();
@@ -92,19 +92,19 @@ $( function () {
 	} );
 
 	$( '.ci_form li' ).each( function ( index ) {
-		var el = this;
-		var section_el = $( this ).closest( '.ci_form_section' );
-		var radioForCheckboxes = $( section_el )
+		const el = this;
+		const section_el = $( this ).closest( '.ci_form_section' );
+		const radioForCheckboxes = $( section_el )
 			.find( '.radio_for_required_checkboxes' )
 			.first();
-		var max_answers = $( section_el )
+		const max_answers = $( section_el )
 			.find( 'input[type=hidden][name$=_multiple-choice-max-answers]' )
 			.val();
 
 		$( this )
 			.find( 'input[type=text]' )
 			.on( 'click', function () {
-				var count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;
+				const count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;
 
 				if ( count > max_answers ) {
 					alert( msg1.replace( '$1', max_answers ) );
@@ -123,8 +123,8 @@ $( function () {
 
 		$( this )
 			.find( 'input[type=checkbox]' )
-			.on( 'click', function () {
-				var count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;
+			.on( 'click', () => {
+				const count = $( section_el ).find( 'input[type=checkbox]:checked' ).length;
 
 				if ( count > max_answers ) {
 					alert( msg1.replace( '$1', max_answers ) );
@@ -136,14 +136,14 @@ $( function () {
 
 	// https://stackoverflow.com/questions/15031513/jquery-help-to-enforce-maxlength-on-textarea
 	$( '.ci_form textarea[maxlength]' ).on( 'keyup', function () {
-		var limit = parseInt( $( this ).attr( 'maxlength' ) );
-		var text = $( this ).val();
-		var chars = text.length;
+		const limit = parseInt( $( this ).attr( 'maxlength' ) );
+		const text = $( this ).val();
+		const chars = text.length;
 
 		$( this )
 			.parents()
 			.each( function () {
-				var span = $( this )
+				const span = $( this )
 					.find( '.ci_form_section_inputs_textarea_maxlength' )
 					.first();
 
@@ -153,7 +153,7 @@ $( function () {
 			} );
 
 		if ( chars > limit ) {
-			var new_text = text.slice( 0, Math.max( 0, limit ) );
+			const new_text = text.slice( 0, Math.max( 0, limit ) );
 			$( this ).val( new_text );
 		}
 	} );
@@ -168,16 +168,16 @@ $( function () {
 	// is triggered after the native validation
 
 	$( '.ci_form input[type=radio]' ).on( 'click', function () {
-		var section_el = $( this ).closest( '.ci_form_section' );
+		const section_el = $( this ).closest( '.ci_form_section' );
 
 		$( section_el )
 			.find( 'li' )
 			.each( function () {
-				var el = this;
+				const el = this;
 
 				$( this )
 					.find( 'input[type=radio][name$=_selected]:checked' )
-					.each( function () {
+					.each( () => {
 						$( el )
 							.find( 'input[type=text][data-required="1"]' )
 							.prop( 'required', true );
@@ -185,23 +185,23 @@ $( function () {
 
 				$( this )
 					.find( 'input[type=radio][name$=_selected]:not(:checked)' )
-					.each( function () {
+					.each( () => {
 						$( el ).find( 'input[type=text]' ).removeAttr( 'required' );
 					} );
 			} );
 	} );
 
 	$( '.ci_form input[type=checkbox]' ).on( 'click', function () {
-		var section_el = $( this ).closest( '.ci_form_section' );
+		const section_el = $( this ).closest( '.ci_form_section' );
 
 		$( section_el )
 			.find( 'li' )
 			.each( function () {
-				var el = this;
+				const el = this;
 
 				$( this )
 					.find( 'input[type=checkbox][name$=_selected]:checked' )
-					.each( function () {
+					.each( () => {
 						$( el )
 							.find( 'input[type=text][data-required="1"]' )
 							.prop( 'required', true );
@@ -209,16 +209,16 @@ $( function () {
 
 				$( this )
 					.find( 'input[type=checkbox][name$=_selected]:not(:checked)' )
-					.each( function () {
+					.each( () => {
 						$( el ).find( 'input[type=text]' ).removeAttr( 'required' );
 					} );
 			} );
 	} );
 
 	$( '.ci_form_section_submit button' ).on( 'click', function ( evt ) {
-		var form_el = $( this ).closest( '.ci_form' );
+		const form_el = $( this ).closest( '.ci_form' );
 
-		var next = $( this ).prop( 'class' ).indexOf( 'next' ) !== -1;
+		const next = $( this ).prop( 'class' ).includes( 'next' );
 
 		if ( next ) {
 			return;
@@ -226,10 +226,10 @@ $( function () {
 
 		form_el.get( 0 ).scrollIntoView();
 
-		var index = form_el.data( 'form-index' );
-		var current_section = currentSection[ index ] + ( next ? 1 : -1 );
+		const index = form_el.data( 'form-index' );
+		const current_section = currentSection[ index ] + ( next ? 1 : -1 );
 
-		var count =
+		const count =
 			$( form_el ).find( "[class^='ci_form_section_display_']" ).length - 1;
 
 		// $(form_el).find(".ci_form_section").length - 1;
@@ -272,16 +272,16 @@ $( function () {
 	} );
 
 	$( '.ci_form' ).on( 'submit', function ( evt ) {
-		var form_el = $( this );
+		const form_el = $( this );
 
 		form_el.get( 0 ).scrollIntoView();
 
-		var paging = $( this )
+		const paging = $( this )
 			.find( 'input[type=hidden][name=form_paging]' )
 			.first()
 			.val();
 
-		var index, current_section, count;
+		let index, current_section, count;
 
 		if ( paging && paging !== 'false' ) {
 			index = form_el.data( 'form-index' );
@@ -291,7 +291,7 @@ $( function () {
 			// $(form_el).find(".ci_form_section").length - 1;
 		}
 
-		var preventSubmit = false;
+		let preventSubmit = false;
 		$( this )
 			.find(
 				( paging && paging !== 'false' ?
@@ -299,15 +299,15 @@ $( function () {
 					'' ) + '.ci_form_section'
 			)
 			.each( function () {
-				var section_type = $( this )
+				const section_type = $( this )
 					.find( 'input[type=hidden][name$=_section_type]' )
 					.val();
 
-				var min_answers = $( this )
+				const min_answers = $( this )
 					.find( 'input[type=hidden][name$=_multiple-choice-min-answers]' )
 					.val();
 
-				var question_name = $( this ).find( '.ci_form_section_title' ).text();
+				let question_name = $( this ).find( '.ci_form_section_title' ).text();
 
 				if ( !question_name ) {
 					question_name = $( form_el ).find( '.ci_form_title' ).text();
@@ -321,7 +321,7 @@ $( function () {
 						$( this )
 							.find( 'input[type=text][name$=_value]' )
 							.each( function () {
-								var val = $( this ).val().trim();
+								const val = $( this ).val().trim();
 
 								if ( val !== '' && val !== null ) {
 									filledIn++;
@@ -345,7 +345,7 @@ $( function () {
 
 					case 'multiple choice':
 						if ( min_answers ) {
-							var checked = $( this ).find(
+							const checked = $( this ).find(
 								'input[type=checkbox][name$=_selected]:checked'
 							).length;
 							if ( checked < min_answers ) {
-- 
2.39.5


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