mediawiki/extensions/PageForms: main (log #1231743)

sourcepatches

This run took 58 seconds.

From 9d8a4f01422fa7ff1f4669c9481ab301c2021118 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Sat, 6 Apr 2024 08:51:33 +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: 41.0.0 → 43.0.0
  The following sniffs are failing and were disabled:
  * Generic.CodeAnalysis.AssignmentInCondition.Found
  * Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition

  The following sniffs now pass and were enabled:
  * MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures

* mediawiki/mediawiki-phan-config: 0.12.1 → 0.14.0

npm:
* grunt-banana-checker: 0.11.0 → 0.11.1
* grunt-eslint: 24.0.1 → 24.3.0
* eslint-plugin-compat: 4.0.2 → 4.2.0
  * https://github.com/advisories/GHSA-c2qf-rxjj-qqgw
* semver: 5.7.1, 6.3.0, 7.3.5, 7.3.8 → 5.7.2, 6.3.1, 7.6.0
  * https://github.com/advisories/GHSA-c2qf-rxjj-qqgw

Change-Id: I4d6f5d6ce04f554ec517476f9f1b5c1e7bb317e9
---
 .phpcs.xml                                    |   3 +-
 composer.json                                 |   7 +-
 includes/PF_AutoeditAPI.php                   |   4 +-
 includes/PF_FormField.php                     |   2 +-
 includes/PF_FormLinker.php                    |   2 +-
 includes/PF_FormPrinter.php                   |  32 +-
 includes/PF_Hooks.php                         |   2 +-
 includes/PF_MappingUtils.php                  |   2 +-
 includes/PF_PageSection.php                   |  24 +-
 includes/PF_Template.php                      |   4 +-
 includes/PF_TemplateInForm.php                |   4 +-
 includes/PF_ValuesUtils.php                   |   6 +-
 includes/forminputs/PF_ComboBoxInput.php      |   2 +-
 includes/forminputs/PF_DateInput.php          |   2 +-
 includes/forminputs/PF_DatePickerInput.php    |   2 +-
 includes/forminputs/PF_DateTimePicker.php     |   2 +-
 includes/forminputs/PF_LeafletInput.php       |   2 +-
 includes/forminputs/PF_OpenLayersInput.php    |   2 +-
 includes/forminputs/PF_TokensInput.php        |   2 +-
 .../parserfunctions/PF_TemplateDisplay.php    |   2 +-
 .../parserfunctions/PF_TemplateParams.php     |   2 +-
 package-lock.json                             | 650 +++++++++---------
 package.json                                  |   4 +-
 specials/PF_CreateForm.php                    |   2 +-
 specials/PF_CreateTemplate.php                |   2 +-
 specials/PF_RunQuery.php                      |   2 +-
 specials/PF_UploadWindow.php                  |  88 +--
 .../includes/PFFormPrinterTest.php            |   6 +-
 .../forminputs/PFRadioButtonInputTest.php     |   6 +-
 29 files changed, 430 insertions(+), 440 deletions(-)

diff --git a/.phpcs.xml b/.phpcs.xml
index 3e3cf53..d5853e8 100644
--- a/.phpcs.xml
+++ b/.phpcs.xml
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ruleset>
 	<rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
+		<exclude name="Generic.CodeAnalysis.AssignmentInCondition.Found" />
+		<exclude name="Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition" />
 		<exclude name="Generic.Files.LineLength.TooLong" />
 		<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate" />
 		<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected" />
@@ -9,7 +11,6 @@
 		<exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationProtected" />
 		<exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPublic" />
 		<exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingVar" />
-		<exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
 		<exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
 		<exclude name="MediaWiki.Usage.DeprecatedGlobalVariables.Deprecated$wgTitle" />
 		<exclude name="MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage" />
diff --git a/composer.json b/composer.json
index 78e2d88..c60ea6f 100644
--- a/composer.json
+++ b/composer.json
@@ -34,8 +34,8 @@
 		}
 	},
 	"require-dev": {
-		"mediawiki/mediawiki-codesniffer": "41.0.0",
-		"mediawiki/mediawiki-phan-config": "0.12.1",
+		"mediawiki/mediawiki-codesniffer": "43.0.0",
+		"mediawiki/mediawiki-phan-config": "0.14.0",
 		"mediawiki/minus-x": "1.1.1",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
 		"php-parallel-lint/php-parallel-lint": "1.3.2"
@@ -56,7 +56,8 @@
 	},
 	"config": {
 		"allow-plugins": {
-			"composer/installers": true
+			"composer/installers": true,
+			"dealerdirect/phpcodesniffer-composer-installer": true
 		}
 	}
 }
