mediawiki/extensions/TalkBelow: main (log #1875830)

sourcepatches

This run took 47 seconds.

From b062626bfbc9d5ef2dbae57757c1518526ad67ad Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Tue, 6 May 2025 05:50:07 +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: 45.0.0 → 47.0.0
* mediawiki/mediawiki-phan-config: 0.15.0 → 0.15.1

npm:
* eslint-config-wikimedia: 0.28.2 → 0.29.1
  The following rules are failing and were disabled:
  * no-jquery/no-done-fail

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

Change-Id: Ifcfc39c615a11824118c47f7197834fa3b438fb0
---
 .eslintrc.json    |   5 +-
 Gruntfile.js      |   2 +-
 TalkBelow.js      | 162 +++++++++++++++++++++++-----------------------
 composer.json     |   4 +-
 package-lock.json |  33 +++++-----
 package.json      |   2 +-
 6 files changed, 106 insertions(+), 102 deletions(-)

diff --git a/.eslintrc.json b/.eslintrc.json
index 67d20f5..0d4578a 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,7 +1,7 @@
 {
 	"root": true,
 	"extends": [
-		"wikimedia/client-es5",
+		"wikimedia/client",
 		"wikimedia/jquery",
 		"wikimedia/mediawiki"
 	],
@@ -11,6 +11,7 @@
 	"rules": {
 		"max-len": "off",
 		"one-var": "off",
-		"vars-on-top": "off"
+		"vars-on-top": "off",
+		"no-jquery/no-done-fail": "warn"
 	}
 }
diff --git a/Gruntfile.js b/Gruntfile.js
index 9fb7f26..66b4408 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,6 +1,6 @@
 /* eslint-env node */
 module.exports = function ( grunt ) {
-	var conf = grunt.file.readJSON( 'extension.json' );
+	const conf = grunt.file.readJSON( 'extension.json' );
 
 	grunt.loadNpmTasks( 'grunt-banana-checker' );
 	grunt.loadNpmTasks( 'grunt-eslint' );
diff --git a/TalkBelow.js b/TalkBelow.js
index f490f0d..ce457f2 100644
--- a/TalkBelow.js
+++ b/TalkBelow.js
@@ -11,7 +11,7 @@ window.TalkBelow = {
 	init: function () {
 
 		// Only init when there's a talk section
-		var section = document.getElementById( 'talkbelow-section' );
+		const section = document.getElementById( 'talkbelow-section' );
 		if ( !section ) {
 			return;
 		}
@@ -27,7 +27,7 @@ window.TalkBelow = {
 	 * Add a reply button
 	 */
 	addReplyButton: function () {
-		var $comment = $( this );
+		const $comment = $( this );
 
 		// Skip paragraphs followed by other paragraphs
 		// so that only the last one shows the reply button
@@ -37,7 +37,7 @@ window.TalkBelow = {
 		}
 
 		// Make the reply button
-		var replyButton = new OO.ui.ButtonInputWidget( {
+		const replyButton = new OO.ui.ButtonInputWidget( {
 			flags: 'progressive',
 			framed: false,
 			label: mw.msg( 'talkbelow-reply' ),
@@ -47,7 +47,7 @@ window.TalkBelow = {
 		replyButton.on( 'click', TalkBelow.onReplyButtonClick, [ replyButton ] );
 
 		// Add to the DOM
-		var $replies = $comment.children( 'dl' );
+		const $replies = $comment.children( 'dl' );
 		if ( $replies.length ) {
 			$replies.before( ' ', replyButton.$element );
 		} else {
@@ -72,7 +72,7 @@ window.TalkBelow = {
 		}
 
 		// Else get the talk wikitext and then add the reply form
-		TalkBelow.getTalkWikitext().done( function () {
+		TalkBelow.getTalkWikitext().done( () => {
 			TalkBelow.addReplyForm( replyButton );
 		} );
 	},
@@ -85,38 +85,38 @@ window.TalkBelow = {
 	addReplyForm: function ( replyButton ) {
 
 		// In most cases, the relevant wikitext is that of the comment we're replying to
-		var $replyButton = replyButton.$element;
-		var $comment = $replyButton.closest( 'p, dd' );
-		var relevantWikitext = TalkBelow.getRelevantWikitext( $comment );
+		const $replyButton = replyButton.$element;
+		const $comment = $replyButton.closest( 'p, dd' );
+		let relevantWikitext = TalkBelow.getRelevantWikitext( $comment );
 
 		// But if the comment already has replies
 		// then the relevant wikitext is that of the last reply
 		// because we need to add the new reply below the last one
-		var $replies = $comment.is( 'p' ) ? $comment.next( 'dl' ) : $comment.children( 'dl' );
+		let $replies = $comment.is( 'p' ) ? $comment.next( 'dl' ) : $comment.children( 'dl' );
 		if ( $replies.length ) {
-			var $lastReply = $replies.children( 'dd' ).last();
+			const $lastReply = $replies.children( 'dd' ).last();
 			relevantWikitext = TalkBelow.getRelevantWikitext( $lastReply );
 		}
 
 		// If no relevant wikitext is found, fallback to regular edit
 		if ( !relevantWikitext ) {
-			var $section = TalkBelow.getSection( $comment );
-			var sectionNumber = $section ? 1 + $section.prevAll( 'h1, h2, h3, h4, h5, h6' ).length : 0;
-			var page = mw.config.get( 'wgPageName' );
-			var talk = new mw.Title( page ).getTalkPage();
-			var editUrl = mw.util.getUrl( talk.getPrefixedText(), { action: 'edit', section: sectionNumber } );
+			const $section = TalkBelow.getSection( $comment );
+			const sectionNumber = $section ? 1 + $section.prevAll( 'h1, h2, h3, h4, h5, h6' ).length : 0;
+			const page = mw.config.get( 'wgPageName' );
+			const talk = new mw.Title( page ).getTalkPage();
+			const editUrl = mw.util.getUrl( talk.getPrefixedText(), { action: 'edit', section: sectionNumber } );
 			window.location.href = editUrl;
 			return;
 		}
 
 		// Make the reply form
-		var replyInput = new OO.ui.MultilineTextInputWidget( { name: 'reply', autosize: true, autofocus: true } );
-		var replyLayout = new OO.ui.HorizontalLayout( { items: [ replyInput ] } );
-		var publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );
-		var cancelButton = new OO.ui.ButtonInputWidget( { flags: 'destructive', framed: false, label: mw.msg( 'talkbelow-cancel' ) } );
-		var buttonsLayout = new OO.ui.HorizontalLayout( { items: [ publishButton, cancelButton ] } );
-		var form = new OO.ui.FormLayout( { items: [ replyLayout, buttonsLayout ] } );
-		var $formWrapper = $( '<dd>' ).html( form.$element );
+		const replyInput = new OO.ui.MultilineTextInputWidget( { name: 'reply', autosize: true, autofocus: true } );
+		const replyLayout = new OO.ui.HorizontalLayout( { items: [ replyInput ] } );
+		const publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );
+		const cancelButton = new OO.ui.ButtonInputWidget( { flags: 'destructive', framed: false, label: mw.msg( 'talkbelow-cancel' ) } );
+		const buttonsLayout = new OO.ui.HorizontalLayout( { items: [ publishButton, cancelButton ] } );
+		const form = new OO.ui.FormLayout( { items: [ replyLayout, buttonsLayout ] } );
+		const $formWrapper = $( '<dd>' ).html( form.$element );
 
 		// Make the font-family monospace to suggest that [[wikitext]] is allowed
 		replyInput.$element.css( 'font-family', 'monospace' );
@@ -137,7 +137,7 @@ window.TalkBelow = {
 		publishButton.on( 'click', TalkBelow.onSubmitReply, [ $comment, $formWrapper, relevantWikitext, publishButton, cancelButton, replyButton ] );
 
 		// Handle a cancel
-		cancelButton.on( 'click', function () {
+		cancelButton.on( 'click', () => {
 			$formWrapper.remove();
 			if ( $replies.children().length === 0 ) {
 				$replies.remove();
@@ -159,8 +159,8 @@ window.TalkBelow = {
 	onSubmitReply: function ( $comment, $formWrapper, relevantWikitext, publishButton, cancelButton, replyButton ) {
 
 		// Check that the user wrote something
-		var $reply = $formWrapper.find( 'textarea[name="reply"]' );
-		var reply = $reply.val();
+		const $reply = $formWrapper.find( 'textarea[name="reply"]' );
+		let reply = $reply.val();
 		if ( !reply ) {
 			$reply.trigger( 'focus' );
 			return;
@@ -172,9 +172,9 @@ window.TalkBelow = {
 		cancelButton.setDisabled( true );
 
 		// Calculate the appropriate number of colons
-		var depth = $comment.parents( 'dl' ).length + 1;
-		var colons = '';
-		for ( var i = 0; i < depth; i++ ) {
+		const depth = $comment.parents( 'dl' ).length + 1;
+		let colons = '';
+		for ( let i = 0; i < depth; i++ ) {
 			colons += ':';
 		}
 
@@ -183,20 +183,20 @@ window.TalkBelow = {
 		reply = reply.replace( /\n+/g, ' ' );
 
 		// Build the final wikitext of the reply
-		var replyWikitext = '\n' + colons + reply + ' ~~~~';
+		const replyWikitext = '\n' + colons + reply + ' ~~~~';
 
 		// Submit the reply
 		TalkBelow.talkWikitext = TalkBelow.talkWikitext.replace( relevantWikitext, relevantWikitext + replyWikitext );
-		var page = mw.config.get( 'wgPageName' );
-		var talk = new mw.Title( page ).getTalkPage();
-		var params = {
+		const page = mw.config.get( 'wgPageName' );
+		const talk = new mw.Title( page ).getTalkPage();
+		const params = {
 			action: 'edit',
 			title: talk.getPrefixedText(),
 			text: TalkBelow.talkWikitext,
 			summary: mw.msg( 'talkbelow-summary' ),
 			tags: mw.config.get( 'wgTalkBelowChangeTag' )
 		};
-		new mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( function () {
+		new mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( () => {
 			TalkBelow.onSubmitReplySuccess( replyWikitext, replyButton, $formWrapper );
 		} );
 	},
@@ -209,9 +209,9 @@ window.TalkBelow = {
 	 * @param {Object} $formWrapper
 	 */
 	onSubmitReplySuccess: function ( replyWikitext, replyButton, $formWrapper ) {
-		var page = mw.config.get( 'wgPageName' );
-		var talk = new mw.Title( page ).getTalkPage();
-		var params = {
+		const page = mw.config.get( 'wgPageName' );
+		const talk = new mw.Title( page ).getTalkPage();
+		const params = {
 			action: 'parse',
 			title: talk.getPrefixedText(),
 			text: replyWikitext,
@@ -220,10 +220,10 @@ window.TalkBelow = {
 			prop: 'text',
 			disablelimitreport: true
 		};
-		new mw.Api().get( params ).fail( TalkBelow.onError ).done( function ( data ) {
-			var text = data.parse.text;
-			var $html = $( text );
-			var $reply = $html.find( 'dd' ).last();
+		new mw.Api().get( params ).fail( TalkBelow.onError ).done( ( data ) => {
+			const text = data.parse.text;
+			const $html = $( text );
+			const $reply = $html.find( 'dd' ).last();
 			$formWrapper.replaceWith( $reply );
 			replyButton.setDisabled( false );
 			TalkBelow.addReplyButton.call( $reply );
@@ -236,22 +236,22 @@ window.TalkBelow = {
 	addNewTopicForm: function () {
 
 		// Build the form
-		var titleInput = new OO.ui.TextInputWidget( { name: 'title', placeholder: mw.msg( 'talkbelow-title' ) } );
-		var commentInput = new OO.ui.MultilineTextInputWidget( { name: 'comment', autosize: true, placeholder: mw.msg( 'talkbelow-comment' ) } );
-		var publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );
-		var titleLayout = new OO.ui.HorizontalLayout( { items: [ titleInput ] } );
-		var commentLayout = new OO.ui.HorizontalLayout( { items: [ commentInput ] } );
-		var publishLayout = new OO.ui.HorizontalLayout( { items: [ publishButton ] } );
-		var formLayout = new OO.ui.FormLayout( { items: [ titleLayout, commentLayout, publishLayout ] } );
-		var $title = $( '<h2>' ).text( mw.msg( 'talkbelow-new-topic' ) );
-		var $form = $( '<div>' ).attr( 'id', 'talkbelow-new-topic-form' ).append( $title, formLayout.$element );
+		const titleInput = new OO.ui.TextInputWidget( { name: 'title', placeholder: mw.msg( 'talkbelow-title' ) } );
+		const commentInput = new OO.ui.MultilineTextInputWidget( { name: 'comment', autosize: true, placeholder: mw.msg( 'talkbelow-comment' ) } );
+		const publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );
+		const titleLayout = new OO.ui.HorizontalLayout( { items: [ titleInput ] } );
+		const commentLayout = new OO.ui.HorizontalLayout( { items: [ commentInput ] } );
+		const publishLayout = new OO.ui.HorizontalLayout( { items: [ publishButton ] } );
+		const formLayout = new OO.ui.FormLayout( { items: [ titleLayout, commentLayout, publishLayout ] } );
+		const $title = $( '<h2>' ).text( mw.msg( 'talkbelow-new-topic' ) );
+		const $form = $( '<div>' ).attr( 'id', 'talkbelow-new-topic-form' ).append( $title, formLayout.$element );
 
 		// Make the font-family monospace to suggest that [[wikitext]] is allowed
 		commentInput.$element.css( 'font-family', 'monospace' );
 
 		// Replace the "Add topic" button for the form
-		var addTopicButton = document.getElementById( 'talkbelow-add-topic-button' );
-		var $addTopicButton = $( addTopicButton );
+		const addTopicButton = document.getElementById( 'talkbelow-add-topic-button' );
+		const $addTopicButton = $( addTopicButton );
 		$addTopicButton.replaceWith( $form );
 
 		// Handle submissions
@@ -264,11 +264,11 @@ window.TalkBelow = {
 	onSubmitNewTopic: function ( publishButton ) {
 
 		// Get the data from the form
-		var $form = publishButton.$element.closest( '#talkbelow-new-topic-form' );
-		var $title = $form.find( 'input[name="title"]' );
-		var $comment = $form.find( 'textarea[name="comment"]' );
-		var title = $title.val();
-		var comment = $comment.val();
+		const $form = publishButton.$element.closest( '#talkbelow-new-topic-form' );
+		const $title = $form.find( 'input[name="title"]' );
+		const $comment = $form.find( 'textarea[name="comment"]' );
+		const title = $title.val();
+		const comment = $comment.val();
 
 		// Do some basic validation
 		if ( !title ) {
@@ -285,10 +285,10 @@ window.TalkBelow = {
 		publishButton.setDisabled( true );
 
 		// Submit the new topic
-		var page = mw.config.get( 'wgPageName' );
-		var talk = new mw.Title( page ).getTalkPage();
-		var text = comment + ' ~~~~'; // Append the signature
-		var params = {
+		const page = mw.config.get( 'wgPageName' );
+		const talk = new mw.Title( page ).getTalkPage();
+		const text = comment + ' ~~~~'; // Append the signature
+		const params = {
 			action: 'edit',
 			title: talk.getPrefixedText(),
 			section: 'new',
@@ -296,7 +296,7 @@ window.TalkBelow = {
 			text: text,
 			tags: mw.config.get( 'wgTalkBelowChangeTag' )
 		};
-		new mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( function () {
+		new mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( () => {
 			TalkBelow.onSubmitNewTopicSuccess( talk, title, text, $form );
 		} );
 	},
@@ -310,7 +310,7 @@ window.TalkBelow = {
 	 * @param {Object} $form New topic form
 	 */
 	onSubmitNewTopicSuccess: function ( talk, title, text, $form ) {
-		var params = {
+		const params = {
 			action: 'parse',
 			title: talk.getPrefixedText(),
 			section: 'new',
@@ -321,11 +321,11 @@ window.TalkBelow = {
 			pst: true,
 			disablelimitreport: true
 		};
-		new mw.Api().get( params ).fail( TalkBelow.onError ).done( function ( data ) {
+		new mw.Api().get( params ).fail( TalkBelow.onError ).done( ( data ) => {
 			// Remove the outer <div>
-			var div = data.parse.text;
-			var topic = $( div ).html();
-			var $topic = $( topic );
+			const div = data.parse.text;
+			const topic = $( div ).html();
+			const $topic = $( topic );
 
 			// Replace the form with the new topic
 			$form.replaceWith( $topic );
@@ -352,15 +352,15 @@ window.TalkBelow = {
 	 * @return {Object} Promise
 	 */
 	getTalkWikitext: function () {
-		var page = mw.config.get( 'wgPageName' );
-		var talk = new mw.Title( page ).getTalkPage();
-		var params = {
+		const page = mw.config.get( 'wgPageName' );
+		const talk = new mw.Title( page ).getTalkPage();
+		const params = {
 			page: talk.getPrefixedText(),
 			action: 'parse',
 			prop: 'wikitext',
 			formatversion: 2
 		};
-		return new mw.Api().get( params ).done( function ( data ) {
+		return new mw.Api().get( params ).done( ( data ) => {
 			TalkBelow.talkWikitext = data.parse.wikitext;
 		} );
 	},
@@ -383,7 +383,7 @@ window.TalkBelow = {
 	 */
 	getRelevantWikitext: function ( $comment ) {
 		// The longest text node has the most chances of being unique
-		var text = TalkBelow.getLongestText( $comment );
+		let text = TalkBelow.getLongestText( $comment );
 
 		// Some comments may not have text nodes at all
 		if ( !text ) {
@@ -394,9 +394,9 @@ window.TalkBelow = {
 		text = text.replace( /\u00a0/g, ' ' ); // Replace nbsp sometimes added by the browser
 		text = text.replace( /[.*+?^${}()|[\]\\]/g, '\\$&' ); // Escape special characters
 
-		var regexp = new RegExp( '.*' + text + '.*', 'g' );
+		const regexp = new RegExp( '.*' + text + '.*', 'g' );
 
-		var matches = TalkBelow.talkWikitext.match( regexp );
+		const matches = TalkBelow.talkWikitext.match( regexp );
 
 		// This may happen if the comments comes from a template
 		if ( !matches ) {
@@ -419,12 +419,12 @@ window.TalkBelow = {
 	 * @return {string} Text of the longest text node
 	 */
 	getLongestText: function ( $comment ) {
-		var text = '';
-		var $textNodes = $comment.contents().filter( function () {
+		let text = '';
+		const $textNodes = $comment.contents().filter( function () {
 			return this.nodeType === 3; // Text node
 		} );
 		$textNodes.each( function () {
-			var nodeText = $( this ).text().trim();
+			const nodeText = $( this ).text().trim();
 			if ( nodeText.length > text.length ) {
 				text = nodeText;
 			}
@@ -442,12 +442,12 @@ window.TalkBelow = {
 	 */
 	makeSummary: function ( summary, $comment, wikitext ) {
 		if ( !summary ) {
-			var page = mw.config.get( 'talkbelow-page', 'mw:TalkBelow' );
+			const page = mw.config.get( 'talkbelow-page', 'mw:TalkBelow' );
 			summary = wikitext ? mw.msg( 'talkbelow-summary-edit', page ) : mw.msg( 'talkbelow-summary-delete', page );
 		}
-		var $section = TalkBelow.getSection( $comment );
+		const $section = TalkBelow.getSection( $comment );
 		if ( $section ) {
-			var section = $section.find( '.mw-headline' ).attr( 'id' ).replace( '/_/g', ' ' );
+			const section = $section.find( '.mw-headline' ).attr( 'id' ).replace( '/_/g', ' ' );
 			summary = '/* ' + section + ' */ ' + summary;
 		}
 		summary += ' #talkbelow'; // For https://hashtags.wmcloud.org
@@ -468,11 +468,11 @@ window.TalkBelow = {
 		if ( $element.is( 'h1, h2, h3, h4, h5, h6' ) ) {
 			return $element;
 		}
-		var $previous = $element.prevAll( 'h1, h2, h3, h4, h5, h6' ).first();
+		const $previous = $element.prevAll( 'h1, h2, h3, h4, h5, h6' ).first();
 		if ( $previous.length ) {
 			return $previous;
 		}
-		var $parent = $element.parent();
+		const $parent = $element.parent();
 		return TalkBelow.getSection( $parent );
 	}
 };
diff --git a/composer.json b/composer.json
index b0ddb62..a144259 100644
--- a/composer.json
+++ b/composer.json
@@ -1,7 +1,7 @@
 {
 	"require-dev": {
-		"mediawiki/mediawiki-codesniffer": "45.0.0",
-		"mediawiki/mediawiki-phan-config": "0.15.0",
+		"mediawiki/mediawiki-codesniffer": "47.0.0",
+		"mediawiki/mediawiki-phan-config": "0.15.1",
 		"mediawiki/minus-x": "1.1.3",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
 		"php-parallel-lint/php-parallel-lint": "1.4.0"
diff --git a/package-lock.json b/package-lock.json
index eaae080..757f12b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,7 @@
 		"": {
 			"name": "TalkBelow",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.28.2",
+				"eslint-config-wikimedia": "0.29.1",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.13.0",
 				"grunt-eslint": "24.3.0"
@@ -946,9 +946,9 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.28.2",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
-			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+			"version": "0.29.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+			"integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
 			"dev": true,
 			"dependencies": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -961,13 +961,16 @@
 				"eslint-plugin-mediawiki": "^0.7.0",
 				"eslint-plugin-mocha": "^10.4.3",
 				"eslint-plugin-n": "^17.7.0",
-				"eslint-plugin-no-jquery": "^3.0.1",
+				"eslint-plugin-no-jquery": "^3.1.1",
 				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
 				"eslint-plugin-unicorn": "^53.0.0",
 				"eslint-plugin-vue": "^9.26.0",
 				"eslint-plugin-wdio": "^8.24.12",
 				"eslint-plugin-yml": "^1.14.0"
+			},
+			"engines": {
+				"node": ">=18 <23"
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
@@ -1165,9 +1168,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
-			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+			"integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
 			"dev": true,
 			"peerDependencies": {
 				"eslint": ">=8.0.0"
@@ -4600,9 +4603,9 @@
 			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.28.2",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
-			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+			"version": "0.29.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+			"integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
 			"dev": true,
 			"requires": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -4615,7 +4618,7 @@
 				"eslint-plugin-mediawiki": "^0.7.0",
 				"eslint-plugin-mocha": "^10.4.3",
 				"eslint-plugin-n": "^17.7.0",
-				"eslint-plugin-no-jquery": "^3.0.1",
+				"eslint-plugin-no-jquery": "^3.1.1",
 				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
 				"eslint-plugin-unicorn": "^53.0.0",
@@ -4750,9 +4753,9 @@
 			}
 		},
 		"eslint-plugin-no-jquery": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
-			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+			"integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
 			"dev": true,
 			"requires": {}
 		},
diff --git a/package.json b/package.json
index 8216636..f96cba2 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.28.2",
+		"eslint-config-wikimedia": "0.29.1",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.13.0",
 		"grunt-eslint": "24.3.0"
-- 
2.39.2

$ date
--- stdout ---
Tue May  6 05:49:33 UTC 2025

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

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {},
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 0,
      "critical": 0,
      "total": 0
    },
    "dependencies": {
      "prod": 1,
      "dev": 328,
      "optional": 0,
      "peer": 1,
      "peerOptional": 0,
      "total": 328
    }
  }
}

--- 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: 38 installs, 0 updates, 0 removals
  - Locking composer/pcre (3.3.2)
  - Locking composer/semver (3.4.3)
  - Locking composer/spdx-licenses (1.5.8)
  - Locking composer/xdebug-handler (3.0.5)
  - Locking dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
  - Locking doctrine/deprecations (1.1.5)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking mediawiki/mediawiki-codesniffer (v45.0.0)
  - Locking mediawiki/mediawiki-phan-config (0.15.0)
  - Locking mediawiki/minus-x (1.1.3)
  - Locking mediawiki/phan-taint-check-plugin (6.1.0)
  - Locking microsoft/tolerant-php-parser (v0.1.2)
  - Locking netresearch/jsonmapper (v4.5.0)
  - Locking phan/phan (5.4.5)
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
  - Locking php-parallel-lint/php-parallel-lint (v1.4.0)
  - Locking phpcsstandards/phpcsextra (1.2.1)
  - Locking phpcsstandards/phpcsutils (1.0.12)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.6.2)
  - Locking phpdocumentor/type-resolver (1.10.0)
  - Locking phpstan/phpdoc-parser (2.1.0)
  - Locking psr/container (2.0.2)
  - Locking psr/log (3.0.2)
  - Locking sabre/event (5.1.7)
  - Locking squizlabs/php_codesniffer (3.10.3)
  - Locking symfony/console (v7.2.6)
  - Locking symfony/deprecation-contracts (v3.5.1)
  - Locking symfony/polyfill-ctype (v1.32.0)
  - Locking symfony/polyfill-intl-grapheme (v1.32.0)
  - Locking symfony/polyfill-intl-normalizer (v1.32.0)
  - Locking symfony/polyfill-mbstring (v1.32.0)
  - Locking symfony/polyfill-php80 (v1.32.0)
  - Locking symfony/service-contracts (v3.5.1)
  - Locking symfony/string (v7.2.6)
  - 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: 38 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Installing squizlabs/php_codesniffer (3.10.3): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
  - Installing composer/pcre (3.3.2): Extracting archive
  - Installing symfony/polyfill-php80 (v1.32.0): Extracting archive
  - Installing phpcsstandards/phpcsutils (1.0.12): Extracting archive
  - Installing phpcsstandards/phpcsextra (1.2.1): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.32.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.8): Extracting archive
  - Installing composer/semver (3.4.3): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v45.0.0): Extracting archive
  - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.32.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.32.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.32.0): Extracting archive
  - Installing symfony/string (v7.2.6): Extracting archive
  - Installing symfony/deprecation-contracts (v3.5.1): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing symfony/service-contracts (v3.5.1): Extracting archive
  - Installing symfony/console (v7.2.6): Extracting archive
  - Installing sabre/event (5.1.7): Extracting archive
  - Installing netresearch/jsonmapper (v4.5.0): Extracting archive
  - Installing microsoft/tolerant-php-parser (v0.1.2): Extracting archive
  - Installing webmozart/assert (1.11.0): Extracting archive
  - Installing phpstan/phpdoc-parser (2.1.0): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing doctrine/deprecations (1.1.5): Extracting archive
  - Installing phpdocumentor/type-resolver (1.10.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.6.2): Extracting archive
  - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
  - Installing psr/log (3.0.2): Extracting archive
  - Installing composer/xdebug-handler (3.0.5): Extracting archive
  - Installing phan/phan (5.4.5): Extracting archive
  - Installing mediawiki/phan-taint-check-plugin (6.1.0): Extracting archive
  - Installing mediawiki/mediawiki-phan-config (0.15.0): Extracting archive
  - Installing mediawiki/minus-x (1.1.3): Extracting archive
  - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
  - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
  - Installing php-parallel-lint/php-parallel-lint (v1.4.0): Extracting archive
  0/36 [>---------------------------]   0%
 20/36 [===============>------------]  55%
 33/36 [=========================>--]  91%
 36/36 [============================] 100%
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
16 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils

--- end ---
Upgrading n:eslint-config-wikimedia from 0.28.2 -> 0.29.1
$ /usr/bin/npm install
--- stdout ---

added 328 packages, and audited 329 packages in 4s

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

found 0 vulnerabilities

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

--- end ---
$ /usr/bin/npm install grunt-eslint@24.3.0 --save-exact
--- stdout ---

up to date, audited 329 packages in 819ms

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

found 0 vulnerabilities

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

--- end ---
$ ./node_modules/.bin/eslint i18n/qqq.json i18n/mk.json i18n/xal.json i18n/zh-hans.json i18n/hy.json composer.json i18n/de.json i18n/nl.json package.json i18n/smn.json i18n/bn.json extension.json i18n/he.json i18n/crh-latn.json i18n/sl.json package-lock.json i18n/fr.json i18n/fa.json i18n/lb.json i18n/skr-arab.json i18n/zh-hant.json i18n/es.json Gruntfile.js i18n/ar.json i18n/en.json i18n/tr.json TalkBelow.js i18n/sr-ec.json i18n/it.json i18n/ms.json i18n/ia.json i18n/ko.json --fix
--- stdout ---

/src/repo/TalkBelow.js
   75:3   error    Prefer .then to .done                                                              no-jquery/no-done-fail
  199:3   error    Prefer .then to .fail                                                              no-jquery/no-done-fail
  199:3   error    Prefer .then to .done                                                              no-jquery/no-done-fail
  223:3   error    Prefer .then to .fail                                                              no-jquery/no-done-fail
  223:3   error    Prefer .then to .done                                                              no-jquery/no-done-fail
  299:3   error    Prefer .then to .fail                                                              no-jquery/no-done-fail
  299:3   error    Prefer .then to .done                                                              no-jquery/no-done-fail
  324:3   error    Prefer .then to .fail                                                              no-jquery/no-done-fail
  324:3   error    Prefer .then to .done                                                              no-jquery/no-done-fail
  363:10  error    Prefer .then to .done                                                              no-jquery/no-done-fail
  368:2   warning  JSDoc @return declaration present but return expression not available in function  jsdoc/require-returns-check
  457:2   warning  JSDoc @return declaration present but return expression not available in function  jsdoc/require-returns-check

✖ 12 problems (10 errors, 2 warnings)


--- end ---
$ ./node_modules/.bin/eslint i18n/qqq.json i18n/mk.json i18n/xal.json i18n/zh-hans.json i18n/hy.json composer.json i18n/de.json i18n/nl.json package.json i18n/smn.json i18n/bn.json extension.json i18n/he.json i18n/crh-latn.json i18n/sl.json package-lock.json i18n/fr.json i18n/fa.json i18n/lb.json i18n/skr-arab.json i18n/zh-hant.json i18n/es.json Gruntfile.js i18n/ar.json i18n/en.json i18n/tr.json TalkBelow.js i18n/sr-ec.json i18n/it.json i18n/ms.json i18n/ia.json i18n/ko.json -f json
--- stdout ---
[{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/TalkBelow.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":75,"column":3,"nodeType":"CallExpression","endLine":77,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":199,"column":3,"nodeType":"CallExpression","endLine":199,"endColumn":69},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":199,"column":3,"nodeType":"CallExpression","endLine":201,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":223,"column":3,"nodeType":"CallExpression","endLine":223,"endColumn":55},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":223,"column":3,"nodeType":"CallExpression","endLine":230,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":299,"column":3,"nodeType":"CallExpression","endLine":299,"endColumn":69},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":299,"column":3,"nodeType":"CallExpression","endLine":301,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":324,"column":3,"nodeType":"CallExpression","endLine":324,"endColumn":55},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":324,"column":3,"nodeType":"CallExpression","endLine":333,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":363,"column":10,"nodeType":"CallExpression","endLine":365,"endColumn":6},{"ruleId":"jsdoc/require-returns-check","severity":1,"message":"JSDoc @return declaration present but return expression not available in function.","line":368,"column":2,"nodeType":"Block","endLine":383,"endColumn":5},{"ruleId":"jsdoc/require-returns-check","severity":1,"message":"JSDoc @return declaration present but return expression not available in function.","line":457,"column":2,"nodeType":"Block","endLine":463,"endColumn":5}],"suppressedMessages":[],"errorCount":10,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"window.TalkBelow = {\n\n\t/**\n\t * Will hold the wikitext of the relevant talk page\n\t */\n\ttalkWikitext: '',\n\n\t/**\n\t * Initialization script\n\t */\n\tinit: function () {\n\n\t\t// Only init when there's a talk section\n\t\tconst section = document.getElementById( 'talkbelow-section' );\n\t\tif ( !section ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add the form to add new topics\n\t\tTalkBelow.addNewTopicForm();\n\n\t\t// Select only paragraphs and replies\n\t\t$( 'p, dd', section ).each( TalkBelow.addReplyButton );\n\t},\n\n\t/**\n\t * Add a reply button\n\t */\n\taddReplyButton: function () {\n\t\tconst $comment = $( this );\n\n\t\t// Skip paragraphs followed by other paragraphs\n\t\t// so that only the last one shows the reply button\n\t\t// in multi-paragraph comments\n\t\tif ( $comment.next().is( 'p' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make the reply button\n\t\tconst replyButton = new OO.ui.ButtonInputWidget( {\n\t\t\tflags: 'progressive',\n\t\t\tframed: false,\n\t\t\tlabel: mw.msg( 'talkbelow-reply' ),\n\t\t\tclasses: [ 'talkbelow-button' ]\n\t\t} );\n\t\treplyButton.$element.css( 'margin', '-8px 0' );\n\t\treplyButton.on( 'click', TalkBelow.onReplyButtonClick, [ replyButton ] );\n\n\t\t// Add to the DOM\n\t\tconst $replies = $comment.children( 'dl' );\n\t\tif ( $replies.length ) {\n\t\t\t$replies.before( ' ', replyButton.$element );\n\t\t} else {\n\t\t\t$comment.append( ' ', replyButton.$element );\n\t\t}\n\t},\n\n\t/**\n\t * Handle a click on a reply button\n\t *\n\t * @param {Object} replyButton\n\t */\n\tonReplyButtonClick: function ( replyButton ) {\n\n\t\t// Disable the button to prevent further clicks\n\t\treplyButton.setDisabled( true );\n\n\t\t// If talkWikitext was already loaded by a previous click, just add the reply form\n\t\tif ( TalkBelow.talkWikitext ) {\n\t\t\tTalkBelow.addReplyForm( replyButton );\n\t\t\treturn;\n\t\t}\n\n\t\t// Else get the talk wikitext and then add the reply form\n\t\tTalkBelow.getTalkWikitext().done( () => {\n\t\t\tTalkBelow.addReplyForm( replyButton );\n\t\t} );\n\t},\n\n\t/**\n\t * Add a reply form\n\t *\n\t * @param {Object} replyButton\n\t */\n\taddReplyForm: function ( replyButton ) {\n\n\t\t// In most cases, the relevant wikitext is that of the comment we're replying to\n\t\tconst $replyButton = replyButton.$element;\n\t\tconst $comment = $replyButton.closest( 'p, dd' );\n\t\tlet relevantWikitext = TalkBelow.getRelevantWikitext( $comment );\n\n\t\t// But if the comment already has replies\n\t\t// then the relevant wikitext is that of the last reply\n\t\t// because we need to add the new reply below the last one\n\t\tlet $replies = $comment.is( 'p' ) ? $comment.next( 'dl' ) : $comment.children( 'dl' );\n\t\tif ( $replies.length ) {\n\t\t\tconst $lastReply = $replies.children( 'dd' ).last();\n\t\t\trelevantWikitext = TalkBelow.getRelevantWikitext( $lastReply );\n\t\t}\n\n\t\t// If no relevant wikitext is found, fallback to regular edit\n\t\tif ( !relevantWikitext ) {\n\t\t\tconst $section = TalkBelow.getSection( $comment );\n\t\t\tconst sectionNumber = $section ? 1 + $section.prevAll( 'h1, h2, h3, h4, h5, h6' ).length : 0;\n\t\t\tconst page = mw.config.get( 'wgPageName' );\n\t\t\tconst talk = new mw.Title( page ).getTalkPage();\n\t\t\tconst editUrl = mw.util.getUrl( talk.getPrefixedText(), { action: 'edit', section: sectionNumber } );\n\t\t\twindow.location.href = editUrl;\n\t\t\treturn;\n\t\t}\n\n\t\t// Make the reply form\n\t\tconst replyInput = new OO.ui.MultilineTextInputWidget( { name: 'reply', autosize: true, autofocus: true } );\n\t\tconst replyLayout = new OO.ui.HorizontalLayout( { items: [ replyInput ] } );\n\t\tconst publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );\n\t\tconst cancelButton = new OO.ui.ButtonInputWidget( { flags: 'destructive', framed: false, label: mw.msg( 'talkbelow-cancel' ) } );\n\t\tconst buttonsLayout = new OO.ui.HorizontalLayout( { items: [ publishButton, cancelButton ] } );\n\t\tconst form = new OO.ui.FormLayout( { items: [ replyLayout, buttonsLayout ] } );\n\t\tconst $formWrapper = $( '<dd>' ).html( form.$element );\n\n\t\t// Make the font-family monospace to suggest that [[wikitext]] is allowed\n\t\treplyInput.$element.css( 'font-family', 'monospace' );\n\n\t\t// Add to the DOM\n\t\tif ( $replies.length ) {\n\t\t\t$replies.append( $formWrapper );\n\t\t} else {\n\t\t\t$replies = $( '<dl>' );\n\t\t\t$replies.append( $formWrapper );\n\t\t\t$comment.append( $replies );\n\t\t}\n\n\t\t// Focus the field because autofocus doesn't always work\n\t\t$formWrapper.find( 'textarea[name=\"reply\"]' ).trigger( 'focus' );\n\n\t\t// Handle a submission\n\t\tpublishButton.on( 'click', TalkBelow.onSubmitReply, [ $comment, $formWrapper, relevantWikitext, publishButton, cancelButton, replyButton ] );\n\n\t\t// Handle a cancel\n\t\tcancelButton.on( 'click', () => {\n\t\t\t$formWrapper.remove();\n\t\t\tif ( $replies.children().length === 0 ) {\n\t\t\t\t$replies.remove();\n\t\t\t}\n\t\t\treplyButton.setDisabled( false );\n\t\t} );\n\t},\n\n\t/**\n\t * Handle a reply form submission\n\t *\n\t * @param {Object} $comment\n\t * @param {Object} $formWrapper\n\t * @param {string} relevantWikitext\n\t * @param {Object} publishButton\n\t * @param {Object} cancelButton\n\t * @param {Object} replyButton\n\t */\n\tonSubmitReply: function ( $comment, $formWrapper, relevantWikitext, publishButton, cancelButton, replyButton ) {\n\n\t\t// Check that the user wrote something\n\t\tconst $reply = $formWrapper.find( 'textarea[name=\"reply\"]' );\n\t\tlet reply = $reply.val();\n\t\tif ( !reply ) {\n\t\t\t$reply.trigger( 'focus' );\n\t\t\treturn;\n\t\t}\n\n\t\t// Disable the buttons\n\t\t// to prevent further clicks and to signal the user that something's happening\n\t\tpublishButton.setDisabled( true );\n\t\tcancelButton.setDisabled( true );\n\n\t\t// Calculate the appropriate number of colons\n\t\tconst depth = $comment.parents( 'dl' ).length + 1;\n\t\tlet colons = '';\n\t\tfor ( let i = 0; i < depth; i++ ) {\n\t\t\tcolons += ':';\n\t\t}\n\n\t\t// Remove line breaks\n\t\treply = reply.trim();\n\t\treply = reply.replace( /\\n+/g, ' ' );\n\n\t\t// Build the final wikitext of the reply\n\t\tconst replyWikitext = '\\n' + colons + reply + ' ~~~~';\n\n\t\t// Submit the reply\n\t\tTalkBelow.talkWikitext = TalkBelow.talkWikitext.replace( relevantWikitext, relevantWikitext + replyWikitext );\n\t\tconst page = mw.config.get( 'wgPageName' );\n\t\tconst talk = new mw.Title( page ).getTalkPage();\n\t\tconst params = {\n\t\t\taction: 'edit',\n\t\t\ttitle: talk.getPrefixedText(),\n\t\t\ttext: TalkBelow.talkWikitext,\n\t\t\tsummary: mw.msg( 'talkbelow-summary' ),\n\t\t\ttags: mw.config.get( 'wgTalkBelowChangeTag' )\n\t\t};\n\t\tnew mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( () => {\n\t\t\tTalkBelow.onSubmitReplySuccess( replyWikitext, replyButton, $formWrapper );\n\t\t} );\n\t},\n\n\t/**\n\t * Handle a successful reply\n\t *\n\t * @param {string} replyWikitext\n\t * @param {Object} replyButton\n\t * @param {Object} $formWrapper\n\t */\n\tonSubmitReplySuccess: function ( replyWikitext, replyButton, $formWrapper ) {\n\t\tconst page = mw.config.get( 'wgPageName' );\n\t\tconst talk = new mw.Title( page ).getTalkPage();\n\t\tconst params = {\n\t\t\taction: 'parse',\n\t\t\ttitle: talk.getPrefixedText(),\n\t\t\ttext: replyWikitext,\n\t\t\tformatversion: 2,\n\t\t\tpst: true,\n\t\t\tprop: 'text',\n\t\t\tdisablelimitreport: true\n\t\t};\n\t\tnew mw.Api().get( params ).fail( TalkBelow.onError ).done( ( data ) => {\n\t\t\tconst text = data.parse.text;\n\t\t\tconst $html = $( text );\n\t\t\tconst $reply = $html.find( 'dd' ).last();\n\t\t\t$formWrapper.replaceWith( $reply );\n\t\t\treplyButton.setDisabled( false );\n\t\t\tTalkBelow.addReplyButton.call( $reply );\n\t\t} );\n\t},\n\n\t/**\n\t * Add the new topic form\n\t */\n\taddNewTopicForm: function () {\n\n\t\t// Build the form\n\t\tconst titleInput = new OO.ui.TextInputWidget( { name: 'title', placeholder: mw.msg( 'talkbelow-title' ) } );\n\t\tconst commentInput = new OO.ui.MultilineTextInputWidget( { name: 'comment', autosize: true, placeholder: mw.msg( 'talkbelow-comment' ) } );\n\t\tconst publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );\n\t\tconst titleLayout = new OO.ui.HorizontalLayout( { items: [ titleInput ] } );\n\t\tconst commentLayout = new OO.ui.HorizontalLayout( { items: [ commentInput ] } );\n\t\tconst publishLayout = new OO.ui.HorizontalLayout( { items: [ publishButton ] } );\n\t\tconst formLayout = new OO.ui.FormLayout( { items: [ titleLayout, commentLayout, publishLayout ] } );\n\t\tconst $title = $( '<h2>' ).text( mw.msg( 'talkbelow-new-topic' ) );\n\t\tconst $form = $( '<div>' ).attr( 'id', 'talkbelow-new-topic-form' ).append( $title, formLayout.$element );\n\n\t\t// Make the font-family monospace to suggest that [[wikitext]] is allowed\n\t\tcommentInput.$element.css( 'font-family', 'monospace' );\n\n\t\t// Replace the \"Add topic\" button for the form\n\t\tconst addTopicButton = document.getElementById( 'talkbelow-add-topic-button' );\n\t\tconst $addTopicButton = $( addTopicButton );\n\t\t$addTopicButton.replaceWith( $form );\n\n\t\t// Handle submissions\n\t\tpublishButton.on( 'click', TalkBelow.onSubmitNewTopic, [ publishButton ] );\n\t},\n\n\t/**\n\t * @param {Object} publishButton\n\t */\n\tonSubmitNewTopic: function ( publishButton ) {\n\n\t\t// Get the data from the form\n\t\tconst $form = publishButton.$element.closest( '#talkbelow-new-topic-form' );\n\t\tconst $title = $form.find( 'input[name=\"title\"]' );\n\t\tconst $comment = $form.find( 'textarea[name=\"comment\"]' );\n\t\tconst title = $title.val();\n\t\tconst comment = $comment.val();\n\n\t\t// Do some basic validation\n\t\tif ( !title ) {\n\t\t\t$title.trigger( 'focus' );\n\t\t\treturn;\n\t\t}\n\t\tif ( !comment ) {\n\t\t\t$comment.trigger( 'focus' );\n\t\t\treturn;\n\t\t}\n\n\t\t// Disable the Publish button\n\t\t// to prevent further clicks and to signal the user that something is happening\n\t\tpublishButton.setDisabled( true );\n\n\t\t// Submit the new topic\n\t\tconst page = mw.config.get( 'wgPageName' );\n\t\tconst talk = new mw.Title( page ).getTalkPage();\n\t\tconst text = comment + ' ~~~~'; // Append the signature\n\t\tconst params = {\n\t\t\taction: 'edit',\n\t\t\ttitle: talk.getPrefixedText(),\n\t\t\tsection: 'new',\n\t\t\tsectiontitle: title,\n\t\t\ttext: text,\n\t\t\ttags: mw.config.get( 'wgTalkBelowChangeTag' )\n\t\t};\n\t\tnew mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( () => {\n\t\t\tTalkBelow.onSubmitNewTopicSuccess( talk, title, text, $form );\n\t\t} );\n\t},\n\n\t/**\n\t * Handle a successful new topic submission\n\t *\n\t * @param {string} talk Talk page where the new topic was posted\n\t * @param {string} title Title of the new topic\n\t * @param {string} text Text of the new topic\n\t * @param {Object} $form New topic form\n\t */\n\tonSubmitNewTopicSuccess: function ( talk, title, text, $form ) {\n\t\tconst params = {\n\t\t\taction: 'parse',\n\t\t\ttitle: talk.getPrefixedText(),\n\t\t\tsection: 'new',\n\t\t\tsectiontitle: title,\n\t\t\ttext: text,\n\t\t\tformatversion: 2,\n\t\t\tprop: 'text',\n\t\t\tpst: true,\n\t\t\tdisablelimitreport: true\n\t\t};\n\t\tnew mw.Api().get( params ).fail( TalkBelow.onError ).done( ( data ) => {\n\t\t\t// Remove the outer <div>\n\t\t\tconst div = data.parse.text;\n\t\t\tconst topic = $( div ).html();\n\t\t\tconst $topic = $( topic );\n\n\t\t\t// Replace the form with the new topic\n\t\t\t$form.replaceWith( $topic );\n\t\t\t$topic.find( 'p' ).each( TalkBelow.addReplyButton );\n\t\t} );\n\t},\n\n\t/**\n\t * Handle an API error\n\t *\n\t * @param {string} error\n\t * @param {Object} data\n\t */\n\tonError: function ( error, data ) {\n\t\tif ( 'error' in data && 'info' in data.error ) {\n\t\t\terror = data.error.info;\n\t\t}\n\t\tmw.notify( mw.msg( 'talkbelow-error', error ) );\n\t},\n\n\t/**\n\t * Helper method to get the wikitext of the relevant talk page\n\t *\n\t * @return {Object} Promise\n\t */\n\tgetTalkWikitext: function () {\n\t\tconst page = mw.config.get( 'wgPageName' );\n\t\tconst talk = new mw.Title( page ).getTalkPage();\n\t\tconst params = {\n\t\t\tpage: talk.getPrefixedText(),\n\t\t\taction: 'parse',\n\t\t\tprop: 'wikitext',\n\t\t\tformatversion: 2\n\t\t};\n\t\treturn new mw.Api().get( params ).done( ( data ) => {\n\t\t\tTalkBelow.talkWikitext = data.parse.wikitext;\n\t\t} );\n\t},\n\n\t/**\n\t * Helper method to get the relevant wikitext that corresponds to a given comment or reply\n\t *\n\t * This is actually the heart of the tool\n\t * It's a heuristic method to try to find the relevant wikitext\n\t * that corresponds to the comment being replied to\n\t * Since wikitext and HTML are different markups\n\t * the only place where they are the same is in plain text fragments\n\t * so we find the longest plain text fragment in the HTML\n\t * then we search for that same fragment in the wikitext\n\t * and return the entire line of wikitext containing that fragment\n\t * or null if anything goes wrong\n\t *\n\t * @param {Object} $comment jQuery object representing the DOM element being edited\n\t * @return {string|null} Wikitext of the comment being edited, or null if it can't be found\n\t */\n\tgetRelevantWikitext: function ( $comment ) {\n\t\t// The longest text node has the most chances of being unique\n\t\tlet text = TalkBelow.getLongestText( $comment );\n\n\t\t// Some comments may not have text nodes at all\n\t\tif ( !text ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Match all lines that contain the text\n\t\ttext = text.replace( /\\u00a0/g, ' ' ); // Replace nbsp sometimes added by the browser\n\t\ttext = text.replace( /[.*+?^${}()|[\\]\\\\]/g, '\\\\$&' ); // Escape special characters\n\n\t\tconst regexp = new RegExp( '.*' + text + '.*', 'g' );\n\n\t\tconst matches = TalkBelow.talkWikitext.match( regexp );\n\n\t\t// This may happen if the comments comes from a template\n\t\tif ( !matches ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// This may happen if the longest text is very short and repeats somewhere else\n\t\tif ( matches.length > 1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We got our relevant wikitext line\n\t\treturn matches[ 0 ];\n\t},\n\n\t/**\n\t * Helper method to get the text of the longest text node\n\t *\n\t * @param {Object} $comment\n\t * @return {string} Text of the longest text node\n\t */\n\tgetLongestText: function ( $comment ) {\n\t\tlet text = '';\n\t\tconst $textNodes = $comment.contents().filter( function () {\n\t\t\treturn this.nodeType === 3; // Text node\n\t\t} );\n\t\t$textNodes.each( function () {\n\t\t\tconst nodeText = $( this ).text().trim();\n\t\t\tif ( nodeText.length > text.length ) {\n\t\t\t\ttext = nodeText;\n\t\t\t}\n\t\t} );\n\t\treturn text;\n\t},\n\n\t/**\n\t * Helper method to build a helpful edit summary\n\t *\n\t * @param {string} summary\n\t * @param {Object} $comment\n\t * @param {string} wikitext\n\t * @return {string} Edit summary\n\t */\n\tmakeSummary: function ( summary, $comment, wikitext ) {\n\t\tif ( !summary ) {\n\t\t\tconst page = mw.config.get( 'talkbelow-page', 'mw:TalkBelow' );\n\t\t\tsummary = wikitext ? mw.msg( 'talkbelow-summary-edit', page ) : mw.msg( 'talkbelow-summary-delete', page );\n\t\t}\n\t\tconst $section = TalkBelow.getSection( $comment );\n\t\tif ( $section ) {\n\t\t\tconst section = $section.find( '.mw-headline' ).attr( 'id' ).replace( '/_/g', ' ' );\n\t\t\tsummary = '/* ' + section + ' */ ' + summary;\n\t\t}\n\t\tsummary += ' #talkbelow'; // For https://hashtags.wmcloud.org\n\t\treturn summary;\n\t},\n\n\t/**\n\t * Helper method to find the closest section\n\t * by traversing back and up the DOM tree\n\t *\n\t * @param {Object} $element Starting element\n\t * @return {Object} Closest section\n\t */\n\tgetSection: function ( $element ) {\n\t\tif ( $element.attr( 'id' ) === 'mw-content-text' ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( $element.is( 'h1, h2, h3, h4, h5, h6' ) ) {\n\t\t\treturn $element;\n\t\t}\n\t\tconst $previous = $element.prevAll( 'h1, h2, h3, h4, h5, h6' ).first();\n\t\tif ( $previous.length ) {\n\t\t\treturn $previous;\n\t\t}\n\t\tconst $parent = $element.parent();\n\t\treturn TalkBelow.getSection( $parent );\n\t}\n};\n\nTalkBelow.init();\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ar.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/bn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/crh-latn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/de.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/es.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fa.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/he.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/hy.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ia.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/it.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ko.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/lb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/mk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ms.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/nl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/skr-arab.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/smn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sr-ec.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/tr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/xal.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/zh-hans.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/zh-hant.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]

--- end ---
Disabling eslint rule 'no-jquery/no-done-fail' (broken in .eslintrc.json) on .eslintrc.json
$ /usr/bin/npm ci
--- stdout ---

added 328 packages, and audited 329 packages in 4s

57 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/TalkBelow.js
   75:3   warning  Prefer .then to .done                                                              no-jquery/no-done-fail
  199:3   warning  Prefer .then to .fail                                                              no-jquery/no-done-fail
  199:3   warning  Prefer .then to .done                                                              no-jquery/no-done-fail
  223:3   warning  Prefer .then to .fail                                                              no-jquery/no-done-fail
  223:3   warning  Prefer .then to .done                                                              no-jquery/no-done-fail
  299:3   warning  Prefer .then to .fail                                                              no-jquery/no-done-fail
  299:3   warning  Prefer .then to .done                                                              no-jquery/no-done-fail
  324:3   warning  Prefer .then to .fail                                                              no-jquery/no-done-fail
  324:3   warning  Prefer .then to .done                                                              no-jquery/no-done-fail
  363:10  warning  Prefer .then to .done                                                              no-jquery/no-done-fail
  368:2   warning  JSDoc @return declaration present but return expression not available in function  jsdoc/require-returns-check
  457:2   warning  JSDoc @return declaration present but return expression not available in function  jsdoc/require-returns-check

✖ 12 problems (0 errors, 12 warnings)


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

Done.

--- end ---
Upgrading c:mediawiki/mediawiki-codesniffer from 45.0.0 -> 47.0.0
Upgrading c:mediawiki/mediawiki-phan-config from 0.15.0 -> 0.15.1
$ /usr/bin/composer update
--- stderr ---
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 3 updates, 0 removals
  - Upgrading mediawiki/mediawiki-codesniffer (v45.0.0 => v47.0.0)
  - Upgrading mediawiki/mediawiki-phan-config (0.15.0 => 0.15.1)
  - Upgrading squizlabs/php_codesniffer (3.10.3 => 3.12.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 3 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Upgrading squizlabs/php_codesniffer (3.10.3 => 3.12.2): Extracting archive
  - Upgrading mediawiki/mediawiki-codesniffer (v45.0.0 => v47.0.0): Extracting archive
  - Upgrading mediawiki/mediawiki-phan-config (0.15.0 => 0.15.1): Extracting archive
 0/3 [>---------------------------]   0%
 2/3 [==================>---------]  66%
 3/3 [============================] 100%
Generating autoload files
16 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 ---
$ vendor/bin/phpcs --report=json
--- stdout ---
{"totals":{"errors":0,"warnings":0,"fixable":0},"files":{"\/src\/repo\/TalkBelow.magic.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/.phan\/config.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/TalkBelow.php":{"errors":0,"warnings":0,"messages":[]}}}

--- 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
16 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---

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


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


Time: 158ms; Memory: 8MB

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

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {},
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 0,
      "critical": 0,
      "total": 0
    },
    "dependencies": {
      "prod": 1,
      "dev": 328,
      "optional": 0,
      "peer": 1,
      "peerOptional": 0,
      "total": 328
    }
  }
}

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

--- end ---
build: Updating dependencies

composer:
* mediawiki/mediawiki-codesniffer: 45.0.0 → 47.0.0
* mediawiki/mediawiki-phan-config: 0.15.0 → 0.15.1

npm:
* eslint-config-wikimedia: 0.28.2 → 0.29.1
  The following rules are failing and were disabled:
  * no-jquery/no-done-fail


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

$ git add .
--- stdout ---

--- end ---
$ git commit -F /tmp/tmp4nsdpj_u
--- stdout ---
[master b062626] build: Updating dependencies
 6 files changed, 106 insertions(+), 102 deletions(-)

--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From b062626bfbc9d5ef2dbae57757c1518526ad67ad Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Tue, 6 May 2025 05:50:07 +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: 45.0.0 → 47.0.0
* mediawiki/mediawiki-phan-config: 0.15.0 → 0.15.1

npm:
* eslint-config-wikimedia: 0.28.2 → 0.29.1
  The following rules are failing and were disabled:
  * no-jquery/no-done-fail

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

Change-Id: Ifcfc39c615a11824118c47f7197834fa3b438fb0
---
 .eslintrc.json    |   5 +-
 Gruntfile.js      |   2 +-
 TalkBelow.js      | 162 +++++++++++++++++++++++-----------------------
 composer.json     |   4 +-
 package-lock.json |  33 +++++-----
 package.json      |   2 +-
 6 files changed, 106 insertions(+), 102 deletions(-)

diff --git a/.eslintrc.json b/.eslintrc.json
index 67d20f5..0d4578a 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,7 +1,7 @@
 {
 	"root": true,
 	"extends": [
-		"wikimedia/client-es5",
+		"wikimedia/client",
 		"wikimedia/jquery",
 		"wikimedia/mediawiki"
 	],
@@ -11,6 +11,7 @@
 	"rules": {
 		"max-len": "off",
 		"one-var": "off",
-		"vars-on-top": "off"
+		"vars-on-top": "off",
+		"no-jquery/no-done-fail": "warn"
 	}
 }
diff --git a/Gruntfile.js b/Gruntfile.js
index 9fb7f26..66b4408 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,6 +1,6 @@
 /* eslint-env node */
 module.exports = function ( grunt ) {
-	var conf = grunt.file.readJSON( 'extension.json' );
+	const conf = grunt.file.readJSON( 'extension.json' );
 
 	grunt.loadNpmTasks( 'grunt-banana-checker' );
 	grunt.loadNpmTasks( 'grunt-eslint' );
diff --git a/TalkBelow.js b/TalkBelow.js
index f490f0d..ce457f2 100644
--- a/TalkBelow.js
+++ b/TalkBelow.js
@@ -11,7 +11,7 @@ window.TalkBelow = {
 	init: function () {
 
 		// Only init when there's a talk section
-		var section = document.getElementById( 'talkbelow-section' );
+		const section = document.getElementById( 'talkbelow-section' );
 		if ( !section ) {
 			return;
 		}
@@ -27,7 +27,7 @@ window.TalkBelow = {
 	 * Add a reply button
 	 */
 	addReplyButton: function () {
-		var $comment = $( this );
+		const $comment = $( this );
 
 		// Skip paragraphs followed by other paragraphs
 		// so that only the last one shows the reply button
@@ -37,7 +37,7 @@ window.TalkBelow = {
 		}
 
 		// Make the reply button
-		var replyButton = new OO.ui.ButtonInputWidget( {
+		const replyButton = new OO.ui.ButtonInputWidget( {
 			flags: 'progressive',
 			framed: false,
 			label: mw.msg( 'talkbelow-reply' ),
@@ -47,7 +47,7 @@ window.TalkBelow = {
 		replyButton.on( 'click', TalkBelow.onReplyButtonClick, [ replyButton ] );
 
 		// Add to the DOM
-		var $replies = $comment.children( 'dl' );
+		const $replies = $comment.children( 'dl' );
 		if ( $replies.length ) {
 			$replies.before( ' ', replyButton.$element );
 		} else {
@@ -72,7 +72,7 @@ window.TalkBelow = {
 		}
 
 		// Else get the talk wikitext and then add the reply form
-		TalkBelow.getTalkWikitext().done( function () {
+		TalkBelow.getTalkWikitext().done( () => {
 			TalkBelow.addReplyForm( replyButton );
 		} );
 	},
@@ -85,38 +85,38 @@ window.TalkBelow = {
 	addReplyForm: function ( replyButton ) {
 
 		// In most cases, the relevant wikitext is that of the comment we're replying to
-		var $replyButton = replyButton.$element;
-		var $comment = $replyButton.closest( 'p, dd' );
-		var relevantWikitext = TalkBelow.getRelevantWikitext( $comment );
+		const $replyButton = replyButton.$element;
+		const $comment = $replyButton.closest( 'p, dd' );
+		let relevantWikitext = TalkBelow.getRelevantWikitext( $comment );
 
 		// But if the comment already has replies
 		// then the relevant wikitext is that of the last reply
 		// because we need to add the new reply below the last one
-		var $replies = $comment.is( 'p' ) ? $comment.next( 'dl' ) : $comment.children( 'dl' );
+		let $replies = $comment.is( 'p' ) ? $comment.next( 'dl' ) : $comment.children( 'dl' );
 		if ( $replies.length ) {
-			var $lastReply = $replies.children( 'dd' ).last();
+			const $lastReply = $replies.children( 'dd' ).last();
 			relevantWikitext = TalkBelow.getRelevantWikitext( $lastReply );
 		}
 
 		// If no relevant wikitext is found, fallback to regular edit
 		if ( !relevantWikitext ) {
-			var $section = TalkBelow.getSection( $comment );
-			var sectionNumber = $section ? 1 + $section.prevAll( 'h1, h2, h3, h4, h5, h6' ).length : 0;
-			var page = mw.config.get( 'wgPageName' );
-			var talk = new mw.Title( page ).getTalkPage();
-			var editUrl = mw.util.getUrl( talk.getPrefixedText(), { action: 'edit', section: sectionNumber } );
+			const $section = TalkBelow.getSection( $comment );
+			const sectionNumber = $section ? 1 + $section.prevAll( 'h1, h2, h3, h4, h5, h6' ).length : 0;
+			const page = mw.config.get( 'wgPageName' );
+			const talk = new mw.Title( page ).getTalkPage();
+			const editUrl = mw.util.getUrl( talk.getPrefixedText(), { action: 'edit', section: sectionNumber } );
 			window.location.href = editUrl;
 			return;
 		}
 
 		// Make the reply form
-		var replyInput = new OO.ui.MultilineTextInputWidget( { name: 'reply', autosize: true, autofocus: true } );
-		var replyLayout = new OO.ui.HorizontalLayout( { items: [ replyInput ] } );
-		var publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );
-		var cancelButton = new OO.ui.ButtonInputWidget( { flags: 'destructive', framed: false, label: mw.msg( 'talkbelow-cancel' ) } );
-		var buttonsLayout = new OO.ui.HorizontalLayout( { items: [ publishButton, cancelButton ] } );
-		var form = new OO.ui.FormLayout( { items: [ replyLayout, buttonsLayout ] } );
-		var $formWrapper = $( '<dd>' ).html( form.$element );
+		const replyInput = new OO.ui.MultilineTextInputWidget( { name: 'reply', autosize: true, autofocus: true } );
+		const replyLayout = new OO.ui.HorizontalLayout( { items: [ replyInput ] } );
+		const publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );
+		const cancelButton = new OO.ui.ButtonInputWidget( { flags: 'destructive', framed: false, label: mw.msg( 'talkbelow-cancel' ) } );
+		const buttonsLayout = new OO.ui.HorizontalLayout( { items: [ publishButton, cancelButton ] } );
+		const form = new OO.ui.FormLayout( { items: [ replyLayout, buttonsLayout ] } );
+		const $formWrapper = $( '<dd>' ).html( form.$element );
 
 		// Make the font-family monospace to suggest that [[wikitext]] is allowed
 		replyInput.$element.css( 'font-family', 'monospace' );
@@ -137,7 +137,7 @@ window.TalkBelow = {
 		publishButton.on( 'click', TalkBelow.onSubmitReply, [ $comment, $formWrapper, relevantWikitext, publishButton, cancelButton, replyButton ] );
 
 		// Handle a cancel
-		cancelButton.on( 'click', function () {
+		cancelButton.on( 'click', () => {
 			$formWrapper.remove();
 			if ( $replies.children().length === 0 ) {
 				$replies.remove();
@@ -159,8 +159,8 @@ window.TalkBelow = {
 	onSubmitReply: function ( $comment, $formWrapper, relevantWikitext, publishButton, cancelButton, replyButton ) {
 
 		// Check that the user wrote something
-		var $reply = $formWrapper.find( 'textarea[name="reply"]' );
-		var reply = $reply.val();
+		const $reply = $formWrapper.find( 'textarea[name="reply"]' );
+		let reply = $reply.val();
 		if ( !reply ) {
 			$reply.trigger( 'focus' );
 			return;
@@ -172,9 +172,9 @@ window.TalkBelow = {
 		cancelButton.setDisabled( true );
 
 		// Calculate the appropriate number of colons
-		var depth = $comment.parents( 'dl' ).length + 1;
-		var colons = '';
-		for ( var i = 0; i < depth; i++ ) {
+		const depth = $comment.parents( 'dl' ).length + 1;
+		let colons = '';
+		for ( let i = 0; i < depth; i++ ) {
 			colons += ':';
 		}
 
@@ -183,20 +183,20 @@ window.TalkBelow = {
 		reply = reply.replace( /\n+/g, ' ' );
 
 		// Build the final wikitext of the reply
-		var replyWikitext = '\n' + colons + reply + ' ~~~~';
+		const replyWikitext = '\n' + colons + reply + ' ~~~~';
 
 		// Submit the reply
 		TalkBelow.talkWikitext = TalkBelow.talkWikitext.replace( relevantWikitext, relevantWikitext + replyWikitext );
-		var page = mw.config.get( 'wgPageName' );
-		var talk = new mw.Title( page ).getTalkPage();
-		var params = {
+		const page = mw.config.get( 'wgPageName' );
+		const talk = new mw.Title( page ).getTalkPage();
+		const params = {
 			action: 'edit',
 			title: talk.getPrefixedText(),
 			text: TalkBelow.talkWikitext,
 			summary: mw.msg( 'talkbelow-summary' ),
 			tags: mw.config.get( 'wgTalkBelowChangeTag' )
 		};
-		new mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( function () {
+		new mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( () => {
 			TalkBelow.onSubmitReplySuccess( replyWikitext, replyButton, $formWrapper );
 		} );
 	},
@@ -209,9 +209,9 @@ window.TalkBelow = {
 	 * @param {Object} $formWrapper
 	 */
 	onSubmitReplySuccess: function ( replyWikitext, replyButton, $formWrapper ) {
-		var page = mw.config.get( 'wgPageName' );
-		var talk = new mw.Title( page ).getTalkPage();
-		var params = {
+		const page = mw.config.get( 'wgPageName' );
+		const talk = new mw.Title( page ).getTalkPage();
+		const params = {
 			action: 'parse',
 			title: talk.getPrefixedText(),
 			text: replyWikitext,
@@ -220,10 +220,10 @@ window.TalkBelow = {
 			prop: 'text',
 			disablelimitreport: true
 		};
-		new mw.Api().get( params ).fail( TalkBelow.onError ).done( function ( data ) {
-			var text = data.parse.text;
-			var $html = $( text );
-			var $reply = $html.find( 'dd' ).last();
+		new mw.Api().get( params ).fail( TalkBelow.onError ).done( ( data ) => {
+			const text = data.parse.text;
+			const $html = $( text );
+			const $reply = $html.find( 'dd' ).last();
 			$formWrapper.replaceWith( $reply );
 			replyButton.setDisabled( false );
 			TalkBelow.addReplyButton.call( $reply );
@@ -236,22 +236,22 @@ window.TalkBelow = {
 	addNewTopicForm: function () {
 
 		// Build the form
-		var titleInput = new OO.ui.TextInputWidget( { name: 'title', placeholder: mw.msg( 'talkbelow-title' ) } );
-		var commentInput = new OO.ui.MultilineTextInputWidget( { name: 'comment', autosize: true, placeholder: mw.msg( 'talkbelow-comment' ) } );
-		var publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );
-		var titleLayout = new OO.ui.HorizontalLayout( { items: [ titleInput ] } );
-		var commentLayout = new OO.ui.HorizontalLayout( { items: [ commentInput ] } );
-		var publishLayout = new OO.ui.HorizontalLayout( { items: [ publishButton ] } );
-		var formLayout = new OO.ui.FormLayout( { items: [ titleLayout, commentLayout, publishLayout ] } );
-		var $title = $( '<h2>' ).text( mw.msg( 'talkbelow-new-topic' ) );
-		var $form = $( '<div>' ).attr( 'id', 'talkbelow-new-topic-form' ).append( $title, formLayout.$element );
+		const titleInput = new OO.ui.TextInputWidget( { name: 'title', placeholder: mw.msg( 'talkbelow-title' ) } );
+		const commentInput = new OO.ui.MultilineTextInputWidget( { name: 'comment', autosize: true, placeholder: mw.msg( 'talkbelow-comment' ) } );
+		const publishButton = new OO.ui.ButtonInputWidget( { flags: [ 'primary', 'progressive' ], label: mw.msg( 'talkbelow-publish' ) } );
+		const titleLayout = new OO.ui.HorizontalLayout( { items: [ titleInput ] } );
+		const commentLayout = new OO.ui.HorizontalLayout( { items: [ commentInput ] } );
+		const publishLayout = new OO.ui.HorizontalLayout( { items: [ publishButton ] } );
+		const formLayout = new OO.ui.FormLayout( { items: [ titleLayout, commentLayout, publishLayout ] } );
+		const $title = $( '<h2>' ).text( mw.msg( 'talkbelow-new-topic' ) );
+		const $form = $( '<div>' ).attr( 'id', 'talkbelow-new-topic-form' ).append( $title, formLayout.$element );
 
 		// Make the font-family monospace to suggest that [[wikitext]] is allowed
 		commentInput.$element.css( 'font-family', 'monospace' );
 
 		// Replace the "Add topic" button for the form
-		var addTopicButton = document.getElementById( 'talkbelow-add-topic-button' );
-		var $addTopicButton = $( addTopicButton );
+		const addTopicButton = document.getElementById( 'talkbelow-add-topic-button' );
+		const $addTopicButton = $( addTopicButton );
 		$addTopicButton.replaceWith( $form );
 
 		// Handle submissions
@@ -264,11 +264,11 @@ window.TalkBelow = {
 	onSubmitNewTopic: function ( publishButton ) {
 
 		// Get the data from the form
-		var $form = publishButton.$element.closest( '#talkbelow-new-topic-form' );
-		var $title = $form.find( 'input[name="title"]' );
-		var $comment = $form.find( 'textarea[name="comment"]' );
-		var title = $title.val();
-		var comment = $comment.val();
+		const $form = publishButton.$element.closest( '#talkbelow-new-topic-form' );
+		const $title = $form.find( 'input[name="title"]' );
+		const $comment = $form.find( 'textarea[name="comment"]' );
+		const title = $title.val();
+		const comment = $comment.val();
 
 		// Do some basic validation
 		if ( !title ) {
@@ -285,10 +285,10 @@ window.TalkBelow = {
 		publishButton.setDisabled( true );
 
 		// Submit the new topic
-		var page = mw.config.get( 'wgPageName' );
-		var talk = new mw.Title( page ).getTalkPage();
-		var text = comment + ' ~~~~'; // Append the signature
-		var params = {
+		const page = mw.config.get( 'wgPageName' );
+		const talk = new mw.Title( page ).getTalkPage();
+		const text = comment + ' ~~~~'; // Append the signature
+		const params = {
 			action: 'edit',
 			title: talk.getPrefixedText(),
 			section: 'new',
@@ -296,7 +296,7 @@ window.TalkBelow = {
 			text: text,
 			tags: mw.config.get( 'wgTalkBelowChangeTag' )
 		};
-		new mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( function () {
+		new mw.Api().postWithEditToken( params ).fail( TalkBelow.onError ).done( () => {
 			TalkBelow.onSubmitNewTopicSuccess( talk, title, text, $form );
 		} );
 	},
@@ -310,7 +310,7 @@ window.TalkBelow = {
 	 * @param {Object} $form New topic form
 	 */
 	onSubmitNewTopicSuccess: function ( talk, title, text, $form ) {
-		var params = {
+		const params = {
 			action: 'parse',
 			title: talk.getPrefixedText(),
 			section: 'new',
@@ -321,11 +321,11 @@ window.TalkBelow = {
 			pst: true,
 			disablelimitreport: true
 		};
-		new mw.Api().get( params ).fail( TalkBelow.onError ).done( function ( data ) {
+		new mw.Api().get( params ).fail( TalkBelow.onError ).done( ( data ) => {
 			// Remove the outer <div>
-			var div = data.parse.text;
-			var topic = $( div ).html();
-			var $topic = $( topic );
+			const div = data.parse.text;
+			const topic = $( div ).html();
+			const $topic = $( topic );
 
 			// Replace the form with the new topic
 			$form.replaceWith( $topic );
@@ -352,15 +352,15 @@ window.TalkBelow = {
 	 * @return {Object} Promise
 	 */
 	getTalkWikitext: function () {
-		var page = mw.config.get( 'wgPageName' );
-		var talk = new mw.Title( page ).getTalkPage();
-		var params = {
+		const page = mw.config.get( 'wgPageName' );
+		const talk = new mw.Title( page ).getTalkPage();
+		const params = {
 			page: talk.getPrefixedText(),
 			action: 'parse',
 			prop: 'wikitext',
 			formatversion: 2
 		};
-		return new mw.Api().get( params ).done( function ( data ) {
+		return new mw.Api().get( params ).done( ( data ) => {
 			TalkBelow.talkWikitext = data.parse.wikitext;
 		} );
 	},
@@ -383,7 +383,7 @@ window.TalkBelow = {
 	 */
 	getRelevantWikitext: function ( $comment ) {
 		// The longest text node has the most chances of being unique
-		var text = TalkBelow.getLongestText( $comment );
+		let text = TalkBelow.getLongestText( $comment );
 
 		// Some comments may not have text nodes at all
 		if ( !text ) {
@@ -394,9 +394,9 @@ window.TalkBelow = {
 		text = text.replace( /\u00a0/g, ' ' ); // Replace nbsp sometimes added by the browser
 		text = text.replace( /[.*+?^${}()|[\]\\]/g, '\\$&' ); // Escape special characters
 
-		var regexp = new RegExp( '.*' + text + '.*', 'g' );
+		const regexp = new RegExp( '.*' + text + '.*', 'g' );
 
-		var matches = TalkBelow.talkWikitext.match( regexp );
+		const matches = TalkBelow.talkWikitext.match( regexp );
 
 		// This may happen if the comments comes from a template
 		if ( !matches ) {
@@ -419,12 +419,12 @@ window.TalkBelow = {
 	 * @return {string} Text of the longest text node
 	 */
 	getLongestText: function ( $comment ) {
-		var text = '';
-		var $textNodes = $comment.contents().filter( function () {
+		let text = '';
+		const $textNodes = $comment.contents().filter( function () {
 			return this.nodeType === 3; // Text node
 		} );
 		$textNodes.each( function () {
-			var nodeText = $( this ).text().trim();
+			const nodeText = $( this ).text().trim();
 			if ( nodeText.length > text.length ) {
 				text = nodeText;
 			}
@@ -442,12 +442,12 @@ window.TalkBelow = {
 	 */
 	makeSummary: function ( summary, $comment, wikitext ) {
 		if ( !summary ) {
-			var page = mw.config.get( 'talkbelow-page', 'mw:TalkBelow' );
+			const page = mw.config.get( 'talkbelow-page', 'mw:TalkBelow' );
 			summary = wikitext ? mw.msg( 'talkbelow-summary-edit', page ) : mw.msg( 'talkbelow-summary-delete', page );
 		}
-		var $section = TalkBelow.getSection( $comment );
+		const $section = TalkBelow.getSection( $comment );
 		if ( $section ) {
-			var section = $section.find( '.mw-headline' ).attr( 'id' ).replace( '/_/g', ' ' );
+			const section = $section.find( '.mw-headline' ).attr( 'id' ).replace( '/_/g', ' ' );
 			summary = '/* ' + section + ' */ ' + summary;
 		}
 		summary += ' #talkbelow'; // For https://hashtags.wmcloud.org
@@ -468,11 +468,11 @@ window.TalkBelow = {
 		if ( $element.is( 'h1, h2, h3, h4, h5, h6' ) ) {
 			return $element;
 		}
-		var $previous = $element.prevAll( 'h1, h2, h3, h4, h5, h6' ).first();
+		const $previous = $element.prevAll( 'h1, h2, h3, h4, h5, h6' ).first();
 		if ( $previous.length ) {
 			return $previous;
 		}
-		var $parent = $element.parent();
+		const $parent = $element.parent();
 		return TalkBelow.getSection( $parent );
 	}
 };
diff --git a/composer.json b/composer.json
index b0ddb62..a144259 100644
--- a/composer.json
+++ b/composer.json
@@ -1,7 +1,7 @@
 {
 	"require-dev": {
-		"mediawiki/mediawiki-codesniffer": "45.0.0",
-		"mediawiki/mediawiki-phan-config": "0.15.0",
+		"mediawiki/mediawiki-codesniffer": "47.0.0",
+		"mediawiki/mediawiki-phan-config": "0.15.1",
 		"mediawiki/minus-x": "1.1.3",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
 		"php-parallel-lint/php-parallel-lint": "1.4.0"
diff --git a/package-lock.json b/package-lock.json
index eaae080..757f12b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,7 @@
 		"": {
 			"name": "TalkBelow",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.28.2",
+				"eslint-config-wikimedia": "0.29.1",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.13.0",
 				"grunt-eslint": "24.3.0"
@@ -946,9 +946,9 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.28.2",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
-			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+			"version": "0.29.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+			"integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
 			"dev": true,
 			"dependencies": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -961,13 +961,16 @@
 				"eslint-plugin-mediawiki": "^0.7.0",
 				"eslint-plugin-mocha": "^10.4.3",
 				"eslint-plugin-n": "^17.7.0",
-				"eslint-plugin-no-jquery": "^3.0.1",
+				"eslint-plugin-no-jquery": "^3.1.1",
 				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
 				"eslint-plugin-unicorn": "^53.0.0",
 				"eslint-plugin-vue": "^9.26.0",
 				"eslint-plugin-wdio": "^8.24.12",
 				"eslint-plugin-yml": "^1.14.0"
+			},
+			"engines": {
+				"node": ">=18 <23"
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
@@ -1165,9 +1168,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
-			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+			"integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
 			"dev": true,
 			"peerDependencies": {
 				"eslint": ">=8.0.0"
@@ -4600,9 +4603,9 @@
 			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.28.2",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
-			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+			"version": "0.29.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+			"integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
 			"dev": true,
 			"requires": {
 				"browserslist-config-wikimedia": "^0.7.0",
@@ -4615,7 +4618,7 @@
 				"eslint-plugin-mediawiki": "^0.7.0",
 				"eslint-plugin-mocha": "^10.4.3",
 				"eslint-plugin-n": "^17.7.0",
-				"eslint-plugin-no-jquery": "^3.0.1",
+				"eslint-plugin-no-jquery": "^3.1.1",
 				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
 				"eslint-plugin-unicorn": "^53.0.0",
@@ -4750,9 +4753,9 @@
 			}
 		},
 		"eslint-plugin-no-jquery": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
-			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+			"integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
 			"dev": true,
 			"requires": {}
 		},
diff --git a/package.json b/package.json
index 8216636..f96cba2 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.28.2",
+		"eslint-config-wikimedia": "0.29.1",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.13.0",
 		"grunt-eslint": "24.3.0"
-- 
2.39.2


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