diff --git a/includes/PF_AutoeditAPI.php b/includes/PF_AutoeditAPI.php
index 74f0162..d63068f 100644
--- a/includes/PF_AutoeditAPI.php
+++ b/includes/PF_AutoeditAPI.php
@@ -940,7 +940,7 @@ class PFAutoeditAPI extends ApiBase {
 			$wgRequest = new FauxRequest( $this->mOptions, true, $session );
 			// Call PFFormPrinter::formHTML() to get at the form
 			// HTML of the existing page.
-			list( $formHTML, $targetContent, $form_page_title, $generatedTargetNameFormula ) =
+			[ $formHTML, $targetContent, $form_page_title, $generatedTargetNameFormula ] =
 				$wgPageFormsFormPrinter->formHTML(
 					// Special handling for autoedit edits -
 					// otherwise, multi-instance templates
@@ -976,7 +976,7 @@ class PFAutoeditAPI extends ApiBase {
 			// Spoof $wgRequest for PFFormPrinter::formHTML().
 			$session = RequestContext::getMain()->getRequest()->getSession();
 			$wgRequest = new FauxRequest( $this->mOptions, true, $session );
-			list( $formHTML, $targetContent, $generatedFormName, $generatedTargetNameFormula ) =
+			[ $formHTML, $targetContent, $generatedFormName, $generatedTargetNameFormula ] =
 				$wgPageFormsFormPrinter->formHTML(
 					$formContent, $isFormSubmitted, $pageExists,
 					$formArticleId, $preloadContent, $targetName, $targetNameFormula,
diff --git a/includes/PF_FormField.php b/includes/PF_FormField.php
index 1f26012..a946bea 100644
--- a/includes/PF_FormField.php
+++ b/includes/PF_FormField.php
@@ -789,7 +789,7 @@ class PFFormField {
 			if ( $fullCargoField != null ) {
 				// It's inefficient to get these values via
 				// text parsing, but oh well.
-				list( $cargo_table, $cargo_field ) = explode( '|', $fullCargoField, 2 );
+				[ $cargo_table, $cargo_field ] = explode( '|', $fullCargoField, 2 );
 				$text .= Html::hidden( 'input_' . $wgPageFormsFieldNum . '_unique_cargo_table', $cargo_table );
 				$text .= Html::hidden( 'input_' . $wgPageFormsFieldNum . '_unique_cargo_field', $cargo_field );
 			}
diff --git a/includes/PF_FormLinker.php b/includes/PF_FormLinker.php
index d0ca5e5..cc8252d 100644
--- a/includes/PF_FormLinker.php
+++ b/includes/PF_FormLinker.php
@@ -47,7 +47,7 @@ class PFFormLinker {
 		// Allow outside code to set/change the preloaded text.
 		MediaWikiServices::getInstance()->getHookContainer()->run( 'PageForms::EditFormPreloadText', [ &$preloadContent, $title, $formTitle ] );
 
-		list( $formText, $pageText, $formPageTitle, $generatedPageName ) =
+		[ $formText, $pageText, $formPageTitle, $generatedPageName ] =
 			$wgPageFormsFormPrinter->formHTML(
 				$formDefinition, false, false, null, $preloadContent,
 				'Some very long page name that will hopefully never get created ABCDEF123',
diff --git a/includes/PF_FormPrinter.php b/includes/PF_FormPrinter.php
index 2345840..beb1f85 100644
--- a/includes/PF_FormPrinter.php
+++ b/includes/PF_FormPrinter.php
@@ -566,7 +566,7 @@ END;
 
 			$inputType = $formField->getInputType();
 			$gridParamValues = [ 'name' => $templateField->getFieldName() ];
-			list( $autocompletedatatype, $autocompletesettings ) = $this->getSpreadsheetAutocompleteAttributes( $formFieldArgs );
+			[ $autocompletedatatype, $autocompletesettings ] = $this->getSpreadsheetAutocompleteAttributes( $formFieldArgs );
 			if ( $formField->getLabel() !== null ) {
 				$gridParamValues['label'] = $formField->getLabel();
 			}
@@ -1309,12 +1309,12 @@ END;
 								$mappingCargoTable = $form_field->getFieldArg( 'mapping cargo table' );
 								$mappingCargoField = $form_field->getFieldArg( 'mapping cargo field' );
 								$mappingCargoValueField = $form_field->getFieldArg( 'mapping cargo value field' );
-								if ( !$form_submitted && $cur_value !== null && $cur_value !== '' ) {
-									$cur_value = $this->getCargoBasedMapping( $cur_value, $mappingCargoTable, $mappingCargoField, $mappingCargoValueField, $form_field );
-								}
-								if ( $form_submitted && $cur_value_in_template !== null && $cur_value_in_template !== '' ) {
-									$cur_value_in_template = $this->getCargoBasedMapping( $cur_value_in_template, $mappingCargoTable, $mappingCargoValueField, $mappingCargoField, $form_field );
-								}
+							if ( !$form_submitted && $cur_value !== null && $cur_value !== '' ) {
+								$cur_value = $this->getCargoBasedMapping( $cur_value, $mappingCargoTable, $mappingCargoField, $mappingCargoValueField, $form_field );
+							}
+							if ( $form_submitted && $cur_value_in_template !== null && $cur_value_in_template !== '' ) {
+								$cur_value_in_template = $this->getCargoBasedMapping( $cur_value_in_template, $mappingCargoTable, $mappingCargoValueField, $mappingCargoField, $form_field );
+							}
 						}
 						if ( $cur_value !== '' &&
 							( $form_field->hasFieldArg( 'mapping template' ) ||
@@ -1465,15 +1465,15 @@ END;
 							}
 						} elseif ( count( $sub_components ) == 2 ) {
 							switch ( $sub_components[0] ) {
-							case 'label':
-								$input_label = self::getParsedValue( $parser, $sub_components[1] );
-								break;
-							case 'class':
-								$attr['class'] = $sub_components[1];
-								break;
-							case 'style':
-								$attr['style'] = Sanitizer::checkCSS( $sub_components[1] );
-								break;
+								case 'label':
+									$input_label = self::getParsedValue( $parser, $sub_components[1] );
+									break;
+								case 'class':
+									$attr['class'] = $sub_components[1];
+									break;
+								case 'style':
+									$attr['style'] = Sanitizer::checkCSS( $sub_components[1] );
+									break;
 							}
 						}
 					}
diff --git a/includes/PF_Hooks.php b/includes/PF_Hooks.php
index 264b7de..4a6d887 100644
--- a/includes/PF_Hooks.php
+++ b/includes/PF_Hooks.php
@@ -347,7 +347,7 @@ class PFHooks {
 			'<div id="pfForm" class="previewnote" style="font-weight: bold">' . $previewNote . "</div>\n<hr />\n";
 
 		$form_definition = StringUtils::delimiterReplace( '<noinclude>', '</noinclude>', '', $editpage->textbox1 );
-		list( $form_text, $data_text, $form_page_title, $generated_page_name ) =
+		[ $form_text, $data_text, $form_page_title, $generated_page_name ] =
 			$wgPageFormsFormPrinter->formHTML( $form_definition, null, false, null, null, "Page Forms form preview dummy title", null );
 
 		$parserOutput = PFUtils::getParser()->getOutput();
diff --git a/includes/PF_MappingUtils.php b/includes/PF_MappingUtils.php
index 35e5d97..3a64585 100644
--- a/includes/PF_MappingUtils.php
+++ b/includes/PF_MappingUtils.php
@@ -404,7 +404,7 @@ class PFMappingUtils {
 	 * @return string
 	 */
 	private static function removeNSPrefixFromLabel( string $label ) {
-		$labelArr = explode( ':',  trim( $label ) );
+		$labelArr = explode( ':', trim( $label ) );
 		if ( count( $labelArr ) > 1 ) {
 			$prefix = array_shift( $labelArr );
 			$res = implode( ':', $labelArr );
diff --git a/includes/PF_PageSection.php b/includes/PF_PageSection.php
index 591541e..5737954 100644
--- a/includes/PF_PageSection.php
+++ b/includes/PF_PageSection.php
@@ -48,18 +48,18 @@ class PFPageSection {
 
 			if ( count( $sub_components ) === 2 ) {
 				switch ( $sub_components[0] ) {
-				case 'level':
-					$ps->mSectionLevel = $sub_components[1];
-					break;
-				case 'rows':
-				case 'cols':
-				case 'class':
-				case 'editor':
-				case 'placeholder':
-					$ps->mSectionArgs[$sub_components[0]] = $sub_components[1];
-					break;
-				default:
-					// Ignore unknown
+					case 'level':
+						$ps->mSectionLevel = $sub_components[1];
+						break;
+					case 'rows':
+					case 'cols':
+					case 'class':
+					case 'editor':
+					case 'placeholder':
+						$ps->mSectionArgs[$sub_components[0]] = $sub_components[1];
+						break;
+					default:
+						// Ignore unknown
 				}
 			}
 		}
diff --git a/includes/PF_Template.php b/includes/PF_Template.php
index 6176438..0a8c5e2 100644
--- a/includes/PF_Template.php
+++ b/includes/PF_Template.php
@@ -242,7 +242,7 @@ class PFTemplate {
 
 		// First, get the table name, and fields, declared for this
 		// template, if any.
-		list( $tableName, $tableSchema ) = $this->getCargoTableAndSchema( $templateTitle );
+		[ $tableName, $tableSchema ] = $this->getCargoTableAndSchema( $templateTitle );
 		if ( $tableName == null ) {
 			$fieldDescriptions = [];
 		} else {
@@ -365,7 +365,7 @@ class PFTemplate {
 		if ( $tableSchemaString === null ) {
 			// There's no declared table - but see if there's an
 			// attached table.
-			list( $tableName, $isDeclared ) = CargoUtils::getTableNameForTemplate( $templateTitle );
+			[ $tableName, $isDeclared ] = CargoUtils::getTableNameForTemplate( $templateTitle );
 			if ( $tableName == null ) {
 				return [ null, null ];
 			}
diff --git a/includes/PF_TemplateInForm.php b/includes/PF_TemplateInForm.php
index c31b717..02fe94e 100644
--- a/includes/PF_TemplateInForm.php
+++ b/includes/PF_TemplateInForm.php
@@ -78,7 +78,7 @@ class PFTemplateInForm {
 		$tif->mAddButtonText = wfMessage( 'pf_formedit_addanother' )->text();
 
 		if ( array_key_exists( $tif->mTemplateName, $wgPageFormsEmbeddedTemplates ) ) {
-			list( $tif->mEmbedInTemplate, $tif->mEmbedInField ) =
+			[ $tif->mEmbedInTemplate, $tif->mEmbedInField ] =
 				$wgPageFormsEmbeddedTemplates[$tif->mTemplateName];
 			$tif->mPlaceholder = PFFormPrinter::placeholderFormat( $tif->mEmbedInTemplate, $tif->mEmbedInField );
 		}
@@ -381,7 +381,7 @@ class PFTemplateInForm {
 			[ '<nowiki', 'nowiki>' ]
 		];
 		foreach ( $startAndEndTags as $tags ) {
-			list( $startTag, $endTag ) = $tags;
+			[ $startTag, $endTag ] = $tags;
 
 			$startTagLoc = -1;
 			while ( ( $startTagLoc + strlen( $startTag ) < strlen( $str ) ) &&
diff --git a/includes/PF_ValuesUtils.php b/includes/PF_ValuesUtils.php
index 9851815..d3b3f47 100644
--- a/includes/PF_ValuesUtils.php
+++ b/includes/PF_ValuesUtils.php
@@ -661,7 +661,7 @@ SERVICE wikibase:label { bd:serviceParam wikibase:language \"" . $wgLanguageCode
 			if ( count( $arr ) == 3 ) {
 				$names_array = self::getValuesForCargoField( $arr[0], $arr[1], $arr[2] );
 			} else {
-				list( $table_name, $field_name ) = explode( '|', $source_name, 2 );
+				[ $table_name, $field_name ] = explode( '|', $source_name, 2 );
 				$names_array = self::getAllValuesForCargoField( $table_name, $field_name );
 			}
 			// Remove blank/null values from the array.
@@ -794,7 +794,7 @@ SERVICE wikibase:label { bd:serviceParam wikibase:language \"" . $wgLanguageCode
 	 * @return string[]
 	 */
 	public static function setAutocompleteValues( $field_args, $is_list ) {
-		list( $autocompleteFieldType, $autocompletionSource ) =
+		[ $autocompleteFieldType, $autocompletionSource ] =
 			self::getAutocompletionTypeAndSource( $field_args );
 		$autocompleteSettings = $autocompletionSource;
 		if ( $is_list ) {
@@ -912,7 +912,7 @@ SERVICE wikibase:label { bd:serviceParam wikibase:language \"" . $wgLanguageCode
 
 		$rawQuery = $rawQuery . "|named args=yes|link=none|limit=$wgPageFormsMaxAutocompleteValues|searchlabel=";
 		$rawQueryArray = explode( "|", $rawQuery );
-		list( $queryString, $processedParams, $printouts ) = SMWQueryProcessor::getComponentsFromFunctionParams( $rawQueryArray, false );
+		[ $queryString, $processedParams, $printouts ] = SMWQueryProcessor::getComponentsFromFunctionParams( $rawQueryArray, false );
 		SMWQueryProcessor::addThisPrintout( $printouts, $processedParams );
 		$processedParams = SMWQueryProcessor::getProcessedParams( $processedParams, $printouts );
 
diff --git a/includes/forminputs/PF_ComboBoxInput.php b/includes/forminputs/PF_ComboBoxInput.php
index b220c30..64278df 100644
--- a/includes/forminputs/PF_ComboBoxInput.php
+++ b/includes/forminputs/PF_ComboBoxInput.php
@@ -98,7 +98,7 @@ class PFComboBoxInput extends PFFormInput {
 				}
 			}
 		} else {
-			list( $autocompleteSettings, $remoteDataType, $delimiter ) = PFValuesUtils::setAutocompleteValues( $other_args, false );
+			[ $autocompleteSettings, $remoteDataType, $delimiter ] = PFValuesUtils::setAutocompleteValues( $other_args, false );
 			$autocompleteSettings = str_replace( "'", "\'", $autocompleteSettings );
 		}
 
diff --git a/includes/forminputs/PF_DateInput.php b/includes/forminputs/PF_DateInput.php
index c5801c4..ac301eb 100644
--- a/includes/forminputs/PF_DateInput.php
+++ b/includes/forminputs/PF_DateInput.php
@@ -174,7 +174,7 @@ class PFDateInput extends PFFormInput {
 				$month = $date['month'];
 				$day = $date['day'];
 			} else {
-				list( $year, $month, $day ) = self::parseDate( $date );
+				[ $year, $month, $day ] = self::parseDate( $date );
 			}
 		} else {
 			// Just keep everything at null.
diff --git a/includes/forminputs/PF_DatePickerInput.php b/includes/forminputs/PF_DatePickerInput.php
index 6d1f575..ea7283c 100644
--- a/includes/forminputs/PF_DatePickerInput.php
+++ b/includes/forminputs/PF_DatePickerInput.php
@@ -30,7 +30,7 @@ class PFDatePickerInput extends PFFormInput {
 	 */
 	public function __construct( $input_number, $cur_value, $input_name, $disabled, array $other_args ) {
 		if ( $cur_value != '' ) {
-			list( $year, $month, $day ) = PFDateInput::parseDate( $cur_value );
+			[ $year, $month, $day ] = PFDateInput::parseDate( $cur_value );
 			$cur_value = sprintf( '%04d-%02d-%02d', $year, $month, $day );
 		}
 
diff --git a/includes/forminputs/PF_DateTimePicker.php b/includes/forminputs/PF_DateTimePicker.php
index 75fd4ca..097271d 100644
--- a/includes/forminputs/PF_DateTimePicker.php
+++ b/includes/forminputs/PF_DateTimePicker.php
@@ -30,7 +30,7 @@ class PFDateTimePicker extends PFFormInput {
 	 */
 	public function __construct( $input_number, $cur_value, $input_name, $disabled, array $other_args ) {
 		if ( $cur_value != '' ) {
-			list( $year, $month, $day, $time ) = PFDateInput::parseDate( $cur_value, true );
+			[ $year, $month, $day, $time ] = PFDateInput::parseDate( $cur_value, true );
 			$cur_value = sprintf( '%04d-%02d-%02dT%sZ', $year, $month, $day, $time );
 		}
 		parent::__construct( $input_number, $cur_value, $input_name, $disabled, $other_args );
diff --git a/includes/forminputs/PF_LeafletInput.php b/includes/forminputs/PF_LeafletInput.php
index 10b695a..bbee11a 100644
--- a/includes/forminputs/PF_LeafletInput.php
+++ b/includes/forminputs/PF_LeafletInput.php
@@ -51,7 +51,7 @@ class PFLeafletInput extends PFOpenLayersInput {
 			$imagePage = new ImagePage( $fileTitle );
 			$file = $imagePage->getDisplayedFile();
 			$filePath = $wgUploadDirectory . '/' . $file->getUrlRel();
-			list( $imageWidth, $imageHeight, $type, $attr ) = getimagesize( $filePath );
+			[ $imageWidth, $imageHeight, $type, $attr ] = getimagesize( $filePath );
 			if ( !array_key_exists( 'height', $other_args ) && !array_key_exists( 'width', $other_args ) ) {
 				// Scale down image if it's huge.
 				$maxDimension = max( $imageHeight, $imageWidth );
diff --git a/includes/forminputs/PF_OpenLayersInput.php b/includes/forminputs/PF_OpenLayersInput.php
index b4076ae..cbc4a35 100644
--- a/includes/forminputs/PF_OpenLayersInput.php
+++ b/includes/forminputs/PF_OpenLayersInput.php
@@ -278,7 +278,7 @@ class PFOpenLayersInput extends PFFormInput {
 		if ( count( $latAndLonStrings ) != 2 ) {
 			throw new MWException( "Error parsing coordinates string: \"$coordinatesString\"." );
 		}
-		list( $latString, $lonString ) = $latAndLonStrings;
+		[ $latString, $lonString ] = $latAndLonStrings;
 
 		// Handle strings one at a time.
 		$latIsNegative = false;
diff --git a/includes/forminputs/PF_TokensInput.php b/includes/forminputs/PF_TokensInput.php
index 8309c0a..562a15e 100644
--- a/includes/forminputs/PF_TokensInput.php
+++ b/includes/forminputs/PF_TokensInput.php
@@ -95,7 +95,7 @@ class PFTokensInput extends PFFormInput {
 				$delimiter = ',';
 			}
 		} else {
-			list( $autocompleteSettings, $remoteDataType, $delimiter ) = PFValuesUtils::setAutocompleteValues( $other_args, true );
+			[ $autocompleteSettings, $remoteDataType, $delimiter ] = PFValuesUtils::setAutocompleteValues( $other_args, true );
 		}
 
 		if ( is_array( $cur_value ) ) {
diff --git a/includes/parserfunctions/PF_TemplateDisplay.php b/includes/parserfunctions/PF_TemplateDisplay.php
index 4418599..93f8b23 100644
--- a/includes/parserfunctions/PF_TemplateDisplay.php
+++ b/includes/parserfunctions/PF_TemplateDisplay.php
@@ -171,7 +171,7 @@ class PFTemplateDisplay {
 		$mappingFormat = new CargoMapsFormat( $parser->getOutput() );
 
 		try {
-			list( $lat, $lon ) = CargoUtils::parseCoordinatesString( $coordinatesStr );
+			[ $lat, $lon ] = CargoUtils::parseCoordinatesString( $coordinatesStr );
 		} catch ( MWException $e ) {
 			return '';
 		}
diff --git a/includes/parserfunctions/PF_TemplateParams.php b/includes/parserfunctions/PF_TemplateParams.php
index 5f0df47..b4f3375 100644
--- a/includes/parserfunctions/PF_TemplateParams.php
+++ b/includes/parserfunctions/PF_TemplateParams.php
@@ -33,7 +33,7 @@ class PFTemplateParams {
 
 		$fieldData = [];
 		foreach ( $params as $param ) {
-			list( $fieldName, $fieldParams ) = self::parseWikitextString( $param );
+			[ $fieldName, $fieldParams ] = self::parseWikitextString( $param );
 			if ( $fieldName !== '' ) {
 				$fieldData[$fieldName] = $fieldParams;
 			}
diff --git a/package-lock.json b/package-lock.json
index c55e8b2..fd4d12d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,8 +8,17 @@
 			"devDependencies": {
 				"eslint-config-wikimedia": "0.25.0",
 				"grunt": "1.6.1",
-				"grunt-banana-checker": "0.11.0",
-				"grunt-eslint": "24.0.1"
+				"grunt-banana-checker": "0.11.1",
+				"grunt-eslint": "24.3.0"
+			}
+		},
+		"node_modules/@aashutoshrathi/word-wrap": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+			"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
 			}
 		},
 		"node_modules/@babel/code-frame": {
@@ -109,23 +118,23 @@
 			}
 		},
 		"node_modules/@eslint-community/regexpp": {
-			"version": "4.4.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
-			"integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
+			"version": "4.10.0",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
 			"dev": true,
 			"engines": {
 				"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@eslint/eslintrc": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
-			"integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
+			"version": "2.1.4",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+			"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
 			"dev": true,
 			"dependencies": {
 				"ajv": "^6.12.4",
 				"debug": "^4.3.2",
-				"espree": "^9.5.0",
+				"espree": "^9.6.0",
 				"globals": "^13.19.0",
 				"ignore": "^5.2.0",
 				"import-fresh": "^3.2.1",
@@ -171,22 +180,22 @@
 			}
 		},
 		"node_modules/@eslint/js": {
-			"version": "8.36.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
-			"integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@humanwhocodes/config-array": {
-			"version": "0.11.8",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
-			"integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"dependencies": {
-				"@humanwhocodes/object-schema": "^1.2.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			},
 			"engines": {
@@ -207,15 +216,15 @@
 			}
 		},
 		"node_modules/@humanwhocodes/object-schema": {
-			"version": "1.2.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
-			"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"node_modules/@mdn/browser-compat-data": {
-			"version": "4.2.1",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz",
-			"integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==",
+			"version": "5.5.19",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.19.tgz",
+			"integrity": "sha512-ntKBZtwWCy4XvJosdTJKqIMdmzgbxjopfoiMxgpzsml3dXqA7MIHCE/amidfQc06a6KvmMrpiVuYHIBt2feDog==",
 			"dev": true
 		},
 		"node_modules/@nodelib/fs.scandir": {
@@ -259,6 +268,12 @@
 			"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
 			"dev": true
 		},
+		"node_modules/@ungap/structured-clone": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+			"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+			"dev": true
+		},
 		"node_modules/abbrev": {
 			"version": "1.1.1",
 			"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -266,9 +281,9 @@
 			"dev": true
 		},
 		"node_modules/acorn": {
-			"version": "8.8.2",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
-			"integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+			"version": "8.11.3",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+			"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
 			"dev": true,
 			"bin": {
 				"acorn": "bin/acorn"
@@ -357,20 +372,14 @@
 			}
 		},
 		"node_modules/ast-metadata-inferer": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.7.0.tgz",
-			"integrity": "sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q==",
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
+			"integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
 			"dev": true,
 			"dependencies": {
-				"@mdn/browser-compat-data": "^3.3.14"
+				"@mdn/browser-compat-data": "^5.2.34"
 			}
 		},
-		"node_modules/ast-metadata-inferer/node_modules/@mdn/browser-compat-data": {
-			"version": "3.3.14",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz",
-			"integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==",
-			"dev": true
-		},
 		"node_modules/async": {
 			"version": "3.2.3",
 			"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
@@ -412,9 +421,9 @@
 			}
 		},
 		"node_modules/browserslist": {
-			"version": "4.20.3",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
-			"integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -424,14 +433,17 @@
 				{
 					"type": "tidelift",
 					"url": "https://tidelift.com/funding/github/npm/browserslist"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001332",
-				"electron-to-chromium": "^1.4.118",
-				"escalade": "^3.1.1",
-				"node-releases": "^2.0.3",
-				"picocolors": "^1.0.0"
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
+				"node-releases": "^2.0.14",
+				"update-browserslist-db": "^1.0.13"
 			},
 			"bin": {
 				"browserslist": "cli.js"
@@ -468,9 +480,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001341",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz",
-			"integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==",
+			"version": "1.0.30001606",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz",
+			"integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==",
 			"dev": true,
 			"funding": [
 				{
@@ -480,6 +492,10 @@
 				{
 					"type": "tidelift",
 					"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
 				}
 			]
 		},
@@ -625,17 +641,6 @@
 			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
 			"dev": true
 		},
-		"node_modules/core-js": {
-			"version": "3.22.5",
-			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz",
-			"integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==",
-			"dev": true,
-			"hasInstallScript": true,
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/core-js"
-			}
-		},
 		"node_modules/cross-spawn": {
 			"version": "7.0.3",
 			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -716,9 +721,9 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.137",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz",
-			"integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==",
+			"version": "1.4.729",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz",
+			"integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==",
 			"dev": true
 		},
 		"node_modules/error-ex": {
@@ -731,9 +736,9 @@
 			}
 		},
 		"node_modules/escalade": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-			"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+			"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
 			"dev": true,
 			"engines": {
 				"node": ">=6"
@@ -752,27 +757,28 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "8.36.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
-			"integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.2.0",
-				"@eslint-community/regexpp": "^4.4.0",
-				"@eslint/eslintrc": "^2.0.1",
-				"@eslint/js": "8.36.0",
-				"@humanwhocodes/config-array": "^0.11.8",
+				"@eslint-community/regexpp": "^4.6.1",
+				"@eslint/eslintrc": "^2.1.4",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
-				"ajv": "^6.10.0",
+				"@ungap/structured-clone": "^1.2.0",
+				"ajv": "^6.12.4",
 				"chalk": "^4.0.0",
 				"cross-spawn": "^7.0.2",
 				"debug": "^4.3.2",
 				"doctrine": "^3.0.0",
 				"escape-string-regexp": "^4.0.0",
-				"eslint-scope": "^7.1.1",
-				"eslint-visitor-keys": "^3.3.0",
-				"espree": "^9.5.0",
+				"eslint-scope": "^7.2.2",
+				"eslint-visitor-keys": "^3.4.3",
+				"espree": "^9.6.1",
 				"esquery": "^1.4.2",
 				"esutils": "^2.0.2",
 				"fast-deep-equal": "^3.1.3",
@@ -780,22 +786,19 @@
 				"find-up": "^5.0.0",
 				"glob-parent": "^6.0.2",
 				"globals": "^13.19.0",
-				"grapheme-splitter": "^1.0.4",
+				"graphemer": "^1.4.0",
 				"ignore": "^5.2.0",
-				"import-fresh": "^3.0.0",
 				"imurmurhash": "^0.1.4",
 				"is-glob": "^4.0.0",
 				"is-path-inside": "^3.0.3",
-				"js-sdsl": "^4.1.4",
 				"js-yaml": "^4.1.0",
 				"json-stable-stringify-without-jsonify": "^1.0.1",
 				"levn": "^0.4.1",
 				"lodash.merge": "^4.6.2",
 				"minimatch": "^3.1.2",
 				"natural-compare": "^1.4.0",
-				"optionator": "^0.9.1",
+				"optionator": "^0.9.3",
 				"strip-ansi": "^6.0.1",
-				"strip-json-comments": "^3.1.0",
 				"text-table": "^0.2.0"
 			},
 			"bin": {
@@ -833,22 +836,21 @@
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz",
-			"integrity": "sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg==",
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
+			"integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
 			"dev": true,
 			"dependencies": {
-				"@mdn/browser-compat-data": "^4.1.5",
-				"ast-metadata-inferer": "^0.7.0",
-				"browserslist": "^4.16.8",
-				"caniuse-lite": "^1.0.30001304",
-				"core-js": "^3.16.2",
+				"@mdn/browser-compat-data": "^5.3.13",
+				"ast-metadata-inferer": "^0.8.0",
+				"browserslist": "^4.21.10",
+				"caniuse-lite": "^1.0.30001524",
 				"find-up": "^5.0.0",
-				"lodash.memoize": "4.1.2",
-				"semver": "7.3.5"
+				"lodash.memoize": "^4.1.2",
+				"semver": "^7.5.4"
 			},
 			"engines": {
-				"node": ">=9.x"
+				"node": ">=14.x"
 			},
 			"peerDependencies": {
 				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
@@ -894,21 +896,6 @@
 				"eslint": "^7.0.0 || ^8.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-jsdoc/node_modules/semver": {
-			"version": "7.3.8",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-			"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-			"dev": true,
-			"dependencies": {
-				"lru-cache": "^6.0.0"
-			},
-			"bin": {
-				"semver": "bin/semver.js"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
 		"node_modules/eslint-plugin-json-es": {
 			"version": "1.5.7",
 			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
@@ -1027,9 +1014,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-node/node_modules/semver": {
-			"version": "6.3.0",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-			"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+			"version": "6.3.1",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+			"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
 			"dev": true,
 			"bin": {
 				"semver": "bin/semver.js"
@@ -1220,9 +1207,9 @@
 			}
 		},
 		"node_modules/eslint-scope": {
-			"version": "7.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-			"integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+			"version": "7.2.2",
+			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+			"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
 			"dev": true,
 			"dependencies": {
 				"esrecurse": "^4.3.0",
@@ -1230,6 +1217,9 @@
 			},
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/eslint-utils": {
@@ -1260,12 +1250,15 @@
 			"dev": true
 		},
 		"node_modules/eslint/node_modules/eslint-visitor-keys": {
-			"version": "3.3.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-			"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+			"version": "3.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+			"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/eslint/node_modules/js-yaml": {
@@ -1293,14 +1286,14 @@
 			}
 		},
 		"node_modules/espree": {
-			"version": "9.5.0",
-			"resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
-			"integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
+			"version": "9.6.1",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+			"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
 			"dev": true,
 			"dependencies": {
-				"acorn": "^8.8.0",
+				"acorn": "^8.9.0",
 				"acorn-jsx": "^5.3.2",
-				"eslint-visitor-keys": "^3.3.0"
+				"eslint-visitor-keys": "^3.4.1"
 			},
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1310,12 +1303,15 @@
 			}
 		},
 		"node_modules/espree/node_modules/eslint-visitor-keys": {
-			"version": "3.3.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-			"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+			"version": "3.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+			"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/esprima": {
@@ -1421,7 +1417,7 @@
 		"node_modules/fast-levenshtein": {
 			"version": "2.0.6",
 			"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+			"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
 			"dev": true
 		},
 		"node_modules/fastq": {
@@ -1646,9 +1642,9 @@
 			}
 		},
 		"node_modules/globals": {
-			"version": "13.20.0",
-			"resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
-			"integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+			"version": "13.24.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+			"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
 			"dev": true,
 			"dependencies": {
 				"type-fest": "^0.20.2"
@@ -1660,10 +1656,10 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/grapheme-splitter": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
-			"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+		"node_modules/graphemer": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+			"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
 			"dev": true
 		},
 		"node_modules/grunt": {
@@ -1694,9 +1690,9 @@
 			}
 		},
 		"node_modules/grunt-banana-checker": {
-			"version": "0.11.0",
-			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.0.tgz",
-			"integrity": "sha512-qXtcxu7y9GFEIx6ELm5jSf+JqvCafdco+t/YsrUhUDNe9AgCnP7X0R+PxT0qZaDftKVrDrR2gPOYqpaAye5bDw==",
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz",
+			"integrity": "sha512-CF0h/TXaX9sbF2yIz+fUfJc4Zvms7XGYQ7ZYMD5+vv0LMZzSFf7JSHXDaBEs72nQWw4r4ap5fOW3baAliW+0bQ==",
 			"dev": true,
 			"bin": {
 				"banana-checker": "src/cli.js"
@@ -1738,13 +1734,13 @@
 			}
 		},
 		"node_modules/grunt-eslint": {
-			"version": "24.0.1",
-			"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.1.tgz",
-			"integrity": "sha512-gFzp+ikAkwyu6nqBE2zx1pLVL0JPrerG7jaO4uJV3XUGKPIipv4mfhDOS5MyiMrzUtGdXSW8FkRHjoUnfqbW+g==",
+			"version": "24.3.0",
+			"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.3.0.tgz",
+			"integrity": "sha512-dUPiRgX8fhmh4uwTAn9xrzg7HV5j5DhGmZZGJdHfjy/AN9G4jD+5IjfbcAJ209JcIG8m4B7xz3crIhuDSm3siQ==",
 			"dev": true,
 			"dependencies": {
 				"chalk": "^4.1.2",
-				"eslint": "^8.0.1"
+				"eslint": "^8.44.0"
 			},
 			"engines": {
 				"node": ">=12"
@@ -2087,16 +2083,6 @@
 				"node": ">=0.10.0"
 			}
 		},
-		"node_modules/js-sdsl": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
-			"integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
-			"dev": true,
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/js-sdsl"
-			}
-		},
 		"node_modules/js-tokens": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -2318,9 +2304,9 @@
 			"dev": true
 		},
 		"node_modules/node-releases": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz",
-			"integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==",
+			"version": "2.0.14",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+			"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
 			"dev": true
 		},
 		"node_modules/nopt": {
@@ -2348,9 +2334,9 @@
 			}
 		},
 		"node_modules/normalize-package-data/node_modules/semver": {
-			"version": "5.7.1",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-			"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+			"version": "5.7.2",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+			"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 			"dev": true,
 			"bin": {
 				"semver": "bin/semver"
@@ -2418,17 +2404,17 @@
 			}
 		},
 		"node_modules/optionator": {
-			"version": "0.9.1",
-			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-			"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+			"version": "0.9.3",
+			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+			"integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
 			"dev": true,
 			"dependencies": {
+				"@aashutoshrathi/word-wrap": "^1.2.3",
 				"deep-is": "^0.1.3",
 				"fast-levenshtein": "^2.0.6",
 				"levn": "^0.4.1",
 				"prelude-ls": "^1.2.1",
-				"type-check": "^0.4.0",
-				"word-wrap": "^1.2.3"
+				"type-check": "^0.4.0"
 			},
 			"engines": {
 				"node": ">= 0.8.0"
@@ -2658,9 +2644,9 @@
 			}
 		},
 		"node_modules/punycode": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
-			"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+			"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
 			"dev": true,
 			"engines": {
 				"node": ">=6"
@@ -2936,9 +2922,9 @@
 			"dev": true
 		},
 		"node_modules/semver": {
-			"version": "7.3.5",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-			"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"dependencies": {
 				"lru-cache": "^6.0.0"
@@ -3143,6 +3129,36 @@
 				"yarn": "*"
 			}
 		},
+		"node_modules/update-browserslist-db": {
+			"version": "1.0.13",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+			"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+			"dev": true,
+			"funding": [
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/browserslist"
+				},
+				{
+					"type": "tidelift",
+					"url": "https://tidelift.com/funding/github/npm/browserslist"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
+				}
+			],
+			"dependencies": {
+				"escalade": "^3.1.1",
+				"picocolors": "^1.0.0"
+			},
+			"bin": {
+				"update-browserslist-db": "cli.js"
+			},
+			"peerDependencies": {
+				"browserslist": ">= 4.21.0"
+			}
+		},
 		"node_modules/uri-js": {
 			"version": "4.4.1",
 			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -3231,15 +3247,6 @@
 				"node": ">= 8"
 			}
 		},
-		"node_modules/word-wrap": {
-			"version": "1.2.3",
-			"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-			"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
 		"node_modules/wrappy": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -3298,6 +3305,12 @@
 		}
 	},
 	"dependencies": {
+		"@aashutoshrathi/word-wrap": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+			"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+			"dev": true
+		},
 		"@babel/code-frame": {
 			"version": "7.18.6",
 			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -3372,20 +3385,20 @@
 			}
 		},
 		"@eslint-community/regexpp": {
-			"version": "4.4.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
-			"integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
+			"version": "4.10.0",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
 			"dev": true
 		},
 		"@eslint/eslintrc": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
-			"integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
+			"version": "2.1.4",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+			"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
 			"dev": true,
 			"requires": {
 				"ajv": "^6.12.4",
 				"debug": "^4.3.2",
-				"espree": "^9.5.0",
+				"espree": "^9.6.0",
 				"globals": "^13.19.0",
 				"ignore": "^5.2.0",
 				"import-fresh": "^3.2.1",
@@ -3421,19 +3434,19 @@
 			}
 		},
 		"@eslint/js": {
-			"version": "8.36.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
-			"integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true
 		},
 		"@humanwhocodes/config-array": {
-			"version": "0.11.8",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
-			"integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"requires": {
-				"@humanwhocodes/object-schema": "^1.2.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			}
 		},
@@ -3444,15 +3457,15 @@
 			"dev": true
 		},
 		"@humanwhocodes/object-schema": {
-			"version": "1.2.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
-			"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"@mdn/browser-compat-data": {
-			"version": "4.2.1",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz",
-			"integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==",
+			"version": "5.5.19",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.19.tgz",
+			"integrity": "sha512-ntKBZtwWCy4XvJosdTJKqIMdmzgbxjopfoiMxgpzsml3dXqA7MIHCE/amidfQc06a6KvmMrpiVuYHIBt2feDog==",
 			"dev": true
 		},
 		"@nodelib/fs.scandir": {
@@ -3487,6 +3500,12 @@
 			"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
 			"dev": true
 		},
+		"@ungap/structured-clone": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+			"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+			"dev": true
+		},
 		"abbrev": {
 			"version": "1.1.1",
 			"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -3494,9 +3513,9 @@
 			"dev": true
 		},
 		"acorn": {
-			"version": "8.8.2",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
-			"integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+			"version": "8.11.3",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+			"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
 			"dev": true
 		},
 		"acorn-jsx": {
@@ -3563,20 +3582,12 @@
 			"dev": true
 		},
 		"ast-metadata-inferer": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.7.0.tgz",
-			"integrity": "sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q==",
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
+			"integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
 			"dev": true,
 			"requires": {
-				"@mdn/browser-compat-data": "^3.3.14"
-			},
-			"dependencies": {
-				"@mdn/browser-compat-data": {
-					"version": "3.3.14",
-					"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz",
-					"integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==",
-					"dev": true
-				}
+				"@mdn/browser-compat-data": "^5.2.34"
 			}
 		},
 		"async": {
@@ -3617,16 +3628,15 @@
 			}
 		},
 		"browserslist": {
-			"version": "4.20.3",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
-			"integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001332",
-				"electron-to-chromium": "^1.4.118",
-				"escalade": "^3.1.1",
-				"node-releases": "^2.0.3",
-				"picocolors": "^1.0.0"
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
+				"node-releases": "^2.0.14",
+				"update-browserslist-db": "^1.0.13"
 			}
 		},
 		"browserslist-config-wikimedia": {
@@ -3648,9 +3658,9 @@
 			"dev": true
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001341",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz",
-			"integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==",
+			"version": "1.0.30001606",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz",
+			"integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==",
 			"dev": true
 		},
 		"chalk": {
@@ -3760,12 +3770,6 @@
 			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
 			"dev": true
 		},
-		"core-js": {
-			"version": "3.22.5",
-			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz",
-			"integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==",
-			"dev": true
-		},
 		"cross-spawn": {
 			"version": "7.0.3",
 			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -3820,9 +3824,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.137",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz",
-			"integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==",
+			"version": "1.4.729",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz",
+			"integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==",
 			"dev": true
 		},
 		"error-ex": {
@@ -3835,9 +3839,9 @@
 			}
 		},
 		"escalade": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-			"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+			"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
 			"dev": true
 		},
 		"escape-string-regexp": {
@@ -3847,27 +3851,28 @@
 			"dev": true
 		},
 		"eslint": {
-			"version": "8.36.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
-			"integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.2.0",
-				"@eslint-community/regexpp": "^4.4.0",
-				"@eslint/eslintrc": "^2.0.1",
-				"@eslint/js": "8.36.0",
-				"@humanwhocodes/config-array": "^0.11.8",
+				"@eslint-community/regexpp": "^4.6.1",
+				"@eslint/eslintrc": "^2.1.4",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
-				"ajv": "^6.10.0",
+				"@ungap/structured-clone": "^1.2.0",
+				"ajv": "^6.12.4",
 				"chalk": "^4.0.0",
 				"cross-spawn": "^7.0.2",
 				"debug": "^4.3.2",
 				"doctrine": "^3.0.0",
 				"escape-string-regexp": "^4.0.0",
-				"eslint-scope": "^7.1.1",
-				"eslint-visitor-keys": "^3.3.0",
-				"espree": "^9.5.0",
+				"eslint-scope": "^7.2.2",
+				"eslint-visitor-keys": "^3.4.3",
+				"espree": "^9.6.1",
 				"esquery": "^1.4.2",
 				"esutils": "^2.0.2",
 				"fast-deep-equal": "^3.1.3",
@@ -3875,22 +3880,19 @@
 				"find-up": "^5.0.0",
 				"glob-parent": "^6.0.2",
 				"globals": "^13.19.0",
-				"grapheme-splitter": "^1.0.4",
+				"graphemer": "^1.4.0",
 				"ignore": "^5.2.0",
-				"import-fresh": "^3.0.0",
 				"imurmurhash": "^0.1.4",
 				"is-glob": "^4.0.0",
 				"is-path-inside": "^3.0.3",
-				"js-sdsl": "^4.1.4",
 				"js-yaml": "^4.1.0",
 				"json-stable-stringify-without-jsonify": "^1.0.1",
 				"levn": "^0.4.1",
 				"lodash.merge": "^4.6.2",
 				"minimatch": "^3.1.2",
 				"natural-compare": "^1.4.0",
-				"optionator": "^0.9.1",
+				"optionator": "^0.9.3",
 				"strip-ansi": "^6.0.1",
-				"strip-json-comments": "^3.1.0",
 				"text-table": "^0.2.0"
 			},
 			"dependencies": {
@@ -3901,9 +3903,9 @@
 					"dev": true
 				},
 				"eslint-visitor-keys": {
-					"version": "3.3.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-					"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+					"version": "3.4.3",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+					"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
 					"dev": true
 				},
 				"js-yaml": {
@@ -3951,19 +3953,18 @@
 			}
 		},
 		"eslint-plugin-compat": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz",
-			"integrity": "sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg==",
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
+			"integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
 			"dev": true,
 			"requires": {
-				"@mdn/browser-compat-data": "^4.1.5",
-				"ast-metadata-inferer": "^0.7.0",
-				"browserslist": "^4.16.8",
-				"caniuse-lite": "^1.0.30001304",
-				"core-js": "^3.16.2",
+				"@mdn/browser-compat-data": "^5.3.13",
+				"ast-metadata-inferer": "^0.8.0",
+				"browserslist": "^4.21.10",
+				"caniuse-lite": "^1.0.30001524",
 				"find-up": "^5.0.0",
-				"lodash.memoize": "4.1.2",
-				"semver": "7.3.5"
+				"lodash.memoize": "^4.1.2",
+				"semver": "^7.5.4"
 			}
 		},
 		"eslint-plugin-es-x": {
@@ -3989,17 +3990,6 @@
 				"esquery": "^1.4.0",
 				"semver": "^7.3.7",
 				"spdx-expression-parse": "^3.0.1"
-			},
-			"dependencies": {
-				"semver": {
-					"version": "7.3.8",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-					"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-					"dev": true,
-					"requires": {
-						"lru-cache": "^6.0.0"
-					}
-				}
 			}
 		},
 		"eslint-plugin-json-es": {
@@ -4089,9 +4079,9 @@
 					}
 				},
 				"semver": {
-					"version": "6.3.0",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-					"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+					"version": "6.3.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+					"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
 					"dev": true
 				}
 			}
@@ -4221,9 +4211,9 @@
 			}
 		},
 		"eslint-scope": {
-			"version": "7.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-			"integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+			"version": "7.2.2",
+			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+			"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
 			"dev": true,
 			"requires": {
 				"esrecurse": "^4.3.0",
@@ -4246,20 +4236,20 @@
 			"dev": true
 		},
 		"espree": {
-			"version": "9.5.0",
-			"resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
-			"integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
+			"version": "9.6.1",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+			"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
 			"dev": true,
 			"requires": {
-				"acorn": "^8.8.0",
+				"acorn": "^8.9.0",
 				"acorn-jsx": "^5.3.2",
-				"eslint-visitor-keys": "^3.3.0"
+				"eslint-visitor-keys": "^3.4.1"
 			},
 			"dependencies": {
 				"eslint-visitor-keys": {
-					"version": "3.3.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-					"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+					"version": "3.4.3",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+					"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
 					"dev": true
 				}
 			}
@@ -4342,7 +4332,7 @@
 		"fast-levenshtein": {
 			"version": "2.0.6",
 			"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+			"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
 			"dev": true
 		},
 		"fastq": {
@@ -4521,18 +4511,18 @@
 			}
 		},
 		"globals": {
-			"version": "13.20.0",
-			"resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
-			"integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+			"version": "13.24.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+			"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
 			"dev": true,
 			"requires": {
 				"type-fest": "^0.20.2"
 			}
 		},
-		"grapheme-splitter": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
-			"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+		"graphemer": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+			"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
 			"dev": true
 		},
 		"grunt": {
@@ -4557,9 +4547,9 @@
 			}
 		},
 		"grunt-banana-checker": {
-			"version": "0.11.0",
-			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.0.tgz",
-			"integrity": "sha512-qXtcxu7y9GFEIx6ELm5jSf+JqvCafdco+t/YsrUhUDNe9AgCnP7X0R+PxT0qZaDftKVrDrR2gPOYqpaAye5bDw==",
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz",
+			"integrity": "sha512-CF0h/TXaX9sbF2yIz+fUfJc4Zvms7XGYQ7ZYMD5+vv0LMZzSFf7JSHXDaBEs72nQWw4r4ap5fOW3baAliW+0bQ==",
 			"dev": true
 		},
 		"grunt-cli": {
@@ -4588,13 +4578,13 @@
 			}
 		},
 		"grunt-eslint": {
-			"version": "24.0.1",
-			"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.1.tgz",
-			"integrity": "sha512-gFzp+ikAkwyu6nqBE2zx1pLVL0JPrerG7jaO4uJV3XUGKPIipv4mfhDOS5MyiMrzUtGdXSW8FkRHjoUnfqbW+g==",
+			"version": "24.3.0",
+			"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.3.0.tgz",
+			"integrity": "sha512-dUPiRgX8fhmh4uwTAn9xrzg7HV5j5DhGmZZGJdHfjy/AN9G4jD+5IjfbcAJ209JcIG8m4B7xz3crIhuDSm3siQ==",
 			"dev": true,
 			"requires": {
 				"chalk": "^4.1.2",
-				"eslint": "^8.0.1"
+				"eslint": "^8.44.0"
 			}
 		},
 		"grunt-known-options": {
@@ -4847,12 +4837,6 @@
 			"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
 			"dev": true
 		},
-		"js-sdsl": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
-			"integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
-			"dev": true
-		},
 		"js-tokens": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -5034,9 +5018,9 @@
 			"dev": true
 		},
 		"node-releases": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz",
-			"integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==",
+			"version": "2.0.14",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+			"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
 			"dev": true
 		},
 		"nopt": {
@@ -5061,9 +5045,9 @@
 			},
 			"dependencies": {
 				"semver": {
-					"version": "5.7.1",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+					"version": "5.7.2",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+					"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 					"dev": true
 				}
 			}
@@ -5118,17 +5102,17 @@
 			}
 		},
 		"optionator": {
-			"version": "0.9.1",
-			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-			"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+			"version": "0.9.3",
+			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+			"integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
 			"dev": true,
 			"requires": {
+				"@aashutoshrathi/word-wrap": "^1.2.3",
 				"deep-is": "^0.1.3",
 				"fast-levenshtein": "^2.0.6",
 				"levn": "^0.4.1",
 				"prelude-ls": "^1.2.1",
-				"type-check": "^0.4.0",
-				"word-wrap": "^1.2.3"
+				"type-check": "^0.4.0"
 			}
 		},
 		"os-homedir": {
@@ -5289,9 +5273,9 @@
 			"dev": true
 		},
 		"punycode": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
-			"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+			"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
 			"dev": true
 		},
 		"queue-microtask": {
@@ -5476,9 +5460,9 @@
 			"dev": true
 		},
 		"semver": {
-			"version": "7.3.5",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-			"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"requires": {
 				"lru-cache": "^6.0.0"
@@ -5628,6 +5612,16 @@
 			"integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
 			"dev": true
 		},
+		"update-browserslist-db": {
+			"version": "1.0.13",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+			"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+			"dev": true,
+			"requires": {
+				"escalade": "^3.1.1",
+				"picocolors": "^1.0.0"
+			}
+		},
 		"uri-js": {
 			"version": "4.4.1",
 			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -5694,12 +5688,6 @@
 				"isexe": "^2.0.0"
 			}
 		},
-		"word-wrap": {
-			"version": "1.2.3",
-			"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-			"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-			"dev": true
-		},
 		"wrappy": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index 888ac1c..9a7dc31 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,7 @@
 	"devDependencies": {
 		"eslint-config-wikimedia": "0.25.0",
 		"grunt": "1.6.1",
-		"grunt-banana-checker": "0.11.0",
-		"grunt-eslint": "24.0.1"
+		"grunt-banana-checker": "0.11.1",
+		"grunt-eslint": "24.3.0"
 	}
 }
diff --git a/specials/PF_CreateForm.php b/specials/PF_CreateForm.php
index d7ed52f..d46c5da 100644
--- a/specials/PF_CreateForm.php
+++ b/specials/PF_CreateForm.php
@@ -78,7 +78,7 @@ class PFCreateForm extends SpecialPage {
 			# ignore variables that are not of the right form
 			if ( strpos( $var, "_" ) != false ) {
 				# get the template declarations and work from there
-				list( $action, $id ) = explode( "_", $var, 2 );
+				[ $action, $id ] = explode( "_", $var, 2 );
 				if ( $action == "template" ) {
 					// If the button was pressed to remove
 					// this template, just don't add it to
diff --git a/specials/PF_CreateTemplate.php b/specials/PF_CreateTemplate.php
index cdb94c9..5151304 100644
--- a/specials/PF_CreateTemplate.php
+++ b/specials/PF_CreateTemplate.php
@@ -328,7 +328,7 @@ END;
 				if ( count( $var_elements ) != 2 ) {
 					continue;
 				}
-				list( $field_field, $id ) = $var_elements;
+				[ $field_field, $id ] = $var_elements;
 				if ( $field_field == 'name' && $id != 'starter' ) {
 					$field = PFTemplateField::create(
 						$val,
diff --git a/specials/PF_RunQuery.php b/specials/PF_RunQuery.php
index f3a0bc3..b62101f 100644
--- a/specials/PF_RunQuery.php
+++ b/specials/PF_RunQuery.php
@@ -87,7 +87,7 @@ class PFRunQuery extends IncludableSpecialPage {
 		}
 
 		$form_context = $embedded ? PFFormPrinter::CONTEXT_EMBEDDED_QUERY : PFFormPrinter::CONTEXT_QUERY;
-		list( $form_text, $data_text, $form_page_title ) =
+		[ $form_text, $data_text, $form_page_title ] =
 			$wgPageFormsFormPrinter->formHTML(
 				$form_definition, $form_submitted, false, $form_title->getArticleID(),
 				$content, null, null, $form_context, [], $user
diff --git a/specials/PF_UploadWindow.php b/specials/PF_UploadWindow.php
index ad2a7c5..ba2fb46 100644
--- a/specials/PF_UploadWindow.php
+++ b/specials/PF_UploadWindow.php
@@ -303,52 +303,52 @@ class PFUploadWindow extends UnlistedSpecialPage {
 			. '<ul class="warningbox">';
 		foreach ( $warnings as $warning => $args ) {
 				// Unlike the other warnings, this one can be worked around.
-				if ( $warning == 'badfilename' ) {
-					$this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
-				}
+			if ( $warning == 'badfilename' ) {
+				$this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
+			}
 
-				if ( $warning == 'exists' ) {
-					$msg = self::getExistsWarning( $args );
-				} elseif ( $warning == 'no-change' ) {
-					$file = $args;
-					$filename = $file->getTitle()->getPrefixedText();
-					$msg = "\t<li>" . $this->msg( 'fileexists-no-change', $filename )->parse() . "</li>\n";
-				} elseif ( $warning == 'duplicate-version' ) {
-					$file = $args[0];
-					$count = count( $args );
-					$filename = $file->getTitle()->getPrefixedText();
-					$message = $this->msg( 'fileexists-duplicate-version' )
-						->params( $filename )
-						->numParams( $count );
-					$msg = "\t<li>" . $message->parse() . "</li>\n";
-				} elseif ( $warning == 'was-deleted' ) {
-					# If the file existed before and was deleted, warn the user of this
-					$ltitle = SpecialPage::getTitleFor( 'Log' );
-					$llink = $linkRenderer->makeKnownLink(
-						$ltitle,
-						$this->msg( 'deletionlog' )->text(),
-						[],
-						[
-							'type' => 'delete',
-							'page' => Title::makeTitle( NS_FILE, $args )->getPrefixedText(),
-						]
-					);
-					$msg = "\t<li>" . $this->msg( 'filewasdeleted' )->rawParams( $llink )->parse() . "</li>\n";
-				} elseif ( $warning == 'duplicate' ) {
-					$msg = $this->getDupeWarning( $args );
-				} elseif ( $warning == 'duplicate-archive' ) {
-					$msg = "\t<li>" . $this->msg(
-						'file-deleted-duplicate',
-						[ Title::makeTitle( NS_FILE, $args )->getPrefixedText() ]
-					)->parse() . "</li>\n";
-				} else {
-					if ( is_bool( $args ) ) {
-						$args = [];
-					} elseif ( !is_array( $args ) ) {
-						$args = [ $args ];
-					}
-					$msg = "\t<li>" . $this->msg( $warning, $args )->parse() . "</li>\n";
+			if ( $warning == 'exists' ) {
+				$msg = self::getExistsWarning( $args );
+			} elseif ( $warning == 'no-change' ) {
+				$file = $args;
+				$filename = $file->getTitle()->getPrefixedText();
+				$msg = "\t<li>" . $this->msg( 'fileexists-no-change', $filename )->parse() . "</li>\n";
+			} elseif ( $warning == 'duplicate-version' ) {
+				$file = $args[0];
+				$count = count( $args );
+				$filename = $file->getTitle()->getPrefixedText();
+				$message = $this->msg( 'fileexists-duplicate-version' )
+					->params( $filename )
+					->numParams( $count );
+				$msg = "\t<li>" . $message->parse() . "</li>\n";
+			} elseif ( $warning == 'was-deleted' ) {
+				# If the file existed before and was deleted, warn the user of this
+				$ltitle = SpecialPage::getTitleFor( 'Log' );
+				$llink = $linkRenderer->makeKnownLink(
+					$ltitle,
+					$this->msg( 'deletionlog' )->text(),
+					[],
+					[
+						'type' => 'delete',
+						'page' => Title::makeTitle( NS_FILE, $args )->getPrefixedText(),
+					]
+				);
+				$msg = "\t<li>" . $this->msg( 'filewasdeleted' )->rawParams( $llink )->parse() . "</li>\n";
+			} elseif ( $warning == 'duplicate' ) {
+				$msg = $this->getDupeWarning( $args );
+			} elseif ( $warning == 'duplicate-archive' ) {
+				$msg = "\t<li>" . $this->msg(
+					'file-deleted-duplicate',
+					[ Title::makeTitle( NS_FILE, $args )->getPrefixedText() ]
+				)->parse() . "</li>\n";
+			} else {
+				if ( is_bool( $args ) ) {
+					$args = [];
+				} elseif ( !is_array( $args ) ) {
+					$args = [ $args ];
 				}
+				$msg = "\t<li>" . $this->msg( $warning, $args )->parse() . "</li>\n";
+			}
 				$warningHtml .= $msg;
 		}
 		$warningHtml .= "</ul>\n";
diff --git a/tests/phpunit/integration/includes/PFFormPrinterTest.php b/tests/phpunit/integration/includes/PFFormPrinterTest.php
index ce29f80..630be16 100644
--- a/tests/phpunit/integration/includes/PFFormPrinterTest.php
+++ b/tests/phpunit/integration/includes/PFFormPrinterTest.php
@@ -38,7 +38,7 @@ class PFFormPrinterTest extends MediaWikiIntegrationTestCase {
 
 		$wgOut->getContext()->setTitle( $this->getTitle() );
 
-		list( $form_text, $page_text, $form_page_title, $generated_page_name ) =
+		[ $form_text, $page_text, $form_page_title, $generated_page_name ] =
 			$wgPageFormsFormPrinter->formHTML(
 				$form_def = $setup['form_definition'],
 				$form_submitted = true,
@@ -134,11 +134,11 @@ class PFFormPrinterTest extends MediaWikiIntegrationTestCase {
 
 		$mockTitle->expects( $this->any() )
 			->method( 'getDBkey' )
-			->will( $this->returnValue( 'Sometitle' ) );
+			->willReturn( 'Sometitle' );
 
 		$mockTitle->expects( $this->any() )
 			->method( 'getNamespace' )
-			->will( $this->returnValue( PF_NS_FORM ) );
+			->willReturn( PF_NS_FORM );
 
 		return $mockTitle;
 	}
diff --git a/tests/phpunit/integration/includes/forminputs/PFRadioButtonInputTest.php b/tests/phpunit/integration/includes/forminputs/PFRadioButtonInputTest.php
index 03335d0..b0d54de 100644
--- a/tests/phpunit/integration/includes/forminputs/PFRadioButtonInputTest.php
+++ b/tests/phpunit/integration/includes/forminputs/PFRadioButtonInputTest.php
@@ -367,7 +367,7 @@ class PFRadioButtonInputTest extends MediaWikiIntegrationTestCase {
 			if ( isset( $setup['form_definition'] ) ) {
 				// We have to specify a template name
 				$form_definition = "{{{for template|TestTemplate123}}}\n{$setup['form_definition']}\n{{{end template}}}\n{{{standard input|save}}}";
-				list( $form_text, $page_text, $form_page_title, $generated_page_name )
+				[ $form_text, $page_text, $form_page_title, $generated_page_name ]
 					= $wgPageFormsFormPrinter->formHTML(
 						$form_definition, true, false, null, null,
 						'TestStringForFormPageTitle', null,
@@ -652,11 +652,11 @@ class PFRadioButtonInputTest extends MediaWikiIntegrationTestCase {
 
 		$mockTitle->expects( $this->any() )
 			->method( 'getDBkey' )
-			->will( $this->returnValue( 'Sometitle' ) );
+			->willReturn( 'Sometitle' );
 
 		$mockTitle->expects( $this->any() )
 			->method( 'getNamespace' )
-			->will( $this->returnValue( PF_NS_FORM ) );
+			->willReturn( PF_NS_FORM );
 
 		return $mockTitle;
 	}
-- 
2.39.2

$ date
--- stdout ---
Sat Apr  6 08:50:44 UTC 2024

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-PageForms.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 ---
978357629bcd1849e2ef52878f3ea8a1c43ce55b refs/heads/master

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "eslint-plugin-compat": {
      "name": "eslint-plugin-compat",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "semver"
      ],
      "effects": [],
      "range": "3.6.0-0 - 4.1.4",
      "nodes": [
        "node_modules/eslint-plugin-compat"
      ],
      "fixAvailable": true
    },
    "semver": {
      "name": "semver",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096482,
          "name": "semver",
          "dependency": "semver",
          "title": "semver vulnerable to Regular Expression Denial of Service",
          "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw",
          "severity": "moderate",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 5.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": ">=7.0.0 <7.5.2"
        },
        {
          "source": 1096483,
          "name": "semver",
          "dependency": "semver",
          "title": "semver vulnerable to Regular Expression Denial of Service",
          "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw",
          "severity": "moderate",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 5.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": "<5.7.2"
        },
        {
          "source": 1096484,
          "name": "semver",
          "dependency": "semver",
          "title": "semver vulnerable to Regular Expression Denial of Service",
          "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw",
          "severity": "moderate",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 5.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": ">=6.0.0 <6.3.1"
        }
      ],
      "effects": [
        "eslint-plugin-compat"
      ],
      "range": "<=5.7.1 || 6.0.0 - 6.3.0 || 7.0.0 - 7.5.1",
      "nodes": [
        "node_modules/eslint-plugin-jsdoc/node_modules/semver",
        "node_modules/eslint-plugin-node/node_modules/semver",
        "node_modules/normalize-package-data/node_modules/semver",
        "node_modules/semver"
      ],
      "fixAvailable": true
    },
    "word-wrap": {
      "name": "word-wrap",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1095091,
          "name": "word-wrap",
          "dependency": "word-wrap",
          "title": "word-wrap vulnerable to Regular Expression Denial of Service",
          "url": "https://github.com/advisories/GHSA-j8xg-fqg3-53r7",
          "severity": "moderate",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 5.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": "<1.2.4"
        }
      ],
      "effects": [],
      "range": "<1.2.4",
      "nodes": [
        "node_modules/word-wrap"
      ],
      "fixAvailable": true
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 3,
      "high": 0,
      "critical": 0,
      "total": 3
    },
    "dependencies": {
      "prod": 1,
      "dev": 289,
      "optional": 0,
      "peer": 0,
      "peerOptional": 0,
      "total": 289
    }
  }
}

--- 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: 37 installs, 0 updates, 0 removals
  - Locking composer/installers (v2.2.0)
  - Locking composer/pcre (3.1.3)
  - Locking composer/semver (3.3.2)
  - Locking composer/spdx-licenses (1.5.8)
  - Locking composer/xdebug-handler (3.0.4)
  - Locking doctrine/deprecations (1.1.3)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking mediawiki/mediawiki-codesniffer (v41.0.0)
  - Locking mediawiki/mediawiki-phan-config (0.12.1)
  - Locking mediawiki/minus-x (1.1.1)
  - Locking mediawiki/phan-taint-check-plugin (4.0.0)
  - Locking microsoft/tolerant-php-parser (v0.1.1)
  - Locking netresearch/jsonmapper (v4.4.1)
  - Locking phan/phan (5.4.1)
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
  - Locking php-parallel-lint/php-parallel-lint (v1.3.2)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.3.0)
  - Locking phpdocumentor/type-resolver (1.8.2)
  - Locking phpstan/phpdoc-parser (1.28.0)
  - Locking psr/container (2.0.2)
  - Locking psr/log (2.0.0)
  - Locking sabre/event (5.1.4)
  - Locking squizlabs/php_codesniffer (3.7.2)
  - Locking symfony/console (v5.4.36)
  - Locking symfony/deprecation-contracts (v3.4.0)
  - Locking symfony/polyfill-ctype (v1.29.0)
  - Locking symfony/polyfill-intl-grapheme (v1.29.0)
  - Locking symfony/polyfill-intl-normalizer (v1.29.0)
  - Locking symfony/polyfill-mbstring (v1.29.0)
  - Locking symfony/polyfill-php73 (v1.29.0)
  - Locking symfony/polyfill-php80 (v1.29.0)
  - Locking symfony/service-contracts (v3.4.2)
  - Locking symfony/string (v6.4.4)
  - 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: 37 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Installing composer/installers (v2.2.0): Extracting archive
  - Installing composer/pcre (3.1.3): Extracting archive
  - Installing symfony/polyfill-php80 (v1.29.0): Extracting archive
  - Installing squizlabs/php_codesniffer (3.7.2): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.29.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.8): Extracting archive
  - Installing composer/semver (3.3.2): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v41.0.0): Extracting archive
  - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.29.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.29.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.29.0): Extracting archive
  - Installing symfony/string (v6.4.4): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing symfony/service-contracts (v3.4.2): Extracting archive
  - Installing symfony/polyfill-php73 (v1.29.0): Extracting archive
  - Installing symfony/deprecation-contracts (v3.4.0): Extracting archive
  - Installing symfony/console (v5.4.36): Extracting archive
  - Installing sabre/event (5.1.4): Extracting archive
  - Installing netresearch/jsonmapper (v4.4.1): Extracting archive
  - Installing microsoft/tolerant-php-parser (v0.1.1): Extracting archive
  - Installing webmozart/assert (1.11.0): Extracting archive
  - Installing phpstan/phpdoc-parser (1.28.0): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing doctrine/deprecations (1.1.3): Extracting archive
  - Installing phpdocumentor/type-resolver (1.8.2): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.3.0): Extracting archive
  - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
  - Installing psr/log (2.0.0): Extracting archive
  - Installing composer/xdebug-handler (3.0.4): Extracting archive
  - Installing phan/phan (5.4.1): Extracting archive
  - Installing mediawiki/phan-taint-check-plugin (4.0.0): Extracting archive
  - Installing mediawiki/mediawiki-phan-config (0.12.1): Extracting archive
  - Installing mediawiki/minus-x (1.1.1): Extracting archive
  - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
  - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
  - Installing php-parallel-lint/php-parallel-lint (v1.3.2): Extracting archive
  0/36 [>---------------------------]   0%
 19/36 [==============>-------------]  52%
 35/36 [===========================>]  97%
 36/36 [============================] 100%
4 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
16 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---

--- end ---
Upgrading n:grunt-banana-checker from 0.11.0 -> 0.11.1
Upgrading n:grunt-eslint from 24.0.1 -> 24.3.0
$ /usr/bin/npm install
--- stderr ---
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@es-joy/jsdoccomment@0.23.6',
npm WARN EBADENGINE   required: { node: '^12 || ^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'eslint-plugin-jsdoc@39.2.2',
npm WARN EBADENGINE   required: { node: '^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---

added 289 packages, and audited 290 packages in 5s

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

2 moderate severity vulnerabilities

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

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

--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@es-joy/jsdoccomment@0.23.6',
npm WARN EBADENGINE   required: { node: '^12 || ^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'eslint-plugin-jsdoc@39.2.2',
npm WARN EBADENGINE   required: { node: '^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---

added 289 packages, and audited 290 packages in 4s

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

2 moderate severity vulnerabilities

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

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

> test
> grunt test

Running "eslint:all" (eslint) task

/src/repo/i18n/he.json
  238:89  warning  Detected potential trojan source attack with unicode bidi introduced in this code: '"{{PLURAL:$1|אסור שיהיה יותר ממופע אחד|אסור שיהיו יותר מ‏־$1 מופעים}}  של תבנית זו."'  security/detect-bidi-characters

/src/repo/i18n/ky.json
  13:37  warning  Detected potential trojan source attack with unicode bidi introduced in this code: '"«$1‎» калыбын түзүү"'  security/detect-bidi-characters
  19:31  warning  Detected potential trojan source attack with unicode bidi introduced in this code: '"«‎$1» түзүү: $2"'      security/detect-bidi-characters
  20:39  warning  Detected potential trojan source attack with unicode bidi introduced in this code: '"«‎$1» түзүү"'          security/detect-bidi-characters

/src/repo/libs/PF_AutoEditRating.js
   63:21  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  113:21  warning  '$' is already declared in the upper scope on line 1 column 13                no-shadow

/src/repo/libs/PF_AutocompleteWidget.js
  130:21  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp
  139:18  warning  Prefer `String#slice()` over `String#substr()`    unicorn/prefer-string-slice

/src/repo/libs/PF_ComboBoxInput.js
  120:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  136:51  warning  ES2015 default parameters are forbidden                                       es-x/no-default-parameters
  149:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  231:13  warning  'optionVal' is already declared in the upper scope on line 308 column 12      no-shadow
  232:13  warning  'optionLabel' is already declared in the upper scope on line 309 column 12    no-shadow
  307:12  warning  ES2015 block-scoped variables are forbidden                                   es-x/no-block-scoped-variables
  537:22  warning  Found non-literal argument to RegExp Constructor                              security/detect-non-literal-regexp
  546:18  warning  Prefer `String#slice()` over `String#substr()`                                unicorn/prefer-string-slice
  555:3   warning  ES2015 block-scoped variables are forbidden                                   es-x/no-block-scoped-variables
  560:3   warning  ES2015 block-scoped variables are forbidden                                   es-x/no-block-scoped-variables
  560:15  warning  Found non-literal argument to RegExp Constructor                              security/detect-non-literal-regexp

/src/repo/libs/PF_FullCalendar.js
   124:11  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   124:11  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   128:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   128:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   132:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   132:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   157:11  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   157:11  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   161:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   161:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   165:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   165:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   172:11  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   172:11  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   176:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   176:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   180:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   180:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   270:9   warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   270:9   warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   272:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   272:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   279:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   279:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   281:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   281:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   290:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   290:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   299:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   299:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   308:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   308:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   613:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
   744:11  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   744:11  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   754:18  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   754:18  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   761:52  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   761:52  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   769:54  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   769:54  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   770:13  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   770:13  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   780:51  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   780:51  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   781:13  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   781:13  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   816:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  1073:12  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1073:12  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1074:13  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1074:13  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1076:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1076:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1078:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1078:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1114:12  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1114:12  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1115:13  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1115:13  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1117:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1117:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1119:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1119:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1121:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1121:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1123:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1123:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1125:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1125:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1127:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1127:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1147:14  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1147:14  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1147:71  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1147:71  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1161:14  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1161:14  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes

/src/repo/libs/PF_SpreadsheetAutocompleteWidget.js
  114:9   warning  ES2015 block-scoped variables are forbidden             es-x/no-block-scoped-variables
  131:5   warning  ES2015 block-scoped variables are forbidden             es-x/no-block-scoped-variables
  135:21  warning  ES2016 'Array.prototype.includes' method is forbidden   es-x/no-array-prototype-includes
  135:21  warning  ES2015 'String.prototype.includes' method is forbidden  es-x/no-string-prototype-includes
  171:21  warning  Found non-literal argument to RegExp Constructor        security/detect-non-literal-regexp
  179:17  warning  Prefer `String#slice()` over `String#substr()`          unicorn/prefer-string-slice
  212:14  warning  Found non-literal argument to RegExp Constructor        security/detect-non-literal-regexp

/src/repo/libs/PF_SpreadsheetComboBoxInput.js
   54:11  warning  'valueFilter' declared on line 56 column 11 is used outside of binding context  block-scoped-var
   56:11  warning  'valueFilter' declared on line 54 column 11 is used outside of binding context  block-scoped-var
   58:11  warning  'valueFilter' declared on line 54 column 11 is used outside of binding context  block-scoped-var
   58:11  warning  'valueFilter' declared on line 56 column 11 is used outside of binding context  block-scoped-var
  108:23  warning  'data' is already declared in the upper scope on line 46 column 4               no-shadow
  114:13  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  114:20  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  114:37  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  116:20  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  116:62  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  131:0   warning  Missing JSDoc @return type                                                      jsdoc/require-returns-type
  138:21  warning  Found non-literal argument to RegExp Constructor                                security/detect-non-literal-regexp
  146:17  warning  Prefer `String#slice()` over `String#substr()`                                  unicorn/prefer-string-slice
  173:14  warning  Found non-literal argument to RegExp Constructor                                security/detect-non-literal-regexp
  184:9   warning  ES2016 'Array.prototype.includes' method is forbidden                           es-x/no-array-prototype-includes
  184:9   warning  ES2015 'String.prototype.includes' method is forbidden                          es-x/no-string-prototype-includes
  190:0   warning  The type 'integer' is undefined                                                 jsdoc/no-undefined-types
  197:2   warning  jQuery collection names must match the variablePattern                          no-jquery/variable-pattern

/src/repo/libs/PF_autoedit.js
  15:16  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  83:21  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  95:38  warning  '$' is already declared in the upper scope on line 9 column 13                no-shadow

/src/repo/libs/PF_checkboxes.js
  47:24  warning  '$' is already declared in the upper scope on line 7 column 14  no-shadow

/src/repo/libs/PF_collapsible.js
  30:8  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_datepicker.js
  14:9  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_editWarning.js
  32:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  61:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_formInput.js
   19:4  warning  ES2015 'for-of' statements are forbidden     es-x/no-for-of-loops
   76:4  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
   80:4  warning  ES2015 'for-of' statements are forbidden     es-x/no-for-of-loops
  104:4  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables

/src/repo/libs/PF_maps.js
  201:5  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  208:5  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  209:5  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  210:5  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  262:6  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  263:6  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  264:6  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables

/src/repo/libs/PF_popupform.js
  374:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  758:12  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  772:12  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_rating.js
  43:4  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/libs/PF_regexp.js
  31:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/libs/PF_spreadsheet.js
   10:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   11:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   12:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   13:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   14:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   15:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   16:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   17:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   72:11  warning  ES2016 'Array.prototype.includes' method is forbidden                       es-x/no-array-prototype-includes
   72:11  warning  ES2015 'String.prototype.includes' method is forbidden                      es-x/no-string-prototype-includes
  394:3   warning  ES2015 'for-of' statements are forbidden                                    es-x/no-for-of-loops
  440:3   warning  ES2015 'for-of' statements are forbidden                                    es-x/no-for-of-loops
  523:16  warning  Found non-literal argument to RegExp Constructor                            security/detect-non-literal-regexp
  689:6   warning  ES2015 'for-of' statements are forbidden                                    es-x/no-for-of-loops
  689:11  warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
  692:7   warning  ES2015 'for-of' statements are forbidden                                    es-x/no-for-of-loops
  692:12  warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
  753:10  warning  'columnParams' is already declared in the upper scope on line 853 column 9  no-shadow
  771:22  warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle
  863:28  warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle
  867:6   warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle
  928:25  warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle
  933:4   warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle

/src/repo/libs/PF_submit.js
  141:46  warning  Prefer `String#slice()` over `String#substring()`                   unicorn/prefer-string-slice
  174:8   warning  '$form' is already declared in the upper scope on line 14 column 6  no-shadow

/src/repo/libs/PF_timepicker.js
  64:9  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/libs/PF_upload.js
  56:41  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PageForms.js
   199:10  warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
   230:19  warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
   241:9   warning  Selector extensions are not allowed                                                  no-jquery/no-sizzle
   406:61  warning  All possible message keys should be documented. See https://w.wiki/4r9a for details  mediawiki/msg-doc
   413:58  warning  All possible message keys should be documented. See https://w.wiki/4r9a for details  mediawiki/msg-doc
   676:19  warning  Found non-literal argument to RegExp Constructor                                     security/detect-non-literal-regexp
   688:21  warning  Unsafe Regular Expression                                                            security/detect-unsafe-regex
   702:17  warning  Unsafe Regular Expression                                                            security/detect-unsafe-regex
   770:9   warning  ES2016 'Array.prototype.includes' method is forbidden                                es-x/no-array-prototype-includes
   770:9   warning  ES2015 'String.prototype.includes' method is forbidden                               es-x/no-string-prototype-includes
   771:5   warning  ES2016 'Array.prototype.includes' method is forbidden                                es-x/no-array-prototype-includes
   771:5   warning  ES2015 'String.prototype.includes' method is forbidden                               es-x/no-string-prototype-includes
   834:6   warning  'negative' declared on line 837 column 7 is used outside of binding context          block-scoped-var
   843:7   warning  'negative' declared on line 837 column 7 is used outside of binding context          block-scoped-var
  1014:6   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1015:6   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1021:6   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1022:6   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1112:11  warning  ES2016 'Array.prototype.includes' method is forbidden                                es-x/no-array-prototype-includes
  1112:11  warning  ES2015 'String.prototype.includes' method is forbidden                               es-x/no-string-prototype-includes
  1118:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1225:7   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1226:8   warning  ES2015 block-scoped variables are forbidden                                          es-x/no-block-scoped-variables
  1258:10  warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1262:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1533:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1646:7   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1653:8   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1929:30  warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1942:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1946:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1951:7   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state

/src/repo/libs/ext.pf.select2.base.js
   73:6  warning  ES2015 block-scoped variables are forbidden     es-x/no-block-scoped-variables
   93:8  warning  ES2015 block-scoped variables are forbidden     es-x/no-block-scoped-variables
  318:6  warning  Prefer `String#slice()` over `String#substr()`  unicorn/prefer-string-slice
  319:6  warning  Prefer `String#slice()` over `String#substr()`  unicorn/prefer-string-slice

/src/repo/libs/ext.pf.select2.tokens.js
   89:11  warning  ES2015 block-scoped variables are forbidden             es-x/no-block-scoped-variables
  288:9   warning  ES2016 'Array.prototype.includes' method is forbidden   es-x/no-array-prototype-includes
  288:9   warning  ES2015 'String.prototype.includes' method is forbidden  es-x/no-string-prototype-includes

✖ 212 problems (0 errors, 212 warnings)


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

Done.

--- end ---
Upgrading c:mediawiki/mediawiki-codesniffer from 41.0.0 -> 43.0.0
Upgrading c:mediawiki/mediawiki-phan-config from 0.12.1 -> 0.14.0
$ /usr/bin/composer update
--- stderr ---
Loading composer repositories with package information
Updating dependencies
Lock file operations: 3 installs, 7 updates, 0 removals
  - Upgrading composer/semver (3.3.2 => 3.4.0)
  - Locking dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
  - Upgrading mediawiki/mediawiki-codesniffer (v41.0.0 => v43.0.0)
  - Upgrading mediawiki/mediawiki-phan-config (0.12.1 => 0.14.0)
  - Upgrading mediawiki/phan-taint-check-plugin (4.0.0 => 6.0.0)
  - Upgrading microsoft/tolerant-php-parser (v0.1.1 => v0.1.2)
  - Upgrading phan/phan (5.4.1 => 5.4.3)
  - Locking phpcsstandards/phpcsextra (1.1.2)
  - Locking phpcsstandards/phpcsutils (1.0.9)
  - Upgrading squizlabs/php_codesniffer (3.7.2 => 3.8.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 3 installs, 7 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Upgrading squizlabs/php_codesniffer (3.7.2 => 3.8.1): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
  - Installing phpcsstandards/phpcsutils (1.0.9): Extracting archive
  - Installing phpcsstandards/phpcsextra (1.1.2): Extracting archive
  - Upgrading composer/semver (3.3.2 => 3.4.0): Extracting archive
  - Upgrading mediawiki/mediawiki-codesniffer (v41.0.0 => v43.0.0): Extracting archive
  - Upgrading microsoft/tolerant-php-parser (v0.1.1 => v0.1.2): Extracting archive
  - Upgrading phan/phan (5.4.1 => 5.4.3): Extracting archive
  - Upgrading mediawiki/phan-taint-check-plugin (4.0.0 => 6.0.0): Extracting archive
  - Upgrading mediawiki/mediawiki-phan-config (0.12.1 => 0.14.0): Extracting archive
 0/8 [>---------------------------]   0%
 7/8 [========================>---]  87%
 8/8 [============================] 100%
Generating autoload files
17 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 ---
{'MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate', 'MediaWiki.Commenting.PropertyDocumentation.MissingVar', 'MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPublic', 'MediaWiki.Usage.ForbiddenFunctions.passthru', 'MediaWiki.Files.ClassMatchesFilename.NotMatch', 'MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate', 'MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationProtected', 'MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures', 'MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage', 'Generic.Files.LineLength.TooLong', 'MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic', 'MediaWiki.Usage.DeprecatedGlobalVariables.Deprecated$wgTitle', 'Squiz.Scope.MethodScope.Missing', 'MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected', 'MediaWiki.Usage.ExtendClassUsage.FunctionVarUsage'}
Tests fail!
$ vendor/bin/phpcbf
--- stdout ---

PHPCBF RESULT SUMMARY
--------------------------------------------------------------------------------
FILE                                                            FIXED  REMAINING
--------------------------------------------------------------------------------
/src/repo/includes/parserfunctions/PF_TemplateParams.php        1      3
/src/repo/includes/forminputs/PF_LeafletInput.php               1      5
...po/tests/phpunit/integration/includes/PFFormPrinterTest.php  3      4
/src/repo/includes/forminputs/PF_DateInput.php                  1      11
/src/repo/includes/forminputs/PF_TokensInput.php                1      12
/src/repo/includes/parserfunctions/PF_TemplateDisplay.php       1      10
/src/repo/includes/PF_FormLinker.php                            1      8
/src/repo/includes/forminputs/PF_OpenLayersInput.php            1      9
/src/repo/includes/forminputs/PF_ComboBoxInput.php              1      9
/src/repo/includes/forminputs/PF_DateTimePicker.php             1      1
/src/repo/includes/forminputs/PF_DatePickerInput.php            1      6
/src/repo/includes/PF_Hooks.php                                 1      15
/src/repo/includes/PF_PageSection.php                           9      26
/src/repo/includes/PF_Template.php                              2      44
/src/repo/specials/PF_CreateTemplate.php                        1      28
/src/repo/includes/PF_MappingUtils.php                          1      4
/src/repo/specials/PF_UploadWindow.php                          13     21
.../integration/includes/forminputs/PFRadioButtonInputTest.php  3      1
/src/repo/specials/PF_RunQuery.php                              1      14
/src/repo/includes/PF_TemplateInForm.php                        2      105
/src/repo/specials/PF_CreateForm.php                            1      40
/src/repo/includes/PF_ValuesUtils.php                           3      21
/src/repo/includes/PF_AutoeditAPI.php                           2      57
/src/repo/includes/PF_FormField.php                             1      70
/src/repo/includes/PF_FormPrinter.php                           11     107
--------------------------------------------------------------------------------
A TOTAL OF 64 ERRORS WERE FIXED IN 25 FILES
--------------------------------------------------------------------------------

Time: 3.25 secs; Memory: 6MB



--- 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
17 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
> minus-x check .
> phpcs -p -s .
--- stdout ---
PHP 8.2.7 | 10 parallel jobs
............................................................ 60/89 (67 %)
.............................                                89/89 (100 %)


Checked 89 files in 0.4 seconds
No syntax error found
MinusX
======
Processing /src/repo...
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
........................................
All good!
............................................. 45 / 45 (100%)


Time: 1.18 secs; Memory: 6MB


--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "eslint-plugin-compat": {
      "name": "eslint-plugin-compat",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "semver"
      ],
      "effects": [],
      "range": "3.6.0-0 - 4.1.4",
      "nodes": [
        "node_modules/eslint-plugin-compat"
      ],
      "fixAvailable": true
    },
    "semver": {
      "name": "semver",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1096482,
          "name": "semver",
          "dependency": "semver",
          "title": "semver vulnerable to Regular Expression Denial of Service",
          "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw",
          "severity": "moderate",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 5.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": ">=7.0.0 <7.5.2"
        },
        {
          "source": 1096483,
          "name": "semver",
          "dependency": "semver",
          "title": "semver vulnerable to Regular Expression Denial of Service",
          "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw",
          "severity": "moderate",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 5.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": "<5.7.2"
        },
        {
          "source": 1096484,
          "name": "semver",
          "dependency": "semver",
          "title": "semver vulnerable to Regular Expression Denial of Service",
          "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw",
          "severity": "moderate",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 5.3,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": ">=6.0.0 <6.3.1"
        }
      ],
      "effects": [
        "eslint-plugin-compat"
      ],
      "range": "<=5.7.1 || 6.0.0 - 6.3.0 || 7.0.0 - 7.5.1",
      "nodes": [
        "node_modules/eslint-plugin-jsdoc/node_modules/semver",
        "node_modules/eslint-plugin-node/node_modules/semver",
        "node_modules/normalize-package-data/node_modules/semver",
        "node_modules/semver"
      ],
      "fixAvailable": true
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 2,
      "high": 0,
      "critical": 0,
      "total": 2
    },
    "dependencies": {
      "prod": 1,
      "dev": 289,
      "optional": 0,
      "peer": 0,
      "peerOptional": 0,
      "total": 289
    }
  }
}

--- end ---
Attempting to npm audit fix
$ /usr/bin/npm audit fix --dry-run --only=dev --json
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@es-joy/jsdoccomment@0.23.6',
npm WARN EBADENGINE   required: { node: '^12 || ^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'eslint-plugin-jsdoc@39.2.2',
npm WARN EBADENGINE   required: { node: '^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---
{
  "added": 1,
  "removed": 3,
  "changed": 11,
  "audited": 288,
  "funding": 42,
  "audit": {
    "auditReportVersion": 2,
    "vulnerabilities": {
      "eslint-plugin-compat": {
        "name": "eslint-plugin-compat",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          "semver"
        ],
        "effects": [],
        "range": "3.6.0-0 - 4.1.4",
        "nodes": [
          ""
        ],
        "fixAvailable": true
      },
      "semver": {
        "name": "semver",
        "severity": "moderate",
        "isDirect": false,
        "via": [
          {
            "source": 1096482,
            "name": "semver",
            "dependency": "semver",
            "title": "semver vulnerable to Regular Expression Denial of Service",
            "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw",
            "severity": "moderate",
            "cwe": [
              "CWE-1333"
            ],
            "cvss": {
              "score": 5.3,
              "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
            },
            "range": ">=7.0.0 <7.5.2"
          },
          {
            "source": 1096483,
            "name": "semver",
            "dependency": "semver",
            "title": "semver vulnerable to Regular Expression Denial of Service",
            "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw",
            "severity": "moderate",
            "cwe": [
              "CWE-1333"
            ],
            "cvss": {
              "score": 5.3,
              "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
            },
            "range": "<5.7.2"
          },
          {
            "source": 1096484,
            "name": "semver",
            "dependency": "semver",
            "title": "semver vulnerable to Regular Expression Denial of Service",
            "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw",
            "severity": "moderate",
            "cwe": [
              "CWE-1333"
            ],
            "cvss": {
              "score": 5.3,
              "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
            },
            "range": ">=6.0.0 <6.3.1"
          }
        ],
        "effects": [
          "eslint-plugin-compat"
        ],
        "range": "<=5.7.1 || 6.0.0 - 6.3.0 || 7.0.0 - 7.5.1",
        "nodes": [
          "",
          "",
          "",
          ""
        ],
        "fixAvailable": true
      }
    },
    "metadata": {
      "vulnerabilities": {
        "info": 0,
        "low": 0,
        "moderate": 2,
        "high": 0,
        "critical": 0,
        "total": 2
      },
      "dependencies": {
        "prod": 1,
        "dev": 287,
        "optional": 0,
        "peer": 0,
        "peerOptional": 0,
        "total": 287
      }
    }
  }
}

--- end ---
{"added": 1, "removed": 3, "changed": 11, "audited": 288, "funding": 42, "audit": {"auditReportVersion": 2, "vulnerabilities": {"eslint-plugin-compat": {"name": "eslint-plugin-compat", "severity": "moderate", "isDirect": false, "via": ["semver"], "effects": [], "range": "3.6.0-0 - 4.1.4", "nodes": [""], "fixAvailable": true}, "semver": {"name": "semver", "severity": "moderate", "isDirect": false, "via": [{"source": 1096482, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": ">=7.0.0 <7.5.2"}, {"source": 1096483, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": "<5.7.2"}, {"source": 1096484, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": ">=6.0.0 <6.3.1"}], "effects": ["eslint-plugin-compat"], "range": "<=5.7.1 || 6.0.0 - 6.3.0 || 7.0.0 - 7.5.1", "nodes": ["", "", "", ""], "fixAvailable": true}}, "metadata": {"vulnerabilities": {"info": 0, "low": 0, "moderate": 2, "high": 0, "critical": 0, "total": 2}, "dependencies": {"prod": 1, "dev": 287, "optional": 0, "peer": 0, "peerOptional": 0, "total": 287}}}}
$ /usr/bin/npm audit fix --only=dev
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@es-joy/jsdoccomment@0.23.6',
npm WARN EBADENGINE   required: { node: '^12 || ^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'eslint-plugin-jsdoc@39.2.2',
npm WARN EBADENGINE   required: { node: '^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---

added 1 package, removed 3 packages, changed 11 packages, and audited 288 packages in 2s

42 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 ---
Verifying that tests still pass
$ /usr/bin/npm ci
--- stderr ---
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@es-joy/jsdoccomment@0.23.6',
npm WARN EBADENGINE   required: { node: '^12 || ^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'eslint-plugin-jsdoc@39.2.2',
npm WARN EBADENGINE   required: { node: '^14 || ^16 || ^17' },
npm WARN EBADENGINE   current: { node: 'v18.19.0', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---

added 287 packages, and audited 288 packages in 3s

42 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/i18n/he.json
  238:89  warning  Detected potential trojan source attack with unicode bidi introduced in this code: '"{{PLURAL:$1|אסור שיהיה יותר ממופע אחד|אסור שיהיו יותר מ‏־$1 מופעים}}  של תבנית זו."'  security/detect-bidi-characters

/src/repo/i18n/ky.json
  13:37  warning  Detected potential trojan source attack with unicode bidi introduced in this code: '"«$1‎» калыбын түзүү"'  security/detect-bidi-characters
  19:31  warning  Detected potential trojan source attack with unicode bidi introduced in this code: '"«‎$1» түзүү: $2"'      security/detect-bidi-characters
  20:39  warning  Detected potential trojan source attack with unicode bidi introduced in this code: '"«‎$1» түзүү"'          security/detect-bidi-characters

/src/repo/libs/PF_AutoEditRating.js
   63:21  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  113:21  warning  '$' is already declared in the upper scope on line 1 column 13                no-shadow

/src/repo/libs/PF_AutocompleteWidget.js
  130:21  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp
  139:18  warning  Prefer `String#slice()` over `String#substr()`    unicorn/prefer-string-slice

/src/repo/libs/PF_ComboBoxInput.js
  120:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  136:51  warning  ES2015 default parameters are forbidden                                       es-x/no-default-parameters
  149:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  231:13  warning  'optionVal' is already declared in the upper scope on line 308 column 12      no-shadow
  232:13  warning  'optionLabel' is already declared in the upper scope on line 309 column 12    no-shadow
  307:12  warning  ES2015 block-scoped variables are forbidden                                   es-x/no-block-scoped-variables
  537:22  warning  Found non-literal argument to RegExp Constructor                              security/detect-non-literal-regexp
  546:18  warning  Prefer `String#slice()` over `String#substr()`                                unicorn/prefer-string-slice
  555:3   warning  ES2015 block-scoped variables are forbidden                                   es-x/no-block-scoped-variables
  560:3   warning  ES2015 block-scoped variables are forbidden                                   es-x/no-block-scoped-variables
  560:15  warning  Found non-literal argument to RegExp Constructor                              security/detect-non-literal-regexp

/src/repo/libs/PF_FullCalendar.js
   124:11  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   124:11  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   128:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   128:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   132:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   132:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   157:11  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   157:11  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   161:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   161:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   165:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   165:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   172:11  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   172:11  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   176:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   176:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   180:19  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   180:19  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   270:9   warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   270:9   warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   272:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   272:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   279:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   279:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   281:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   281:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   290:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   290:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   299:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   299:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   308:17  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   308:17  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   613:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
   744:11  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   744:11  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   754:18  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   754:18  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   761:52  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   761:52  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   769:54  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   769:54  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   770:13  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   770:13  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   780:51  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   780:51  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   781:13  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
   781:13  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
   816:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  1073:12  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1073:12  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1074:13  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1074:13  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1076:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1076:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1078:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1078:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1114:12  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1114:12  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1115:13  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1115:13  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1117:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1117:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1119:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1119:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1121:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1121:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1123:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1123:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1125:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1125:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1127:20  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1127:20  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1147:14  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1147:14  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1147:71  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1147:71  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes
  1161:14  warning  ES2016 'Array.prototype.includes' method is forbidden                         es-x/no-array-prototype-includes
  1161:14  warning  ES2015 'String.prototype.includes' method is forbidden                        es-x/no-string-prototype-includes

/src/repo/libs/PF_SpreadsheetAutocompleteWidget.js
  114:9   warning  ES2015 block-scoped variables are forbidden             es-x/no-block-scoped-variables
  131:5   warning  ES2015 block-scoped variables are forbidden             es-x/no-block-scoped-variables
  135:21  warning  ES2016 'Array.prototype.includes' method is forbidden   es-x/no-array-prototype-includes
  135:21  warning  ES2015 'String.prototype.includes' method is forbidden  es-x/no-string-prototype-includes
  171:21  warning  Found non-literal argument to RegExp Constructor        security/detect-non-literal-regexp
  179:17  warning  Prefer `String#slice()` over `String#substr()`          unicorn/prefer-string-slice
  212:14  warning  Found non-literal argument to RegExp Constructor        security/detect-non-literal-regexp

/src/repo/libs/PF_SpreadsheetComboBoxInput.js
   54:11  warning  'valueFilter' declared on line 56 column 11 is used outside of binding context  block-scoped-var
   56:11  warning  'valueFilter' declared on line 54 column 11 is used outside of binding context  block-scoped-var
   58:11  warning  'valueFilter' declared on line 54 column 11 is used outside of binding context  block-scoped-var
   58:11  warning  'valueFilter' declared on line 56 column 11 is used outside of binding context  block-scoped-var
  108:23  warning  'data' is already declared in the upper scope on line 46 column 4               no-shadow
  114:13  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  114:20  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  114:37  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  116:20  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  116:62  warning  'i' declared on line 50 column 9 is used outside of binding context             block-scoped-var
  131:0   warning  Missing JSDoc @return type                                                      jsdoc/require-returns-type
  138:21  warning  Found non-literal argument to RegExp Constructor                                security/detect-non-literal-regexp
  146:17  warning  Prefer `String#slice()` over `String#substr()`                                  unicorn/prefer-string-slice
  173:14  warning  Found non-literal argument to RegExp Constructor                                security/detect-non-literal-regexp
  184:9   warning  ES2016 'Array.prototype.includes' method is forbidden                           es-x/no-array-prototype-includes
  184:9   warning  ES2015 'String.prototype.includes' method is forbidden                          es-x/no-string-prototype-includes
  190:0   warning  The type 'integer' is undefined                                                 jsdoc/no-undefined-types
  197:2   warning  jQuery collection names must match the variablePattern                          no-jquery/variable-pattern

/src/repo/libs/PF_autoedit.js
  15:16  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  83:21  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  95:38  warning  '$' is already declared in the upper scope on line 9 column 13                no-shadow

/src/repo/libs/PF_checkboxes.js
  47:24  warning  '$' is already declared in the upper scope on line 7 column 14  no-shadow

/src/repo/libs/PF_collapsible.js
  30:8  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_datepicker.js
  14:9  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_editWarning.js
  32:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  61:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_formInput.js
   19:4  warning  ES2015 'for-of' statements are forbidden     es-x/no-for-of-loops
   76:4  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
   80:4  warning  ES2015 'for-of' statements are forbidden     es-x/no-for-of-loops
  104:4  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables

/src/repo/libs/PF_maps.js
  201:5  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  208:5  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  209:5  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  210:5  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  262:6  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  263:6  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables
  264:6  warning  ES2015 block-scoped variables are forbidden  es-x/no-block-scoped-variables

/src/repo/libs/PF_popupform.js
  374:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  758:12  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  772:12  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_rating.js
  43:4  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/libs/PF_regexp.js
  31:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/libs/PF_spreadsheet.js
   10:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   11:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   12:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   13:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   14:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   15:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   16:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   17:1   warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
   72:11  warning  ES2016 'Array.prototype.includes' method is forbidden                       es-x/no-array-prototype-includes
   72:11  warning  ES2015 'String.prototype.includes' method is forbidden                      es-x/no-string-prototype-includes
  394:3   warning  ES2015 'for-of' statements are forbidden                                    es-x/no-for-of-loops
  440:3   warning  ES2015 'for-of' statements are forbidden                                    es-x/no-for-of-loops
  523:16  warning  Found non-literal argument to RegExp Constructor                            security/detect-non-literal-regexp
  689:6   warning  ES2015 'for-of' statements are forbidden                                    es-x/no-for-of-loops
  689:11  warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
  692:7   warning  ES2015 'for-of' statements are forbidden                                    es-x/no-for-of-loops
  692:12  warning  ES2015 block-scoped variables are forbidden                                 es-x/no-block-scoped-variables
  753:10  warning  'columnParams' is already declared in the upper scope on line 853 column 9  no-shadow
  771:22  warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle
  863:28  warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle
  867:6   warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle
  928:25  warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle
  933:4   warning  Positional selector extensions are not allowed                              no-jquery/no-sizzle

/src/repo/libs/PF_submit.js
  141:46  warning  Prefer `String#slice()` over `String#substring()`                   unicorn/prefer-string-slice
  174:8   warning  '$form' is already declared in the upper scope on line 14 column 6  no-shadow

/src/repo/libs/PF_timepicker.js
  64:9  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/libs/PF_upload.js
  56:41  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PageForms.js
   199:10  warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
   230:19  warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
   241:9   warning  Selector extensions are not allowed                                                  no-jquery/no-sizzle
   406:61  warning  All possible message keys should be documented. See https://w.wiki/4r9a for details  mediawiki/msg-doc
   413:58  warning  All possible message keys should be documented. See https://w.wiki/4r9a for details  mediawiki/msg-doc
   676:19  warning  Found non-literal argument to RegExp Constructor                                     security/detect-non-literal-regexp
   688:21  warning  Unsafe Regular Expression                                                            security/detect-unsafe-regex
   702:17  warning  Unsafe Regular Expression                                                            security/detect-unsafe-regex
   770:9   warning  ES2016 'Array.prototype.includes' method is forbidden                                es-x/no-array-prototype-includes
   770:9   warning  ES2015 'String.prototype.includes' method is forbidden                               es-x/no-string-prototype-includes
   771:5   warning  ES2016 'Array.prototype.includes' method is forbidden                                es-x/no-array-prototype-includes
   771:5   warning  ES2015 'String.prototype.includes' method is forbidden                               es-x/no-string-prototype-includes
   834:6   warning  'negative' declared on line 837 column 7 is used outside of binding context          block-scoped-var
   843:7   warning  'negative' declared on line 837 column 7 is used outside of binding context          block-scoped-var
  1014:6   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1015:6   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1021:6   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1022:6   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1112:11  warning  ES2016 'Array.prototype.includes' method is forbidden                                es-x/no-array-prototype-includes
  1112:11  warning  ES2015 'String.prototype.includes' method is forbidden                               es-x/no-string-prototype-includes
  1118:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1225:7   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1226:8   warning  ES2015 block-scoped variables are forbidden                                          es-x/no-block-scoped-variables
  1258:10  warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1262:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1533:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1646:7   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1653:8   warning  jQuery collection names must match the variablePattern                               no-jquery/variable-pattern
  1929:30  warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1942:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1946:8   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state
  1951:7   warning  Where possible, maintain application state in JS to avoid slower DOM queries         no-jquery/no-class-state

/src/repo/libs/ext.pf.select2.base.js
   73:6  warning  ES2015 block-scoped variables are forbidden     es-x/no-block-scoped-variables
   93:8  warning  ES2015 block-scoped variables are forbidden     es-x/no-block-scoped-variables
  318:6  warning  Prefer `String#slice()` over `String#substr()`  unicorn/prefer-string-slice
  319:6  warning  Prefer `String#slice()` over `String#substr()`  unicorn/prefer-string-slice

/src/repo/libs/ext.pf.select2.tokens.js
   89:11  warning  ES2015 block-scoped variables are forbidden             es-x/no-block-scoped-variables
  288:9   warning  ES2016 'Array.prototype.includes' method is forbidden   es-x/no-array-prototype-includes
  288:9   warning  ES2015 'String.prototype.includes' method is forbidden  es-x/no-string-prototype-includes

✖ 212 problems (0 errors, 212 warnings)


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

Done.

--- end ---
{"1096482": {"source": 1096482, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": ">=7.0.0 <7.5.2"}, "1096483": {"source": 1096483, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": "<5.7.2"}, "1096484": {"source": 1096484, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": ">=6.0.0 <6.3.1"}}
Upgrading n:eslint-plugin-compat from 4.0.2 -> 4.2.0
{"1096482": {"source": 1096482, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": ">=7.0.0 <7.5.2"}, "1096483": {"source": 1096483, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": "<5.7.2"}, "1096484": {"source": 1096484, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}, "range": ">=6.0.0 <6.3.1"}}
Upgrading n:semver from 5.7.1, 6.3.0, 7.3.5, 7.3.8 -> 5.7.2, 6.3.1, 7.6.0
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
build: Updating dependencies

composer:
* mediawiki/mediawiki-codesniffer: 41.0.0 → 43.0.0
  The following sniffs are failing and were disabled:
  * Generic.CodeAnalysis.AssignmentInCondition.Found
  * Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition

  The following sniffs now pass and were enabled:
  * MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures

* mediawiki/mediawiki-phan-config: 0.12.1 → 0.14.0

npm:
* grunt-banana-checker: 0.11.0 → 0.11.1
* grunt-eslint: 24.0.1 → 24.3.0
* eslint-plugin-compat: 4.0.2 → 4.2.0
  * https://github.com/advisories/GHSA-c2qf-rxjj-qqgw
* semver: 5.7.1, 6.3.0, 7.3.5, 7.3.8 → 5.7.2, 6.3.1, 7.6.0
  * https://github.com/advisories/GHSA-c2qf-rxjj-qqgw


$ git add .
--- stdout ---

--- end ---
$ git commit -F /tmp/tmp_u5ghp4x
--- stdout ---
[master 9d8a4f0] build: Updating dependencies
 29 files changed, 430 insertions(+), 440 deletions(-)

--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 9d8a4f01422fa7ff1f4669c9481ab301c2021118 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Sat, 6 Apr 2024 08:51:33 +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: 41.0.0 → 43.0.0
  The following sniffs are failing and were disabled:
  * Generic.CodeAnalysis.AssignmentInCondition.Found
  * Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition

  The following sniffs now pass and were enabled:
  * MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures

* mediawiki/mediawiki-phan-config: 0.12.1 → 0.14.0

npm:
* grunt-banana-checker: 0.11.0 → 0.11.1
* grunt-eslint: 24.0.1 → 24.3.0
* eslint-plugin-compat: 4.0.2 → 4.2.0
  * https://github.com/advisories/GHSA-c2qf-rxjj-qqgw
* semver: 5.7.1, 6.3.0, 7.3.5, 7.3.8 → 5.7.2, 6.3.1, 7.6.0
  * https://github.com/advisories/GHSA-c2qf-rxjj-qqgw

Change-Id: I4d6f5d6ce04f554ec517476f9f1b5c1e7bb317e9
---
 .phpcs.xml                                    |   3 +-
 composer.json                                 |   7 +-
 includes/PF_AutoeditAPI.php                   |   4 +-
 includes/PF_FormField.php                     |   2 +-
 includes/PF_FormLinker.php                    |   2 +-
 includes/PF_FormPrinter.php                   |  32 +-
 includes/PF_Hooks.php                         |   2 +-
 includes/PF_MappingUtils.php                  |   2 +-
 includes/PF_PageSection.php                   |  24 +-
 includes/PF_Template.php                      |   4 +-
 includes/PF_TemplateInForm.php                |   4 +-
 includes/PF_ValuesUtils.php                   |   6 +-
 includes/forminputs/PF_ComboBoxInput.php      |   2 +-
 includes/forminputs/PF_DateInput.php          |   2 +-
 includes/forminputs/PF_DatePickerInput.php    |   2 +-
 includes/forminputs/PF_DateTimePicker.php     |   2 +-
 includes/forminputs/PF_LeafletInput.php       |   2 +-
 includes/forminputs/PF_OpenLayersInput.php    |   2 +-
 includes/forminputs/PF_TokensInput.php        |   2 +-
 .../parserfunctions/PF_TemplateDisplay.php    |   2 +-
 .../parserfunctions/PF_TemplateParams.php     |   2 +-
 package-lock.json                             | 650 +++++++++---------
 package.json                                  |   4 +-
 specials/PF_CreateForm.php                    |   2 +-
 specials/PF_CreateTemplate.php                |   2 +-
 specials/PF_RunQuery.php                      |   2 +-
 specials/PF_UploadWindow.php                  |  88 +--
 .../includes/PFFormPrinterTest.php            |   6 +-
 .../forminputs/PFRadioButtonInputTest.php     |   6 +-
 29 files changed, 430 insertions(+), 440 deletions(-)

diff --git a/.phpcs.xml b/.phpcs.xml
index 3e3cf53..d5853e8 100644
--- a/.phpcs.xml
+++ b/.phpcs.xml
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ruleset>
 	<rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
+		<exclude name="Generic.CodeAnalysis.AssignmentInCondition.Found" />
+		<exclude name="Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition" />
 		<exclude name="Generic.Files.LineLength.TooLong" />
 		<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate" />
 		<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected" />
@@ -9,7 +11,6 @@
 		<exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationProtected" />
 		<exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPublic" />
 		<exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingVar" />
-		<exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
 		<exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
 		<exclude name="MediaWiki.Usage.DeprecatedGlobalVariables.Deprecated$wgTitle" />
 		<exclude name="MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage" />
diff --git a/composer.json b/composer.json
index 78e2d88..c60ea6f 100644
--- a/composer.json
+++ b/composer.json
@@ -34,8 +34,8 @@
 		}
 	},
 	"require-dev": {
-		"mediawiki/mediawiki-codesniffer": "41.0.0",
-		"mediawiki/mediawiki-phan-config": "0.12.1",
+		"mediawiki/mediawiki-codesniffer": "43.0.0",
+		"mediawiki/mediawiki-phan-config": "0.14.0",
 		"mediawiki/minus-x": "1.1.1",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
 		"php-parallel-lint/php-parallel-lint": "1.3.2"
@@ -56,7 +56,8 @@
 	},
 	"config": {
 		"allow-plugins": {
-			"composer/installers": true
+			"composer/installers": true,
+			"dealerdirect/phpcodesniffer-composer-installer": true
 		}
 	}
 }
diff --git a/includes/PF_AutoeditAPI.php b/includes/PF_AutoeditAPI.php
index 74f0162..d63068f 100644
--- a/includes/PF_AutoeditAPI.php
+++ b/includes/PF_AutoeditAPI.php
@@ -940,7 +940,7 @@ class PFAutoeditAPI extends ApiBase {
 			$wgRequest = new FauxRequest( $this->mOptions, true, $session );
 			// Call PFFormPrinter::formHTML() to get at the form
 			// HTML of the existing page.
-			list( $formHTML, $targetContent, $form_page_title, $generatedTargetNameFormula ) =
+			[ $formHTML, $targetContent, $form_page_title, $generatedTargetNameFormula ] =
 				$wgPageFormsFormPrinter->formHTML(
 					// Special handling for autoedit edits -
 					// otherwise, multi-instance templates
@@ -976,7 +976,7 @@ class PFAutoeditAPI extends ApiBase {
 			// Spoof $wgRequest for PFFormPrinter::formHTML().
 			$session = RequestContext::getMain()->getRequest()->getSession();
 			$wgRequest = new FauxRequest( $this->mOptions, true, $session );
-			list( $formHTML, $targetContent, $generatedFormName, $generatedTargetNameFormula ) =
+			[ $formHTML, $targetContent, $generatedFormName, $generatedTargetNameFormula ] =
 				$wgPageFormsFormPrinter->formHTML(
 					$formContent, $isFormSubmitted, $pageExists,
 					$formArticleId, $preloadContent, $targetName, $targetNameFormula,
diff --git a/includes/PF_FormField.php b/includes/PF_FormField.php
index 1f26012..a946bea 100644
--- a/includes/PF_FormField.php
+++ b/includes/PF_FormField.php
@@ -789,7 +789,7 @@ class PFFormField {
 			if ( $fullCargoField != null ) {
 				// It's inefficient to get these values via
 				// text parsing, but oh well.
-				list( $cargo_table, $cargo_field ) = explode( '|', $fullCargoField, 2 );
+				[ $cargo_table, $cargo_field ] = explode( '|', $fullCargoField, 2 );
 				$text .= Html::hidden( 'input_' . $wgPageFormsFieldNum . '_unique_cargo_table', $cargo_table );
 				$text .= Html::hidden( 'input_' . $wgPageFormsFieldNum . '_unique_cargo_field', $cargo_field );
 			}
diff --git a/includes/PF_FormLinker.php b/includes/PF_FormLinker.php
index d0ca5e5..cc8252d 100644
--- a/includes/PF_FormLinker.php
+++ b/includes/PF_FormLinker.php
@@ -47,7 +47,7 @@ class PFFormLinker {
 		// Allow outside code to set/change the preloaded text.
 		MediaWikiServices::getInstance()->getHookContainer()->run( 'PageForms::EditFormPreloadText', [ &$preloadContent, $title, $formTitle ] );
 
-		list( $formText, $pageText, $formPageTitle, $generatedPageName ) =
+		[ $formText, $pageText, $formPageTitle, $generatedPageName ] =
 			$wgPageFormsFormPrinter->formHTML(
 				$formDefinition, false, false, null, $preloadContent,
 				'Some very long page name that will hopefully never get created ABCDEF123',
diff --git a/includes/PF_FormPrinter.php b/includes/PF_FormPrinter.php
index 2345840..beb1f85 100644
--- a/includes/PF_FormPrinter.php
+++ b/includes/PF_FormPrinter.php
@@ -566,7 +566,7 @@ END;
 
 			$inputType = $formField->getInputType();
 			$gridParamValues = [ 'name' => $templateField->getFieldName() ];
-			list( $autocompletedatatype, $autocompletesettings ) = $this->getSpreadsheetAutocompleteAttributes( $formFieldArgs );
+			[ $autocompletedatatype, $autocompletesettings ] = $this->getSpreadsheetAutocompleteAttributes( $formFieldArgs );
 			if ( $formField->getLabel() !== null ) {
 				$gridParamValues['label'] = $formField->getLabel();
 			}
@@ -1309,12 +1309,12 @@ END;
 								$mappingCargoTable = $form_field->getFieldArg( 'mapping cargo table' );
 								$mappingCargoField = $form_field->getFieldArg( 'mapping cargo field' );
 								$mappingCargoValueField = $form_field->getFieldArg( 'mapping cargo value field' );
-								if ( !$form_submitted && $cur_value !== null && $cur_value !== '' ) {
-									$cur_value = $this->getCargoBasedMapping( $cur_value, $mappingCargoTable, $mappingCargoField, $mappingCargoValueField, $form_field );
-								}
-								if ( $form_submitted && $cur_value_in_template !== null && $cur_value_in_template !== '' ) {
-									$cur_value_in_template = $this->getCargoBasedMapping( $cur_value_in_template, $mappingCargoTable, $mappingCargoValueField, $mappingCargoField, $form_field );
-								}
+							if ( !$form_submitted && $cur_value !== null && $cur_value !== '' ) {
+								$cur_value = $this->getCargoBasedMapping( $cur_value, $mappingCargoTable, $mappingCargoField, $mappingCargoValueField, $form_field );
+							}
+							if ( $form_submitted && $cur_value_in_template !== null && $cur_value_in_template !== '' ) {
+								$cur_value_in_template = $this->getCargoBasedMapping( $cur_value_in_template, $mappingCargoTable, $mappingCargoValueField, $mappingCargoField, $form_field );
+							}
 						}
 						if ( $cur_value !== '' &&
 							( $form_field->hasFieldArg( 'mapping template' ) ||
@@ -1465,15 +1465,15 @@ END;
 							}
 						} elseif ( count( $sub_components ) == 2 ) {
 							switch ( $sub_components[0] ) {
-							case 'label':
-								$input_label = self::getParsedValue( $parser, $sub_components[1] );
-								break;
-							case 'class':
-								$attr['class'] = $sub_components[1];
-								break;
-							case 'style':
-								$attr['style'] = Sanitizer::checkCSS( $sub_components[1] );
-								break;
+								case 'label':
+									$input_label = self::getParsedValue( $parser, $sub_components[1] );
+									break;
+								case 'class':
+									$attr['class'] = $sub_components[1];
+									break;
+								case 'style':
+									$attr['style'] = Sanitizer::checkCSS( $sub_components[1] );
+									break;
 							}
 						}
 					}
diff --git a/includes/PF_Hooks.php b/includes/PF_Hooks.php
index 264b7de..4a6d887 100644
--- a/includes/PF_Hooks.php
+++ b/includes/PF_Hooks.php
@@ -347,7 +347,7 @@ class PFHooks {
 			'<div id="pfForm" class="previewnote" style="font-weight: bold">' . $previewNote . "</div>\n<hr />\n";
 
 		$form_definition = StringUtils::delimiterReplace( '<noinclude>', '</noinclude>', '', $editpage->textbox1 );
-		list( $form_text, $data_text, $form_page_title, $generated_page_name ) =
+		[ $form_text, $data_text, $form_page_title, $generated_page_name ] =
 			$wgPageFormsFormPrinter->formHTML( $form_definition, null, false, null, null, "Page Forms form preview dummy title", null );
 
 		$parserOutput = PFUtils::getParser()->getOutput();
diff --git a/includes/PF_MappingUtils.php b/includes/PF_MappingUtils.php
index 35e5d97..3a64585 100644
--- a/includes/PF_MappingUtils.php
+++ b/includes/PF_MappingUtils.php
@@ -404,7 +404,7 @@ class PFMappingUtils {
 	 * @return string
 	 */
 	private static function removeNSPrefixFromLabel( string $label ) {
-		$labelArr = explode( ':',  trim( $label ) );
+		$labelArr = explode( ':', trim( $label ) );
 		if ( count( $labelArr ) > 1 ) {
 			$prefix = array_shift( $labelArr );
 			$res = implode( ':', $labelArr );
diff --git a/includes/PF_PageSection.php b/includes/PF_PageSection.php
index 591541e..5737954 100644
--- a/includes/PF_PageSection.php
+++ b/includes/PF_PageSection.php
@@ -48,18 +48,18 @@ class PFPageSection {
 
 			if ( count( $sub_components ) === 2 ) {
 				switch ( $sub_components[0] ) {
-				case 'level':
-					$ps->mSectionLevel = $sub_components[1];
-					break;
-				case 'rows':
-				case 'cols':
-				case 'class':
-				case 'editor':
-				case 'placeholder':
-					$ps->mSectionArgs[$sub_components[0]] = $sub_components[1];
-					break;
-				default:
-					// Ignore unknown
+					case 'level':
+						$ps->mSectionLevel = $sub_components[1];
+						break;
+					case 'rows':
+					case 'cols':
+					case 'class':
+					case 'editor':
+					case 'placeholder':
+						$ps->mSectionArgs[$sub_components[0]] = $sub_components[1];
+						break;
+					default:
+						// Ignore unknown
 				}
 			}
 		}
diff --git a/includes/PF_Template.php b/includes/PF_Template.php
index 6176438..0a8c5e2 100644
--- a/includes/PF_Template.php
+++ b/includes/PF_Template.php
@@ -242,7 +242,7 @@ class PFTemplate {
 
 		// First, get the table name, and fields, declared for this
 		// template, if any.
-		list( $tableName, $tableSchema ) = $this->getCargoTableAndSchema( $templateTitle );
+		[ $tableName, $tableSchema ] = $this->getCargoTableAndSchema( $templateTitle );
 		if ( $tableName == null ) {
 			$fieldDescriptions = [];
 		} else {
@@ -365,7 +365,7 @@ class PFTemplate {
 		if ( $tableSchemaString === null ) {
 			// There's no declared table - but see if there's an
 			// attached table.
-			list( $tableName, $isDeclared ) = CargoUtils::getTableNameForTemplate( $templateTitle );
+			[ $tableName, $isDeclared ] = CargoUtils::getTableNameForTemplate( $templateTitle );
 			if ( $tableName == null ) {
 				return [ null, null ];
 			}
diff --git a/includes/PF_TemplateInForm.php b/includes/PF_TemplateInForm.php
index c31b717..02fe94e 100644
--- a/includes/PF_TemplateInForm.php
+++ b/includes/PF_TemplateInForm.php
@@ -78,7 +78,7 @@ class PFTemplateInForm {
 		$tif->mAddButtonText = wfMessage( 'pf_formedit_addanother' )->text();
 
 		if ( array_key_exists( $tif->mTemplateName, $wgPageFormsEmbeddedTemplates ) ) {
-			list( $tif->mEmbedInTemplate, $tif->mEmbedInField ) =
+			[ $tif->mEmbedInTemplate, $tif->mEmbedInField ] =
 				$wgPageFormsEmbeddedTemplates[$tif->mTemplateName];
 			$tif->mPlaceholder = PFFormPrinter::placeholderFormat( $tif->mEmbedInTemplate, $tif->mEmbedInField );
 		}
@@ -381,7 +381,7 @@ class PFTemplateInForm {
 			[ '<nowiki', 'nowiki>' ]
 		];
 		foreach ( $startAndEndTags as $tags ) {
-			list( $startTag, $endTag ) = $tags;
+			[ $startTag, $endTag ] = $tags;
 
 			$startTagLoc = -1;
 			while ( ( $startTagLoc + strlen( $startTag ) < strlen( $str ) ) &&
diff --git a/includes/PF_ValuesUtils.php b/includes/PF_ValuesUtils.php
index 9851815..d3b3f47 100644
--- a/includes/PF_ValuesUtils.php
+++ b/includes/PF_ValuesUtils.php
@@ -661,7 +661,7 @@ SERVICE wikibase:label { bd:serviceParam wikibase:language \"" . $wgLanguageCode
 			if ( count( $arr ) == 3 ) {
 				$names_array = self::getValuesForCargoField( $arr[0], $arr[1], $arr[2] );
 			} else {
-				list( $table_name, $field_name ) = explode( '|', $source_name, 2 );
+				[ $table_name, $field_name ] = explode( '|', $source_name, 2 );
 				$names_array = self::getAllValuesForCargoField( $table_name, $field_name );
 			}
 			// Remove blank/null values from the array.
@@ -794,7 +794,7 @@ SERVICE wikibase:label { bd:serviceParam wikibase:language \"" . $wgLanguageCode
 	 * @return string[]
 	 */
 	public static function setAutocompleteValues( $field_args, $is_list ) {
-		list( $autocompleteFieldType, $autocompletionSource ) =
+		[ $autocompleteFieldType, $autocompletionSource ] =
 			self::getAutocompletionTypeAndSource( $field_args );
 		$autocompleteSettings = $autocompletionSource;
 		if ( $is_list ) {
@@ -912,7 +912,7 @@ SERVICE wikibase:label { bd:serviceParam wikibase:language \"" . $wgLanguageCode
 
 		$rawQuery = $rawQuery . "|named args=yes|link=none|limit=$wgPageFormsMaxAutocompleteValues|searchlabel=";
 		$rawQueryArray = explode( "|", $rawQuery );
-		list( $queryString, $processedParams, $printouts ) = SMWQueryProcessor::getComponentsFromFunctionParams( $rawQueryArray, false );
+		[ $queryString, $processedParams, $printouts ] = SMWQueryProcessor::getComponentsFromFunctionParams( $rawQueryArray, false );
 		SMWQueryProcessor::addThisPrintout( $printouts, $processedParams );
 		$processedParams = SMWQueryProcessor::getProcessedParams( $processedParams, $printouts );
 
diff --git a/includes/forminputs/PF_ComboBoxInput.php b/includes/forminputs/PF_ComboBoxInput.php
index b220c30..64278df 100644
--- a/includes/forminputs/PF_ComboBoxInput.php
+++ b/includes/forminputs/PF_ComboBoxInput.php
@@ -98,7 +98,7 @@ class PFComboBoxInput extends PFFormInput {
 				}
 			}
 		} else {
-			list( $autocompleteSettings, $remoteDataType, $delimiter ) = PFValuesUtils::setAutocompleteValues( $other_args, false );
+			[ $autocompleteSettings, $remoteDataType, $delimiter ] = PFValuesUtils::setAutocompleteValues( $other_args, false );
 			$autocompleteSettings = str_replace( "'", "\'", $autocompleteSettings );
 		}
 
diff --git a/includes/forminputs/PF_DateInput.php b/includes/forminputs/PF_DateInput.php
index c5801c4..ac301eb 100644
--- a/includes/forminputs/PF_DateInput.php
+++ b/includes/forminputs/PF_DateInput.php
@@ -174,7 +174,7 @@ class PFDateInput extends PFFormInput {
 				$month = $date['month'];
 				$day = $date['day'];
 			} else {
-				list( $year, $month, $day ) = self::parseDate( $date );
+				[ $year, $month, $day ] = self::parseDate( $date );
 			}
 		} else {
 			// Just keep everything at null.
diff --git a/includes/forminputs/PF_DatePickerInput.php b/includes/forminputs/PF_DatePickerInput.php
index 6d1f575..ea7283c 100644
--- a/includes/forminputs/PF_DatePickerInput.php
+++ b/includes/forminputs/PF_DatePickerInput.php
@@ -30,7 +30,7 @@ class PFDatePickerInput extends PFFormInput {
 	 */
 	public function __construct( $input_number, $cur_value, $input_name, $disabled, array $other_args ) {
 		if ( $cur_value != '' ) {
-			list( $year, $month, $day ) = PFDateInput::parseDate( $cur_value );
+			[ $year, $month, $day ] = PFDateInput::parseDate( $cur_value );
 			$cur_value = sprintf( '%04d-%02d-%02d', $year, $month, $day );
 		}
 
diff --git a/includes/forminputs/PF_DateTimePicker.php b/includes/forminputs/PF_DateTimePicker.php
index 75fd4ca..097271d 100644
--- a/includes/forminputs/PF_DateTimePicker.php
+++ b/includes/forminputs/PF_DateTimePicker.php
@@ -30,7 +30,7 @@ class PFDateTimePicker extends PFFormInput {
 	 */
 	public function __construct( $input_number, $cur_value, $input_name, $disabled, array $other_args ) {
 		if ( $cur_value != '' ) {
-			list( $year, $month, $day, $time ) = PFDateInput::parseDate( $cur_value, true );
+			[ $year, $month, $day, $time ] = PFDateInput::parseDate( $cur_value, true );
 			$cur_value = sprintf( '%04d-%02d-%02dT%sZ', $year, $month, $day, $time );
 		}
 		parent::__construct( $input_number, $cur_value, $input_name, $disabled, $other_args );
diff --git a/includes/forminputs/PF_LeafletInput.php b/includes/forminputs/PF_LeafletInput.php
index 10b695a..bbee11a 100644
--- a/includes/forminputs/PF_LeafletInput.php
+++ b/includes/forminputs/PF_LeafletInput.php
@@ -51,7 +51,7 @@ class PFLeafletInput extends PFOpenLayersInput {
 			$imagePage = new ImagePage( $fileTitle );
 			$file = $imagePage->getDisplayedFile();
 			$filePath = $wgUploadDirectory . '/' . $file->getUrlRel();
-			list( $imageWidth, $imageHeight, $type, $attr ) = getimagesize( $filePath );
+			[ $imageWidth, $imageHeight, $type, $attr ] = getimagesize( $filePath );
 			if ( !array_key_exists( 'height', $other_args ) && !array_key_exists( 'width', $other_args ) ) {
 				// Scale down image if it's huge.
 				$maxDimension = max( $imageHeight, $imageWidth );
diff --git a/includes/forminputs/PF_OpenLayersInput.php b/includes/forminputs/PF_OpenLayersInput.php
index b4076ae..cbc4a35 100644
--- a/includes/forminputs/PF_OpenLayersInput.php
+++ b/includes/forminputs/PF_OpenLayersInput.php
@@ -278,7 +278,7 @@ class PFOpenLayersInput extends PFFormInput {
 		if ( count( $latAndLonStrings ) != 2 ) {
 			throw new MWException( "Error parsing coordinates string: \"$coordinatesString\"." );
 		}
-		list( $latString, $lonString ) = $latAndLonStrings;
+		[ $latString, $lonString ] = $latAndLonStrings;
 
 		// Handle strings one at a time.
 		$latIsNegative = false;
diff --git a/includes/forminputs/PF_TokensInput.php b/includes/forminputs/PF_TokensInput.php
index 8309c0a..562a15e 100644
--- a/includes/forminputs/PF_TokensInput.php
+++ b/includes/forminputs/PF_TokensInput.php
@@ -95,7 +95,7 @@ class PFTokensInput extends PFFormInput {
 				$delimiter = ',';
 			}
 		} else {
-			list( $autocompleteSettings, $remoteDataType, $delimiter ) = PFValuesUtils::setAutocompleteValues( $other_args, true );
+			[ $autocompleteSettings, $remoteDataType, $delimiter ] = PFValuesUtils::setAutocompleteValues( $other_args, true );
 		}
 
 		if ( is_array( $cur_value ) ) {
diff --git a/includes/parserfunctions/PF_TemplateDisplay.php b/includes/parserfunctions/PF_TemplateDisplay.php
index 4418599..93f8b23 100644
--- a/includes/parserfunctions/PF_TemplateDisplay.php
+++ b/includes/parserfunctions/PF_TemplateDisplay.php
@@ -171,7 +171,7 @@ class PFTemplateDisplay {
 		$mappingFormat = new CargoMapsFormat( $parser->getOutput() );
 
 		try {
-			list( $lat, $lon ) = CargoUtils::parseCoordinatesString( $coordinatesStr );
+			[ $lat, $lon ] = CargoUtils::parseCoordinatesString( $coordinatesStr );
 		} catch ( MWException $e ) {
 			return '';
 		}
diff --git a/includes/parserfunctions/PF_TemplateParams.php b/includes/parserfunctions/PF_TemplateParams.php
index 5f0df47..b4f3375 100644
--- a/includes/parserfunctions/PF_TemplateParams.php
+++ b/includes/parserfunctions/PF_TemplateParams.php
@@ -33,7 +33,7 @@ class PFTemplateParams {
 
 		$fieldData = [];
 		foreach ( $params as $param ) {
-			list( $fieldName, $fieldParams ) = self::parseWikitextString( $param );
+			[ $fieldName, $fieldParams ] = self::parseWikitextString( $param );
 			if ( $fieldName !== '' ) {
 				$fieldData[$fieldName] = $fieldParams;
 			}
diff --git a/package-lock.json b/package-lock.json
index c55e8b2..fd4d12d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,8 +8,17 @@
 			"devDependencies": {
 				"eslint-config-wikimedia": "0.25.0",
 				"grunt": "1.6.1",
-				"grunt-banana-checker": "0.11.0",
-				"grunt-eslint": "24.0.1"
+				"grunt-banana-checker": "0.11.1",
+				"grunt-eslint": "24.3.0"
+			}
+		},
+		"node_modules/@aashutoshrathi/word-wrap": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+			"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
 			}
 		},
 		"node_modules/@babel/code-frame": {
@@ -109,23 +118,23 @@
 			}
 		},
 		"node_modules/@eslint-community/regexpp": {
-			"version": "4.4.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
-			"integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
+			"version": "4.10.0",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
 			"dev": true,
 			"engines": {
 				"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@eslint/eslintrc": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
-			"integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
+			"version": "2.1.4",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+			"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
 			"dev": true,
 			"dependencies": {
 				"ajv": "^6.12.4",
 				"debug": "^4.3.2",
-				"espree": "^9.5.0",
+				"espree": "^9.6.0",
 				"globals": "^13.19.0",
 				"ignore": "^5.2.0",
 				"import-fresh": "^3.2.1",
@@ -171,22 +180,22 @@
 			}
 		},
 		"node_modules/@eslint/js": {
-			"version": "8.36.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
-			"integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@humanwhocodes/config-array": {
-			"version": "0.11.8",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
-			"integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"dependencies": {
-				"@humanwhocodes/object-schema": "^1.2.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			},
 			"engines": {
@@ -207,15 +216,15 @@
 			}
 		},
 		"node_modules/@humanwhocodes/object-schema": {
-			"version": "1.2.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
-			"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"node_modules/@mdn/browser-compat-data": {
-			"version": "4.2.1",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz",
-			"integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==",
+			"version": "5.5.19",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.19.tgz",
+			"integrity": "sha512-ntKBZtwWCy4XvJosdTJKqIMdmzgbxjopfoiMxgpzsml3dXqA7MIHCE/amidfQc06a6KvmMrpiVuYHIBt2feDog==",
 			"dev": true
 		},
 		"node_modules/@nodelib/fs.scandir": {
@@ -259,6 +268,12 @@
 			"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
 			"dev": true
 		},
+		"node_modules/@ungap/structured-clone": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+			"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+			"dev": true
+		},
 		"node_modules/abbrev": {
 			"version": "1.1.1",
 			"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -266,9 +281,9 @@
 			"dev": true
 		},
 		"node_modules/acorn": {
-			"version": "8.8.2",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
-			"integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+			"version": "8.11.3",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+			"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
 			"dev": true,
 			"bin": {
 				"acorn": "bin/acorn"
@@ -357,20 +372,14 @@
 			}
 		},
 		"node_modules/ast-metadata-inferer": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.7.0.tgz",
-			"integrity": "sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q==",
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
+			"integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
 			"dev": true,
 			"dependencies": {
-				"@mdn/browser-compat-data": "^3.3.14"
+				"@mdn/browser-compat-data": "^5.2.34"
 			}
 		},
-		"node_modules/ast-metadata-inferer/node_modules/@mdn/browser-compat-data": {
-			"version": "3.3.14",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz",
-			"integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==",
-			"dev": true
-		},
 		"node_modules/async": {
 			"version": "3.2.3",
 			"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
@@ -412,9 +421,9 @@
 			}
 		},
 		"node_modules/browserslist": {
-			"version": "4.20.3",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
-			"integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -424,14 +433,17 @@
 				{
 					"type": "tidelift",
 					"url": "https://tidelift.com/funding/github/npm/browserslist"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001332",
-				"electron-to-chromium": "^1.4.118",
-				"escalade": "^3.1.1",
-				"node-releases": "^2.0.3",
-				"picocolors": "^1.0.0"
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
+				"node-releases": "^2.0.14",
+				"update-browserslist-db": "^1.0.13"
 			},
 			"bin": {
 				"browserslist": "cli.js"
@@ -468,9 +480,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001341",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz",
-			"integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==",
+			"version": "1.0.30001606",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz",
+			"integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==",
 			"dev": true,
 			"funding": [
 				{
@@ -480,6 +492,10 @@
 				{
 					"type": "tidelift",
 					"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
 				}
 			]
 		},
@@ -625,17 +641,6 @@
 			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
 			"dev": true
 		},
-		"node_modules/core-js": {
-			"version": "3.22.5",
-			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz",
-			"integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==",
-			"dev": true,
-			"hasInstallScript": true,
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/core-js"
-			}
-		},
 		"node_modules/cross-spawn": {
 			"version": "7.0.3",
 			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -716,9 +721,9 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.137",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz",
-			"integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==",
+			"version": "1.4.729",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz",
+			"integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==",
 			"dev": true
 		},
 		"node_modules/error-ex": {
@@ -731,9 +736,9 @@
 			}
 		},
 		"node_modules/escalade": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-			"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+			"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
 			"dev": true,
 			"engines": {
 				"node": ">=6"
@@ -752,27 +757,28 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "8.36.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
-			"integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.2.0",
-				"@eslint-community/regexpp": "^4.4.0",
-				"@eslint/eslintrc": "^2.0.1",
-				"@eslint/js": "8.36.0",
-				"@humanwhocodes/config-array": "^0.11.8",
+				"@eslint-community/regexpp": "^4.6.1",
+				"@eslint/eslintrc": "^2.1.4",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
-				"ajv": "^6.10.0",
+				"@ungap/structured-clone": "^1.2.0",
+				"ajv": "^6.12.4",
 				"chalk": "^4.0.0",
 				"cross-spawn": "^7.0.2",
 				"debug": "^4.3.2",
 				"doctrine": "^3.0.0",
 				"escape-string-regexp": "^4.0.0",
-				"eslint-scope": "^7.1.1",
-				"eslint-visitor-keys": "^3.3.0",
-				"espree": "^9.5.0",
+				"eslint-scope": "^7.2.2",
+				"eslint-visitor-keys": "^3.4.3",
+				"espree": "^9.6.1",
 				"esquery": "^1.4.2",
 				"esutils": "^2.0.2",
 				"fast-deep-equal": "^3.1.3",
@@ -780,22 +786,19 @@
 				"find-up": "^5.0.0",
 				"glob-parent": "^6.0.2",
 				"globals": "^13.19.0",
-				"grapheme-splitter": "^1.0.4",
+				"graphemer": "^1.4.0",
 				"ignore": "^5.2.0",
-				"import-fresh": "^3.0.0",
 				"imurmurhash": "^0.1.4",
 				"is-glob": "^4.0.0",
 				"is-path-inside": "^3.0.3",
-				"js-sdsl": "^4.1.4",
 				"js-yaml": "^4.1.0",
 				"json-stable-stringify-without-jsonify": "^1.0.1",
 				"levn": "^0.4.1",
 				"lodash.merge": "^4.6.2",
 				"minimatch": "^3.1.2",
 				"natural-compare": "^1.4.0",
-				"optionator": "^0.9.1",
+				"optionator": "^0.9.3",
 				"strip-ansi": "^6.0.1",
-				"strip-json-comments": "^3.1.0",
 				"text-table": "^0.2.0"
 			},
 			"bin": {
@@ -833,22 +836,21 @@
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz",
-			"integrity": "sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg==",
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
+			"integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
 			"dev": true,
 			"dependencies": {
-				"@mdn/browser-compat-data": "^4.1.5",
-				"ast-metadata-inferer": "^0.7.0",
-				"browserslist": "^4.16.8",
-				"caniuse-lite": "^1.0.30001304",
-				"core-js": "^3.16.2",
+				"@mdn/browser-compat-data": "^5.3.13",
+				"ast-metadata-inferer": "^0.8.0",
+				"browserslist": "^4.21.10",
+				"caniuse-lite": "^1.0.30001524",
 				"find-up": "^5.0.0",
-				"lodash.memoize": "4.1.2",
-				"semver": "7.3.5"
+				"lodash.memoize": "^4.1.2",
+				"semver": "^7.5.4"
 			},
 			"engines": {
-				"node": ">=9.x"
+				"node": ">=14.x"
 			},
 			"peerDependencies": {
 				"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
@@ -894,21 +896,6 @@
 				"eslint": "^7.0.0 || ^8.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-jsdoc/node_modules/semver": {
-			"version": "7.3.8",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-			"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-			"dev": true,
-			"dependencies": {
-				"lru-cache": "^6.0.0"
-			},
-			"bin": {
-				"semver": "bin/semver.js"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
 		"node_modules/eslint-plugin-json-es": {
 			"version": "1.5.7",
 			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
@@ -1027,9 +1014,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-node/node_modules/semver": {
-			"version": "6.3.0",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-			"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+			"version": "6.3.1",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+			"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
 			"dev": true,
 			"bin": {
 				"semver": "bin/semver.js"
@@ -1220,9 +1207,9 @@
 			}
 		},
 		"node_modules/eslint-scope": {
-			"version": "7.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-			"integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+			"version": "7.2.2",
+			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+			"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
 			"dev": true,
 			"dependencies": {
 				"esrecurse": "^4.3.0",
@@ -1230,6 +1217,9 @@
 			},
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/eslint-utils": {
@@ -1260,12 +1250,15 @@
 			"dev": true
 		},
 		"node_modules/eslint/node_modules/eslint-visitor-keys": {
-			"version": "3.3.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-			"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+			"version": "3.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+			"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/eslint/node_modules/js-yaml": {
@@ -1293,14 +1286,14 @@
 			}
 		},
 		"node_modules/espree": {
-			"version": "9.5.0",
-			"resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
-			"integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
+			"version": "9.6.1",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+			"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
 			"dev": true,
 			"dependencies": {
-				"acorn": "^8.8.0",
+				"acorn": "^8.9.0",
 				"acorn-jsx": "^5.3.2",
-				"eslint-visitor-keys": "^3.3.0"
+				"eslint-visitor-keys": "^3.4.1"
 			},
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1310,12 +1303,15 @@
 			}
 		},
 		"node_modules/espree/node_modules/eslint-visitor-keys": {
-			"version": "3.3.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-			"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+			"version": "3.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+			"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
 			}
 		},
 		"node_modules/esprima": {
@@ -1421,7 +1417,7 @@
 		"node_modules/fast-levenshtein": {
 			"version": "2.0.6",
 			"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+			"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
 			"dev": true
 		},
 		"node_modules/fastq": {
@@ -1646,9 +1642,9 @@
 			}
 		},
 		"node_modules/globals": {
-			"version": "13.20.0",
-			"resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
-			"integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+			"version": "13.24.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+			"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
 			"dev": true,
 			"dependencies": {
 				"type-fest": "^0.20.2"
@@ -1660,10 +1656,10 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/grapheme-splitter": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
-			"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+		"node_modules/graphemer": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+			"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
 			"dev": true
 		},
 		"node_modules/grunt": {
@@ -1694,9 +1690,9 @@
 			}
 		},
 		"node_modules/grunt-banana-checker": {
-			"version": "0.11.0",
-			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.0.tgz",
-			"integrity": "sha512-qXtcxu7y9GFEIx6ELm5jSf+JqvCafdco+t/YsrUhUDNe9AgCnP7X0R+PxT0qZaDftKVrDrR2gPOYqpaAye5bDw==",
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz",
+			"integrity": "sha512-CF0h/TXaX9sbF2yIz+fUfJc4Zvms7XGYQ7ZYMD5+vv0LMZzSFf7JSHXDaBEs72nQWw4r4ap5fOW3baAliW+0bQ==",
 			"dev": true,
 			"bin": {
 				"banana-checker": "src/cli.js"
@@ -1738,13 +1734,13 @@
 			}
 		},
 		"node_modules/grunt-eslint": {
-			"version": "24.0.1",
-			"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.1.tgz",
-			"integrity": "sha512-gFzp+ikAkwyu6nqBE2zx1pLVL0JPrerG7jaO4uJV3XUGKPIipv4mfhDOS5MyiMrzUtGdXSW8FkRHjoUnfqbW+g==",
+			"version": "24.3.0",
+			"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.3.0.tgz",
+			"integrity": "sha512-dUPiRgX8fhmh4uwTAn9xrzg7HV5j5DhGmZZGJdHfjy/AN9G4jD+5IjfbcAJ209JcIG8m4B7xz3crIhuDSm3siQ==",
 			"dev": true,
 			"dependencies": {
 				"chalk": "^4.1.2",
-				"eslint": "^8.0.1"
+				"eslint": "^8.44.0"
 			},
 			"engines": {
 				"node": ">=12"
@@ -2087,16 +2083,6 @@
 				"node": ">=0.10.0"
 			}
 		},
-		"node_modules/js-sdsl": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
-			"integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
-			"dev": true,
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/js-sdsl"
-			}
-		},
 		"node_modules/js-tokens": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -2318,9 +2304,9 @@
 			"dev": true
 		},
 		"node_modules/node-releases": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz",
-			"integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==",
+			"version": "2.0.14",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+			"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
 			"dev": true
 		},
 		"node_modules/nopt": {
@@ -2348,9 +2334,9 @@
 			}
 		},
 		"node_modules/normalize-package-data/node_modules/semver": {
-			"version": "5.7.1",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-			"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+			"version": "5.7.2",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+			"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 			"dev": true,
 			"bin": {
 				"semver": "bin/semver"
@@ -2418,17 +2404,17 @@
 			}
 		},
 		"node_modules/optionator": {
-			"version": "0.9.1",
-			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-			"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+			"version": "0.9.3",
+			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+			"integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
 			"dev": true,
 			"dependencies": {
+				"@aashutoshrathi/word-wrap": "^1.2.3",
 				"deep-is": "^0.1.3",
 				"fast-levenshtein": "^2.0.6",
 				"levn": "^0.4.1",
 				"prelude-ls": "^1.2.1",
-				"type-check": "^0.4.0",
-				"word-wrap": "^1.2.3"
+				"type-check": "^0.4.0"
 			},
 			"engines": {
 				"node": ">= 0.8.0"
@@ -2658,9 +2644,9 @@
 			}
 		},
 		"node_modules/punycode": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
-			"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+			"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
 			"dev": true,
 			"engines": {
 				"node": ">=6"
@@ -2936,9 +2922,9 @@
 			"dev": true
 		},
 		"node_modules/semver": {
-			"version": "7.3.5",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-			"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"dependencies": {
 				"lru-cache": "^6.0.0"
@@ -3143,6 +3129,36 @@
 				"yarn": "*"
 			}
 		},
+		"node_modules/update-browserslist-db": {
+			"version": "1.0.13",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+			"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+			"dev": true,
+			"funding": [
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/browserslist"
+				},
+				{
+					"type": "tidelift",
+					"url": "https://tidelift.com/funding/github/npm/browserslist"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
+				}
+			],
+			"dependencies": {
+				"escalade": "^3.1.1",
+				"picocolors": "^1.0.0"
+			},
+			"bin": {
+				"update-browserslist-db": "cli.js"
+			},
+			"peerDependencies": {
+				"browserslist": ">= 4.21.0"
+			}
+		},
 		"node_modules/uri-js": {
 			"version": "4.4.1",
 			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -3231,15 +3247,6 @@
 				"node": ">= 8"
 			}
 		},
-		"node_modules/word-wrap": {
-			"version": "1.2.3",
-			"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-			"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
 		"node_modules/wrappy": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -3298,6 +3305,12 @@
 		}
 	},
 	"dependencies": {
+		"@aashutoshrathi/word-wrap": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+			"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+			"dev": true
+		},
 		"@babel/code-frame": {
 			"version": "7.18.6",
 			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -3372,20 +3385,20 @@
 			}
 		},
 		"@eslint-community/regexpp": {
-			"version": "4.4.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
-			"integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
+			"version": "4.10.0",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
 			"dev": true
 		},
 		"@eslint/eslintrc": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
-			"integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
+			"version": "2.1.4",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+			"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
 			"dev": true,
 			"requires": {
 				"ajv": "^6.12.4",
 				"debug": "^4.3.2",
-				"espree": "^9.5.0",
+				"espree": "^9.6.0",
 				"globals": "^13.19.0",
 				"ignore": "^5.2.0",
 				"import-fresh": "^3.2.1",
@@ -3421,19 +3434,19 @@
 			}
 		},
 		"@eslint/js": {
-			"version": "8.36.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
-			"integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true
 		},
 		"@humanwhocodes/config-array": {
-			"version": "0.11.8",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
-			"integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"requires": {
-				"@humanwhocodes/object-schema": "^1.2.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			}
 		},
@@ -3444,15 +3457,15 @@
 			"dev": true
 		},
 		"@humanwhocodes/object-schema": {
-			"version": "1.2.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
-			"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"@mdn/browser-compat-data": {
-			"version": "4.2.1",
-			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz",
-			"integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==",
+			"version": "5.5.19",
+			"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.19.tgz",
+			"integrity": "sha512-ntKBZtwWCy4XvJosdTJKqIMdmzgbxjopfoiMxgpzsml3dXqA7MIHCE/amidfQc06a6KvmMrpiVuYHIBt2feDog==",
 			"dev": true
 		},
 		"@nodelib/fs.scandir": {
@@ -3487,6 +3500,12 @@
 			"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
 			"dev": true
 		},
+		"@ungap/structured-clone": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+			"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+			"dev": true
+		},
 		"abbrev": {
 			"version": "1.1.1",
 			"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -3494,9 +3513,9 @@
 			"dev": true
 		},
 		"acorn": {
-			"version": "8.8.2",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
-			"integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+			"version": "8.11.3",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+			"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
 			"dev": true
 		},
 		"acorn-jsx": {
@@ -3563,20 +3582,12 @@
 			"dev": true
 		},
 		"ast-metadata-inferer": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.7.0.tgz",
-			"integrity": "sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q==",
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz",
+			"integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==",
 			"dev": true,
 			"requires": {
-				"@mdn/browser-compat-data": "^3.3.14"
-			},
-			"dependencies": {
-				"@mdn/browser-compat-data": {
-					"version": "3.3.14",
-					"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz",
-					"integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==",
-					"dev": true
-				}
+				"@mdn/browser-compat-data": "^5.2.34"
 			}
 		},
 		"async": {
@@ -3617,16 +3628,15 @@
 			}
 		},
 		"browserslist": {
-			"version": "4.20.3",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
-			"integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001332",
-				"electron-to-chromium": "^1.4.118",
-				"escalade": "^3.1.1",
-				"node-releases": "^2.0.3",
-				"picocolors": "^1.0.0"
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
+				"node-releases": "^2.0.14",
+				"update-browserslist-db": "^1.0.13"
 			}
 		},
 		"browserslist-config-wikimedia": {
@@ -3648,9 +3658,9 @@
 			"dev": true
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001341",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz",
-			"integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==",
+			"version": "1.0.30001606",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz",
+			"integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==",
 			"dev": true
 		},
 		"chalk": {
@@ -3760,12 +3770,6 @@
 			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
 			"dev": true
 		},
-		"core-js": {
-			"version": "3.22.5",
-			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz",
-			"integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==",
-			"dev": true
-		},
 		"cross-spawn": {
 			"version": "7.0.3",
 			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -3820,9 +3824,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.137",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz",
-			"integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==",
+			"version": "1.4.729",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz",
+			"integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==",
 			"dev": true
 		},
 		"error-ex": {
@@ -3835,9 +3839,9 @@
 			}
 		},
 		"escalade": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-			"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+			"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
 			"dev": true
 		},
 		"escape-string-regexp": {
@@ -3847,27 +3851,28 @@
 			"dev": true
 		},
 		"eslint": {
-			"version": "8.36.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
-			"integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.2.0",
-				"@eslint-community/regexpp": "^4.4.0",
-				"@eslint/eslintrc": "^2.0.1",
-				"@eslint/js": "8.36.0",
-				"@humanwhocodes/config-array": "^0.11.8",
+				"@eslint-community/regexpp": "^4.6.1",
+				"@eslint/eslintrc": "^2.1.4",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
-				"ajv": "^6.10.0",
+				"@ungap/structured-clone": "^1.2.0",
+				"ajv": "^6.12.4",
 				"chalk": "^4.0.0",
 				"cross-spawn": "^7.0.2",
 				"debug": "^4.3.2",
 				"doctrine": "^3.0.0",
 				"escape-string-regexp": "^4.0.0",
-				"eslint-scope": "^7.1.1",
-				"eslint-visitor-keys": "^3.3.0",
-				"espree": "^9.5.0",
+				"eslint-scope": "^7.2.2",
+				"eslint-visitor-keys": "^3.4.3",
+				"espree": "^9.6.1",
 				"esquery": "^1.4.2",
 				"esutils": "^2.0.2",
 				"fast-deep-equal": "^3.1.3",
@@ -3875,22 +3880,19 @@
 				"find-up": "^5.0.0",
 				"glob-parent": "^6.0.2",
 				"globals": "^13.19.0",
-				"grapheme-splitter": "^1.0.4",
+				"graphemer": "^1.4.0",
 				"ignore": "^5.2.0",
-				"import-fresh": "^3.0.0",
 				"imurmurhash": "^0.1.4",
 				"is-glob": "^4.0.0",
 				"is-path-inside": "^3.0.3",
-				"js-sdsl": "^4.1.4",
 				"js-yaml": "^4.1.0",
 				"json-stable-stringify-without-jsonify": "^1.0.1",
 				"levn": "^0.4.1",
 				"lodash.merge": "^4.6.2",
 				"minimatch": "^3.1.2",
 				"natural-compare": "^1.4.0",
-				"optionator": "^0.9.1",
+				"optionator": "^0.9.3",
 				"strip-ansi": "^6.0.1",
-				"strip-json-comments": "^3.1.0",
 				"text-table": "^0.2.0"
 			},
 			"dependencies": {
@@ -3901,9 +3903,9 @@
 					"dev": true
 				},
 				"eslint-visitor-keys": {
-					"version": "3.3.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-					"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+					"version": "3.4.3",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+					"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
 					"dev": true
 				},
 				"js-yaml": {
@@ -3951,19 +3953,18 @@
 			}
 		},
 		"eslint-plugin-compat": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz",
-			"integrity": "sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg==",
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
+			"integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
 			"dev": true,
 			"requires": {
-				"@mdn/browser-compat-data": "^4.1.5",
-				"ast-metadata-inferer": "^0.7.0",
-				"browserslist": "^4.16.8",
-				"caniuse-lite": "^1.0.30001304",
-				"core-js": "^3.16.2",
+				"@mdn/browser-compat-data": "^5.3.13",
+				"ast-metadata-inferer": "^0.8.0",
+				"browserslist": "^4.21.10",
+				"caniuse-lite": "^1.0.30001524",
 				"find-up": "^5.0.0",
-				"lodash.memoize": "4.1.2",
-				"semver": "7.3.5"
+				"lodash.memoize": "^4.1.2",
+				"semver": "^7.5.4"
 			}
 		},
 		"eslint-plugin-es-x": {
@@ -3989,17 +3990,6 @@
 				"esquery": "^1.4.0",
 				"semver": "^7.3.7",
 				"spdx-expression-parse": "^3.0.1"
-			},
-			"dependencies": {
-				"semver": {
-					"version": "7.3.8",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-					"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-					"dev": true,
-					"requires": {
-						"lru-cache": "^6.0.0"
-					}
-				}
 			}
 		},
 		"eslint-plugin-json-es": {
@@ -4089,9 +4079,9 @@
 					}
 				},
 				"semver": {
-					"version": "6.3.0",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-					"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+					"version": "6.3.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+					"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
 					"dev": true
 				}
 			}
@@ -4221,9 +4211,9 @@
 			}
 		},
 		"eslint-scope": {
-			"version": "7.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-			"integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+			"version": "7.2.2",
+			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+			"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
 			"dev": true,
 			"requires": {
 				"esrecurse": "^4.3.0",
@@ -4246,20 +4236,20 @@
 			"dev": true
 		},
 		"espree": {
-			"version": "9.5.0",
-			"resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
-			"integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
+			"version": "9.6.1",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+			"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
 			"dev": true,
 			"requires": {
-				"acorn": "^8.8.0",
+				"acorn": "^8.9.0",
 				"acorn-jsx": "^5.3.2",
-				"eslint-visitor-keys": "^3.3.0"
+				"eslint-visitor-keys": "^3.4.1"
 			},
 			"dependencies": {
 				"eslint-visitor-keys": {
-					"version": "3.3.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-					"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+					"version": "3.4.3",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+					"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
 					"dev": true
 				}
 			}
@@ -4342,7 +4332,7 @@
 		"fast-levenshtein": {
 			"version": "2.0.6",
 			"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+			"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
 			"dev": true
 		},
 		"fastq": {
@@ -4521,18 +4511,18 @@
 			}
 		},
 		"globals": {
-			"version": "13.20.0",
-			"resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
-			"integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+			"version": "13.24.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+			"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
 			"dev": true,
 			"requires": {
 				"type-fest": "^0.20.2"
 			}
 		},
-		"grapheme-splitter": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
-			"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+		"graphemer": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+			"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
 			"dev": true
 		},
 		"grunt": {
@@ -4557,9 +4547,9 @@
 			}
 		},
 		"grunt-banana-checker": {
-			"version": "0.11.0",
-			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.0.tgz",
-			"integrity": "sha512-qXtcxu7y9GFEIx6ELm5jSf+JqvCafdco+t/YsrUhUDNe9AgCnP7X0R+PxT0qZaDftKVrDrR2gPOYqpaAye5bDw==",
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz",
+			"integrity": "sha512-CF0h/TXaX9sbF2yIz+fUfJc4Zvms7XGYQ7ZYMD5+vv0LMZzSFf7JSHXDaBEs72nQWw4r4ap5fOW3baAliW+0bQ==",
 			"dev": true
 		},
 		"grunt-cli": {
@@ -4588,13 +4578,13 @@
 			}
 		},
 		"grunt-eslint": {
-			"version": "24.0.1",
-			"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.1.tgz",
-			"integrity": "sha512-gFzp+ikAkwyu6nqBE2zx1pLVL0JPrerG7jaO4uJV3XUGKPIipv4mfhDOS5MyiMrzUtGdXSW8FkRHjoUnfqbW+g==",
+			"version": "24.3.0",
+			"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.3.0.tgz",
+			"integrity": "sha512-dUPiRgX8fhmh4uwTAn9xrzg7HV5j5DhGmZZGJdHfjy/AN9G4jD+5IjfbcAJ209JcIG8m4B7xz3crIhuDSm3siQ==",
 			"dev": true,
 			"requires": {
 				"chalk": "^4.1.2",
-				"eslint": "^8.0.1"
+				"eslint": "^8.44.0"
 			}
 		},
 		"grunt-known-options": {
@@ -4847,12 +4837,6 @@
 			"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
 			"dev": true
 		},
-		"js-sdsl": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
-			"integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
-			"dev": true
-		},
 		"js-tokens": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -5034,9 +5018,9 @@
 			"dev": true
 		},
 		"node-releases": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz",
-			"integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==",
+			"version": "2.0.14",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+			"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
 			"dev": true
 		},
 		"nopt": {
@@ -5061,9 +5045,9 @@
 			},
 			"dependencies": {
 				"semver": {
-					"version": "5.7.1",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+					"version": "5.7.2",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+					"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 					"dev": true
 				}
 			}
@@ -5118,17 +5102,17 @@
 			}
 		},
 		"optionator": {
-			"version": "0.9.1",
-			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-			"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+			"version": "0.9.3",
+			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+			"integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
 			"dev": true,
 			"requires": {
+				"@aashutoshrathi/word-wrap": "^1.2.3",
 				"deep-is": "^0.1.3",
 				"fast-levenshtein": "^2.0.6",
 				"levn": "^0.4.1",
 				"prelude-ls": "^1.2.1",
-				"type-check": "^0.4.0",
-				"word-wrap": "^1.2.3"
+				"type-check": "^0.4.0"
 			}
 		},
 		"os-homedir": {
@@ -5289,9 +5273,9 @@
 			"dev": true
 		},
 		"punycode": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
-			"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+			"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
 			"dev": true
 		},
 		"queue-microtask": {
@@ -5476,9 +5460,9 @@
 			"dev": true
 		},
 		"semver": {
-			"version": "7.3.5",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-			"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"requires": {
 				"lru-cache": "^6.0.0"
@@ -5628,6 +5612,16 @@
 			"integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
 			"dev": true
 		},
+		"update-browserslist-db": {
+			"version": "1.0.13",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+			"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+			"dev": true,
+			"requires": {
+				"escalade": "^3.1.1",
+				"picocolors": "^1.0.0"
+			}
+		},
 		"uri-js": {
 			"version": "4.4.1",
 			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -5694,12 +5688,6 @@
 				"isexe": "^2.0.0"
 			}
 		},
-		"word-wrap": {
-			"version": "1.2.3",
-			"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-			"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-			"dev": true
-		},
 		"wrappy": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index 888ac1c..9a7dc31 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,7 @@
 	"devDependencies": {
 		"eslint-config-wikimedia": "0.25.0",
 		"grunt": "1.6.1",
-		"grunt-banana-checker": "0.11.0",
-		"grunt-eslint": "24.0.1"
+		"grunt-banana-checker": "0.11.1",
+		"grunt-eslint": "24.3.0"
 	}
 }
diff --git a/specials/PF_CreateForm.php b/specials/PF_CreateForm.php
index d7ed52f..d46c5da 100644
--- a/specials/PF_CreateForm.php
+++ b/specials/PF_CreateForm.php
@@ -78,7 +78,7 @@ class PFCreateForm extends SpecialPage {
 			# ignore variables that are not of the right form
 			if ( strpos( $var, "_" ) != false ) {
 				# get the template declarations and work from there
-				list( $action, $id ) = explode( "_", $var, 2 );
+				[ $action, $id ] = explode( "_", $var, 2 );
 				if ( $action == "template" ) {
 					// If the button was pressed to remove
 					// this template, just don't add it to
diff --git a/specials/PF_CreateTemplate.php b/specials/PF_CreateTemplate.php
index cdb94c9..5151304 100644
--- a/specials/PF_CreateTemplate.php
+++ b/specials/PF_CreateTemplate.php
@@ -328,7 +328,7 @@ END;
 				if ( count( $var_elements ) != 2 ) {
 					continue;
 				}
-				list( $field_field, $id ) = $var_elements;
+				[ $field_field, $id ] = $var_elements;
 				if ( $field_field == 'name' && $id != 'starter' ) {
 					$field = PFTemplateField::create(
 						$val,
diff --git a/specials/PF_RunQuery.php b/specials/PF_RunQuery.php
index f3a0bc3..b62101f 100644
--- a/specials/PF_RunQuery.php
+++ b/specials/PF_RunQuery.php
@@ -87,7 +87,7 @@ class PFRunQuery extends IncludableSpecialPage {
 		}
 
 		$form_context = $embedded ? PFFormPrinter::CONTEXT_EMBEDDED_QUERY : PFFormPrinter::CONTEXT_QUERY;
-		list( $form_text, $data_text, $form_page_title ) =
+		[ $form_text, $data_text, $form_page_title ] =
 			$wgPageFormsFormPrinter->formHTML(
 				$form_definition, $form_submitted, false, $form_title->getArticleID(),
 				$content, null, null, $form_context, [], $user
diff --git a/specials/PF_UploadWindow.php b/specials/PF_UploadWindow.php
index ad2a7c5..ba2fb46 100644
--- a/specials/PF_UploadWindow.php
+++ b/specials/PF_UploadWindow.php
@@ -303,52 +303,52 @@ class PFUploadWindow extends UnlistedSpecialPage {
 			. '<ul class="warningbox">';
 		foreach ( $warnings as $warning => $args ) {
 				// Unlike the other warnings, this one can be worked around.
-				if ( $warning == 'badfilename' ) {
-					$this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
-				}
+			if ( $warning == 'badfilename' ) {
+				$this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
+			}
 
-				if ( $warning == 'exists' ) {
-					$msg = self::getExistsWarning( $args );
-				} elseif ( $warning == 'no-change' ) {
-					$file = $args;
-					$filename = $file->getTitle()->getPrefixedText();
-					$msg = "\t<li>" . $this->msg( 'fileexists-no-change', $filename )->parse() . "</li>\n";
-				} elseif ( $warning == 'duplicate-version' ) {
-					$file = $args[0];
-					$count = count( $args );
-					$filename = $file->getTitle()->getPrefixedText();
-					$message = $this->msg( 'fileexists-duplicate-version' )
-						->params( $filename )
-						->numParams( $count );
-					$msg = "\t<li>" . $message->parse() . "</li>\n";
-				} elseif ( $warning == 'was-deleted' ) {
-					# If the file existed before and was deleted, warn the user of this
-					$ltitle = SpecialPage::getTitleFor( 'Log' );
-					$llink = $linkRenderer->makeKnownLink(
-						$ltitle,
-						$this->msg( 'deletionlog' )->text(),
-						[],
-						[
-							'type' => 'delete',
-							'page' => Title::makeTitle( NS_FILE, $args )->getPrefixedText(),
-						]
-					);
-					$msg = "\t<li>" . $this->msg( 'filewasdeleted' )->rawParams( $llink )->parse() . "</li>\n";
-				} elseif ( $warning == 'duplicate' ) {
-					$msg = $this->getDupeWarning( $args );
-				} elseif ( $warning == 'duplicate-archive' ) {
-					$msg = "\t<li>" . $this->msg(
-						'file-deleted-duplicate',
-						[ Title::makeTitle( NS_FILE, $args )->getPrefixedText() ]
-					)->parse() . "</li>\n";
-				} else {
-					if ( is_bool( $args ) ) {
-						$args = [];
-					} elseif ( !is_array( $args ) ) {
-						$args = [ $args ];
-					}
-					$msg = "\t<li>" . $this->msg( $warning, $args )->parse() . "</li>\n";
+			if ( $warning == 'exists' ) {
+				$msg = self::getExistsWarning( $args );
+			} elseif ( $warning == 'no-change' ) {
+				$file = $args;
+				$filename = $file->getTitle()->getPrefixedText();
+				$msg = "\t<li>" . $this->msg( 'fileexists-no-change', $filename )->parse() . "</li>\n";
+			} elseif ( $warning == 'duplicate-version' ) {
+				$file = $args[0];
+				$count = count( $args );
+				$filename = $file->getTitle()->getPrefixedText();
+				$message = $this->msg( 'fileexists-duplicate-version' )
+					->params( $filename )
+					->numParams( $count );
+				$msg = "\t<li>" . $message->parse() . "</li>\n";
+			} elseif ( $warning == 'was-deleted' ) {
+				# If the file existed before and was deleted, warn the user of this
+				$ltitle = SpecialPage::getTitleFor( 'Log' );
+				$llink = $linkRenderer->makeKnownLink(
+					$ltitle,
+					$this->msg( 'deletionlog' )->text(),
+					[],
+					[
+						'type' => 'delete',
+						'page' => Title::makeTitle( NS_FILE, $args )->getPrefixedText(),
+					]
+				);
+				$msg = "\t<li>" . $this->msg( 'filewasdeleted' )->rawParams( $llink )->parse() . "</li>\n";
+			} elseif ( $warning == 'duplicate' ) {
+				$msg = $this->getDupeWarning( $args );
+			} elseif ( $warning == 'duplicate-archive' ) {
+				$msg = "\t<li>" . $this->msg(
+					'file-deleted-duplicate',
+					[ Title::makeTitle( NS_FILE, $args )->getPrefixedText() ]
+				)->parse() . "</li>\n";
+			} else {
+				if ( is_bool( $args ) ) {
+					$args = [];
+				} elseif ( !is_array( $args ) ) {
+					$args = [ $args ];
 				}
+				$msg = "\t<li>" . $this->msg( $warning, $args )->parse() . "</li>\n";
+			}
 				$warningHtml .= $msg;
 		}
 		$warningHtml .= "</ul>\n";
diff --git a/tests/phpunit/integration/includes/PFFormPrinterTest.php b/tests/phpunit/integration/includes/PFFormPrinterTest.php
index ce29f80..630be16 100644
--- a/tests/phpunit/integration/includes/PFFormPrinterTest.php
+++ b/tests/phpunit/integration/includes/PFFormPrinterTest.php
@@ -38,7 +38,7 @@ class PFFormPrinterTest extends MediaWikiIntegrationTestCase {
 
 		$wgOut->getContext()->setTitle( $this->getTitle() );
 
-		list( $form_text, $page_text, $form_page_title, $generated_page_name ) =
+		[ $form_text, $page_text, $form_page_title, $generated_page_name ] =
 			$wgPageFormsFormPrinter->formHTML(
 				$form_def = $setup['form_definition'],
 				$form_submitted = true,
@@ -134,11 +134,11 @@ class PFFormPrinterTest extends MediaWikiIntegrationTestCase {
 
 		$mockTitle->expects( $this->any() )
 			->method( 'getDBkey' )
-			->will( $this->returnValue( 'Sometitle' ) );
+			->willReturn( 'Sometitle' );
 
 		$mockTitle->expects( $this->any() )
 			->method( 'getNamespace' )
-			->will( $this->returnValue( PF_NS_FORM ) );
+			->willReturn( PF_NS_FORM );
 
 		return $mockTitle;
 	}
diff --git a/tests/phpunit/integration/includes/forminputs/PFRadioButtonInputTest.php b/tests/phpunit/integration/includes/forminputs/PFRadioButtonInputTest.php
index 03335d0..b0d54de 100644
--- a/tests/phpunit/integration/includes/forminputs/PFRadioButtonInputTest.php
+++ b/tests/phpunit/integration/includes/forminputs/PFRadioButtonInputTest.php
@@ -367,7 +367,7 @@ class PFRadioButtonInputTest extends MediaWikiIntegrationTestCase {
 			if ( isset( $setup['form_definition'] ) ) {
 				// We have to specify a template name
 				$form_definition = "{{{for template|TestTemplate123}}}\n{$setup['form_definition']}\n{{{end template}}}\n{{{standard input|save}}}";
-				list( $form_text, $page_text, $form_page_title, $generated_page_name )
+				[ $form_text, $page_text, $form_page_title, $generated_page_name ]
 					= $wgPageFormsFormPrinter->formHTML(
 						$form_definition, true, false, null, null,
 						'TestStringForFormPageTitle', null,
@@ -652,11 +652,11 @@ class PFRadioButtonInputTest extends MediaWikiIntegrationTestCase {
 
 		$mockTitle->expects( $this->any() )
 			->method( 'getDBkey' )
-			->will( $this->returnValue( 'Sometitle' ) );
+			->willReturn( 'Sometitle' );
 
 		$mockTitle->expects( $this->any() )
 			->method( 'getNamespace' )
-			->will( $this->returnValue( PF_NS_FORM ) );
+			->willReturn( PF_NS_FORM );
 
 		return $mockTitle;
 	}
-- 
2.39.2


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